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