1dbe8def9Shuhu233; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2*39a0aa58SEli Friedman; RUN: llc -mtriple=aarch64 -mattr=+sve < %s -o - | FileCheck -check-prefixes=SVE,SVELINUX %s 3*39a0aa58SEli Friedman; RUN: llc -mtriple=aarch64-windows-msvc -mattr=+sve < %s -o - | FileCheck -check-prefixes=SVE,SVEWINDOWS %s 4*39a0aa58SEli Friedman; RUN: llc -mtriple=aarch64-windows-msvc < %s -o - | FileCheck -check-prefixes=WINDOWS %s 5dbe8def9Shuhu233 6dbe8def9Shuhu233define double @testExp(double %val, i32 %a) { 7*39a0aa58SEli Friedman; SVE-LABEL: testExp: 8*39a0aa58SEli Friedman; SVE: // %bb.0: // %entry 9*39a0aa58SEli Friedman; SVE-NEXT: // kill: def $w0 killed $w0 def $x0 10*39a0aa58SEli Friedman; SVE-NEXT: sxtw x8, w0 11*39a0aa58SEli Friedman; SVE-NEXT: ptrue p0.d 12*39a0aa58SEli Friedman; SVE-NEXT: // kill: def $d0 killed $d0 def $z0 13*39a0aa58SEli Friedman; SVE-NEXT: fmov d1, x8 14*39a0aa58SEli Friedman; SVE-NEXT: fscale z0.d, p0/m, z0.d, z1.d 15*39a0aa58SEli Friedman; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0 16*39a0aa58SEli Friedman; SVE-NEXT: ret 17*39a0aa58SEli Friedman; 18*39a0aa58SEli Friedman; WINDOWS-LABEL: testExp: 19*39a0aa58SEli Friedman; WINDOWS: // %bb.0: // %entry 20*39a0aa58SEli Friedman; WINDOWS-NEXT: b ldexp 21dbe8def9Shuhu233entry: 22dbe8def9Shuhu233 %call = tail call fast double @ldexp(double %val, i32 %a) 23dbe8def9Shuhu233 ret double %call 24dbe8def9Shuhu233} 25dbe8def9Shuhu233 26dbe8def9Shuhu233declare double @ldexp(double, i32) memory(none) 27dbe8def9Shuhu233 28*39a0aa58SEli Friedmandefine double @testExpIntrinsic(double %val, i32 %a) { 29*39a0aa58SEli Friedman; SVE-LABEL: testExpIntrinsic: 30*39a0aa58SEli Friedman; SVE: // %bb.0: // %entry 31*39a0aa58SEli Friedman; SVE-NEXT: // kill: def $w0 killed $w0 def $x0 32*39a0aa58SEli Friedman; SVE-NEXT: sxtw x8, w0 33*39a0aa58SEli Friedman; SVE-NEXT: ptrue p0.d 34*39a0aa58SEli Friedman; SVE-NEXT: // kill: def $d0 killed $d0 def $z0 35*39a0aa58SEli Friedman; SVE-NEXT: fmov d1, x8 36*39a0aa58SEli Friedman; SVE-NEXT: fscale z0.d, p0/m, z0.d, z1.d 37*39a0aa58SEli Friedman; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0 38*39a0aa58SEli Friedman; SVE-NEXT: ret 39*39a0aa58SEli Friedman; 40*39a0aa58SEli Friedman; WINDOWS-LABEL: testExpIntrinsic: 41*39a0aa58SEli Friedman; WINDOWS: // %bb.0: // %entry 42*39a0aa58SEli Friedman; WINDOWS-NEXT: b ldexp 43*39a0aa58SEli Friedmanentry: 44*39a0aa58SEli Friedman %call = tail call fast double @llvm.ldexp.f64(double %val, i32 %a) 45*39a0aa58SEli Friedman ret double %call 46*39a0aa58SEli Friedman} 47*39a0aa58SEli Friedman 48dbe8def9Shuhu233define float @testExpf(float %val, i32 %a) { 49*39a0aa58SEli Friedman; SVELINUX-LABEL: testExpf: 50*39a0aa58SEli Friedman; SVELINUX: // %bb.0: // %entry 51*39a0aa58SEli Friedman; SVELINUX-NEXT: fmov s1, w0 52*39a0aa58SEli Friedman; SVELINUX-NEXT: ptrue p0.s 53*39a0aa58SEli Friedman; SVELINUX-NEXT: // kill: def $s0 killed $s0 def $z0 54*39a0aa58SEli Friedman; SVELINUX-NEXT: fscale z0.s, p0/m, z0.s, z1.s 55*39a0aa58SEli Friedman; SVELINUX-NEXT: // kill: def $s0 killed $s0 killed $z0 56*39a0aa58SEli Friedman; SVELINUX-NEXT: ret 57*39a0aa58SEli Friedman; 58*39a0aa58SEli Friedman; SVEWINDOWS-LABEL: testExpf: 59*39a0aa58SEli Friedman; SVEWINDOWS: // %bb.0: // %entry 60*39a0aa58SEli Friedman; SVEWINDOWS-NEXT: b ldexpf 61*39a0aa58SEli Friedman; 62*39a0aa58SEli Friedman; WINDOWS-LABEL: testExpf: 63*39a0aa58SEli Friedman; WINDOWS: // %bb.0: // %entry 64*39a0aa58SEli Friedman; WINDOWS-NEXT: b ldexpf 65dbe8def9Shuhu233entry: 66dbe8def9Shuhu233 %call = tail call fast float @ldexpf(float %val, i32 %a) 67dbe8def9Shuhu233 ret float %call 68dbe8def9Shuhu233} 69dbe8def9Shuhu233 70*39a0aa58SEli Friedmandefine float @testExpfIntrinsic(float %val, i32 %a) { 71*39a0aa58SEli Friedman; SVE-LABEL: testExpfIntrinsic: 72*39a0aa58SEli Friedman; SVE: // %bb.0: // %entry 73*39a0aa58SEli Friedman; SVE-NEXT: fmov s1, w0 74*39a0aa58SEli Friedman; SVE-NEXT: ptrue p0.s 75*39a0aa58SEli Friedman; SVE-NEXT: // kill: def $s0 killed $s0 def $z0 76*39a0aa58SEli Friedman; SVE-NEXT: fscale z0.s, p0/m, z0.s, z1.s 77*39a0aa58SEli Friedman; SVE-NEXT: // kill: def $s0 killed $s0 killed $z0 78*39a0aa58SEli Friedman; SVE-NEXT: ret 79*39a0aa58SEli Friedman; 80*39a0aa58SEli Friedman; WINDOWS-LABEL: testExpfIntrinsic: 81*39a0aa58SEli Friedman; WINDOWS: .seh_proc testExpfIntrinsic 82*39a0aa58SEli Friedman; WINDOWS-NEXT: // %bb.0: // %entry 83*39a0aa58SEli Friedman; WINDOWS-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 84*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_save_reg_x x30, 16 85*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_endprologue 86*39a0aa58SEli Friedman; WINDOWS-NEXT: fcvt d0, s0 87*39a0aa58SEli Friedman; WINDOWS-NEXT: bl ldexp 88*39a0aa58SEli Friedman; WINDOWS-NEXT: fcvt s0, d0 89*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_startepilogue 90*39a0aa58SEli Friedman; WINDOWS-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 91*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_save_reg_x x30, 16 92*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_endepilogue 93*39a0aa58SEli Friedman; WINDOWS-NEXT: ret 94*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_endfunclet 95*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_endproc 96*39a0aa58SEli Friedmanentry: 97*39a0aa58SEli Friedman %call = tail call fast float @llvm.ldexp.f32(float %val, i32 %a) 98*39a0aa58SEli Friedman ret float %call 99*39a0aa58SEli Friedman} 100*39a0aa58SEli Friedman 101*39a0aa58SEli Friedman 102dbe8def9Shuhu233declare float @ldexpf(float, i32) memory(none) 103dbe8def9Shuhu233 104dbe8def9Shuhu233define fp128 @testExpl(fp128 %val, i32 %a) { 105*39a0aa58SEli Friedman; SVE-LABEL: testExpl: 106*39a0aa58SEli Friedman; SVE: // %bb.0: // %entry 107*39a0aa58SEli Friedman; SVE-NEXT: b ldexpl 108*39a0aa58SEli Friedman; 109*39a0aa58SEli Friedman; WINDOWS-LABEL: testExpl: 110*39a0aa58SEli Friedman; WINDOWS: // %bb.0: // %entry 111*39a0aa58SEli Friedman; WINDOWS-NEXT: b ldexpl 112dbe8def9Shuhu233entry: 113dbe8def9Shuhu233 %call = tail call fast fp128 @ldexpl(fp128 %val, i32 %a) 114dbe8def9Shuhu233 ret fp128 %call 115dbe8def9Shuhu233} 116dbe8def9Shuhu233 117dbe8def9Shuhu233declare fp128 @ldexpl(fp128, i32) memory(none) 118dbe8def9Shuhu233 119dbe8def9Shuhu233define half @testExpf16(half %val, i32 %a) { 120*39a0aa58SEli Friedman; SVE-LABEL: testExpf16: 121*39a0aa58SEli Friedman; SVE: // %bb.0: // %entry 122*39a0aa58SEli Friedman; SVE-NEXT: fcvt s0, h0 123*39a0aa58SEli Friedman; SVE-NEXT: fmov s1, w0 124*39a0aa58SEli Friedman; SVE-NEXT: ptrue p0.s 125*39a0aa58SEli Friedman; SVE-NEXT: fscale z0.s, p0/m, z0.s, z1.s 126*39a0aa58SEli Friedman; SVE-NEXT: fcvt h0, s0 127*39a0aa58SEli Friedman; SVE-NEXT: ret 128*39a0aa58SEli Friedman; 129*39a0aa58SEli Friedman; WINDOWS-LABEL: testExpf16: 130*39a0aa58SEli Friedman; WINDOWS: .seh_proc testExpf16 131*39a0aa58SEli Friedman; WINDOWS-NEXT: // %bb.0: // %entry 132*39a0aa58SEli Friedman; WINDOWS-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 133*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_save_reg_x x30, 16 134*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_endprologue 135*39a0aa58SEli Friedman; WINDOWS-NEXT: fcvt d0, h0 136*39a0aa58SEli Friedman; WINDOWS-NEXT: bl ldexp 137*39a0aa58SEli Friedman; WINDOWS-NEXT: fcvt h0, d0 138*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_startepilogue 139*39a0aa58SEli Friedman; WINDOWS-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 140*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_save_reg_x x30, 16 141*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_endepilogue 142*39a0aa58SEli Friedman; WINDOWS-NEXT: ret 143*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_endfunclet 144*39a0aa58SEli Friedman; WINDOWS-NEXT: .seh_endproc 145dbe8def9Shuhu233entry: 146dbe8def9Shuhu233 %0 = tail call fast half @llvm.ldexp.f16.i32(half %val, i32 %a) 147dbe8def9Shuhu233 ret half %0 148dbe8def9Shuhu233} 149dbe8def9Shuhu233 150dbe8def9Shuhu233declare half @llvm.ldexp.f16.i32(half, i32) memory(none) 151