brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · b220070 Raw
188 lines · plain
1; Like frame-02.ll, but with long doubles rather than floats.  Some of the2; cases are slightly different because we need to allocate pairs of FPRs.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s5 6; This function should require all FPRs, but no other spill slots.7; We need to save and restore 8 of the 16 FPRs, so the frame size8; should be exactly 8 * 8 = 64.  The CFA offset is 1609; (the caller-allocated part of the frame) + 64.10define void @f1(ptr %ptr) {11; CHECK-LABEL: f1:12; CHECK: aghi %r15, -6413; CHECK: .cfi_def_cfa_offset 22414; CHECK: std %f8, 56(%r15)15; CHECK: std %f9, 48(%r15)16; CHECK: std %f10, 40(%r15)17; CHECK: std %f11, 32(%r15)18; CHECK: std %f12, 24(%r15)19; CHECK: std %f13, 16(%r15)20; CHECK: std %f14, 8(%r15)21; CHECK: std %f15, 0(%r15)22; CHECK: .cfi_offset %f8, -16823; CHECK: .cfi_offset %f9, -17624; CHECK: .cfi_offset %f10, -18425; CHECK: .cfi_offset %f11, -19226; CHECK: .cfi_offset %f12, -20027; CHECK: .cfi_offset %f13, -20828; CHECK: .cfi_offset %f14, -21629; CHECK: .cfi_offset %f15, -22430; ...main function body...31; CHECK: ld %f8, 56(%r15)32; CHECK: ld %f9, 48(%r15)33; CHECK: ld %f10, 40(%r15)34; CHECK: ld %f11, 32(%r15)35; CHECK: ld %f12, 24(%r15)36; CHECK: ld %f13, 16(%r15)37; CHECK: ld %f14, 8(%r15)38; CHECK: ld %f15, 0(%r15)39; CHECK: aghi %r15, 6440; CHECK: br %r1441  %l0 = load volatile fp128, ptr %ptr42  %l1 = load volatile fp128, ptr %ptr43  %l4 = load volatile fp128, ptr %ptr44  %l5 = load volatile fp128, ptr %ptr45  %l8 = load volatile fp128, ptr %ptr46  %l9 = load volatile fp128, ptr %ptr47  %l12 = load volatile fp128, ptr %ptr48  %l13 = load volatile fp128, ptr %ptr49  %add0 = fadd fp128 %l0, %l050  %add1 = fadd fp128 %l1, %add051  %add4 = fadd fp128 %l4, %add152  %add5 = fadd fp128 %l5, %add453  %add8 = fadd fp128 %l8, %add554  %add9 = fadd fp128 %l9, %add855  %add12 = fadd fp128 %l12, %add956  %add13 = fadd fp128 %l13, %add1257  store volatile fp128 %add0, ptr %ptr58  store volatile fp128 %add1, ptr %ptr59  store volatile fp128 %add4, ptr %ptr60  store volatile fp128 %add5, ptr %ptr61  store volatile fp128 %add8, ptr %ptr62  store volatile fp128 %add9, ptr %ptr63  store volatile fp128 %add12, ptr %ptr64  store volatile fp128 %add13, ptr %ptr65  ret void66}67 68; Like f1, but requires one fewer FPR pair.  We allocate in numerical order,69; so %f13+%f15 is the pair that gets dropped.70define void @f2(ptr %ptr) {71; CHECK-LABEL: f2:72; CHECK: aghi %r15, -4873; CHECK: .cfi_def_cfa_offset 20874; CHECK: std %f8, 40(%r15)75; CHECK: std %f9, 32(%r15)76; CHECK: std %f10, 24(%r15)77; CHECK: std %f11, 16(%r15)78; CHECK: std %f12, 8(%r15)79; CHECK: std %f14, 0(%r15)80; CHECK: .cfi_offset %f8, -16881; CHECK: .cfi_offset %f9, -17682; CHECK: .cfi_offset %f10, -18483; CHECK: .cfi_offset %f11, -19284; CHECK: .cfi_offset %f12, -20085; CHECK: .cfi_offset %f14, -20886; CHECK-NOT: %f1387; CHECK-NOT: %f1588; ...main function body...89; CHECK: ld %f8, 40(%r15)90; CHECK: ld %f9, 32(%r15)91; CHECK: ld %f10, 24(%r15)92; CHECK: ld %f11, 16(%r15)93; CHECK: ld %f12, 8(%r15)94; CHECK: ld %f14, 0(%r15)95; CHECK: aghi %r15, 4896; CHECK: br %r1497  %l0 = load volatile fp128, ptr %ptr98  %l1 = load volatile fp128, ptr %ptr99  %l4 = load volatile fp128, ptr %ptr100  %l5 = load volatile fp128, ptr %ptr101  %l8 = load volatile fp128, ptr %ptr102  %l9 = load volatile fp128, ptr %ptr103  %l12 = load volatile fp128, ptr %ptr104  %add0 = fadd fp128 %l0, %l0105  %add1 = fadd fp128 %l1, %add0106  %add4 = fadd fp128 %l4, %add1107  %add5 = fadd fp128 %l5, %add4108  %add8 = fadd fp128 %l8, %add5109  %add9 = fadd fp128 %l9, %add8110  %add12 = fadd fp128 %l12, %add9111  store volatile fp128 %add0, ptr %ptr112  store volatile fp128 %add1, ptr %ptr113  store volatile fp128 %add4, ptr %ptr114  store volatile fp128 %add5, ptr %ptr115  store volatile fp128 %add8, ptr %ptr116  store volatile fp128 %add9, ptr %ptr117  store volatile fp128 %add12, ptr %ptr118  ret void119}120 121; Like f1, but requires only one call-saved FPR pair.  We allocate in122; numerical order so the pair should be %f8+%f10.123define void @f3(ptr %ptr) {124; CHECK-LABEL: f3:125; CHECK: aghi %r15, -16126; CHECK: .cfi_def_cfa_offset 176127; CHECK: std %f8, 8(%r15)128; CHECK: std %f10, 0(%r15)129; CHECK: .cfi_offset %f8, -168130; CHECK: .cfi_offset %f10, -176131; CHECK-NOT: %f9132; CHECK-NOT: %f11133; CHECK-NOT: %f12134; CHECK-NOT: %f13135; CHECK-NOT: %f14136; CHECK-NOT: %f15137; ...main function body...138; CHECK: ld %f8, 8(%r15)139; CHECK: ld %f10, 0(%r15)140; CHECK: aghi %r15, 16141; CHECK: br %r14142  %l0 = load volatile fp128, ptr %ptr143  %l1 = load volatile fp128, ptr %ptr144  %l4 = load volatile fp128, ptr %ptr145  %l5 = load volatile fp128, ptr %ptr146  %l8 = load volatile fp128, ptr %ptr147  %add0 = fadd fp128 %l0, %l0148  %add1 = fadd fp128 %l1, %add0149  %add4 = fadd fp128 %l4, %add1150  %add5 = fadd fp128 %l5, %add4151  %add8 = fadd fp128 %l8, %add5152  store volatile fp128 %add0, ptr %ptr153  store volatile fp128 %add1, ptr %ptr154  store volatile fp128 %add4, ptr %ptr155  store volatile fp128 %add5, ptr %ptr156  store volatile fp128 %add8, ptr %ptr157  ret void158}159 160; This function should use all call-clobbered FPRs but no call-saved ones.161; It shouldn't need to create a frame.162define void @f4(ptr %ptr) {163; CHECK-LABEL: f4:164; CHECK-NOT: %r15165; CHECK-NOT: %f8166; CHECK-NOT: %f9167; CHECK-NOT: %f10168; CHECK-NOT: %f11169; CHECK-NOT: %f12170; CHECK-NOT: %f13171; CHECK-NOT: %f14172; CHECK-NOT: %f15173; CHECK: br %r14174  %l0 = load volatile fp128, ptr %ptr175  %l1 = load volatile fp128, ptr %ptr176  %l4 = load volatile fp128, ptr %ptr177  %l5 = load volatile fp128, ptr %ptr178  %add0 = fadd fp128 %l0, %l0179  %add1 = fadd fp128 %l1, %add0180  %add4 = fadd fp128 %l4, %add1181  %add5 = fadd fp128 %l5, %add4182  store volatile fp128 %add0, ptr %ptr183  store volatile fp128 %add1, ptr %ptr184  store volatile fp128 %add4, ptr %ptr185  store volatile fp128 %add5, ptr %ptr186  ret void187}188