267 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc -mtriple=aarch64 -mattr=+sve < %s -o - | FileCheck -check-prefixes=SVE,SVELINUX %s3; RUN: llc -mtriple=aarch64 -global-isel < %s -o - | FileCheck -check-prefixes=GISEL %s4; RUN: llc -mtriple=aarch64-windows-msvc -mattr=+sve < %s -o - | FileCheck -check-prefixes=SVE,SVEWINDOWS %s5; RUN: llc -mtriple=aarch64-windows-msvc < %s -o - | FileCheck -check-prefixes=WINDOWS %s6 7define double @testExp(double %val, i32 %a) {8; SVE-LABEL: testExp:9; SVE: // %bb.0: // %entry10; SVE-NEXT: // kill: def $w0 killed $w0 def $x011; SVE-NEXT: sxtw x8, w012; SVE-NEXT: ptrue p0.d13; SVE-NEXT: // kill: def $d0 killed $d0 def $z014; SVE-NEXT: fmov d1, x815; SVE-NEXT: fscale z0.d, p0/m, z0.d, z1.d16; SVE-NEXT: // kill: def $d0 killed $d0 killed $z017; SVE-NEXT: ret18;19; GISEL-LABEL: testExp:20; GISEL: // %bb.0: // %entry21; GISEL-NEXT: b ldexp22;23; WINDOWS-LABEL: testExp:24; WINDOWS: // %bb.0: // %entry25; WINDOWS-NEXT: b ldexp26entry:27 %call = tail call fast double @ldexp(double %val, i32 %a)28 ret double %call29}30 31declare double @ldexp(double, i32) memory(none)32 33define double @testExpIntrinsic(double %val, i32 %a) {34; SVE-LABEL: testExpIntrinsic:35; SVE: // %bb.0: // %entry36; SVE-NEXT: // kill: def $w0 killed $w0 def $x037; SVE-NEXT: sxtw x8, w038; SVE-NEXT: ptrue p0.d39; SVE-NEXT: // kill: def $d0 killed $d0 def $z040; SVE-NEXT: fmov d1, x841; SVE-NEXT: fscale z0.d, p0/m, z0.d, z1.d42; SVE-NEXT: // kill: def $d0 killed $d0 killed $z043; SVE-NEXT: ret44;45; GISEL-LABEL: testExpIntrinsic:46; GISEL: // %bb.0: // %entry47; GISEL-NEXT: b ldexp48;49; WINDOWS-LABEL: testExpIntrinsic:50; WINDOWS: // %bb.0: // %entry51; WINDOWS-NEXT: b ldexp52entry:53 %call = tail call fast double @llvm.ldexp.f64(double %val, i32 %a)54 ret double %call55}56 57define float @testExpf(float %val, i32 %a) {58; SVELINUX-LABEL: testExpf:59; SVELINUX: // %bb.0: // %entry60; SVELINUX-NEXT: fmov s1, w061; SVELINUX-NEXT: ptrue p0.s62; SVELINUX-NEXT: // kill: def $s0 killed $s0 def $z063; SVELINUX-NEXT: fscale z0.s, p0/m, z0.s, z1.s64; SVELINUX-NEXT: // kill: def $s0 killed $s0 killed $z065; SVELINUX-NEXT: ret66;67; GISEL-LABEL: testExpf:68; GISEL: // %bb.0: // %entry69; GISEL-NEXT: b ldexpf70;71; SVEWINDOWS-LABEL: testExpf:72; SVEWINDOWS: // %bb.0: // %entry73; SVEWINDOWS-NEXT: b ldexpf74;75; WINDOWS-LABEL: testExpf:76; WINDOWS: // %bb.0: // %entry77; WINDOWS-NEXT: b ldexpf78entry:79 %call = tail call fast float @ldexpf(float %val, i32 %a)80 ret float %call81}82 83define float @testExpfIntrinsic(float %val, i32 %a) {84; SVE-LABEL: testExpfIntrinsic:85; SVE: // %bb.0: // %entry86; SVE-NEXT: fmov s1, w087; SVE-NEXT: ptrue p0.s88; SVE-NEXT: // kill: def $s0 killed $s0 def $z089; SVE-NEXT: fscale z0.s, p0/m, z0.s, z1.s90; SVE-NEXT: // kill: def $s0 killed $s0 killed $z091; SVE-NEXT: ret92;93; GISEL-LABEL: testExpfIntrinsic:94; GISEL: // %bb.0: // %entry95; GISEL-NEXT: b ldexpf96;97; WINDOWS-LABEL: testExpfIntrinsic:98; WINDOWS: .seh_proc testExpfIntrinsic99; WINDOWS-NEXT: // %bb.0: // %entry100; WINDOWS-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill101; WINDOWS-NEXT: .seh_save_reg_x x30, 16102; WINDOWS-NEXT: .seh_endprologue103; WINDOWS-NEXT: fcvt d0, s0104; WINDOWS-NEXT: bl ldexp105; WINDOWS-NEXT: fcvt s0, d0106; WINDOWS-NEXT: .seh_startepilogue107; WINDOWS-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload108; WINDOWS-NEXT: .seh_save_reg_x x30, 16109; WINDOWS-NEXT: .seh_endepilogue110; WINDOWS-NEXT: ret111; WINDOWS-NEXT: .seh_endfunclet112; WINDOWS-NEXT: .seh_endproc113entry:114 %call = tail call fast float @llvm.ldexp.f32(float %val, i32 %a)115 ret float %call116}117 118define <2 x float> @test_ldexp_v2f32_v2i32(<2 x float> %Val, <2 x i32> %Exp) {119; SVE-LABEL: test_ldexp_v2f32_v2i32:120; SVE: // %bb.0:121; SVE-NEXT: // kill: def $d1 killed $d1 def $z1122; SVE-NEXT: mov w8, v1.s[1]123; SVE-NEXT: // kill: def $d0 killed $d0 def $z0124; SVE-NEXT: mov s2, v0.s[1]125; SVE-NEXT: ptrue p0.s126; SVE-NEXT: fscale z0.s, p0/m, z0.s, z1.s127; SVE-NEXT: fmov s3, w8128; SVE-NEXT: fscale z2.s, p0/m, z2.s, z3.s129; SVE-NEXT: mov v0.s[1], v2.s[0]130; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0131; SVE-NEXT: ret132;133; GISEL-LABEL: test_ldexp_v2f32_v2i32:134; GISEL: // %bb.0:135; GISEL-NEXT: sub sp, sp, #48136; GISEL-NEXT: stp d9, d8, [sp, #16] // 16-byte Folded Spill137; GISEL-NEXT: str x30, [sp, #32] // 8-byte Spill138; GISEL-NEXT: .cfi_def_cfa_offset 48139; GISEL-NEXT: .cfi_offset w30, -16140; GISEL-NEXT: .cfi_offset b8, -24141; GISEL-NEXT: .cfi_offset b9, -32142; GISEL-NEXT: // kill: def $d1 killed $d1 def $q1143; GISEL-NEXT: fmov w0, s1144; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0145; GISEL-NEXT: mov s8, v0.s[1]146; GISEL-NEXT: mov s9, v1.s[1]147; GISEL-NEXT: // kill: def $s0 killed $s0 killed $q0148; GISEL-NEXT: bl ldexpf149; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0150; GISEL-NEXT: str q0, [sp] // 16-byte Spill151; GISEL-NEXT: fmov w0, s9152; GISEL-NEXT: fmov s0, s8153; GISEL-NEXT: bl ldexpf154; GISEL-NEXT: ldr q1, [sp] // 16-byte Reload155; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0156; GISEL-NEXT: ldp d9, d8, [sp, #16] // 16-byte Folded Reload157; GISEL-NEXT: ldr x30, [sp, #32] // 8-byte Reload158; GISEL-NEXT: mov v1.s[1], v0.s[0]159; GISEL-NEXT: fmov d0, d1160; GISEL-NEXT: add sp, sp, #48161; GISEL-NEXT: ret162;163; WINDOWS-LABEL: test_ldexp_v2f32_v2i32:164; WINDOWS: .seh_proc test_ldexp_v2f32_v2i32165; WINDOWS-NEXT: // %bb.0:166; WINDOWS-NEXT: sub sp, sp, #48167; WINDOWS-NEXT: .seh_stackalloc 48168; WINDOWS-NEXT: str x30, [sp, #32] // 8-byte Spill169; WINDOWS-NEXT: .seh_save_reg x30, 32170; WINDOWS-NEXT: .seh_endprologue171; WINDOWS-NEXT: // kill: def $d0 killed $d0 def $q0172; WINDOWS-NEXT: mov s2, v0.s[1]173; WINDOWS-NEXT: // kill: def $d1 killed $d1 def $q1174; WINDOWS-NEXT: stp q1, q0, [sp] // 32-byte Folded Spill175; WINDOWS-NEXT: mov w0, v1.s[1]176; WINDOWS-NEXT: fcvt d0, s2177; WINDOWS-NEXT: bl ldexp178; WINDOWS-NEXT: ldr q1, [sp, #16] // 16-byte Reload179; WINDOWS-NEXT: fcvt s0, d0180; WINDOWS-NEXT: fcvt d1, s1181; WINDOWS-NEXT: str q0, [sp, #16] // 16-byte Spill182; WINDOWS-NEXT: ldr q0, [sp] // 16-byte Reload183; WINDOWS-NEXT: fmov w0, s0184; WINDOWS-NEXT: fmov d0, d1185; WINDOWS-NEXT: bl ldexp186; WINDOWS-NEXT: fcvt s0, d0187; WINDOWS-NEXT: ldr q1, [sp, #16] // 16-byte Reload188; WINDOWS-NEXT: mov v0.s[1], v1.s[0]189; WINDOWS-NEXT: // kill: def $d0 killed $d0 killed $q0190; WINDOWS-NEXT: .seh_startepilogue191; WINDOWS-NEXT: ldr x30, [sp, #32] // 8-byte Reload192; WINDOWS-NEXT: .seh_save_reg x30, 32193; WINDOWS-NEXT: add sp, sp, #48194; WINDOWS-NEXT: .seh_stackalloc 48195; WINDOWS-NEXT: .seh_endepilogue196; WINDOWS-NEXT: ret197; WINDOWS-NEXT: .seh_endfunclet198; WINDOWS-NEXT: .seh_endproc199 %result = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %Val, <2 x i32> %Exp)200 ret <2 x float> %result201}202 203declare float @ldexpf(float, i32) memory(none)204 205define fp128 @testExpl(fp128 %val, i32 %a) {206; SVE-LABEL: testExpl:207; SVE: // %bb.0: // %entry208; SVE-NEXT: b ldexpl209;210; GISEL-LABEL: testExpl:211; GISEL: // %bb.0: // %entry212; GISEL-NEXT: b ldexpl213;214; WINDOWS-LABEL: testExpl:215; WINDOWS: // %bb.0: // %entry216; WINDOWS-NEXT: b ldexpl217entry:218 %call = tail call fast fp128 @ldexpl(fp128 %val, i32 %a)219 ret fp128 %call220}221 222declare fp128 @ldexpl(fp128, i32) memory(none)223 224define half @testExpf16(half %val, i32 %a) {225; SVE-LABEL: testExpf16:226; SVE: // %bb.0: // %entry227; SVE-NEXT: fcvt s0, h0228; SVE-NEXT: fmov s1, w0229; SVE-NEXT: ptrue p0.s230; SVE-NEXT: fscale z0.s, p0/m, z0.s, z1.s231; SVE-NEXT: fcvt h0, s0232; SVE-NEXT: ret233;234; GISEL-LABEL: testExpf16:235; GISEL: // %bb.0: // %entry236; GISEL-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill237; GISEL-NEXT: .cfi_def_cfa_offset 16238; GISEL-NEXT: .cfi_offset w30, -16239; GISEL-NEXT: fcvt s0, h0240; GISEL-NEXT: bl ldexpf241; GISEL-NEXT: fcvt h0, s0242; GISEL-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload243; GISEL-NEXT: ret244;245; WINDOWS-LABEL: testExpf16:246; WINDOWS: .seh_proc testExpf16247; WINDOWS-NEXT: // %bb.0: // %entry248; WINDOWS-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill249; WINDOWS-NEXT: .seh_save_reg_x x30, 16250; WINDOWS-NEXT: .seh_endprologue251; WINDOWS-NEXT: fcvt d0, h0252; WINDOWS-NEXT: bl ldexp253; WINDOWS-NEXT: fcvt h0, d0254; WINDOWS-NEXT: .seh_startepilogue255; WINDOWS-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload256; WINDOWS-NEXT: .seh_save_reg_x x30, 16257; WINDOWS-NEXT: .seh_endepilogue258; WINDOWS-NEXT: ret259; WINDOWS-NEXT: .seh_endfunclet260; WINDOWS-NEXT: .seh_endproc261entry:262 %0 = tail call fast half @llvm.ldexp.f16.i32(half %val, i32 %a)263 ret half %0264}265 266declare half @llvm.ldexp.f16.i32(half, i32) memory(none)267