446 lines · plain
1; Like frame-03.ll, but for z13. In this case we have 16 more registers2; available.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | 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; CHECK-DAG: ld %f0, 0(%r2)31; CHECK-DAG: ld %f7, 0(%r2)32; CHECK-DAG: ld %f8, 0(%r2)33; CHECK-DAG: ld %f15, 0(%r2)34; CHECK-DAG: vlrepg %v16, 0(%r2)35; CHECK-DAG: vlrepg %v23, 0(%r2)36; CHECK-DAG: vlrepg %v24, 0(%r2)37; CHECK-DAG: vlrepg %v31, 0(%r2)38; CHECK: ld %f8, 56(%r15)39; CHECK: ld %f9, 48(%r15)40; CHECK: ld %f10, 40(%r15)41; CHECK: ld %f11, 32(%r15)42; CHECK: ld %f12, 24(%r15)43; CHECK: ld %f13, 16(%r15)44; CHECK: ld %f14, 8(%r15)45; CHECK: ld %f15, 0(%r15)46; CHECK: aghi %r15, 6447; CHECK: br %r1448 %l0 = load volatile double, ptr %ptr49 %l1 = load volatile double, ptr %ptr50 %l2 = load volatile double, ptr %ptr51 %l3 = load volatile double, ptr %ptr52 %l4 = load volatile double, ptr %ptr53 %l5 = load volatile double, ptr %ptr54 %l6 = load volatile double, ptr %ptr55 %l7 = load volatile double, ptr %ptr56 %l8 = load volatile double, ptr %ptr57 %l9 = load volatile double, ptr %ptr58 %l10 = load volatile double, ptr %ptr59 %l11 = load volatile double, ptr %ptr60 %l12 = load volatile double, ptr %ptr61 %l13 = load volatile double, ptr %ptr62 %l14 = load volatile double, ptr %ptr63 %l15 = load volatile double, ptr %ptr64 %l16 = load volatile double, ptr %ptr65 %l17 = load volatile double, ptr %ptr66 %l18 = load volatile double, ptr %ptr67 %l19 = load volatile double, ptr %ptr68 %l20 = load volatile double, ptr %ptr69 %l21 = load volatile double, ptr %ptr70 %l22 = load volatile double, ptr %ptr71 %l23 = load volatile double, ptr %ptr72 %l24 = load volatile double, ptr %ptr73 %l25 = load volatile double, ptr %ptr74 %l26 = load volatile double, ptr %ptr75 %l27 = load volatile double, ptr %ptr76 %l28 = load volatile double, ptr %ptr77 %l29 = load volatile double, ptr %ptr78 %l30 = load volatile double, ptr %ptr79 %l31 = load volatile double, ptr %ptr80 %acc0 = fsub double %l0, %l081 %acc1 = fsub double %l1, %acc082 %acc2 = fsub double %l2, %acc183 %acc3 = fsub double %l3, %acc284 %acc4 = fsub double %l4, %acc385 %acc5 = fsub double %l5, %acc486 %acc6 = fsub double %l6, %acc587 %acc7 = fsub double %l7, %acc688 %acc8 = fsub double %l8, %acc789 %acc9 = fsub double %l9, %acc890 %acc10 = fsub double %l10, %acc991 %acc11 = fsub double %l11, %acc1092 %acc12 = fsub double %l12, %acc1193 %acc13 = fsub double %l13, %acc1294 %acc14 = fsub double %l14, %acc1395 %acc15 = fsub double %l15, %acc1496 %acc16 = fsub double %l16, %acc1597 %acc17 = fsub double %l17, %acc1698 %acc18 = fsub double %l18, %acc1799 %acc19 = fsub double %l19, %acc18100 %acc20 = fsub double %l20, %acc19101 %acc21 = fsub double %l21, %acc20102 %acc22 = fsub double %l22, %acc21103 %acc23 = fsub double %l23, %acc22104 %acc24 = fsub double %l24, %acc23105 %acc25 = fsub double %l25, %acc24106 %acc26 = fsub double %l26, %acc25107 %acc27 = fsub double %l27, %acc26108 %acc28 = fsub double %l28, %acc27109 %acc29 = fsub double %l29, %acc28110 %acc30 = fsub double %l30, %acc29111 %acc31 = fsub double %l31, %acc30112 store volatile double %acc0, ptr %ptr113 store volatile double %acc1, ptr %ptr114 store volatile double %acc2, ptr %ptr115 store volatile double %acc3, ptr %ptr116 store volatile double %acc4, ptr %ptr117 store volatile double %acc5, ptr %ptr118 store volatile double %acc6, ptr %ptr119 store volatile double %acc7, ptr %ptr120 store volatile double %acc8, ptr %ptr121 store volatile double %acc9, ptr %ptr122 store volatile double %acc10, ptr %ptr123 store volatile double %acc11, ptr %ptr124 store volatile double %acc12, ptr %ptr125 store volatile double %acc13, ptr %ptr126 store volatile double %acc14, ptr %ptr127 store volatile double %acc15, ptr %ptr128 store volatile double %acc16, ptr %ptr129 store volatile double %acc17, ptr %ptr130 store volatile double %acc18, ptr %ptr131 store volatile double %acc19, ptr %ptr132 store volatile double %acc20, ptr %ptr133 store volatile double %acc21, ptr %ptr134 store volatile double %acc22, ptr %ptr135 store volatile double %acc23, ptr %ptr136 store volatile double %acc24, ptr %ptr137 store volatile double %acc25, ptr %ptr138 store volatile double %acc26, ptr %ptr139 store volatile double %acc27, ptr %ptr140 store volatile double %acc28, ptr %ptr141 store volatile double %acc29, ptr %ptr142 store volatile double %acc30, ptr %ptr143 store volatile double %acc31, ptr %ptr144 ret void145}146 147; Like f1, but requires one fewer FPR. We allocate in numerical order,148; so %f15 is the one that gets dropped.149define void @f2(ptr %ptr) {150; CHECK-LABEL: f2:151; CHECK: aghi %r15, -56152; CHECK: .cfi_def_cfa_offset 216153; CHECK: std %f8, 48(%r15)154; CHECK: std %f9, 40(%r15)155; CHECK: std %f10, 32(%r15)156; CHECK: std %f11, 24(%r15)157; CHECK: std %f12, 16(%r15)158; CHECK: std %f13, 8(%r15)159; CHECK: std %f14, 0(%r15)160; CHECK: .cfi_offset %f8, -168161; CHECK: .cfi_offset %f9, -176162; CHECK: .cfi_offset %f10, -184163; CHECK: .cfi_offset %f11, -192164; CHECK: .cfi_offset %f12, -200165; CHECK: .cfi_offset %f13, -208166; CHECK: .cfi_offset %f14, -216167; CHECK-NOT: %v15168; CHECK-NOT: %f15169; CHECK: ld %f8, 48(%r15)170; CHECK: ld %f9, 40(%r15)171; CHECK: ld %f10, 32(%r15)172; CHECK: ld %f11, 24(%r15)173; CHECK: ld %f12, 16(%r15)174; CHECK: ld %f13, 8(%r15)175; CHECK: ld %f14, 0(%r15)176; CHECK: aghi %r15, 56177; CHECK: br %r14178 %l0 = load volatile double, ptr %ptr179 %l1 = load volatile double, ptr %ptr180 %l2 = load volatile double, ptr %ptr181 %l3 = load volatile double, ptr %ptr182 %l4 = load volatile double, ptr %ptr183 %l5 = load volatile double, ptr %ptr184 %l6 = load volatile double, ptr %ptr185 %l7 = load volatile double, ptr %ptr186 %l8 = load volatile double, ptr %ptr187 %l9 = load volatile double, ptr %ptr188 %l10 = load volatile double, ptr %ptr189 %l11 = load volatile double, ptr %ptr190 %l12 = load volatile double, ptr %ptr191 %l13 = load volatile double, ptr %ptr192 %l14 = load volatile double, ptr %ptr193 %l16 = load volatile double, ptr %ptr194 %l17 = load volatile double, ptr %ptr195 %l18 = load volatile double, ptr %ptr196 %l19 = load volatile double, ptr %ptr197 %l20 = load volatile double, ptr %ptr198 %l21 = load volatile double, ptr %ptr199 %l22 = load volatile double, ptr %ptr200 %l23 = load volatile double, ptr %ptr201 %l24 = load volatile double, ptr %ptr202 %l25 = load volatile double, ptr %ptr203 %l26 = load volatile double, ptr %ptr204 %l27 = load volatile double, ptr %ptr205 %l28 = load volatile double, ptr %ptr206 %l29 = load volatile double, ptr %ptr207 %l30 = load volatile double, ptr %ptr208 %l31 = load volatile double, ptr %ptr209 %acc0 = fsub double %l0, %l0210 %acc1 = fsub double %l1, %acc0211 %acc2 = fsub double %l2, %acc1212 %acc3 = fsub double %l3, %acc2213 %acc4 = fsub double %l4, %acc3214 %acc5 = fsub double %l5, %acc4215 %acc6 = fsub double %l6, %acc5216 %acc7 = fsub double %l7, %acc6217 %acc8 = fsub double %l8, %acc7218 %acc9 = fsub double %l9, %acc8219 %acc10 = fsub double %l10, %acc9220 %acc11 = fsub double %l11, %acc10221 %acc12 = fsub double %l12, %acc11222 %acc13 = fsub double %l13, %acc12223 %acc14 = fsub double %l14, %acc13224 %acc16 = fsub double %l16, %acc14225 %acc17 = fsub double %l17, %acc16226 %acc18 = fsub double %l18, %acc17227 %acc19 = fsub double %l19, %acc18228 %acc20 = fsub double %l20, %acc19229 %acc21 = fsub double %l21, %acc20230 %acc22 = fsub double %l22, %acc21231 %acc23 = fsub double %l23, %acc22232 %acc24 = fsub double %l24, %acc23233 %acc25 = fsub double %l25, %acc24234 %acc26 = fsub double %l26, %acc25235 %acc27 = fsub double %l27, %acc26236 %acc28 = fsub double %l28, %acc27237 %acc29 = fsub double %l29, %acc28238 %acc30 = fsub double %l30, %acc29239 %acc31 = fsub double %l31, %acc30240 store volatile double %acc0, ptr %ptr241 store volatile double %acc1, ptr %ptr242 store volatile double %acc2, ptr %ptr243 store volatile double %acc3, ptr %ptr244 store volatile double %acc4, ptr %ptr245 store volatile double %acc5, ptr %ptr246 store volatile double %acc6, ptr %ptr247 store volatile double %acc7, ptr %ptr248 store volatile double %acc8, ptr %ptr249 store volatile double %acc9, ptr %ptr250 store volatile double %acc10, ptr %ptr251 store volatile double %acc11, ptr %ptr252 store volatile double %acc12, ptr %ptr253 store volatile double %acc13, ptr %ptr254 store volatile double %acc14, ptr %ptr255 store volatile double %acc16, ptr %ptr256 store volatile double %acc17, ptr %ptr257 store volatile double %acc18, ptr %ptr258 store volatile double %acc19, ptr %ptr259 store volatile double %acc20, ptr %ptr260 store volatile double %acc21, ptr %ptr261 store volatile double %acc22, ptr %ptr262 store volatile double %acc23, ptr %ptr263 store volatile double %acc24, ptr %ptr264 store volatile double %acc25, ptr %ptr265 store volatile double %acc26, ptr %ptr266 store volatile double %acc27, ptr %ptr267 store volatile double %acc28, ptr %ptr268 store volatile double %acc29, ptr %ptr269 store volatile double %acc30, ptr %ptr270 store volatile double %acc31, ptr %ptr271 ret void272}273 274; Like f1, but should require only one call-saved FPR.275define void @f3(ptr %ptr) {276; CHECK-LABEL: f3:277; CHECK: aghi %r15, -8278; CHECK: .cfi_def_cfa_offset 168279; CHECK: std %f8, 0(%r15)280; CHECK: .cfi_offset %f8, -168281; CHECK-NOT: {{%[fv]9}}282; CHECK-NOT: {{%[fv]1[0-5]}}283; CHECK: ld %f8, 0(%r15)284; CHECK: aghi %r15, 8285; CHECK: br %r14286 %l0 = load volatile double, ptr %ptr287 %l1 = load volatile double, ptr %ptr288 %l2 = load volatile double, ptr %ptr289 %l3 = load volatile double, ptr %ptr290 %l4 = load volatile double, ptr %ptr291 %l5 = load volatile double, ptr %ptr292 %l6 = load volatile double, ptr %ptr293 %l7 = load volatile double, ptr %ptr294 %l8 = load volatile double, ptr %ptr295 %l16 = load volatile double, ptr %ptr296 %l17 = load volatile double, ptr %ptr297 %l18 = load volatile double, ptr %ptr298 %l19 = load volatile double, ptr %ptr299 %l20 = load volatile double, ptr %ptr300 %l21 = load volatile double, ptr %ptr301 %l22 = load volatile double, ptr %ptr302 %l23 = load volatile double, ptr %ptr303 %l24 = load volatile double, ptr %ptr304 %l25 = load volatile double, ptr %ptr305 %l26 = load volatile double, ptr %ptr306 %l27 = load volatile double, ptr %ptr307 %l28 = load volatile double, ptr %ptr308 %l29 = load volatile double, ptr %ptr309 %l30 = load volatile double, ptr %ptr310 %l31 = load volatile double, ptr %ptr311 %acc0 = fsub double %l0, %l0312 %acc1 = fsub double %l1, %acc0313 %acc2 = fsub double %l2, %acc1314 %acc3 = fsub double %l3, %acc2315 %acc4 = fsub double %l4, %acc3316 %acc5 = fsub double %l5, %acc4317 %acc6 = fsub double %l6, %acc5318 %acc7 = fsub double %l7, %acc6319 %acc8 = fsub double %l8, %acc7320 %acc16 = fsub double %l16, %acc8321 %acc17 = fsub double %l17, %acc16322 %acc18 = fsub double %l18, %acc17323 %acc19 = fsub double %l19, %acc18324 %acc20 = fsub double %l20, %acc19325 %acc21 = fsub double %l21, %acc20326 %acc22 = fsub double %l22, %acc21327 %acc23 = fsub double %l23, %acc22328 %acc24 = fsub double %l24, %acc23329 %acc25 = fsub double %l25, %acc24330 %acc26 = fsub double %l26, %acc25331 %acc27 = fsub double %l27, %acc26332 %acc28 = fsub double %l28, %acc27333 %acc29 = fsub double %l29, %acc28334 %acc30 = fsub double %l30, %acc29335 %acc31 = fsub double %l31, %acc30336 store volatile double %acc0, ptr %ptr337 store volatile double %acc1, ptr %ptr338 store volatile double %acc2, ptr %ptr339 store volatile double %acc3, ptr %ptr340 store volatile double %acc4, ptr %ptr341 store volatile double %acc5, ptr %ptr342 store volatile double %acc6, ptr %ptr343 store volatile double %acc7, ptr %ptr344 store volatile double %acc8, ptr %ptr345 store volatile double %acc16, ptr %ptr346 store volatile double %acc17, ptr %ptr347 store volatile double %acc18, ptr %ptr348 store volatile double %acc19, ptr %ptr349 store volatile double %acc20, ptr %ptr350 store volatile double %acc21, ptr %ptr351 store volatile double %acc22, ptr %ptr352 store volatile double %acc23, ptr %ptr353 store volatile double %acc24, ptr %ptr354 store volatile double %acc25, ptr %ptr355 store volatile double %acc26, ptr %ptr356 store volatile double %acc27, ptr %ptr357 store volatile double %acc28, ptr %ptr358 store volatile double %acc29, ptr %ptr359 store volatile double %acc30, ptr %ptr360 store volatile double %acc31, ptr %ptr361 ret void362}363 364; This function should use all call-clobbered FPRs and vector registers365; but no call-saved ones. It shouldn't need to create a frame.366define void @f4(ptr %ptr) {367; CHECK-LABEL: f4:368; CHECK-NOT: %r15369; CHECK-NOT: {{%[fv][89]}}370; CHECK-NOT: {{%[fv]1[0-5]}}371; CHECK: br %r14372 %l0 = load volatile double, ptr %ptr373 %l1 = load volatile double, ptr %ptr374 %l2 = load volatile double, ptr %ptr375 %l3 = load volatile double, ptr %ptr376 %l4 = load volatile double, ptr %ptr377 %l5 = load volatile double, ptr %ptr378 %l6 = load volatile double, ptr %ptr379 %l7 = load volatile double, ptr %ptr380 %l16 = load volatile double, ptr %ptr381 %l17 = load volatile double, ptr %ptr382 %l18 = load volatile double, ptr %ptr383 %l19 = load volatile double, ptr %ptr384 %l20 = load volatile double, ptr %ptr385 %l21 = load volatile double, ptr %ptr386 %l22 = load volatile double, ptr %ptr387 %l23 = load volatile double, ptr %ptr388 %l24 = load volatile double, ptr %ptr389 %l25 = load volatile double, ptr %ptr390 %l26 = load volatile double, ptr %ptr391 %l27 = load volatile double, ptr %ptr392 %l28 = load volatile double, ptr %ptr393 %l29 = load volatile double, ptr %ptr394 %l30 = load volatile double, ptr %ptr395 %l31 = load volatile double, ptr %ptr396 %acc0 = fsub double %l0, %l0397 %acc1 = fsub double %l1, %acc0398 %acc2 = fsub double %l2, %acc1399 %acc3 = fsub double %l3, %acc2400 %acc4 = fsub double %l4, %acc3401 %acc5 = fsub double %l5, %acc4402 %acc6 = fsub double %l6, %acc5403 %acc7 = fsub double %l7, %acc6404 %acc16 = fsub double %l16, %acc7405 %acc17 = fsub double %l17, %acc16406 %acc18 = fsub double %l18, %acc17407 %acc19 = fsub double %l19, %acc18408 %acc20 = fsub double %l20, %acc19409 %acc21 = fsub double %l21, %acc20410 %acc22 = fsub double %l22, %acc21411 %acc23 = fsub double %l23, %acc22412 %acc24 = fsub double %l24, %acc23413 %acc25 = fsub double %l25, %acc24414 %acc26 = fsub double %l26, %acc25415 %acc27 = fsub double %l27, %acc26416 %acc28 = fsub double %l28, %acc27417 %acc29 = fsub double %l29, %acc28418 %acc30 = fsub double %l30, %acc29419 %acc31 = fsub double %l31, %acc30420 store volatile double %acc0, ptr %ptr421 store volatile double %acc1, ptr %ptr422 store volatile double %acc2, ptr %ptr423 store volatile double %acc3, ptr %ptr424 store volatile double %acc4, ptr %ptr425 store volatile double %acc5, ptr %ptr426 store volatile double %acc6, ptr %ptr427 store volatile double %acc7, ptr %ptr428 store volatile double %acc16, ptr %ptr429 store volatile double %acc17, ptr %ptr430 store volatile double %acc18, ptr %ptr431 store volatile double %acc19, ptr %ptr432 store volatile double %acc20, ptr %ptr433 store volatile double %acc21, ptr %ptr434 store volatile double %acc22, ptr %ptr435 store volatile double %acc23, ptr %ptr436 store volatile double %acc24, ptr %ptr437 store volatile double %acc25, ptr %ptr438 store volatile double %acc26, ptr %ptr439 store volatile double %acc27, ptr %ptr440 store volatile double %acc28, ptr %ptr441 store volatile double %acc29, ptr %ptr442 store volatile double %acc30, ptr %ptr443 store volatile double %acc31, ptr %ptr444 ret void445}446