brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.0 KiB · 2545dc9 Raw
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