260 lines · plain
1; Like frame-02.ll, but with doubles rather than floats. Internally this2; uses a different register class, but the set of saved and restored3; registers should be the same.4;5; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s6 7; This function should require all FPRs, but no other spill slots.8; We need to save and restore 8 of the 16 FPRs, so the frame size9; should be exactly 8 * 8 = 64. The CFA offset is 16010; (the caller-allocated part of the frame) + 64.11define void @f1(ptr %ptr) {12; CHECK-LABEL: f1:13; CHECK: aghi %r15, -6414; CHECK: .cfi_def_cfa_offset 22415; CHECK: std %f8, 56(%r15)16; CHECK: std %f9, 48(%r15)17; CHECK: std %f10, 40(%r15)18; CHECK: std %f11, 32(%r15)19; CHECK: std %f12, 24(%r15)20; CHECK: std %f13, 16(%r15)21; CHECK: std %f14, 8(%r15)22; CHECK: std %f15, 0(%r15)23; CHECK: .cfi_offset %f8, -16824; CHECK: .cfi_offset %f9, -17625; CHECK: .cfi_offset %f10, -18426; CHECK: .cfi_offset %f11, -19227; CHECK: .cfi_offset %f12, -20028; CHECK: .cfi_offset %f13, -20829; CHECK: .cfi_offset %f14, -21630; CHECK: .cfi_offset %f15, -22431; ...main function body...32; CHECK: ld %f8, 56(%r15)33; CHECK: ld %f9, 48(%r15)34; CHECK: ld %f10, 40(%r15)35; CHECK: ld %f11, 32(%r15)36; CHECK: ld %f12, 24(%r15)37; CHECK: ld %f13, 16(%r15)38; CHECK: ld %f14, 8(%r15)39; CHECK: ld %f15, 0(%r15)40; CHECK: aghi %r15, 6441; CHECK: br %r1442 %l0 = load volatile double, ptr %ptr43 %l1 = load volatile double, ptr %ptr44 %l2 = load volatile double, ptr %ptr45 %l3 = load volatile double, ptr %ptr46 %l4 = load volatile double, ptr %ptr47 %l5 = load volatile double, ptr %ptr48 %l6 = load volatile double, ptr %ptr49 %l7 = load volatile double, ptr %ptr50 %l8 = load volatile double, ptr %ptr51 %l9 = load volatile double, ptr %ptr52 %l10 = load volatile double, ptr %ptr53 %l11 = load volatile double, ptr %ptr54 %l12 = load volatile double, ptr %ptr55 %l13 = load volatile double, ptr %ptr56 %l14 = load volatile double, ptr %ptr57 %l15 = load volatile double, ptr %ptr58 %add0 = fadd double %l0, %l059 %add1 = fadd double %l1, %add060 %add2 = fadd double %l2, %add161 %add3 = fadd double %l3, %add262 %add4 = fadd double %l4, %add363 %add5 = fadd double %l5, %add464 %add6 = fadd double %l6, %add565 %add7 = fadd double %l7, %add666 %add8 = fadd double %l8, %add767 %add9 = fadd double %l9, %add868 %add10 = fadd double %l10, %add969 %add11 = fadd double %l11, %add1070 %add12 = fadd double %l12, %add1171 %add13 = fadd double %l13, %add1272 %add14 = fadd double %l14, %add1373 %add15 = fadd double %l15, %add1474 store volatile double %add0, ptr %ptr75 store volatile double %add1, ptr %ptr76 store volatile double %add2, ptr %ptr77 store volatile double %add3, ptr %ptr78 store volatile double %add4, ptr %ptr79 store volatile double %add5, ptr %ptr80 store volatile double %add6, ptr %ptr81 store volatile double %add7, ptr %ptr82 store volatile double %add8, ptr %ptr83 store volatile double %add9, ptr %ptr84 store volatile double %add10, ptr %ptr85 store volatile double %add11, ptr %ptr86 store volatile double %add12, ptr %ptr87 store volatile double %add13, ptr %ptr88 store volatile double %add14, ptr %ptr89 store volatile double %add15, ptr %ptr90 ret void91}92 93; Like f1, but requires one fewer FPR. We allocate in numerical order,94; so %f15 is the one that gets dropped.95define void @f2(ptr %ptr) {96; CHECK-LABEL: f2:97; CHECK: aghi %r15, -5698; CHECK: .cfi_def_cfa_offset 21699; CHECK: std %f8, 48(%r15)100; CHECK: std %f9, 40(%r15)101; CHECK: std %f10, 32(%r15)102; CHECK: std %f11, 24(%r15)103; CHECK: std %f12, 16(%r15)104; CHECK: std %f13, 8(%r15)105; CHECK: std %f14, 0(%r15)106; CHECK: .cfi_offset %f8, -168107; CHECK: .cfi_offset %f9, -176108; CHECK: .cfi_offset %f10, -184109; CHECK: .cfi_offset %f11, -192110; CHECK: .cfi_offset %f12, -200111; CHECK: .cfi_offset %f13, -208112; CHECK: .cfi_offset %f14, -216113; CHECK-NOT: %f15114; ...main function body...115; CHECK: ld %f8, 48(%r15)116; CHECK: ld %f9, 40(%r15)117; CHECK: ld %f10, 32(%r15)118; CHECK: ld %f11, 24(%r15)119; CHECK: ld %f12, 16(%r15)120; CHECK: ld %f13, 8(%r15)121; CHECK: ld %f14, 0(%r15)122; CHECK: aghi %r15, 56123; CHECK: br %r14124 %l0 = load volatile double, ptr %ptr125 %l1 = load volatile double, ptr %ptr126 %l2 = load volatile double, ptr %ptr127 %l3 = load volatile double, ptr %ptr128 %l4 = load volatile double, ptr %ptr129 %l5 = load volatile double, ptr %ptr130 %l6 = load volatile double, ptr %ptr131 %l7 = load volatile double, ptr %ptr132 %l8 = load volatile double, ptr %ptr133 %l9 = load volatile double, ptr %ptr134 %l10 = load volatile double, ptr %ptr135 %l11 = load volatile double, ptr %ptr136 %l12 = load volatile double, ptr %ptr137 %l13 = load volatile double, ptr %ptr138 %l14 = load volatile double, ptr %ptr139 %add0 = fadd double %l0, %l0140 %add1 = fadd double %l1, %add0141 %add2 = fadd double %l2, %add1142 %add3 = fadd double %l3, %add2143 %add4 = fadd double %l4, %add3144 %add5 = fadd double %l5, %add4145 %add6 = fadd double %l6, %add5146 %add7 = fadd double %l7, %add6147 %add8 = fadd double %l8, %add7148 %add9 = fadd double %l9, %add8149 %add10 = fadd double %l10, %add9150 %add11 = fadd double %l11, %add10151 %add12 = fadd double %l12, %add11152 %add13 = fadd double %l13, %add12153 %add14 = fadd double %l14, %add13154 store volatile double %add0, ptr %ptr155 store volatile double %add1, ptr %ptr156 store volatile double %add2, ptr %ptr157 store volatile double %add3, ptr %ptr158 store volatile double %add4, ptr %ptr159 store volatile double %add5, ptr %ptr160 store volatile double %add6, ptr %ptr161 store volatile double %add7, ptr %ptr162 store volatile double %add8, ptr %ptr163 store volatile double %add9, ptr %ptr164 store volatile double %add10, ptr %ptr165 store volatile double %add11, ptr %ptr166 store volatile double %add12, ptr %ptr167 store volatile double %add13, ptr %ptr168 store volatile double %add14, ptr %ptr169 ret void170}171 172; Like f1, but should require only one call-saved FPR.173define void @f3(ptr %ptr) {174; CHECK-LABEL: f3:175; CHECK: aghi %r15, -8176; CHECK: .cfi_def_cfa_offset 168177; CHECK: std %f8, 0(%r15)178; CHECK: .cfi_offset %f8, -168179; CHECK-NOT: %f9180; CHECK-NOT: %f10181; CHECK-NOT: %f11182; CHECK-NOT: %f12183; CHECK-NOT: %f13184; CHECK-NOT: %f14185; CHECK-NOT: %f15186; ...main function body...187; CHECK: ld %f8, 0(%r15)188; CHECK: aghi %r15, 8189; CHECK: br %r14190 %l0 = load volatile double, ptr %ptr191 %l1 = load volatile double, ptr %ptr192 %l2 = load volatile double, ptr %ptr193 %l3 = load volatile double, ptr %ptr194 %l4 = load volatile double, ptr %ptr195 %l5 = load volatile double, ptr %ptr196 %l6 = load volatile double, ptr %ptr197 %l7 = load volatile double, ptr %ptr198 %l8 = load volatile double, ptr %ptr199 %add0 = fadd double %l0, %l0200 %add1 = fadd double %l1, %add0201 %add2 = fadd double %l2, %add1202 %add3 = fadd double %l3, %add2203 %add4 = fadd double %l4, %add3204 %add5 = fadd double %l5, %add4205 %add6 = fadd double %l6, %add5206 %add7 = fadd double %l7, %add6207 %add8 = fadd double %l8, %add7208 store volatile double %add0, ptr %ptr209 store volatile double %add1, ptr %ptr210 store volatile double %add2, ptr %ptr211 store volatile double %add3, ptr %ptr212 store volatile double %add4, ptr %ptr213 store volatile double %add5, ptr %ptr214 store volatile double %add6, ptr %ptr215 store volatile double %add7, ptr %ptr216 store volatile double %add8, ptr %ptr217 ret void218}219 220; This function should use all call-clobbered FPRs but no call-saved ones.221; It shouldn't need to create a frame.222define void @f4(ptr %ptr) {223; CHECK-LABEL: f4:224; CHECK-NOT: %r15225; CHECK-NOT: %f8226; CHECK-NOT: %f9227; CHECK-NOT: %f10228; CHECK-NOT: %f11229; CHECK-NOT: %f12230; CHECK-NOT: %f13231; CHECK-NOT: %f14232; CHECK-NOT: %f15233; CHECK: br %r14234 %l0 = load volatile double, ptr %ptr235 %l1 = load volatile double, ptr %ptr236 %l2 = load volatile double, ptr %ptr237 %l3 = load volatile double, ptr %ptr238 %l4 = load volatile double, ptr %ptr239 %l5 = load volatile double, ptr %ptr240 %l6 = load volatile double, ptr %ptr241 %l7 = load volatile double, ptr %ptr242 %add0 = fadd double %l0, %l0243 %add1 = fadd double %l1, %add0244 %add2 = fadd double %l2, %add1245 %add3 = fadd double %l3, %add2246 %add4 = fadd double %l4, %add3247 %add5 = fadd double %l5, %add4248 %add6 = fadd double %l6, %add5249 %add7 = fadd double %l7, %add6250 store volatile double %add0, ptr %ptr251 store volatile double %add1, ptr %ptr252 store volatile double %add2, ptr %ptr253 store volatile double %add3, ptr %ptr254 store volatile double %add4, ptr %ptr255 store volatile double %add5, ptr %ptr256 store volatile double %add6, ptr %ptr257 store volatile double %add7, ptr %ptr258 ret void259}260