1*9880d681SAndroid Build Coastguard Worker; Verify that scalar integer conversions to FP compile successfully 2*9880d681SAndroid Build Coastguard Worker; (at one time long double failed with avx512f), and that reasonable 3*9880d681SAndroid Build Coastguard Worker; instruction sequences are selected based on subtarget features. 4*9880d681SAndroid Build Coastguard Worker; Due to the plethora of reasonable sequences we just check for 5*9880d681SAndroid Build Coastguard Worker; one key instruction, usually a cvt or fild, allowing the test 6*9880d681SAndroid Build Coastguard Worker; to be relatively easily updated when sequences are improved. 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_32 9*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512_64 10*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_32 11*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE2_64 12*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=-sse | FileCheck %s --check-prefix=CHECK --check-prefix=X87 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u32_to_f 15*9880d681SAndroid Build Coastguard Worker; AVX512_32: vcvtusi2ssl 16*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtusi2ssl 17*9880d681SAndroid Build Coastguard Worker; SSE2_32: cvtsd2ss 18*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2ssq 19*9880d681SAndroid Build Coastguard Worker; X87: fildll 20*9880d681SAndroid Build Coastguard Workerdefine float @u32_to_f(i32 %a) nounwind { 21*9880d681SAndroid Build Coastguard Worker %r = uitofp i32 %a to float 22*9880d681SAndroid Build Coastguard Worker ret float %r 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s32_to_f 26*9880d681SAndroid Build Coastguard Worker; AVX512_32: vcvtsi2ssl 27*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtsi2ssl 28*9880d681SAndroid Build Coastguard Worker; SSE2_32: cvtsi2ssl 29*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2ssl 30*9880d681SAndroid Build Coastguard Worker; X87: fildl 31*9880d681SAndroid Build Coastguard Workerdefine float @s32_to_f(i32 %a) nounwind { 32*9880d681SAndroid Build Coastguard Worker %r = sitofp i32 %a to float 33*9880d681SAndroid Build Coastguard Worker ret float %r 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u32_to_d 37*9880d681SAndroid Build Coastguard Worker; AVX512_32: vcvtusi2sdl 38*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtusi2sdl 39*9880d681SAndroid Build Coastguard Worker; SSE2_32: subsd 40*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2sdq 41*9880d681SAndroid Build Coastguard Worker; X87: fildll 42*9880d681SAndroid Build Coastguard Workerdefine double @u32_to_d(i32 %a) nounwind { 43*9880d681SAndroid Build Coastguard Worker %r = uitofp i32 %a to double 44*9880d681SAndroid Build Coastguard Worker ret double %r 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s32_to_d 48*9880d681SAndroid Build Coastguard Worker; AVX512_32: vcvtsi2sdl 49*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtsi2sdl 50*9880d681SAndroid Build Coastguard Worker; SSE2_32: cvtsi2sdl 51*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2sdl 52*9880d681SAndroid Build Coastguard Worker; X87: fildl 53*9880d681SAndroid Build Coastguard Workerdefine double @s32_to_d(i32 %a) nounwind { 54*9880d681SAndroid Build Coastguard Worker %r = sitofp i32 %a to double 55*9880d681SAndroid Build Coastguard Worker ret double %r 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u32_to_x 59*9880d681SAndroid Build Coastguard Worker; AVX512_32: vsubsd 60*9880d681SAndroid Build Coastguard Worker; AVX512_64: vsubsd 61*9880d681SAndroid Build Coastguard Worker; SSE2_32: subsd 62*9880d681SAndroid Build Coastguard Worker; SSE2_64: fildll 63*9880d681SAndroid Build Coastguard Worker; X87: fildll 64*9880d681SAndroid Build Coastguard Workerdefine x86_fp80 @u32_to_x(i32 %a) nounwind { 65*9880d681SAndroid Build Coastguard Worker %r = uitofp i32 %a to x86_fp80 66*9880d681SAndroid Build Coastguard Worker ret x86_fp80 %r 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s32_to_x 70*9880d681SAndroid Build Coastguard Worker; CHECK: fildl 71*9880d681SAndroid Build Coastguard Workerdefine x86_fp80 @s32_to_x(i32 %a) nounwind { 72*9880d681SAndroid Build Coastguard Worker %r = sitofp i32 %a to x86_fp80 73*9880d681SAndroid Build Coastguard Worker ret x86_fp80 %r 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u64_to_f 77*9880d681SAndroid Build Coastguard Worker; AVX512_32: vmovq {{.*#+}} xmm0 = mem[0],zero 78*9880d681SAndroid Build Coastguard Worker; AVX512_32: vmovlpd %xmm0, {{[0-9]+}}(%esp) 79*9880d681SAndroid Build Coastguard Worker; AVX512_32: fildll 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtusi2ssq 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; SSE2_32: movq {{.*#+}} xmm0 = mem[0],zero 84*9880d681SAndroid Build Coastguard Worker; SSE2_32: movq %xmm0, {{[0-9]+}}(%esp) 85*9880d681SAndroid Build Coastguard Worker; SSE2_32: fildll 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2ssq 88*9880d681SAndroid Build Coastguard Worker; X87: fildll 89*9880d681SAndroid Build Coastguard Workerdefine float @u64_to_f(i64 %a) nounwind { 90*9880d681SAndroid Build Coastguard Worker %r = uitofp i64 %a to float 91*9880d681SAndroid Build Coastguard Worker ret float %r 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s64_to_f 95*9880d681SAndroid Build Coastguard Worker; AVX512_32: fildll 96*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtsi2ssq 97*9880d681SAndroid Build Coastguard Worker; SSE2_32: fildll 98*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2ssq 99*9880d681SAndroid Build Coastguard Worker; X87: fildll 100*9880d681SAndroid Build Coastguard Workerdefine float @s64_to_f(i64 %a) nounwind { 101*9880d681SAndroid Build Coastguard Worker %r = sitofp i64 %a to float 102*9880d681SAndroid Build Coastguard Worker ret float %r 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s64_to_f_2 106*9880d681SAndroid Build Coastguard Worker; SSE2_32: movd %ecx, %xmm0 107*9880d681SAndroid Build Coastguard Worker; SSE2_32: movd %eax, %xmm1 108*9880d681SAndroid Build Coastguard Worker; SSE2_32: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 109*9880d681SAndroid Build Coastguard Worker; SSE2_32: movq %xmm1, {{[0-9]+}}(%esp) 110*9880d681SAndroid Build Coastguard Worker; SSE2_32: fildll {{[0-9]+}}(%esp) 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; AVX512_32: vmovd %eax, %xmm0 113*9880d681SAndroid Build Coastguard Worker; AVX512_32: vpinsrd $1, %ecx, %xmm0, %xmm0 114*9880d681SAndroid Build Coastguard Worker; AVX512_32: vmovlpd %xmm0, {{[0-9]+}}(%esp) 115*9880d681SAndroid Build Coastguard Worker; AVX512_32: fildll {{[0-9]+}}(%esp) 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine float @s64_to_f_2(i64 %a) nounwind { 118*9880d681SAndroid Build Coastguard Worker %a1 = add i64 %a, 5 119*9880d681SAndroid Build Coastguard Worker %r = sitofp i64 %a1 to float 120*9880d681SAndroid Build Coastguard Worker ret float %r 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u64_to_d 124*9880d681SAndroid Build Coastguard Worker; AVX512_32: vpunpckldq 125*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtusi2sdq 126*9880d681SAndroid Build Coastguard Worker; SSE2_32: punpckldq 127*9880d681SAndroid Build Coastguard Worker; SSE2_64: punpckldq 128*9880d681SAndroid Build Coastguard Worker; X87: fildll 129*9880d681SAndroid Build Coastguard Workerdefine double @u64_to_d(i64 %a) nounwind { 130*9880d681SAndroid Build Coastguard Worker %r = uitofp i64 %a to double 131*9880d681SAndroid Build Coastguard Worker ret double %r 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s64_to_d 135*9880d681SAndroid Build Coastguard Worker; AVX512_32: fildll 136*9880d681SAndroid Build Coastguard Worker; AVX512_64: vcvtsi2sdq 137*9880d681SAndroid Build Coastguard Worker; SSE2_32: fildll 138*9880d681SAndroid Build Coastguard Worker; SSE2_64: cvtsi2sdq 139*9880d681SAndroid Build Coastguard Worker; X87: fildll 140*9880d681SAndroid Build Coastguard Workerdefine double @s64_to_d(i64 %a) nounwind { 141*9880d681SAndroid Build Coastguard Worker %r = sitofp i64 %a to double 142*9880d681SAndroid Build Coastguard Worker ret double %r 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s64_to_d_2 146*9880d681SAndroid Build Coastguard Worker; SSE2_32: movd %ecx, %xmm0 147*9880d681SAndroid Build Coastguard Worker; SSE2_32: movd %eax, %xmm1 148*9880d681SAndroid Build Coastguard Worker; SSE2_32: punpckldq %xmm0, %xmm1 149*9880d681SAndroid Build Coastguard Worker; SSE2_32: movq %xmm1, {{[0-9]+}}(%esp) 150*9880d681SAndroid Build Coastguard Worker; SSE2_32: fildll 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker; AVX512_32: vmovd %eax, %xmm0 153*9880d681SAndroid Build Coastguard Worker; AVX512_32: vpinsrd $1, %ecx, %xmm0, %xmm0 154*9880d681SAndroid Build Coastguard Worker; AVX512_32: vmovlpd %xmm0, {{[0-9]+}}(%esp) 155*9880d681SAndroid Build Coastguard Worker; AVX512_32: fildll 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerdefine double @s64_to_d_2(i64 %a) nounwind { 158*9880d681SAndroid Build Coastguard Worker %b = add i64 %a, 5 159*9880d681SAndroid Build Coastguard Worker %f = sitofp i64 %b to double 160*9880d681SAndroid Build Coastguard Worker ret double %f 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: u64_to_x 164*9880d681SAndroid Build Coastguard Worker; CHECK: fildll 165*9880d681SAndroid Build Coastguard Workerdefine x86_fp80 @u64_to_x(i64 %a) nounwind { 166*9880d681SAndroid Build Coastguard Worker %r = uitofp i64 %a to x86_fp80 167*9880d681SAndroid Build Coastguard Worker ret x86_fp80 %r 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: s64_to_x 171*9880d681SAndroid Build Coastguard Worker; CHECK: fildll 172*9880d681SAndroid Build Coastguard Workerdefine x86_fp80 @s64_to_x(i64 %a) nounwind { 173*9880d681SAndroid Build Coastguard Worker %r = sitofp i64 %a to x86_fp80 174*9880d681SAndroid Build Coastguard Worker ret x86_fp80 %r 175*9880d681SAndroid Build Coastguard Worker} 176