138 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s | FileCheck %s3 4target triple = "aarch64-unknown-linux-gnu"5 6; Ensure we don't attempt to combine into an extending fp128 load.7define void @fcvt_v4f64_v4f128(ptr %a, ptr %b) vscale_range(2,0) #0 {8; CHECK-LABEL: fcvt_v4f64_v4f128:9; CHECK: // %bb.0:10; CHECK-NEXT: str x29, [sp, #-32]! // 8-byte Folded Spill11; CHECK-NEXT: stp x30, x19, [sp, #16] // 16-byte Folded Spill12; CHECK-NEXT: sub sp, sp, #4813; CHECK-NEXT: addvl sp, sp, #-214; CHECK-NEXT: ptrue p0.d, vl415; CHECK-NEXT: add x8, sp, #4816; CHECK-NEXT: mov x19, x117; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0]18; CHECK-NEXT: str z0, [x8, #1, mul vl] // 16-byte Folded Spill19; CHECK-NEXT: ext z0.b, z0.b, z0.b, #1620; CHECK-NEXT: str z0, [x8] // 16-byte Folded Spill21; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z022; CHECK-NEXT: bl __extenddftf223; CHECK-NEXT: add x8, sp, #4824; CHECK-NEXT: str q0, [sp, #32] // 16-byte Spill25; CHECK-NEXT: ldr z1, [x8] // 16-byte Folded Reload26; CHECK-NEXT: mov d1, v1.d[1]27; CHECK-NEXT: fmov d0, d128; CHECK-NEXT: bl __extenddftf229; CHECK-NEXT: add x8, sp, #4830; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill31; CHECK-NEXT: ldr z0, [x8, #1, mul vl] // 16-byte Folded Reload32; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z033; CHECK-NEXT: bl __extenddftf234; CHECK-NEXT: add x8, sp, #4835; CHECK-NEXT: str q0, [sp] // 16-byte Spill36; CHECK-NEXT: ldr z1, [x8, #1, mul vl] // 16-byte Folded Reload37; CHECK-NEXT: mov d1, v1.d[1]38; CHECK-NEXT: fmov d0, d139; CHECK-NEXT: bl __extenddftf240; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload41; CHECK-NEXT: stp q1, q0, [x19]42; CHECK-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload43; CHECK-NEXT: stp q0, q1, [x19, #32]44; CHECK-NEXT: addvl sp, sp, #245; CHECK-NEXT: add sp, sp, #4846; CHECK-NEXT: ldp x30, x19, [sp, #16] // 16-byte Folded Reload47; CHECK-NEXT: ldr x29, [sp], #32 // 8-byte Folded Reload48; CHECK-NEXT: ret49 %op1 = load <4 x double>, ptr %a50 %res = fpext <4 x double> %op1 to <4 x fp128>51 store <4 x fp128> %res, ptr %b52 ret void53}54 55; Ensure we don't attempt to combine into a truncating fp128 store.56define void @fcvt_v4f128_v4f64(ptr %a, ptr %b) vscale_range(2,0) #0 {57; CHECK-LABEL: fcvt_v4f128_v4f64:58; CHECK: // %bb.0:59; CHECK-NEXT: str x29, [sp, #-32]! // 8-byte Folded Spill60; CHECK-NEXT: stp x30, x19, [sp, #16] // 16-byte Folded Spill61; CHECK-NEXT: sub sp, sp, #12862; CHECK-NEXT: addvl sp, sp, #-263; CHECK-NEXT: ldp q1, q0, [x0, #64]64; CHECK-NEXT: mov x19, x165; CHECK-NEXT: stp q0, q1, [sp, #96] // 32-byte Folded Spill66; CHECK-NEXT: ldp q1, q0, [x0, #96]67; CHECK-NEXT: stp q0, q1, [sp, #64] // 32-byte Folded Spill68; CHECK-NEXT: ldp q1, q0, [x0]69; CHECK-NEXT: stp q0, q1, [sp, #32] // 32-byte Folded Spill70; CHECK-NEXT: ldp q1, q0, [x0, #32]71; CHECK-NEXT: str q1, [sp, #16] // 16-byte Spill72; CHECK-NEXT: bl __trunctfdf273; CHECK-NEXT: // kill: def $d0 killed $d0 def $q074; CHECK-NEXT: str q0, [sp] // 16-byte Spill75; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload76; CHECK-NEXT: bl __trunctfdf277; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload78; CHECK-NEXT: // kill: def $d0 killed $d0 def $z079; CHECK-NEXT: add x8, sp, #12880; CHECK-NEXT: mov v0.d[1], v1.d[0]81; CHECK-NEXT: str z0, [x8, #1, mul vl] // 16-byte Folded Spill82; CHECK-NEXT: ldr q0, [sp, #32] // 16-byte Reload83; CHECK-NEXT: bl __trunctfdf284; CHECK-NEXT: // kill: def $d0 killed $d0 def $q085; CHECK-NEXT: str q0, [sp, #32] // 16-byte Spill86; CHECK-NEXT: ldr q0, [sp, #48] // 16-byte Reload87; CHECK-NEXT: bl __trunctfdf288; CHECK-NEXT: ldr q1, [sp, #32] // 16-byte Reload89; CHECK-NEXT: // kill: def $d0 killed $d0 def $z090; CHECK-NEXT: add x8, sp, #12891; CHECK-NEXT: ptrue p0.d, vl292; CHECK-NEXT: mov v0.d[1], v1.d[0]93; CHECK-NEXT: ldr z1, [x8, #1, mul vl] // 16-byte Folded Reload94; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d95; CHECK-NEXT: str z0, [x8, #1, mul vl] // 16-byte Folded Spill96; CHECK-NEXT: ldr q0, [sp, #64] // 16-byte Reload97; CHECK-NEXT: bl __trunctfdf298; CHECK-NEXT: // kill: def $d0 killed $d0 def $q099; CHECK-NEXT: str q0, [sp, #64] // 16-byte Spill100; CHECK-NEXT: ldr q0, [sp, #80] // 16-byte Reload101; CHECK-NEXT: bl __trunctfdf2102; CHECK-NEXT: ldr q1, [sp, #64] // 16-byte Reload103; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0104; CHECK-NEXT: add x8, sp, #128105; CHECK-NEXT: mov v0.d[1], v1.d[0]106; CHECK-NEXT: str z0, [x8] // 16-byte Folded Spill107; CHECK-NEXT: ldr q0, [sp, #96] // 16-byte Reload108; CHECK-NEXT: bl __trunctfdf2109; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0110; CHECK-NEXT: str q0, [sp, #96] // 16-byte Spill111; CHECK-NEXT: ldr q0, [sp, #112] // 16-byte Reload112; CHECK-NEXT: bl __trunctfdf2113; CHECK-NEXT: ldr q1, [sp, #96] // 16-byte Reload114; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0115; CHECK-NEXT: add x8, sp, #128116; CHECK-NEXT: ptrue p0.d, vl2117; CHECK-NEXT: mov v0.d[1], v1.d[0]118; CHECK-NEXT: ldr z1, [x8] // 16-byte Folded Reload119; CHECK-NEXT: mov x8, #4 // =0x4120; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d121; CHECK-NEXT: ptrue p0.d, vl4122; CHECK-NEXT: st1d { z0.d }, p0, [x19, x8, lsl #3]123; CHECK-NEXT: add x8, sp, #128124; CHECK-NEXT: ldr z0, [x8, #1, mul vl] // 16-byte Folded Reload125; CHECK-NEXT: st1d { z0.d }, p0, [x19]126; CHECK-NEXT: addvl sp, sp, #2127; CHECK-NEXT: add sp, sp, #128128; CHECK-NEXT: ldp x30, x19, [sp, #16] // 16-byte Folded Reload129; CHECK-NEXT: ldr x29, [sp], #32 // 8-byte Folded Reload130; CHECK-NEXT: ret131 %op1 = load <8 x fp128>, ptr %a132 %res = fptrunc <8 x fp128> %op1 to <8 x double>133 store <8 x double> %res, ptr %b134 ret void135}136 137attributes #0 = { nounwind "target-features"="+sve" }138