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