258 lines · plain
1; Test saving and restoring of call-saved FPRs.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; This function should require all FPRs, but no other spill slots.6; We need to save and restore 8 of the 16 FPRs, so the frame size7; should be exactly 8 * 8 = 64. The CFA offset is 1608; (the caller-allocated part of the frame) + 64.9define void @f1(ptr %ptr) {10; CHECK-LABEL: f1:11; CHECK: aghi %r15, -6412; CHECK: .cfi_def_cfa_offset 22413; CHECK: std %f8, 56(%r15)14; CHECK: std %f9, 48(%r15)15; CHECK: std %f10, 40(%r15)16; CHECK: std %f11, 32(%r15)17; CHECK: std %f12, 24(%r15)18; CHECK: std %f13, 16(%r15)19; CHECK: std %f14, 8(%r15)20; CHECK: std %f15, 0(%r15)21; CHECK: .cfi_offset %f8, -16822; CHECK: .cfi_offset %f9, -17623; CHECK: .cfi_offset %f10, -18424; CHECK: .cfi_offset %f11, -19225; CHECK: .cfi_offset %f12, -20026; CHECK: .cfi_offset %f13, -20827; CHECK: .cfi_offset %f14, -21628; CHECK: .cfi_offset %f15, -22429; ...main function body...30; CHECK: ld %f8, 56(%r15)31; CHECK: ld %f9, 48(%r15)32; CHECK: ld %f10, 40(%r15)33; CHECK: ld %f11, 32(%r15)34; CHECK: ld %f12, 24(%r15)35; CHECK: ld %f13, 16(%r15)36; CHECK: ld %f14, 8(%r15)37; CHECK: ld %f15, 0(%r15)38; CHECK: aghi %r15, 6439; CHECK: br %r1440 %l0 = load volatile float, ptr %ptr41 %l1 = load volatile float, ptr %ptr42 %l2 = load volatile float, ptr %ptr43 %l3 = load volatile float, ptr %ptr44 %l4 = load volatile float, ptr %ptr45 %l5 = load volatile float, ptr %ptr46 %l6 = load volatile float, ptr %ptr47 %l7 = load volatile float, ptr %ptr48 %l8 = load volatile float, ptr %ptr49 %l9 = load volatile float, ptr %ptr50 %l10 = load volatile float, ptr %ptr51 %l11 = load volatile float, ptr %ptr52 %l12 = load volatile float, ptr %ptr53 %l13 = load volatile float, ptr %ptr54 %l14 = load volatile float, ptr %ptr55 %l15 = load volatile float, ptr %ptr56 %add0 = fadd float %l0, %l057 %add1 = fadd float %l1, %add058 %add2 = fadd float %l2, %add159 %add3 = fadd float %l3, %add260 %add4 = fadd float %l4, %add361 %add5 = fadd float %l5, %add462 %add6 = fadd float %l6, %add563 %add7 = fadd float %l7, %add664 %add8 = fadd float %l8, %add765 %add9 = fadd float %l9, %add866 %add10 = fadd float %l10, %add967 %add11 = fadd float %l11, %add1068 %add12 = fadd float %l12, %add1169 %add13 = fadd float %l13, %add1270 %add14 = fadd float %l14, %add1371 %add15 = fadd float %l15, %add1472 store volatile float %add0, ptr %ptr73 store volatile float %add1, ptr %ptr74 store volatile float %add2, ptr %ptr75 store volatile float %add3, ptr %ptr76 store volatile float %add4, ptr %ptr77 store volatile float %add5, ptr %ptr78 store volatile float %add6, ptr %ptr79 store volatile float %add7, ptr %ptr80 store volatile float %add8, ptr %ptr81 store volatile float %add9, ptr %ptr82 store volatile float %add10, ptr %ptr83 store volatile float %add11, ptr %ptr84 store volatile float %add12, ptr %ptr85 store volatile float %add13, ptr %ptr86 store volatile float %add14, ptr %ptr87 store volatile float %add15, ptr %ptr88 ret void89}90 91; Like f1, but requires one fewer FPR. We allocate in numerical order,92; so %f15 is the one that gets dropped.93define void @f2(ptr %ptr) {94; CHECK-LABEL: f2:95; CHECK: aghi %r15, -5696; CHECK: .cfi_def_cfa_offset 21697; CHECK: std %f8, 48(%r15)98; CHECK: std %f9, 40(%r15)99; CHECK: std %f10, 32(%r15)100; CHECK: std %f11, 24(%r15)101; CHECK: std %f12, 16(%r15)102; CHECK: std %f13, 8(%r15)103; CHECK: std %f14, 0(%r15)104; CHECK: .cfi_offset %f8, -168105; CHECK: .cfi_offset %f9, -176106; CHECK: .cfi_offset %f10, -184107; CHECK: .cfi_offset %f11, -192108; CHECK: .cfi_offset %f12, -200109; CHECK: .cfi_offset %f13, -208110; CHECK: .cfi_offset %f14, -216111; CHECK-NOT: %f15112; ...main function body...113; CHECK: ld %f8, 48(%r15)114; CHECK: ld %f9, 40(%r15)115; CHECK: ld %f10, 32(%r15)116; CHECK: ld %f11, 24(%r15)117; CHECK: ld %f12, 16(%r15)118; CHECK: ld %f13, 8(%r15)119; CHECK: ld %f14, 0(%r15)120; CHECK: aghi %r15, 56121; CHECK: br %r14122 %l0 = load volatile float, ptr %ptr123 %l1 = load volatile float, ptr %ptr124 %l2 = load volatile float, ptr %ptr125 %l3 = load volatile float, ptr %ptr126 %l4 = load volatile float, ptr %ptr127 %l5 = load volatile float, ptr %ptr128 %l6 = load volatile float, ptr %ptr129 %l7 = load volatile float, ptr %ptr130 %l8 = load volatile float, ptr %ptr131 %l9 = load volatile float, ptr %ptr132 %l10 = load volatile float, ptr %ptr133 %l11 = load volatile float, ptr %ptr134 %l12 = load volatile float, ptr %ptr135 %l13 = load volatile float, ptr %ptr136 %l14 = load volatile float, ptr %ptr137 %add0 = fadd float %l0, %l0138 %add1 = fadd float %l1, %add0139 %add2 = fadd float %l2, %add1140 %add3 = fadd float %l3, %add2141 %add4 = fadd float %l4, %add3142 %add5 = fadd float %l5, %add4143 %add6 = fadd float %l6, %add5144 %add7 = fadd float %l7, %add6145 %add8 = fadd float %l8, %add7146 %add9 = fadd float %l9, %add8147 %add10 = fadd float %l10, %add9148 %add11 = fadd float %l11, %add10149 %add12 = fadd float %l12, %add11150 %add13 = fadd float %l13, %add12151 %add14 = fadd float %l14, %add13152 store volatile float %add0, ptr %ptr153 store volatile float %add1, ptr %ptr154 store volatile float %add2, ptr %ptr155 store volatile float %add3, ptr %ptr156 store volatile float %add4, ptr %ptr157 store volatile float %add5, ptr %ptr158 store volatile float %add6, ptr %ptr159 store volatile float %add7, ptr %ptr160 store volatile float %add8, ptr %ptr161 store volatile float %add9, ptr %ptr162 store volatile float %add10, ptr %ptr163 store volatile float %add11, ptr %ptr164 store volatile float %add12, ptr %ptr165 store volatile float %add13, ptr %ptr166 store volatile float %add14, ptr %ptr167 ret void168}169 170; Like f1, but should require only one call-saved FPR.171define void @f3(ptr %ptr) {172; CHECK-LABEL: f3:173; CHECK: aghi %r15, -8174; CHECK: .cfi_def_cfa_offset 168175; CHECK: std %f8, 0(%r15)176; CHECK: .cfi_offset %f8, -168177; CHECK-NOT: %f9178; CHECK-NOT: %f10179; CHECK-NOT: %f11180; CHECK-NOT: %f12181; CHECK-NOT: %f13182; CHECK-NOT: %f14183; CHECK-NOT: %f15184; ...main function body...185; CHECK: ld %f8, 0(%r15)186; CHECK: aghi %r15, 8187; CHECK: br %r14188 %l0 = load volatile float, ptr %ptr189 %l1 = load volatile float, ptr %ptr190 %l2 = load volatile float, ptr %ptr191 %l3 = load volatile float, ptr %ptr192 %l4 = load volatile float, ptr %ptr193 %l5 = load volatile float, ptr %ptr194 %l6 = load volatile float, ptr %ptr195 %l7 = load volatile float, ptr %ptr196 %l8 = load volatile float, ptr %ptr197 %add0 = fadd float %l0, %l0198 %add1 = fadd float %l1, %add0199 %add2 = fadd float %l2, %add1200 %add3 = fadd float %l3, %add2201 %add4 = fadd float %l4, %add3202 %add5 = fadd float %l5, %add4203 %add6 = fadd float %l6, %add5204 %add7 = fadd float %l7, %add6205 %add8 = fadd float %l8, %add7206 store volatile float %add0, ptr %ptr207 store volatile float %add1, ptr %ptr208 store volatile float %add2, ptr %ptr209 store volatile float %add3, ptr %ptr210 store volatile float %add4, ptr %ptr211 store volatile float %add5, ptr %ptr212 store volatile float %add6, ptr %ptr213 store volatile float %add7, ptr %ptr214 store volatile float %add8, ptr %ptr215 ret void216}217 218; This function should use all call-clobbered FPRs but no call-saved ones.219; It shouldn't need to create a frame.220define void @f4(ptr %ptr) {221; CHECK-LABEL: f4:222; CHECK-NOT: %r15223; CHECK-NOT: %f8224; CHECK-NOT: %f9225; CHECK-NOT: %f10226; CHECK-NOT: %f11227; CHECK-NOT: %f12228; CHECK-NOT: %f13229; CHECK-NOT: %f14230; CHECK-NOT: %f15231; CHECK: br %r14232 %l0 = load volatile float, ptr %ptr233 %l1 = load volatile float, ptr %ptr234 %l2 = load volatile float, ptr %ptr235 %l3 = load volatile float, ptr %ptr236 %l4 = load volatile float, ptr %ptr237 %l5 = load volatile float, ptr %ptr238 %l6 = load volatile float, ptr %ptr239 %l7 = load volatile float, ptr %ptr240 %add0 = fadd float %l0, %l0241 %add1 = fadd float %l1, %add0242 %add2 = fadd float %l2, %add1243 %add3 = fadd float %l3, %add2244 %add4 = fadd float %l4, %add3245 %add5 = fadd float %l5, %add4246 %add6 = fadd float %l6, %add5247 %add7 = fadd float %l7, %add6248 store volatile float %add0, ptr %ptr249 store volatile float %add1, ptr %ptr250 store volatile float %add2, ptr %ptr251 store volatile float %add3, ptr %ptr252 store volatile float %add4, ptr %ptr253 store volatile float %add5, ptr %ptr254 store volatile float %add6, ptr %ptr255 store volatile float %add7, ptr %ptr256 ret void257}258