Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-half-conversions.ll
blob21533818bac11a9a278915bd69ed6b4d7e3d38c4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx -verify-machineinstrs | FileCheck %s --check-prefixes=AVX,AVX1
3 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx2 -verify-machineinstrs | FileCheck %s --check-prefixes=AVX,AVX2
4 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+f16c -verify-machineinstrs | FileCheck %s --check-prefixes=F16C
5 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+f16c -verify-machineinstrs | FileCheck %s --check-prefixes=F16C
6 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+f16c,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle -verify-machineinstrs | FileCheck %s --check-prefixes=F16C
7 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+f16c,+fast-variable-perlane-shuffle -verify-machineinstrs | FileCheck %s --check-prefixes=F16C
8 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f -verify-machineinstrs | FileCheck %s --check-prefixes=AVX512,AVX512F
9 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle -verify-machineinstrs | FileCheck %s --check-prefixes=AVX512,AVX512-FASTLANE
10 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+fast-variable-perlane-shuffle -verify-machineinstrs | FileCheck %s --check-prefixes=AVX512,AVX512-FASTLANE
13 ; Half to Float
16 define float @cvt_i16_to_f32(i16 %a0) nounwind {
17 ; AVX-LABEL: cvt_i16_to_f32:
18 ; AVX:       # %bb.0:
19 ; AVX-NEXT:    vpinsrw $0, %edi, %xmm0, %xmm0
20 ; AVX-NEXT:    jmp __extendhfsf2@PLT # TAILCALL
22 ; F16C-LABEL: cvt_i16_to_f32:
23 ; F16C:       # %bb.0:
24 ; F16C-NEXT:    movzwl %di, %eax
25 ; F16C-NEXT:    vmovd %eax, %xmm0
26 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
27 ; F16C-NEXT:    retq
29 ; AVX512-LABEL: cvt_i16_to_f32:
30 ; AVX512:       # %bb.0:
31 ; AVX512-NEXT:    movzwl %di, %eax
32 ; AVX512-NEXT:    vmovd %eax, %xmm0
33 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
34 ; AVX512-NEXT:    retq
35   %1 = bitcast i16 %a0 to half
36   %2 = fpext half %1 to float
37   ret float %2
40 define <4 x float> @cvt_4i16_to_4f32(<4 x i16> %a0) nounwind {
41 ; AVX-LABEL: cvt_4i16_to_4f32:
42 ; AVX:       # %bb.0:
43 ; AVX-NEXT:    subq $72, %rsp
44 ; AVX-NEXT:    vmovq %xmm0, %rax
45 ; AVX-NEXT:    movq %rax, %rcx
46 ; AVX-NEXT:    movq %rax, %rdx
47 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
48 ; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
49 ; AVX-NEXT:    shrl $16, %eax
50 ; AVX-NEXT:    shrq $32, %rcx
51 ; AVX-NEXT:    shrq $48, %rdx
52 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm1
53 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
54 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm1
55 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
56 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
57 ; AVX-NEXT:    vmovdqa %xmm1, (%rsp) # 16-byte Spill
58 ; AVX-NEXT:    callq __extendhfsf2@PLT
59 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
60 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
61 ; AVX-NEXT:    callq __extendhfsf2@PLT
62 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
63 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
64 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
65 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
66 ; AVX-NEXT:    callq __extendhfsf2@PLT
67 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
68 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
69 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
70 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
71 ; AVX-NEXT:    callq __extendhfsf2@PLT
72 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
73 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
74 ; AVX-NEXT:    addq $72, %rsp
75 ; AVX-NEXT:    retq
77 ; F16C-LABEL: cvt_4i16_to_4f32:
78 ; F16C:       # %bb.0:
79 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
80 ; F16C-NEXT:    retq
82 ; AVX512-LABEL: cvt_4i16_to_4f32:
83 ; AVX512:       # %bb.0:
84 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
85 ; AVX512-NEXT:    retq
86   %1 = bitcast <4 x i16> %a0 to <4 x half>
87   %2 = fpext <4 x half> %1 to <4 x float>
88   ret <4 x float> %2
91 define <4 x float> @cvt_8i16_to_4f32(<8 x i16> %a0) nounwind {
92 ; AVX-LABEL: cvt_8i16_to_4f32:
93 ; AVX:       # %bb.0:
94 ; AVX-NEXT:    subq $72, %rsp
95 ; AVX-NEXT:    vmovq %xmm0, %rax
96 ; AVX-NEXT:    movq %rax, %rcx
97 ; AVX-NEXT:    movq %rax, %rdx
98 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
99 ; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
100 ; AVX-NEXT:    shrl $16, %eax
101 ; AVX-NEXT:    shrq $32, %rcx
102 ; AVX-NEXT:    shrq $48, %rdx
103 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm1
104 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
105 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm1
106 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
107 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
108 ; AVX-NEXT:    vmovdqa %xmm1, (%rsp) # 16-byte Spill
109 ; AVX-NEXT:    callq __extendhfsf2@PLT
110 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
111 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
112 ; AVX-NEXT:    callq __extendhfsf2@PLT
113 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
114 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
115 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
116 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
117 ; AVX-NEXT:    callq __extendhfsf2@PLT
118 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
119 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
120 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
121 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
122 ; AVX-NEXT:    callq __extendhfsf2@PLT
123 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
124 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
125 ; AVX-NEXT:    addq $72, %rsp
126 ; AVX-NEXT:    retq
128 ; F16C-LABEL: cvt_8i16_to_4f32:
129 ; F16C:       # %bb.0:
130 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
131 ; F16C-NEXT:    retq
133 ; AVX512-LABEL: cvt_8i16_to_4f32:
134 ; AVX512:       # %bb.0:
135 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
136 ; AVX512-NEXT:    retq
137   %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
138   %2 = bitcast <4 x i16> %1 to <4 x half>
139   %3 = fpext <4 x half> %2 to <4 x float>
140   ret <4 x float> %3
143 define <8 x float> @cvt_8i16_to_8f32(<8 x i16> %a0) nounwind {
144 ; AVX-LABEL: cvt_8i16_to_8f32:
145 ; AVX:       # %bb.0:
146 ; AVX-NEXT:    subq $56, %rsp
147 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
148 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
149 ; AVX-NEXT:    callq __extendhfsf2@PLT
150 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
151 ; AVX-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
152 ; AVX-NEXT:    # xmm0 = mem[2,3,0,1]
153 ; AVX-NEXT:    callq __extendhfsf2@PLT
154 ; AVX-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
155 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
156 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
157 ; AVX-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
158 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
159 ; AVX-NEXT:    callq __extendhfsf2@PLT
160 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
161 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
162 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
163 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
164 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
165 ; AVX-NEXT:    callq __extendhfsf2@PLT
166 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
167 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
168 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
169 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
170 ; AVX-NEXT:    callq __extendhfsf2@PLT
171 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
172 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
173 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
174 ; AVX-NEXT:    callq __extendhfsf2@PLT
175 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
176 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
177 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
178 ; AVX-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
179 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
180 ; AVX-NEXT:    callq __extendhfsf2@PLT
181 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
182 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
183 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
184 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
185 ; AVX-NEXT:    vpsrlq $48, %xmm0, %xmm0
186 ; AVX-NEXT:    callq __extendhfsf2@PLT
187 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
188 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
189 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
190 ; AVX-NEXT:    addq $56, %rsp
191 ; AVX-NEXT:    retq
193 ; F16C-LABEL: cvt_8i16_to_8f32:
194 ; F16C:       # %bb.0:
195 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm0
196 ; F16C-NEXT:    retq
198 ; AVX512-LABEL: cvt_8i16_to_8f32:
199 ; AVX512:       # %bb.0:
200 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
201 ; AVX512-NEXT:    retq
202   %1 = bitcast <8 x i16> %a0 to <8 x half>
203   %2 = fpext <8 x half> %1 to <8 x float>
204   ret <8 x float> %2
207 define <16 x float> @cvt_16i16_to_16f32(<16 x i16> %a0) nounwind {
208 ; AVX1-LABEL: cvt_16i16_to_16f32:
209 ; AVX1:       # %bb.0:
210 ; AVX1-NEXT:    subq $104, %rsp
211 ; AVX1-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
212 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
213 ; AVX1-NEXT:    vzeroupper
214 ; AVX1-NEXT:    callq __extendhfsf2@PLT
215 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
216 ; AVX1-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
217 ; AVX1-NEXT:    # xmm0 = mem[2,3,0,1]
218 ; AVX1-NEXT:    callq __extendhfsf2@PLT
219 ; AVX1-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
220 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
221 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
222 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
223 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
224 ; AVX1-NEXT:    callq __extendhfsf2@PLT
225 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
226 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
227 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
228 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
229 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
230 ; AVX1-NEXT:    vzeroupper
231 ; AVX1-NEXT:    callq __extendhfsf2@PLT
232 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
233 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
234 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
235 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
236 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
237 ; AVX1-NEXT:    vzeroupper
238 ; AVX1-NEXT:    callq __extendhfsf2@PLT
239 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
240 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
241 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
242 ; AVX1-NEXT:    vzeroupper
243 ; AVX1-NEXT:    callq __extendhfsf2@PLT
244 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
245 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
246 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
247 ; AVX1-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
248 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
249 ; AVX1-NEXT:    callq __extendhfsf2@PLT
250 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
251 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
252 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
253 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
254 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
255 ; AVX1-NEXT:    vzeroupper
256 ; AVX1-NEXT:    callq __extendhfsf2@PLT
257 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
258 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
259 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
260 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
261 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
262 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
263 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
264 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
265 ; AVX1-NEXT:    vzeroupper
266 ; AVX1-NEXT:    callq __extendhfsf2@PLT
267 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
268 ; AVX1-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
269 ; AVX1-NEXT:    # xmm0 = mem[2,3,0,1]
270 ; AVX1-NEXT:    callq __extendhfsf2@PLT
271 ; AVX1-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
272 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
273 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
274 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
275 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
276 ; AVX1-NEXT:    callq __extendhfsf2@PLT
277 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
278 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
279 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
280 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
281 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
282 ; AVX1-NEXT:    callq __extendhfsf2@PLT
283 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
284 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
285 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
286 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
287 ; AVX1-NEXT:    callq __extendhfsf2@PLT
288 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
289 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
290 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
291 ; AVX1-NEXT:    callq __extendhfsf2@PLT
292 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
293 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
294 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
295 ; AVX1-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
296 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
297 ; AVX1-NEXT:    callq __extendhfsf2@PLT
298 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
299 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
300 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
301 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
302 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
303 ; AVX1-NEXT:    callq __extendhfsf2@PLT
304 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
305 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
306 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
307 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
308 ; AVX1-NEXT:    addq $104, %rsp
309 ; AVX1-NEXT:    retq
311 ; AVX2-LABEL: cvt_16i16_to_16f32:
312 ; AVX2:       # %bb.0:
313 ; AVX2-NEXT:    subq $104, %rsp
314 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
315 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
316 ; AVX2-NEXT:    vzeroupper
317 ; AVX2-NEXT:    callq __extendhfsf2@PLT
318 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
319 ; AVX2-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
320 ; AVX2-NEXT:    # xmm0 = mem[2,3,0,1]
321 ; AVX2-NEXT:    callq __extendhfsf2@PLT
322 ; AVX2-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
323 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
324 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
325 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
326 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
327 ; AVX2-NEXT:    callq __extendhfsf2@PLT
328 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
329 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
330 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
331 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
332 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
333 ; AVX2-NEXT:    vzeroupper
334 ; AVX2-NEXT:    callq __extendhfsf2@PLT
335 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
336 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
337 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
338 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
339 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
340 ; AVX2-NEXT:    vzeroupper
341 ; AVX2-NEXT:    callq __extendhfsf2@PLT
342 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
343 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
344 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
345 ; AVX2-NEXT:    vzeroupper
346 ; AVX2-NEXT:    callq __extendhfsf2@PLT
347 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
348 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
349 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
350 ; AVX2-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
351 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
352 ; AVX2-NEXT:    callq __extendhfsf2@PLT
353 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
354 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
355 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
356 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
357 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
358 ; AVX2-NEXT:    vzeroupper
359 ; AVX2-NEXT:    callq __extendhfsf2@PLT
360 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
361 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
362 ; AVX2-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
363 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
364 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
365 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
366 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
367 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
368 ; AVX2-NEXT:    vzeroupper
369 ; AVX2-NEXT:    callq __extendhfsf2@PLT
370 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
371 ; AVX2-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
372 ; AVX2-NEXT:    # xmm0 = mem[2,3,0,1]
373 ; AVX2-NEXT:    callq __extendhfsf2@PLT
374 ; AVX2-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
375 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
376 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
377 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
378 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
379 ; AVX2-NEXT:    callq __extendhfsf2@PLT
380 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
381 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
382 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
383 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
384 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
385 ; AVX2-NEXT:    callq __extendhfsf2@PLT
386 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
387 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
388 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
389 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
390 ; AVX2-NEXT:    callq __extendhfsf2@PLT
391 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
392 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
393 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
394 ; AVX2-NEXT:    callq __extendhfsf2@PLT
395 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
396 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
397 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
398 ; AVX2-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
399 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
400 ; AVX2-NEXT:    callq __extendhfsf2@PLT
401 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
402 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
403 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
404 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
405 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
406 ; AVX2-NEXT:    callq __extendhfsf2@PLT
407 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
408 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
409 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
410 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
411 ; AVX2-NEXT:    addq $104, %rsp
412 ; AVX2-NEXT:    retq
414 ; F16C-LABEL: cvt_16i16_to_16f32:
415 ; F16C:       # %bb.0:
416 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm2
417 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
418 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm1
419 ; F16C-NEXT:    vmovaps %ymm2, %ymm0
420 ; F16C-NEXT:    retq
422 ; AVX512-LABEL: cvt_16i16_to_16f32:
423 ; AVX512:       # %bb.0:
424 ; AVX512-NEXT:    vcvtph2ps %ymm0, %zmm0
425 ; AVX512-NEXT:    retq
426   %1 = bitcast <16 x i16> %a0 to <16 x half>
427   %2 = fpext <16 x half> %1 to <16 x float>
428   ret <16 x float> %2
431 define <2 x float> @cvt_2i16_to_2f32_constrained(<2 x i16> %a0) nounwind strictfp {
432 ; AVX-LABEL: cvt_2i16_to_2f32_constrained:
433 ; AVX:       # %bb.0:
434 ; AVX-NEXT:    subq $40, %rsp
435 ; AVX-NEXT:    vmovd %xmm0, %eax
436 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
437 ; AVX-NEXT:    shrl $16, %eax
438 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
439 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
440 ; AVX-NEXT:    callq __extendhfsf2@PLT
441 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
442 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
443 ; AVX-NEXT:    callq __extendhfsf2@PLT
444 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
445 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
446 ; AVX-NEXT:    addq $40, %rsp
447 ; AVX-NEXT:    retq
449 ; F16C-LABEL: cvt_2i16_to_2f32_constrained:
450 ; F16C:       # %bb.0:
451 ; F16C-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
452 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
453 ; F16C-NEXT:    retq
455 ; AVX512-LABEL: cvt_2i16_to_2f32_constrained:
456 ; AVX512:       # %bb.0:
457 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
458 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
459 ; AVX512-NEXT:    retq
460   %1 = bitcast <2 x i16> %a0 to <2 x half>
461   %2 = call <2 x float> @llvm.experimental.constrained.fpext.v2f32.v2f16(<2 x half> %1, metadata !"fpexcept.strict") strictfp
462   ret <2 x float> %2
464 declare <2 x float> @llvm.experimental.constrained.fpext.v2f32.v2f16(<2 x half>, metadata) strictfp
466 define <4 x float> @cvt_4i16_to_4f32_constrained(<4 x i16> %a0) nounwind strictfp {
467 ; AVX-LABEL: cvt_4i16_to_4f32_constrained:
468 ; AVX:       # %bb.0:
469 ; AVX-NEXT:    subq $72, %rsp
470 ; AVX-NEXT:    vmovq %xmm0, %rax
471 ; AVX-NEXT:    movq %rax, %rcx
472 ; AVX-NEXT:    movq %rax, %rdx
473 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
474 ; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
475 ; AVX-NEXT:    shrl $16, %eax
476 ; AVX-NEXT:    shrq $32, %rcx
477 ; AVX-NEXT:    shrq $48, %rdx
478 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm1
479 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
480 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm1
481 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
482 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
483 ; AVX-NEXT:    vmovdqa %xmm1, (%rsp) # 16-byte Spill
484 ; AVX-NEXT:    callq __extendhfsf2@PLT
485 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
486 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
487 ; AVX-NEXT:    callq __extendhfsf2@PLT
488 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
489 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
490 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
491 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
492 ; AVX-NEXT:    callq __extendhfsf2@PLT
493 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
494 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
495 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
496 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
497 ; AVX-NEXT:    callq __extendhfsf2@PLT
498 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
499 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
500 ; AVX-NEXT:    addq $72, %rsp
501 ; AVX-NEXT:    retq
503 ; F16C-LABEL: cvt_4i16_to_4f32_constrained:
504 ; F16C:       # %bb.0:
505 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
506 ; F16C-NEXT:    retq
508 ; AVX512-LABEL: cvt_4i16_to_4f32_constrained:
509 ; AVX512:       # %bb.0:
510 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
511 ; AVX512-NEXT:    retq
512   %1 = bitcast <4 x i16> %a0 to <4 x half>
513   %2 = call <4 x float> @llvm.experimental.constrained.fpext.v4f32.v4f16(<4 x half> %1, metadata !"fpexcept.strict") strictfp
514   ret <4 x float> %2
516 declare <4 x float> @llvm.experimental.constrained.fpext.v4f32.v4f16(<4 x half>, metadata) strictfp
518 define <8 x float> @cvt_8i16_to_8f32_constrained(<8 x i16> %a0) nounwind strictfp {
519 ; AVX-LABEL: cvt_8i16_to_8f32_constrained:
520 ; AVX:       # %bb.0:
521 ; AVX-NEXT:    subq $56, %rsp
522 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
523 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
524 ; AVX-NEXT:    callq __extendhfsf2@PLT
525 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
526 ; AVX-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
527 ; AVX-NEXT:    # xmm0 = mem[2,3,0,1]
528 ; AVX-NEXT:    callq __extendhfsf2@PLT
529 ; AVX-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
530 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
531 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
532 ; AVX-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
533 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
534 ; AVX-NEXT:    callq __extendhfsf2@PLT
535 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
536 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
537 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
538 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
539 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
540 ; AVX-NEXT:    callq __extendhfsf2@PLT
541 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
542 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
543 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
544 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
545 ; AVX-NEXT:    callq __extendhfsf2@PLT
546 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
547 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
548 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
549 ; AVX-NEXT:    callq __extendhfsf2@PLT
550 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
551 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
552 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
553 ; AVX-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
554 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
555 ; AVX-NEXT:    callq __extendhfsf2@PLT
556 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
557 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
558 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
559 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
560 ; AVX-NEXT:    vpsrlq $48, %xmm0, %xmm0
561 ; AVX-NEXT:    callq __extendhfsf2@PLT
562 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
563 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
564 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
565 ; AVX-NEXT:    addq $56, %rsp
566 ; AVX-NEXT:    retq
568 ; F16C-LABEL: cvt_8i16_to_8f32_constrained:
569 ; F16C:       # %bb.0:
570 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm0
571 ; F16C-NEXT:    retq
573 ; AVX512-LABEL: cvt_8i16_to_8f32_constrained:
574 ; AVX512:       # %bb.0:
575 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
576 ; AVX512-NEXT:    retq
577   %1 = bitcast <8 x i16> %a0 to <8 x half>
578   %2 = call <8 x float> @llvm.experimental.constrained.fpext.v8f32.v8f16(<8 x half> %1, metadata !"fpexcept.strict") strictfp
579   ret <8 x float> %2
581 declare <8 x float> @llvm.experimental.constrained.fpext.v8f32.v8f16(<8 x half>, metadata) strictfp
583 define <16 x float> @cvt_16i16_to_16f32_constrained(<16 x i16> %a0) nounwind strictfp {
584 ; AVX1-LABEL: cvt_16i16_to_16f32_constrained:
585 ; AVX1:       # %bb.0:
586 ; AVX1-NEXT:    subq $104, %rsp
587 ; AVX1-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
588 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
589 ; AVX1-NEXT:    vzeroupper
590 ; AVX1-NEXT:    callq __extendhfsf2@PLT
591 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
592 ; AVX1-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
593 ; AVX1-NEXT:    # xmm0 = mem[2,3,0,1]
594 ; AVX1-NEXT:    callq __extendhfsf2@PLT
595 ; AVX1-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
596 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
597 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
598 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
599 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
600 ; AVX1-NEXT:    callq __extendhfsf2@PLT
601 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
602 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
603 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
604 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
605 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
606 ; AVX1-NEXT:    vzeroupper
607 ; AVX1-NEXT:    callq __extendhfsf2@PLT
608 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
609 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
610 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
611 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
612 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
613 ; AVX1-NEXT:    vzeroupper
614 ; AVX1-NEXT:    callq __extendhfsf2@PLT
615 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
616 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
617 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
618 ; AVX1-NEXT:    vzeroupper
619 ; AVX1-NEXT:    callq __extendhfsf2@PLT
620 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
621 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
622 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
623 ; AVX1-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
624 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
625 ; AVX1-NEXT:    callq __extendhfsf2@PLT
626 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
627 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
628 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
629 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
630 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
631 ; AVX1-NEXT:    vzeroupper
632 ; AVX1-NEXT:    callq __extendhfsf2@PLT
633 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
634 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
635 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
636 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
637 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
638 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
639 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
640 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
641 ; AVX1-NEXT:    vzeroupper
642 ; AVX1-NEXT:    callq __extendhfsf2@PLT
643 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
644 ; AVX1-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
645 ; AVX1-NEXT:    # xmm0 = mem[2,3,0,1]
646 ; AVX1-NEXT:    callq __extendhfsf2@PLT
647 ; AVX1-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
648 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
649 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
650 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
651 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
652 ; AVX1-NEXT:    callq __extendhfsf2@PLT
653 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
654 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
655 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
656 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
657 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
658 ; AVX1-NEXT:    callq __extendhfsf2@PLT
659 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
660 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
661 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
662 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
663 ; AVX1-NEXT:    callq __extendhfsf2@PLT
664 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
665 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
666 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
667 ; AVX1-NEXT:    callq __extendhfsf2@PLT
668 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
669 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
670 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
671 ; AVX1-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
672 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
673 ; AVX1-NEXT:    callq __extendhfsf2@PLT
674 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
675 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
676 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
677 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
678 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
679 ; AVX1-NEXT:    callq __extendhfsf2@PLT
680 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
681 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
682 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
683 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
684 ; AVX1-NEXT:    addq $104, %rsp
685 ; AVX1-NEXT:    retq
687 ; AVX2-LABEL: cvt_16i16_to_16f32_constrained:
688 ; AVX2:       # %bb.0:
689 ; AVX2-NEXT:    subq $104, %rsp
690 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
691 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
692 ; AVX2-NEXT:    vzeroupper
693 ; AVX2-NEXT:    callq __extendhfsf2@PLT
694 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
695 ; AVX2-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
696 ; AVX2-NEXT:    # xmm0 = mem[2,3,0,1]
697 ; AVX2-NEXT:    callq __extendhfsf2@PLT
698 ; AVX2-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
699 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
700 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
701 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
702 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
703 ; AVX2-NEXT:    callq __extendhfsf2@PLT
704 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
705 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
706 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
707 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
708 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
709 ; AVX2-NEXT:    vzeroupper
710 ; AVX2-NEXT:    callq __extendhfsf2@PLT
711 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
712 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
713 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
714 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
715 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
716 ; AVX2-NEXT:    vzeroupper
717 ; AVX2-NEXT:    callq __extendhfsf2@PLT
718 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
719 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
720 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
721 ; AVX2-NEXT:    vzeroupper
722 ; AVX2-NEXT:    callq __extendhfsf2@PLT
723 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
724 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
725 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
726 ; AVX2-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
727 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
728 ; AVX2-NEXT:    callq __extendhfsf2@PLT
729 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
730 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
731 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
732 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
733 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
734 ; AVX2-NEXT:    vzeroupper
735 ; AVX2-NEXT:    callq __extendhfsf2@PLT
736 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
737 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
738 ; AVX2-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
739 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
740 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
741 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
742 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
743 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
744 ; AVX2-NEXT:    vzeroupper
745 ; AVX2-NEXT:    callq __extendhfsf2@PLT
746 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
747 ; AVX2-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
748 ; AVX2-NEXT:    # xmm0 = mem[2,3,0,1]
749 ; AVX2-NEXT:    callq __extendhfsf2@PLT
750 ; AVX2-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
751 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
752 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
753 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
754 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
755 ; AVX2-NEXT:    callq __extendhfsf2@PLT
756 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
757 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
758 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
759 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
760 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
761 ; AVX2-NEXT:    callq __extendhfsf2@PLT
762 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
763 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
764 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
765 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
766 ; AVX2-NEXT:    callq __extendhfsf2@PLT
767 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
768 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
769 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
770 ; AVX2-NEXT:    callq __extendhfsf2@PLT
771 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
772 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
773 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
774 ; AVX2-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
775 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
776 ; AVX2-NEXT:    callq __extendhfsf2@PLT
777 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
778 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
779 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
780 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
781 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
782 ; AVX2-NEXT:    callq __extendhfsf2@PLT
783 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
784 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
785 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
786 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
787 ; AVX2-NEXT:    addq $104, %rsp
788 ; AVX2-NEXT:    retq
790 ; F16C-LABEL: cvt_16i16_to_16f32_constrained:
791 ; F16C:       # %bb.0:
792 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm1
793 ; F16C-NEXT:    vcvtph2ps %xmm1, %ymm1
794 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm0
795 ; F16C-NEXT:    retq
797 ; AVX512-LABEL: cvt_16i16_to_16f32_constrained:
798 ; AVX512:       # %bb.0:
799 ; AVX512-NEXT:    vcvtph2ps %ymm0, %zmm0
800 ; AVX512-NEXT:    retq
801   %1 = bitcast <16 x i16> %a0 to <16 x half>
802   %2 = call <16 x float> @llvm.experimental.constrained.fpext.v16f32.v16f16(<16 x half> %1, metadata !"fpexcept.strict") strictfp
803   ret <16 x float> %2
805 declare <16 x float> @llvm.experimental.constrained.fpext.v16f32.v16f16(<16 x half>, metadata) strictfp
808 ; Half to Float (Load)
811 define float @load_cvt_i16_to_f32(ptr %a0) nounwind {
812 ; AVX-LABEL: load_cvt_i16_to_f32:
813 ; AVX:       # %bb.0:
814 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
815 ; AVX-NEXT:    jmp __extendhfsf2@PLT # TAILCALL
817 ; F16C-LABEL: load_cvt_i16_to_f32:
818 ; F16C:       # %bb.0:
819 ; F16C-NEXT:    movzwl (%rdi), %eax
820 ; F16C-NEXT:    vmovd %eax, %xmm0
821 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
822 ; F16C-NEXT:    retq
824 ; AVX512-LABEL: load_cvt_i16_to_f32:
825 ; AVX512:       # %bb.0:
826 ; AVX512-NEXT:    movzwl (%rdi), %eax
827 ; AVX512-NEXT:    vmovd %eax, %xmm0
828 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
829 ; AVX512-NEXT:    retq
830   %1 = load i16, ptr %a0
831   %2 = bitcast i16 %1 to half
832   %3 = fpext half %2 to float
833   ret float %3
836 define <4 x float> @load_cvt_4i16_to_4f32(ptr %a0) nounwind {
837 ; AVX-LABEL: load_cvt_4i16_to_4f32:
838 ; AVX:       # %bb.0:
839 ; AVX-NEXT:    subq $72, %rsp
840 ; AVX-NEXT:    vpinsrw $0, 6(%rdi), %xmm0, %xmm0
841 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
842 ; AVX-NEXT:    vpinsrw $0, 4(%rdi), %xmm0, %xmm0
843 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
844 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
845 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
846 ; AVX-NEXT:    vpinsrw $0, 2(%rdi), %xmm0, %xmm0
847 ; AVX-NEXT:    callq __extendhfsf2@PLT
848 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
849 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
850 ; AVX-NEXT:    callq __extendhfsf2@PLT
851 ; AVX-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
852 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
853 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
854 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
855 ; AVX-NEXT:    callq __extendhfsf2@PLT
856 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
857 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
858 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
859 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
860 ; AVX-NEXT:    callq __extendhfsf2@PLT
861 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
862 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
863 ; AVX-NEXT:    addq $72, %rsp
864 ; AVX-NEXT:    retq
866 ; F16C-LABEL: load_cvt_4i16_to_4f32:
867 ; F16C:       # %bb.0:
868 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
869 ; F16C-NEXT:    retq
871 ; AVX512-LABEL: load_cvt_4i16_to_4f32:
872 ; AVX512:       # %bb.0:
873 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
874 ; AVX512-NEXT:    retq
875   %1 = load <4 x i16>, ptr %a0
876   %2 = bitcast <4 x i16> %1 to <4 x half>
877   %3 = fpext <4 x half> %2 to <4 x float>
878   ret <4 x float> %3
881 define <4 x float> @load_cvt_8i16_to_4f32(ptr %a0) nounwind {
882 ; AVX-LABEL: load_cvt_8i16_to_4f32:
883 ; AVX:       # %bb.0:
884 ; AVX-NEXT:    subq $72, %rsp
885 ; AVX-NEXT:    movq (%rdi), %rax
886 ; AVX-NEXT:    movq %rax, %rcx
887 ; AVX-NEXT:    movq %rax, %rdx
888 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
889 ; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
890 ; AVX-NEXT:    shrl $16, %eax
891 ; AVX-NEXT:    shrq $32, %rcx
892 ; AVX-NEXT:    shrq $48, %rdx
893 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm1
894 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
895 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm1
896 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
897 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
898 ; AVX-NEXT:    vmovdqa %xmm1, (%rsp) # 16-byte Spill
899 ; AVX-NEXT:    callq __extendhfsf2@PLT
900 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
901 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
902 ; AVX-NEXT:    callq __extendhfsf2@PLT
903 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
904 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
905 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
906 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
907 ; AVX-NEXT:    callq __extendhfsf2@PLT
908 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
909 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
910 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
911 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
912 ; AVX-NEXT:    callq __extendhfsf2@PLT
913 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
914 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
915 ; AVX-NEXT:    addq $72, %rsp
916 ; AVX-NEXT:    retq
918 ; F16C-LABEL: load_cvt_8i16_to_4f32:
919 ; F16C:       # %bb.0:
920 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
921 ; F16C-NEXT:    retq
923 ; AVX512-LABEL: load_cvt_8i16_to_4f32:
924 ; AVX512:       # %bb.0:
925 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
926 ; AVX512-NEXT:    retq
927   %1 = load <8 x i16>, ptr %a0
928   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
929   %3 = bitcast <4 x i16> %2 to <4 x half>
930   %4 = fpext <4 x half> %3 to <4 x float>
931   ret <4 x float> %4
934 define <8 x float> @load_cvt_8i16_to_8f32(ptr %a0) nounwind {
935 ; AVX1-LABEL: load_cvt_8i16_to_8f32:
936 ; AVX1:       # %bb.0:
937 ; AVX1-NEXT:    pushq %rbx
938 ; AVX1-NEXT:    subq $48, %rsp
939 ; AVX1-NEXT:    movq %rdi, %rbx
940 ; AVX1-NEXT:    vmovaps (%rdi), %xmm0
941 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
942 ; AVX1-NEXT:    vbroadcastss 8(%rdi), %xmm0
943 ; AVX1-NEXT:    callq __extendhfsf2@PLT
944 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
945 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
946 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
947 ; AVX1-NEXT:    callq __extendhfsf2@PLT
948 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
949 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
950 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
951 ; AVX1-NEXT:    vbroadcastss 12(%rbx), %xmm0
952 ; AVX1-NEXT:    callq __extendhfsf2@PLT
953 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
954 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
955 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
956 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
957 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
958 ; AVX1-NEXT:    callq __extendhfsf2@PLT
959 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
960 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
961 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
962 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
963 ; AVX1-NEXT:    callq __extendhfsf2@PLT
964 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
965 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
966 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
967 ; AVX1-NEXT:    callq __extendhfsf2@PLT
968 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
969 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
970 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
971 ; AVX1-NEXT:    vbroadcastss 4(%rbx), %xmm0
972 ; AVX1-NEXT:    callq __extendhfsf2@PLT
973 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
974 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
975 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
976 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
977 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
978 ; AVX1-NEXT:    callq __extendhfsf2@PLT
979 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
980 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
981 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
982 ; AVX1-NEXT:    addq $48, %rsp
983 ; AVX1-NEXT:    popq %rbx
984 ; AVX1-NEXT:    retq
986 ; AVX2-LABEL: load_cvt_8i16_to_8f32:
987 ; AVX2:       # %bb.0:
988 ; AVX2-NEXT:    pushq %rbx
989 ; AVX2-NEXT:    subq $48, %rsp
990 ; AVX2-NEXT:    movq %rdi, %rbx
991 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
992 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
993 ; AVX2-NEXT:    vpinsrw $0, 8(%rdi), %xmm0, %xmm0
994 ; AVX2-NEXT:    callq __extendhfsf2@PLT
995 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
996 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
997 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
998 ; AVX2-NEXT:    callq __extendhfsf2@PLT
999 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1000 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1001 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1002 ; AVX2-NEXT:    vpinsrw $0, 12(%rbx), %xmm0, %xmm0
1003 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1004 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1005 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1006 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1007 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1008 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1009 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1010 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1011 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1012 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1013 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1014 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1015 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1016 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1017 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
1018 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1019 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1020 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1021 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1022 ; AVX2-NEXT:    vpinsrw $0, 4(%rbx), %xmm0, %xmm0
1023 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1024 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1025 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1026 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1027 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1028 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
1029 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1030 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1031 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1032 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1033 ; AVX2-NEXT:    addq $48, %rsp
1034 ; AVX2-NEXT:    popq %rbx
1035 ; AVX2-NEXT:    retq
1037 ; F16C-LABEL: load_cvt_8i16_to_8f32:
1038 ; F16C:       # %bb.0:
1039 ; F16C-NEXT:    vcvtph2ps (%rdi), %ymm0
1040 ; F16C-NEXT:    retq
1042 ; AVX512-LABEL: load_cvt_8i16_to_8f32:
1043 ; AVX512:       # %bb.0:
1044 ; AVX512-NEXT:    vcvtph2ps (%rdi), %ymm0
1045 ; AVX512-NEXT:    retq
1046   %1 = load <8 x i16>, ptr %a0
1047   %2 = bitcast <8 x i16> %1 to <8 x half>
1048   %3 = fpext <8 x half> %2 to <8 x float>
1049   ret <8 x float> %3
1052 define <16 x float> @load_cvt_16i16_to_16f32(ptr %a0) nounwind {
1053 ; AVX1-LABEL: load_cvt_16i16_to_16f32:
1054 ; AVX1:       # %bb.0:
1055 ; AVX1-NEXT:    pushq %rbx
1056 ; AVX1-NEXT:    subq $80, %rsp
1057 ; AVX1-NEXT:    movq %rdi, %rbx
1058 ; AVX1-NEXT:    vbroadcastss 8(%rdi), %xmm0
1059 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1060 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1061 ; AVX1-NEXT:    vmovdqa (%rbx), %xmm1
1062 ; AVX1-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1063 ; AVX1-NEXT:    vmovaps 16(%rbx), %xmm0
1064 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1065 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1066 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1067 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1068 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1069 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1070 ; AVX1-NEXT:    vbroadcastss 12(%rbx), %xmm0
1071 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1072 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1073 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1074 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1075 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1076 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1077 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1078 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1079 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1080 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1081 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1082 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1083 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1084 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1085 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
1086 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1087 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1088 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1089 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1090 ; AVX1-NEXT:    vbroadcastss 4(%rbx), %xmm0
1091 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1092 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1093 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1094 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1095 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1096 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
1097 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1098 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1099 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1100 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1101 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
1102 ; AVX1-NEXT:    vbroadcastss 24(%rbx), %xmm0
1103 ; AVX1-NEXT:    vzeroupper
1104 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1105 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1106 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1107 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1108 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1109 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1110 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1111 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1112 ; AVX1-NEXT:    vbroadcastss 28(%rbx), %xmm0
1113 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1114 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1115 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1116 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1117 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1118 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1119 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1120 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1121 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1122 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1123 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1124 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1125 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1126 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1127 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
1128 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1129 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1130 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1131 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1132 ; AVX1-NEXT:    vbroadcastss 20(%rbx), %xmm0
1133 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1134 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1135 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1136 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1137 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1138 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
1139 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1140 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1141 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1142 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
1143 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
1144 ; AVX1-NEXT:    addq $80, %rsp
1145 ; AVX1-NEXT:    popq %rbx
1146 ; AVX1-NEXT:    retq
1148 ; AVX2-LABEL: load_cvt_16i16_to_16f32:
1149 ; AVX2:       # %bb.0:
1150 ; AVX2-NEXT:    pushq %rbx
1151 ; AVX2-NEXT:    subq $80, %rsp
1152 ; AVX2-NEXT:    movq %rdi, %rbx
1153 ; AVX2-NEXT:    vpinsrw $0, 8(%rdi), %xmm0, %xmm0
1154 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1155 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1156 ; AVX2-NEXT:    vmovdqa (%rbx), %xmm1
1157 ; AVX2-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1158 ; AVX2-NEXT:    vmovaps 16(%rbx), %xmm0
1159 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1160 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1161 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1162 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1163 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1164 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1165 ; AVX2-NEXT:    vpinsrw $0, 12(%rbx), %xmm0, %xmm0
1166 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1167 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1168 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1169 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1170 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1171 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1172 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1173 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1174 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1175 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1176 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1177 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1178 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1179 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1180 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
1181 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1182 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1183 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1184 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1185 ; AVX2-NEXT:    vpinsrw $0, 4(%rbx), %xmm0, %xmm0
1186 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1187 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1188 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1189 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1190 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1191 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
1192 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1193 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1194 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1195 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1196 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
1197 ; AVX2-NEXT:    vpinsrw $0, 24(%rbx), %xmm0, %xmm0
1198 ; AVX2-NEXT:    vzeroupper
1199 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1200 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1201 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1202 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1203 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1204 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1205 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1206 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1207 ; AVX2-NEXT:    vpinsrw $0, 28(%rbx), %xmm0, %xmm0
1208 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1209 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1210 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1211 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1212 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1213 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1214 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1215 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1216 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1217 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1218 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1219 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1220 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1221 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1222 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
1223 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1224 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1225 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1226 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1227 ; AVX2-NEXT:    vpinsrw $0, 20(%rbx), %xmm0, %xmm0
1228 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1229 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1230 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1231 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1232 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1233 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
1234 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1235 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1236 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1237 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
1238 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
1239 ; AVX2-NEXT:    addq $80, %rsp
1240 ; AVX2-NEXT:    popq %rbx
1241 ; AVX2-NEXT:    retq
1243 ; F16C-LABEL: load_cvt_16i16_to_16f32:
1244 ; F16C:       # %bb.0:
1245 ; F16C-NEXT:    vcvtph2ps (%rdi), %ymm0
1246 ; F16C-NEXT:    vcvtph2ps 16(%rdi), %ymm1
1247 ; F16C-NEXT:    retq
1249 ; AVX512-LABEL: load_cvt_16i16_to_16f32:
1250 ; AVX512:       # %bb.0:
1251 ; AVX512-NEXT:    vcvtph2ps (%rdi), %zmm0
1252 ; AVX512-NEXT:    retq
1253   %1 = load <16 x i16>, ptr %a0
1254   %2 = bitcast <16 x i16> %1 to <16 x half>
1255   %3 = fpext <16 x half> %2 to <16 x float>
1256   ret <16 x float> %3
1259 define <4 x float> @load_cvt_4i16_to_4f32_constrained(ptr %a0) nounwind strictfp {
1260 ; AVX-LABEL: load_cvt_4i16_to_4f32_constrained:
1261 ; AVX:       # %bb.0:
1262 ; AVX-NEXT:    subq $72, %rsp
1263 ; AVX-NEXT:    vpinsrw $0, 6(%rdi), %xmm0, %xmm0
1264 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1265 ; AVX-NEXT:    vpinsrw $0, 4(%rdi), %xmm0, %xmm0
1266 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1267 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
1268 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1269 ; AVX-NEXT:    vpinsrw $0, 2(%rdi), %xmm0, %xmm0
1270 ; AVX-NEXT:    callq __extendhfsf2@PLT
1271 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1272 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1273 ; AVX-NEXT:    callq __extendhfsf2@PLT
1274 ; AVX-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1275 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
1276 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1277 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1278 ; AVX-NEXT:    callq __extendhfsf2@PLT
1279 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1280 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1281 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1282 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1283 ; AVX-NEXT:    callq __extendhfsf2@PLT
1284 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1285 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1286 ; AVX-NEXT:    addq $72, %rsp
1287 ; AVX-NEXT:    retq
1289 ; F16C-LABEL: load_cvt_4i16_to_4f32_constrained:
1290 ; F16C:       # %bb.0:
1291 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
1292 ; F16C-NEXT:    retq
1294 ; AVX512-LABEL: load_cvt_4i16_to_4f32_constrained:
1295 ; AVX512:       # %bb.0:
1296 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
1297 ; AVX512-NEXT:    retq
1298   %1 = load <4 x i16>, ptr %a0
1299   %2 = bitcast <4 x i16> %1 to <4 x half>
1300   %3 = call <4 x float> @llvm.experimental.constrained.fpext.v4f32.v4f16(<4 x half> %2, metadata !"fpexcept.strict") strictfp
1301   ret <4 x float> %3
1304 define <4 x float> @load_cvt_8i16_to_4f32_constrained(ptr %a0) nounwind strictfp {
1305 ; AVX-LABEL: load_cvt_8i16_to_4f32_constrained:
1306 ; AVX:       # %bb.0:
1307 ; AVX-NEXT:    subq $72, %rsp
1308 ; AVX-NEXT:    movq (%rdi), %rax
1309 ; AVX-NEXT:    movq %rax, %rcx
1310 ; AVX-NEXT:    movq %rax, %rdx
1311 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1312 ; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
1313 ; AVX-NEXT:    shrl $16, %eax
1314 ; AVX-NEXT:    shrq $32, %rcx
1315 ; AVX-NEXT:    shrq $48, %rdx
1316 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm1
1317 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1318 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm1
1319 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1320 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
1321 ; AVX-NEXT:    vmovdqa %xmm1, (%rsp) # 16-byte Spill
1322 ; AVX-NEXT:    callq __extendhfsf2@PLT
1323 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1324 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1325 ; AVX-NEXT:    callq __extendhfsf2@PLT
1326 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1327 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1328 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1329 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1330 ; AVX-NEXT:    callq __extendhfsf2@PLT
1331 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1332 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1333 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1334 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1335 ; AVX-NEXT:    callq __extendhfsf2@PLT
1336 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1337 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1338 ; AVX-NEXT:    addq $72, %rsp
1339 ; AVX-NEXT:    retq
1341 ; F16C-LABEL: load_cvt_8i16_to_4f32_constrained:
1342 ; F16C:       # %bb.0:
1343 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
1344 ; F16C-NEXT:    retq
1346 ; AVX512-LABEL: load_cvt_8i16_to_4f32_constrained:
1347 ; AVX512:       # %bb.0:
1348 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
1349 ; AVX512-NEXT:    retq
1350   %1 = load <8 x i16>, ptr %a0
1351   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1352   %3 = bitcast <4 x i16> %2 to <4 x half>
1353   %4 = call <4 x float> @llvm.experimental.constrained.fpext.v4f32.v4f16(<4 x half> %3, metadata !"fpexcept.strict") strictfp
1354   ret <4 x float> %4
1358 ; Half to Double
1361 define double @cvt_i16_to_f64(i16 %a0) nounwind {
1362 ; AVX-LABEL: cvt_i16_to_f64:
1363 ; AVX:       # %bb.0:
1364 ; AVX-NEXT:    pushq %rax
1365 ; AVX-NEXT:    vpinsrw $0, %edi, %xmm0, %xmm0
1366 ; AVX-NEXT:    callq __extendhfsf2@PLT
1367 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1368 ; AVX-NEXT:    popq %rax
1369 ; AVX-NEXT:    retq
1371 ; F16C-LABEL: cvt_i16_to_f64:
1372 ; F16C:       # %bb.0:
1373 ; F16C-NEXT:    movzwl %di, %eax
1374 ; F16C-NEXT:    vmovd %eax, %xmm0
1375 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1376 ; F16C-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1377 ; F16C-NEXT:    retq
1379 ; AVX512-LABEL: cvt_i16_to_f64:
1380 ; AVX512:       # %bb.0:
1381 ; AVX512-NEXT:    movzwl %di, %eax
1382 ; AVX512-NEXT:    vmovd %eax, %xmm0
1383 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1384 ; AVX512-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1385 ; AVX512-NEXT:    retq
1386   %1 = bitcast i16 %a0 to half
1387   %2 = fpext half %1 to double
1388   ret double %2
1391 define <2 x double> @cvt_2i16_to_2f64(<2 x i16> %a0) nounwind {
1392 ; AVX-LABEL: cvt_2i16_to_2f64:
1393 ; AVX:       # %bb.0:
1394 ; AVX-NEXT:    subq $40, %rsp
1395 ; AVX-NEXT:    vmovd %xmm0, %eax
1396 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1397 ; AVX-NEXT:    shrl $16, %eax
1398 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
1399 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1400 ; AVX-NEXT:    callq __extendhfsf2@PLT
1401 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1402 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1403 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1404 ; AVX-NEXT:    callq __extendhfsf2@PLT
1405 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1406 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1407 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1408 ; AVX-NEXT:    addq $40, %rsp
1409 ; AVX-NEXT:    retq
1411 ; F16C-LABEL: cvt_2i16_to_2f64:
1412 ; F16C:       # %bb.0:
1413 ; F16C-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1414 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1415 ; F16C-NEXT:    vcvtps2pd %xmm0, %xmm0
1416 ; F16C-NEXT:    retq
1418 ; AVX512-LABEL: cvt_2i16_to_2f64:
1419 ; AVX512:       # %bb.0:
1420 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1421 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1422 ; AVX512-NEXT:    vcvtps2pd %xmm0, %xmm0
1423 ; AVX512-NEXT:    retq
1424   %1 = bitcast <2 x i16> %a0 to <2 x half>
1425   %2 = fpext <2 x half> %1 to <2 x double>
1426   ret <2 x double> %2
1429 define <4 x double> @cvt_4i16_to_4f64(<4 x i16> %a0) nounwind {
1430 ; AVX-LABEL: cvt_4i16_to_4f64:
1431 ; AVX:       # %bb.0:
1432 ; AVX-NEXT:    subq $72, %rsp
1433 ; AVX-NEXT:    vmovq %xmm0, %rax
1434 ; AVX-NEXT:    movq %rax, %rcx
1435 ; AVX-NEXT:    movl %eax, %edx
1436 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1437 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1438 ; AVX-NEXT:    shrq $48, %rax
1439 ; AVX-NEXT:    shrq $32, %rcx
1440 ; AVX-NEXT:    shrl $16, %edx
1441 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm0
1442 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1443 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm0
1444 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1445 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1446 ; AVX-NEXT:    callq __extendhfsf2@PLT
1447 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1448 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1449 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1450 ; AVX-NEXT:    callq __extendhfsf2@PLT
1451 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1452 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1453 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1454 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1455 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1456 ; AVX-NEXT:    callq __extendhfsf2@PLT
1457 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1458 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1459 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1460 ; AVX-NEXT:    callq __extendhfsf2@PLT
1461 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1462 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1463 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1464 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1465 ; AVX-NEXT:    addq $72, %rsp
1466 ; AVX-NEXT:    retq
1468 ; F16C-LABEL: cvt_4i16_to_4f64:
1469 ; F16C:       # %bb.0:
1470 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1471 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1472 ; F16C-NEXT:    retq
1474 ; AVX512-LABEL: cvt_4i16_to_4f64:
1475 ; AVX512:       # %bb.0:
1476 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1477 ; AVX512-NEXT:    vcvtps2pd %xmm0, %ymm0
1478 ; AVX512-NEXT:    retq
1479   %1 = bitcast <4 x i16> %a0 to <4 x half>
1480   %2 = fpext <4 x half> %1 to <4 x double>
1481   ret <4 x double> %2
1484 define <2 x double> @cvt_8i16_to_2f64(<8 x i16> %a0) nounwind {
1485 ; AVX-LABEL: cvt_8i16_to_2f64:
1486 ; AVX:       # %bb.0:
1487 ; AVX-NEXT:    subq $40, %rsp
1488 ; AVX-NEXT:    vmovd %xmm0, %eax
1489 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1490 ; AVX-NEXT:    shrl $16, %eax
1491 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
1492 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1493 ; AVX-NEXT:    callq __extendhfsf2@PLT
1494 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1495 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1496 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1497 ; AVX-NEXT:    callq __extendhfsf2@PLT
1498 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1499 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1500 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1501 ; AVX-NEXT:    addq $40, %rsp
1502 ; AVX-NEXT:    retq
1504 ; F16C-LABEL: cvt_8i16_to_2f64:
1505 ; F16C:       # %bb.0:
1506 ; F16C-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1507 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1508 ; F16C-NEXT:    vcvtps2pd %xmm0, %xmm0
1509 ; F16C-NEXT:    retq
1511 ; AVX512-LABEL: cvt_8i16_to_2f64:
1512 ; AVX512:       # %bb.0:
1513 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1514 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1515 ; AVX512-NEXT:    vcvtps2pd %xmm0, %xmm0
1516 ; AVX512-NEXT:    retq
1517   %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
1518   %2 = bitcast <2 x i16> %1 to <2 x half>
1519   %3 = fpext <2 x half> %2 to <2 x double>
1520   ret <2 x double> %3
1523 define <4 x double> @cvt_8i16_to_4f64(<8 x i16> %a0) nounwind {
1524 ; AVX-LABEL: cvt_8i16_to_4f64:
1525 ; AVX:       # %bb.0:
1526 ; AVX-NEXT:    subq $72, %rsp
1527 ; AVX-NEXT:    vmovq %xmm0, %rax
1528 ; AVX-NEXT:    movq %rax, %rcx
1529 ; AVX-NEXT:    movl %eax, %edx
1530 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1531 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1532 ; AVX-NEXT:    shrq $48, %rax
1533 ; AVX-NEXT:    shrq $32, %rcx
1534 ; AVX-NEXT:    shrl $16, %edx
1535 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm0
1536 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1537 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm0
1538 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1539 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1540 ; AVX-NEXT:    callq __extendhfsf2@PLT
1541 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1542 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1543 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1544 ; AVX-NEXT:    callq __extendhfsf2@PLT
1545 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1546 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1547 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1548 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1549 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1550 ; AVX-NEXT:    callq __extendhfsf2@PLT
1551 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1552 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1553 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1554 ; AVX-NEXT:    callq __extendhfsf2@PLT
1555 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1556 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1557 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1558 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1559 ; AVX-NEXT:    addq $72, %rsp
1560 ; AVX-NEXT:    retq
1562 ; F16C-LABEL: cvt_8i16_to_4f64:
1563 ; F16C:       # %bb.0:
1564 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1565 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1566 ; F16C-NEXT:    retq
1568 ; AVX512-LABEL: cvt_8i16_to_4f64:
1569 ; AVX512:       # %bb.0:
1570 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1571 ; AVX512-NEXT:    vcvtps2pd %xmm0, %ymm0
1572 ; AVX512-NEXT:    retq
1573   %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1574   %2 = bitcast <4 x i16> %1 to <4 x half>
1575   %3 = fpext <4 x half> %2 to <4 x double>
1576   ret <4 x double> %3
1579 define <8 x double> @cvt_8i16_to_8f64(<8 x i16> %a0) nounwind {
1580 ; AVX-LABEL: cvt_8i16_to_8f64:
1581 ; AVX:       # %bb.0:
1582 ; AVX-NEXT:    subq $88, %rsp
1583 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1584 ; AVX-NEXT:    vpsrlq $48, %xmm0, %xmm0
1585 ; AVX-NEXT:    callq __extendhfsf2@PLT
1586 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1587 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1588 ; AVX-NEXT:    vpermilps $245, (%rsp), %xmm0 # 16-byte Folded Reload
1589 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
1590 ; AVX-NEXT:    callq __extendhfsf2@PLT
1591 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1592 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1593 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1594 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1595 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1596 ; AVX-NEXT:    callq __extendhfsf2@PLT
1597 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1598 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1599 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1600 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
1601 ; AVX-NEXT:    callq __extendhfsf2@PLT
1602 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1603 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1604 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1605 ; AVX-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
1606 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
1607 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1608 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1609 ; AVX-NEXT:    vzeroupper
1610 ; AVX-NEXT:    callq __extendhfsf2@PLT
1611 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1612 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1613 ; AVX-NEXT:    vpermilps $255, (%rsp), %xmm0 # 16-byte Folded Reload
1614 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
1615 ; AVX-NEXT:    callq __extendhfsf2@PLT
1616 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1617 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1618 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1619 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1620 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1621 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1622 ; AVX-NEXT:    callq __extendhfsf2@PLT
1623 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1624 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1625 ; AVX-NEXT:    vpermilps $78, (%rsp), %xmm0 # 16-byte Folded Reload
1626 ; AVX-NEXT:    # xmm0 = mem[2,3,0,1]
1627 ; AVX-NEXT:    callq __extendhfsf2@PLT
1628 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1629 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1630 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1631 ; AVX-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm1 # 16-byte Folded Reload
1632 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
1633 ; AVX-NEXT:    addq $88, %rsp
1634 ; AVX-NEXT:    retq
1636 ; F16C-LABEL: cvt_8i16_to_8f64:
1637 ; F16C:       # %bb.0:
1638 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm1
1639 ; F16C-NEXT:    vcvtps2pd %xmm1, %ymm0
1640 ; F16C-NEXT:    vextractf128 $1, %ymm1, %xmm1
1641 ; F16C-NEXT:    vcvtps2pd %xmm1, %ymm1
1642 ; F16C-NEXT:    retq
1644 ; AVX512-LABEL: cvt_8i16_to_8f64:
1645 ; AVX512:       # %bb.0:
1646 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
1647 ; AVX512-NEXT:    vcvtps2pd %ymm0, %zmm0
1648 ; AVX512-NEXT:    retq
1649   %1 = bitcast <8 x i16> %a0 to <8 x half>
1650   %2 = fpext <8 x half> %1 to <8 x double>
1651   ret <8 x double> %2
1654 define <2 x double> @cvt_2i16_to_2f64_constrained(<2 x i16> %a0) nounwind strictfp {
1655 ; AVX-LABEL: cvt_2i16_to_2f64_constrained:
1656 ; AVX:       # %bb.0:
1657 ; AVX-NEXT:    subq $40, %rsp
1658 ; AVX-NEXT:    vmovd %xmm0, %eax
1659 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1660 ; AVX-NEXT:    shrl $16, %eax
1661 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
1662 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1663 ; AVX-NEXT:    callq __extendhfsf2@PLT
1664 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1665 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1666 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1667 ; AVX-NEXT:    callq __extendhfsf2@PLT
1668 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1669 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1670 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1671 ; AVX-NEXT:    addq $40, %rsp
1672 ; AVX-NEXT:    retq
1674 ; F16C-LABEL: cvt_2i16_to_2f64_constrained:
1675 ; F16C:       # %bb.0:
1676 ; F16C-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1677 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1678 ; F16C-NEXT:    vcvtps2pd %xmm0, %xmm0
1679 ; F16C-NEXT:    retq
1681 ; AVX512-LABEL: cvt_2i16_to_2f64_constrained:
1682 ; AVX512:       # %bb.0:
1683 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1684 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1685 ; AVX512-NEXT:    vcvtps2pd %xmm0, %xmm0
1686 ; AVX512-NEXT:    retq
1687   %1 = bitcast <2 x i16> %a0 to <2 x half>
1688   %2 = call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f16(<2 x half> %1, metadata !"fpexcept.strict") strictfp
1689   ret <2 x double> %2
1691 declare <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f16(<2 x half>, metadata) strictfp
1693 define <4 x double> @cvt_4i16_to_4f64_constrained(<4 x i16> %a0) nounwind strictfp {
1694 ; AVX-LABEL: cvt_4i16_to_4f64_constrained:
1695 ; AVX:       # %bb.0:
1696 ; AVX-NEXT:    subq $72, %rsp
1697 ; AVX-NEXT:    vmovq %xmm0, %rax
1698 ; AVX-NEXT:    movq %rax, %rcx
1699 ; AVX-NEXT:    movl %eax, %edx
1700 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1701 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1702 ; AVX-NEXT:    shrq $48, %rax
1703 ; AVX-NEXT:    shrq $32, %rcx
1704 ; AVX-NEXT:    shrl $16, %edx
1705 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm0
1706 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1707 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm0
1708 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1709 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1710 ; AVX-NEXT:    callq __extendhfsf2@PLT
1711 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1712 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1713 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1714 ; AVX-NEXT:    callq __extendhfsf2@PLT
1715 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1716 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1717 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1718 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1719 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1720 ; AVX-NEXT:    callq __extendhfsf2@PLT
1721 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1722 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1723 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1724 ; AVX-NEXT:    callq __extendhfsf2@PLT
1725 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1726 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1727 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1728 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1729 ; AVX-NEXT:    addq $72, %rsp
1730 ; AVX-NEXT:    retq
1732 ; F16C-LABEL: cvt_4i16_to_4f64_constrained:
1733 ; F16C:       # %bb.0:
1734 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1735 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1736 ; F16C-NEXT:    retq
1738 ; AVX512-LABEL: cvt_4i16_to_4f64_constrained:
1739 ; AVX512:       # %bb.0:
1740 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1741 ; AVX512-NEXT:    vcvtps2pd %xmm0, %ymm0
1742 ; AVX512-NEXT:    retq
1743   %1 = bitcast <4 x i16> %a0 to <4 x half>
1744   %2 = call <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f16(<4 x half> %1, metadata !"fpexcept.strict") strictfp
1745   ret <4 x double> %2
1747 declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f16(<4 x half>, metadata) strictfp
1749 define <8 x double> @cvt_8i16_to_8f64_constrained(<8 x i16> %a0) nounwind strictfp {
1750 ; AVX-LABEL: cvt_8i16_to_8f64_constrained:
1751 ; AVX:       # %bb.0:
1752 ; AVX-NEXT:    subq $88, %rsp
1753 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1754 ; AVX-NEXT:    vpsrlq $48, %xmm0, %xmm0
1755 ; AVX-NEXT:    callq __extendhfsf2@PLT
1756 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1757 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1758 ; AVX-NEXT:    vpermilps $245, (%rsp), %xmm0 # 16-byte Folded Reload
1759 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
1760 ; AVX-NEXT:    callq __extendhfsf2@PLT
1761 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1762 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1763 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1764 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1765 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1766 ; AVX-NEXT:    callq __extendhfsf2@PLT
1767 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1768 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1769 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1770 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
1771 ; AVX-NEXT:    callq __extendhfsf2@PLT
1772 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1773 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1774 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1775 ; AVX-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
1776 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
1777 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1778 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1779 ; AVX-NEXT:    vzeroupper
1780 ; AVX-NEXT:    callq __extendhfsf2@PLT
1781 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1782 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1783 ; AVX-NEXT:    vpermilps $255, (%rsp), %xmm0 # 16-byte Folded Reload
1784 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
1785 ; AVX-NEXT:    callq __extendhfsf2@PLT
1786 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1787 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1788 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1789 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1790 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1791 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1792 ; AVX-NEXT:    callq __extendhfsf2@PLT
1793 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1794 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1795 ; AVX-NEXT:    vpermilps $78, (%rsp), %xmm0 # 16-byte Folded Reload
1796 ; AVX-NEXT:    # xmm0 = mem[2,3,0,1]
1797 ; AVX-NEXT:    callq __extendhfsf2@PLT
1798 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1799 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1800 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1801 ; AVX-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm1 # 16-byte Folded Reload
1802 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
1803 ; AVX-NEXT:    addq $88, %rsp
1804 ; AVX-NEXT:    retq
1806 ; F16C-LABEL: cvt_8i16_to_8f64_constrained:
1807 ; F16C:       # %bb.0:
1808 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm0
1809 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm1
1810 ; F16C-NEXT:    vcvtps2pd %xmm1, %ymm1
1811 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1812 ; F16C-NEXT:    retq
1814 ; AVX512-LABEL: cvt_8i16_to_8f64_constrained:
1815 ; AVX512:       # %bb.0:
1816 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
1817 ; AVX512-NEXT:    vcvtps2pd %ymm0, %zmm0
1818 ; AVX512-NEXT:    retq
1819   %1 = bitcast <8 x i16> %a0 to <8 x half>
1820   %2 = call <8 x double> @llvm.experimental.constrained.fpext.v8f64.v8f16(<8 x half> %1, metadata !"fpexcept.strict") strictfp
1821   ret <8 x double> %2
1823 declare <8 x double> @llvm.experimental.constrained.fpext.v8f64.v8f16(<8 x half>, metadata) strictfp
1826 ; Half to Double (Load)
1829 define double @load_cvt_i16_to_f64(ptr %a0) nounwind {
1830 ; AVX-LABEL: load_cvt_i16_to_f64:
1831 ; AVX:       # %bb.0:
1832 ; AVX-NEXT:    pushq %rax
1833 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
1834 ; AVX-NEXT:    callq __extendhfsf2@PLT
1835 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1836 ; AVX-NEXT:    popq %rax
1837 ; AVX-NEXT:    retq
1839 ; F16C-LABEL: load_cvt_i16_to_f64:
1840 ; F16C:       # %bb.0:
1841 ; F16C-NEXT:    movzwl (%rdi), %eax
1842 ; F16C-NEXT:    vmovd %eax, %xmm0
1843 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1844 ; F16C-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1845 ; F16C-NEXT:    retq
1847 ; AVX512-LABEL: load_cvt_i16_to_f64:
1848 ; AVX512:       # %bb.0:
1849 ; AVX512-NEXT:    movzwl (%rdi), %eax
1850 ; AVX512-NEXT:    vmovd %eax, %xmm0
1851 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1852 ; AVX512-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1853 ; AVX512-NEXT:    retq
1854   %1 = load i16, ptr %a0
1855   %2 = bitcast i16 %1 to half
1856   %3 = fpext half %2 to double
1857   ret double %3
1860 define <2 x double> @load_cvt_2i16_to_2f64(ptr %a0) nounwind {
1861 ; AVX-LABEL: load_cvt_2i16_to_2f64:
1862 ; AVX:       # %bb.0:
1863 ; AVX-NEXT:    subq $40, %rsp
1864 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
1865 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1866 ; AVX-NEXT:    vpinsrw $0, 2(%rdi), %xmm0, %xmm0
1867 ; AVX-NEXT:    callq __extendhfsf2@PLT
1868 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1869 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1870 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1871 ; AVX-NEXT:    callq __extendhfsf2@PLT
1872 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1873 ; AVX-NEXT:    vunpcklpd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
1874 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1875 ; AVX-NEXT:    addq $40, %rsp
1876 ; AVX-NEXT:    retq
1878 ; F16C-LABEL: load_cvt_2i16_to_2f64:
1879 ; F16C:       # %bb.0:
1880 ; F16C-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1881 ; F16C-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1882 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1883 ; F16C-NEXT:    vcvtps2pd %xmm0, %xmm0
1884 ; F16C-NEXT:    retq
1886 ; AVX512-LABEL: load_cvt_2i16_to_2f64:
1887 ; AVX512:       # %bb.0:
1888 ; AVX512-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1889 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1890 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1891 ; AVX512-NEXT:    vcvtps2pd %xmm0, %xmm0
1892 ; AVX512-NEXT:    retq
1893   %1 = load <2 x i16>, ptr %a0
1894   %2 = bitcast <2 x i16> %1 to <2 x half>
1895   %3 = fpext <2 x half> %2 to <2 x double>
1896   ret <2 x double> %3
1899 define <4 x double> @load_cvt_4i16_to_4f64(ptr %a0) nounwind {
1900 ; AVX-LABEL: load_cvt_4i16_to_4f64:
1901 ; AVX:       # %bb.0:
1902 ; AVX-NEXT:    subq $72, %rsp
1903 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
1904 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1905 ; AVX-NEXT:    vpinsrw $0, 2(%rdi), %xmm0, %xmm0
1906 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1907 ; AVX-NEXT:    vpinsrw $0, 4(%rdi), %xmm0, %xmm0
1908 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1909 ; AVX-NEXT:    vpinsrw $0, 6(%rdi), %xmm0, %xmm0
1910 ; AVX-NEXT:    callq __extendhfsf2@PLT
1911 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1912 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1913 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1914 ; AVX-NEXT:    callq __extendhfsf2@PLT
1915 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1916 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1917 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1918 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1919 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1920 ; AVX-NEXT:    callq __extendhfsf2@PLT
1921 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1922 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1923 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1924 ; AVX-NEXT:    callq __extendhfsf2@PLT
1925 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1926 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1927 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1928 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1929 ; AVX-NEXT:    addq $72, %rsp
1930 ; AVX-NEXT:    retq
1932 ; F16C-LABEL: load_cvt_4i16_to_4f64:
1933 ; F16C:       # %bb.0:
1934 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
1935 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1936 ; F16C-NEXT:    retq
1938 ; AVX512-LABEL: load_cvt_4i16_to_4f64:
1939 ; AVX512:       # %bb.0:
1940 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
1941 ; AVX512-NEXT:    vcvtps2pd %xmm0, %ymm0
1942 ; AVX512-NEXT:    retq
1943   %1 = load <4 x i16>, ptr %a0
1944   %2 = bitcast <4 x i16> %1 to <4 x half>
1945   %3 = fpext <4 x half> %2 to <4 x double>
1946   ret <4 x double> %3
1949 define <4 x double> @load_cvt_8i16_to_4f64(ptr %a0) nounwind {
1950 ; AVX-LABEL: load_cvt_8i16_to_4f64:
1951 ; AVX:       # %bb.0:
1952 ; AVX-NEXT:    subq $72, %rsp
1953 ; AVX-NEXT:    movq (%rdi), %rax
1954 ; AVX-NEXT:    movq %rax, %rcx
1955 ; AVX-NEXT:    movl %eax, %edx
1956 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1957 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1958 ; AVX-NEXT:    shrq $48, %rax
1959 ; AVX-NEXT:    shrq $32, %rcx
1960 ; AVX-NEXT:    shrl $16, %edx
1961 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm0
1962 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1963 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm0
1964 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1965 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1966 ; AVX-NEXT:    callq __extendhfsf2@PLT
1967 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1968 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1969 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1970 ; AVX-NEXT:    callq __extendhfsf2@PLT
1971 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1972 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1973 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1974 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1975 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1976 ; AVX-NEXT:    callq __extendhfsf2@PLT
1977 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1978 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1979 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1980 ; AVX-NEXT:    callq __extendhfsf2@PLT
1981 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1982 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1983 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1984 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1985 ; AVX-NEXT:    addq $72, %rsp
1986 ; AVX-NEXT:    retq
1988 ; F16C-LABEL: load_cvt_8i16_to_4f64:
1989 ; F16C:       # %bb.0:
1990 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
1991 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1992 ; F16C-NEXT:    retq
1994 ; AVX512-LABEL: load_cvt_8i16_to_4f64:
1995 ; AVX512:       # %bb.0:
1996 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
1997 ; AVX512-NEXT:    vcvtps2pd %xmm0, %ymm0
1998 ; AVX512-NEXT:    retq
1999   %1 = load <8 x i16>, ptr %a0
2000   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2001   %3 = bitcast <4 x i16> %2 to <4 x half>
2002   %4 = fpext <4 x half> %3 to <4 x double>
2003   ret <4 x double> %4
2006 define <8 x double> @load_cvt_8i16_to_8f64(ptr %a0) nounwind {
2007 ; AVX1-LABEL: load_cvt_8i16_to_8f64:
2008 ; AVX1:       # %bb.0:
2009 ; AVX1-NEXT:    pushq %rbx
2010 ; AVX1-NEXT:    subq $80, %rsp
2011 ; AVX1-NEXT:    movq %rdi, %rbx
2012 ; AVX1-NEXT:    vmovaps (%rdi), %xmm0
2013 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2014 ; AVX1-NEXT:    vbroadcastss 4(%rdi), %xmm0
2015 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2016 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2017 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2018 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2019 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
2020 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2021 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2022 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2023 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2024 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2025 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2026 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2027 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2028 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2029 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2030 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
2031 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2032 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2033 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
2034 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2035 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2036 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2037 ; AVX1-NEXT:    vbroadcastss 12(%rbx), %xmm0
2038 ; AVX1-NEXT:    vzeroupper
2039 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2040 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2041 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2042 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2043 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2044 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2045 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2046 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
2047 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2048 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2049 ; AVX1-NEXT:    vbroadcastss 8(%rbx), %xmm0
2050 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2051 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2052 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2053 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2054 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2055 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2056 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2057 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2058 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2059 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
2060 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2061 ; AVX1-NEXT:    addq $80, %rsp
2062 ; AVX1-NEXT:    popq %rbx
2063 ; AVX1-NEXT:    retq
2065 ; AVX2-LABEL: load_cvt_8i16_to_8f64:
2066 ; AVX2:       # %bb.0:
2067 ; AVX2-NEXT:    pushq %rbx
2068 ; AVX2-NEXT:    subq $80, %rsp
2069 ; AVX2-NEXT:    movq %rdi, %rbx
2070 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
2071 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2072 ; AVX2-NEXT:    vpinsrw $0, 4(%rdi), %xmm0, %xmm0
2073 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2074 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2075 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2076 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2077 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
2078 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2079 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2080 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2081 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2082 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2083 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2084 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2085 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2086 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2087 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2088 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
2089 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2090 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2091 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
2092 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2093 ; AVX2-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2094 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2095 ; AVX2-NEXT:    vpinsrw $0, 12(%rbx), %xmm0, %xmm0
2096 ; AVX2-NEXT:    vzeroupper
2097 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2098 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2099 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2100 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2101 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2102 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2103 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2104 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
2105 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2106 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2107 ; AVX2-NEXT:    vpinsrw $0, 8(%rbx), %xmm0, %xmm0
2108 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2109 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2110 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2111 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2112 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2113 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2114 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2115 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2116 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2117 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
2118 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2119 ; AVX2-NEXT:    addq $80, %rsp
2120 ; AVX2-NEXT:    popq %rbx
2121 ; AVX2-NEXT:    retq
2123 ; F16C-LABEL: load_cvt_8i16_to_8f64:
2124 ; F16C:       # %bb.0:
2125 ; F16C-NEXT:    vcvtph2ps (%rdi), %ymm1
2126 ; F16C-NEXT:    vcvtps2pd %xmm1, %ymm0
2127 ; F16C-NEXT:    vextractf128 $1, %ymm1, %xmm1
2128 ; F16C-NEXT:    vcvtps2pd %xmm1, %ymm1
2129 ; F16C-NEXT:    retq
2131 ; AVX512-LABEL: load_cvt_8i16_to_8f64:
2132 ; AVX512:       # %bb.0:
2133 ; AVX512-NEXT:    vcvtph2ps (%rdi), %ymm0
2134 ; AVX512-NEXT:    vcvtps2pd %ymm0, %zmm0
2135 ; AVX512-NEXT:    retq
2136   %1 = load <8 x i16>, ptr %a0
2137   %2 = bitcast <8 x i16> %1 to <8 x half>
2138   %3 = fpext <8 x half> %2 to <8 x double>
2139   ret <8 x double> %3
2143 ; Float to Half
2146 define i16 @cvt_f32_to_i16(float %a0) nounwind {
2147 ; AVX-LABEL: cvt_f32_to_i16:
2148 ; AVX:       # %bb.0:
2149 ; AVX-NEXT:    pushq %rax
2150 ; AVX-NEXT:    callq __truncsfhf2@PLT
2151 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
2152 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
2153 ; AVX-NEXT:    popq %rcx
2154 ; AVX-NEXT:    retq
2156 ; F16C-LABEL: cvt_f32_to_i16:
2157 ; F16C:       # %bb.0:
2158 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2159 ; F16C-NEXT:    vmovd %xmm0, %eax
2160 ; F16C-NEXT:    # kill: def $ax killed $ax killed $eax
2161 ; F16C-NEXT:    retq
2163 ; AVX512-LABEL: cvt_f32_to_i16:
2164 ; AVX512:       # %bb.0:
2165 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2166 ; AVX512-NEXT:    vmovd %xmm0, %eax
2167 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
2168 ; AVX512-NEXT:    retq
2169   %1 = fptrunc float %a0 to half
2170   %2 = bitcast half %1 to i16
2171   ret i16 %2
2174 define <4 x i16> @cvt_4f32_to_4i16(<4 x float> %a0) nounwind {
2175 ; AVX-LABEL: cvt_4f32_to_4i16:
2176 ; AVX:       # %bb.0:
2177 ; AVX-NEXT:    subq $72, %rsp
2178 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2179 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2180 ; AVX-NEXT:    callq __truncsfhf2@PLT
2181 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2182 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2183 ; AVX-NEXT:    callq __truncsfhf2@PLT
2184 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2185 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2186 ; AVX-NEXT:    # xmm0 = mem[1,0]
2187 ; AVX-NEXT:    callq __truncsfhf2@PLT
2188 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2189 ; AVX-NEXT:    vpshufd $255, (%rsp), %xmm0 # 16-byte Folded Reload
2190 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2191 ; AVX-NEXT:    callq __truncsfhf2@PLT
2192 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2193 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2194 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2195 ; AVX-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
2196 ; AVX-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
2197 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2198 ; AVX-NEXT:    addq $72, %rsp
2199 ; AVX-NEXT:    retq
2201 ; F16C-LABEL: cvt_4f32_to_4i16:
2202 ; F16C:       # %bb.0:
2203 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2204 ; F16C-NEXT:    retq
2206 ; AVX512-LABEL: cvt_4f32_to_4i16:
2207 ; AVX512:       # %bb.0:
2208 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2209 ; AVX512-NEXT:    retq
2210   %1 = fptrunc <4 x float> %a0 to <4 x half>
2211   %2 = bitcast <4 x half> %1 to <4 x i16>
2212   ret <4 x i16> %2
2215 define <8 x i16> @cvt_4f32_to_8i16_undef(<4 x float> %a0) nounwind {
2216 ; AVX-LABEL: cvt_4f32_to_8i16_undef:
2217 ; AVX:       # %bb.0:
2218 ; AVX-NEXT:    subq $72, %rsp
2219 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2220 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2221 ; AVX-NEXT:    callq __truncsfhf2@PLT
2222 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2223 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2224 ; AVX-NEXT:    callq __truncsfhf2@PLT
2225 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2226 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2227 ; AVX-NEXT:    # xmm0 = mem[1,0]
2228 ; AVX-NEXT:    callq __truncsfhf2@PLT
2229 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2230 ; AVX-NEXT:    vpshufd $255, (%rsp), %xmm0 # 16-byte Folded Reload
2231 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2232 ; AVX-NEXT:    callq __truncsfhf2@PLT
2233 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2234 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2235 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2236 ; AVX-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
2237 ; AVX-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
2238 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2239 ; AVX-NEXT:    addq $72, %rsp
2240 ; AVX-NEXT:    retq
2242 ; F16C-LABEL: cvt_4f32_to_8i16_undef:
2243 ; F16C:       # %bb.0:
2244 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2245 ; F16C-NEXT:    retq
2247 ; AVX512-LABEL: cvt_4f32_to_8i16_undef:
2248 ; AVX512:       # %bb.0:
2249 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2250 ; AVX512-NEXT:    retq
2251   %1 = fptrunc <4 x float> %a0 to <4 x half>
2252   %2 = bitcast <4 x half> %1 to <4 x i16>
2253   %3 = shufflevector <4 x i16> %2, <4 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2254   ret <8 x i16> %3
2257 define <8 x i16> @cvt_4f32_to_8i16_zero(<4 x float> %a0) nounwind {
2258 ; AVX-LABEL: cvt_4f32_to_8i16_zero:
2259 ; AVX:       # %bb.0:
2260 ; AVX-NEXT:    subq $72, %rsp
2261 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2262 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2263 ; AVX-NEXT:    callq __truncsfhf2@PLT
2264 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2265 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2266 ; AVX-NEXT:    callq __truncsfhf2@PLT
2267 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2268 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2269 ; AVX-NEXT:    # xmm0 = mem[1,0]
2270 ; AVX-NEXT:    callq __truncsfhf2@PLT
2271 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2272 ; AVX-NEXT:    vpshufd $255, (%rsp), %xmm0 # 16-byte Folded Reload
2273 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2274 ; AVX-NEXT:    callq __truncsfhf2@PLT
2275 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2276 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2277 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2278 ; AVX-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
2279 ; AVX-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
2280 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2281 ; AVX-NEXT:    addq $72, %rsp
2282 ; AVX-NEXT:    retq
2284 ; F16C-LABEL: cvt_4f32_to_8i16_zero:
2285 ; F16C:       # %bb.0:
2286 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2287 ; F16C-NEXT:    retq
2289 ; AVX512-LABEL: cvt_4f32_to_8i16_zero:
2290 ; AVX512:       # %bb.0:
2291 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2292 ; AVX512-NEXT:    retq
2293   %1 = fptrunc <4 x float> %a0 to <4 x half>
2294   %2 = bitcast <4 x half> %1 to <4 x i16>
2295   %3 = shufflevector <4 x i16> %2, <4 x i16> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2296   ret <8 x i16> %3
2299 define <8 x i16> @cvt_8f32_to_8i16(<8 x float> %a0) nounwind {
2300 ; AVX-LABEL: cvt_8f32_to_8i16:
2301 ; AVX:       # %bb.0:
2302 ; AVX-NEXT:    subq $88, %rsp
2303 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2304 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
2305 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2306 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2307 ; AVX-NEXT:    vzeroupper
2308 ; AVX-NEXT:    callq __truncsfhf2@PLT
2309 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2310 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2311 ; AVX-NEXT:    # xmm0 = mem[1,0]
2312 ; AVX-NEXT:    callq __truncsfhf2@PLT
2313 ; AVX-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2314 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2315 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2316 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2317 ; AVX-NEXT:    callq __truncsfhf2@PLT
2318 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2319 ; AVX-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2320 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
2321 ; AVX-NEXT:    callq __truncsfhf2@PLT
2322 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2323 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2324 ; AVX-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2325 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2326 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2327 ; AVX-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2328 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2329 ; AVX-NEXT:    callq __truncsfhf2@PLT
2330 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2331 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2332 ; AVX-NEXT:    # xmm0 = mem[1,0]
2333 ; AVX-NEXT:    callq __truncsfhf2@PLT
2334 ; AVX-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2335 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2336 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2337 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2338 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2339 ; AVX-NEXT:    vzeroupper
2340 ; AVX-NEXT:    callq __truncsfhf2@PLT
2341 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2342 ; AVX-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2343 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
2344 ; AVX-NEXT:    callq __truncsfhf2@PLT
2345 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2346 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2347 ; AVX-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2348 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2349 ; AVX-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2350 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
2351 ; AVX-NEXT:    addq $88, %rsp
2352 ; AVX-NEXT:    retq
2354 ; F16C-LABEL: cvt_8f32_to_8i16:
2355 ; F16C:       # %bb.0:
2356 ; F16C-NEXT:    vcvtps2ph $4, %ymm0, %xmm0
2357 ; F16C-NEXT:    vzeroupper
2358 ; F16C-NEXT:    retq
2360 ; AVX512-LABEL: cvt_8f32_to_8i16:
2361 ; AVX512:       # %bb.0:
2362 ; AVX512-NEXT:    vcvtps2ph $4, %ymm0, %xmm0
2363 ; AVX512-NEXT:    vzeroupper
2364 ; AVX512-NEXT:    retq
2365   %1 = fptrunc <8 x float> %a0 to <8 x half>
2366   %2 = bitcast <8 x half> %1 to <8 x i16>
2367   ret <8 x i16> %2
2370 define <16 x i16> @cvt_16f32_to_16i16(<16 x float> %a0) nounwind {
2371 ; AVX1-LABEL: cvt_16f32_to_16i16:
2372 ; AVX1:       # %bb.0:
2373 ; AVX1-NEXT:    subq $120, %rsp
2374 ; AVX1-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2375 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2376 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0
2377 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2378 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2379 ; AVX1-NEXT:    vzeroupper
2380 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2381 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2382 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2383 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2384 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2385 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2386 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2387 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2388 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2389 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2390 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2391 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2392 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2393 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2394 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2395 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2396 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2397 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2398 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2399 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2400 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
2401 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2402 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2403 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2404 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2405 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2406 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2407 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2408 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2409 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2410 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2411 ; AVX1-NEXT:    vzeroupper
2412 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2413 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2414 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2415 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2416 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2417 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2418 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2419 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2420 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2421 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2422 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
2423 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2424 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2425 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2426 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2427 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2428 ; AVX1-NEXT:    vzeroupper
2429 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2430 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2431 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2432 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2433 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2434 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2435 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2436 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2437 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2438 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2439 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2440 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2441 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2442 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2443 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2444 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2445 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2446 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2447 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2448 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2449 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
2450 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2451 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2452 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2453 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2454 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2455 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2456 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2457 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2458 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2459 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2460 ; AVX1-NEXT:    vzeroupper
2461 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2462 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2463 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2464 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2465 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2466 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2467 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2468 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2469 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2470 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2471 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
2472 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2473 ; AVX1-NEXT:    addq $120, %rsp
2474 ; AVX1-NEXT:    retq
2476 ; AVX2-LABEL: cvt_16f32_to_16i16:
2477 ; AVX2:       # %bb.0:
2478 ; AVX2-NEXT:    subq $184, %rsp
2479 ; AVX2-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2480 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2481 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm0
2482 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2483 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2484 ; AVX2-NEXT:    vzeroupper
2485 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2486 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2487 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2488 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2489 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2490 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2491 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2492 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2493 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2494 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
2495 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2496 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2497 ; AVX2-NEXT:    vzeroupper
2498 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2499 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2500 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2501 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2502 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2503 ; AVX2-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2504 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2505 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2506 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2507 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2508 ; AVX2-NEXT:    vzeroupper
2509 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2510 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2511 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2512 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
2513 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2514 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
2515 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2516 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2517 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2518 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2519 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2520 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2521 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
2522 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2523 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
2524 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2525 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2526 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
2527 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
2528 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2529 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2530 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
2531 ; AVX2-NEXT:    vzeroupper
2532 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2533 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2534 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2535 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2536 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2537 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2538 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2539 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2540 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2541 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
2542 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2543 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2544 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2545 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2546 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2547 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2548 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2549 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2550 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2551 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2552 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2553 ; AVX2-NEXT:    vzeroupper
2554 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2555 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2556 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2557 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
2558 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2559 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2560 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2561 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2562 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2563 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2564 ; AVX2-NEXT:    vzeroupper
2565 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2566 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2567 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2568 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
2569 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2570 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2571 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2572 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2573 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
2574 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
2575 ; AVX2-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
2576 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[2],mem[2]
2577 ; AVX2-NEXT:    addq $184, %rsp
2578 ; AVX2-NEXT:    retq
2580 ; F16C-LABEL: cvt_16f32_to_16i16:
2581 ; F16C:       # %bb.0:
2582 ; F16C-NEXT:    vcvtps2ph $4, %ymm0, %xmm0
2583 ; F16C-NEXT:    vcvtps2ph $4, %ymm1, %xmm1
2584 ; F16C-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2585 ; F16C-NEXT:    retq
2587 ; AVX512-LABEL: cvt_16f32_to_16i16:
2588 ; AVX512:       # %bb.0:
2589 ; AVX512-NEXT:    vcvtps2ph $4, %zmm0, %ymm0
2590 ; AVX512-NEXT:    retq
2591   %1 = fptrunc <16 x float> %a0 to <16 x half>
2592   %2 = bitcast <16 x half> %1 to <16 x i16>
2593   ret <16 x i16> %2
2597 ; Float to Half (Store)
2600 define void @store_cvt_f32_to_i16(float %a0, ptr %a1) nounwind {
2601 ; AVX-LABEL: store_cvt_f32_to_i16:
2602 ; AVX:       # %bb.0:
2603 ; AVX-NEXT:    pushq %rbx
2604 ; AVX-NEXT:    movq %rdi, %rbx
2605 ; AVX-NEXT:    callq __truncsfhf2@PLT
2606 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rbx)
2607 ; AVX-NEXT:    popq %rbx
2608 ; AVX-NEXT:    retq
2610 ; F16C-LABEL: store_cvt_f32_to_i16:
2611 ; F16C:       # %bb.0:
2612 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2613 ; F16C-NEXT:    vmovd %xmm0, %eax
2614 ; F16C-NEXT:    movw %ax, (%rdi)
2615 ; F16C-NEXT:    retq
2617 ; AVX512-LABEL: store_cvt_f32_to_i16:
2618 ; AVX512:       # %bb.0:
2619 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2620 ; AVX512-NEXT:    vmovd %xmm0, %eax
2621 ; AVX512-NEXT:    movw %ax, (%rdi)
2622 ; AVX512-NEXT:    retq
2623   %1 = fptrunc float %a0 to half
2624   %2 = bitcast half %1 to i16
2625   store i16 %2, ptr %a1
2626   ret void
2629 define void @store_cvt_4f32_to_4i16(<4 x float> %a0, ptr %a1) nounwind {
2630 ; AVX-LABEL: store_cvt_4f32_to_4i16:
2631 ; AVX:       # %bb.0:
2632 ; AVX-NEXT:    pushq %rbx
2633 ; AVX-NEXT:    subq $64, %rsp
2634 ; AVX-NEXT:    movq %rdi, %rbx
2635 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2636 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2637 ; AVX-NEXT:    callq __truncsfhf2@PLT
2638 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2639 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2640 ; AVX-NEXT:    # xmm0 = mem[1,0]
2641 ; AVX-NEXT:    callq __truncsfhf2@PLT
2642 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2643 ; AVX-NEXT:    vpermilps $255, (%rsp), %xmm0 # 16-byte Folded Reload
2644 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2645 ; AVX-NEXT:    callq __truncsfhf2@PLT
2646 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2647 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
2648 ; AVX-NEXT:    callq __truncsfhf2@PLT
2649 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rbx)
2650 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2651 ; AVX-NEXT:    vpextrw $0, %xmm0, 6(%rbx)
2652 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2653 ; AVX-NEXT:    vpextrw $0, %xmm0, 4(%rbx)
2654 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2655 ; AVX-NEXT:    vpextrw $0, %xmm0, 2(%rbx)
2656 ; AVX-NEXT:    addq $64, %rsp
2657 ; AVX-NEXT:    popq %rbx
2658 ; AVX-NEXT:    retq
2660 ; F16C-LABEL: store_cvt_4f32_to_4i16:
2661 ; F16C:       # %bb.0:
2662 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, (%rdi)
2663 ; F16C-NEXT:    retq
2665 ; AVX512-LABEL: store_cvt_4f32_to_4i16:
2666 ; AVX512:       # %bb.0:
2667 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, (%rdi)
2668 ; AVX512-NEXT:    retq
2669   %1 = fptrunc <4 x float> %a0 to <4 x half>
2670   %2 = bitcast <4 x half> %1 to <4 x i16>
2671   store <4 x i16> %2, ptr %a1
2672   ret void
2675 define void @store_cvt_4f32_to_8i16_undef(<4 x float> %a0, ptr %a1) nounwind {
2676 ; AVX-LABEL: store_cvt_4f32_to_8i16_undef:
2677 ; AVX:       # %bb.0:
2678 ; AVX-NEXT:    pushq %rbx
2679 ; AVX-NEXT:    subq $64, %rsp
2680 ; AVX-NEXT:    movq %rdi, %rbx
2681 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2682 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2683 ; AVX-NEXT:    callq __truncsfhf2@PLT
2684 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2685 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2686 ; AVX-NEXT:    callq __truncsfhf2@PLT
2687 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2688 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2689 ; AVX-NEXT:    # xmm0 = mem[1,0]
2690 ; AVX-NEXT:    callq __truncsfhf2@PLT
2691 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2692 ; AVX-NEXT:    vpshufd $255, (%rsp), %xmm0 # 16-byte Folded Reload
2693 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2694 ; AVX-NEXT:    callq __truncsfhf2@PLT
2695 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2696 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2697 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2698 ; AVX-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
2699 ; AVX-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
2700 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2701 ; AVX-NEXT:    vmovaps %xmm0, (%rbx)
2702 ; AVX-NEXT:    addq $64, %rsp
2703 ; AVX-NEXT:    popq %rbx
2704 ; AVX-NEXT:    retq
2706 ; F16C-LABEL: store_cvt_4f32_to_8i16_undef:
2707 ; F16C:       # %bb.0:
2708 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2709 ; F16C-NEXT:    vmovaps %xmm0, (%rdi)
2710 ; F16C-NEXT:    retq
2712 ; AVX512-LABEL: store_cvt_4f32_to_8i16_undef:
2713 ; AVX512:       # %bb.0:
2714 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2715 ; AVX512-NEXT:    vmovaps %xmm0, (%rdi)
2716 ; AVX512-NEXT:    retq
2717   %1 = fptrunc <4 x float> %a0 to <4 x half>
2718   %2 = bitcast <4 x half> %1 to <4 x i16>
2719   %3 = shufflevector <4 x i16> %2, <4 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2720   store <8 x i16> %3, ptr %a1
2721   ret void
2724 define void @store_cvt_4f32_to_8i16_zero(<4 x float> %a0, ptr %a1) nounwind {
2725 ; AVX-LABEL: store_cvt_4f32_to_8i16_zero:
2726 ; AVX:       # %bb.0:
2727 ; AVX-NEXT:    pushq %rbx
2728 ; AVX-NEXT:    subq $64, %rsp
2729 ; AVX-NEXT:    movq %rdi, %rbx
2730 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2731 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2732 ; AVX-NEXT:    callq __truncsfhf2@PLT
2733 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2734 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2735 ; AVX-NEXT:    callq __truncsfhf2@PLT
2736 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2737 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2738 ; AVX-NEXT:    # xmm0 = mem[1,0]
2739 ; AVX-NEXT:    callq __truncsfhf2@PLT
2740 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2741 ; AVX-NEXT:    vpshufd $255, (%rsp), %xmm0 # 16-byte Folded Reload
2742 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2743 ; AVX-NEXT:    callq __truncsfhf2@PLT
2744 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2745 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2746 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2747 ; AVX-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
2748 ; AVX-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
2749 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2750 ; AVX-NEXT:    vmovaps %xmm0, (%rbx)
2751 ; AVX-NEXT:    addq $64, %rsp
2752 ; AVX-NEXT:    popq %rbx
2753 ; AVX-NEXT:    retq
2755 ; F16C-LABEL: store_cvt_4f32_to_8i16_zero:
2756 ; F16C:       # %bb.0:
2757 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2758 ; F16C-NEXT:    vmovaps %xmm0, (%rdi)
2759 ; F16C-NEXT:    retq
2761 ; AVX512-LABEL: store_cvt_4f32_to_8i16_zero:
2762 ; AVX512:       # %bb.0:
2763 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2764 ; AVX512-NEXT:    vmovaps %xmm0, (%rdi)
2765 ; AVX512-NEXT:    retq
2766   %1 = fptrunc <4 x float> %a0 to <4 x half>
2767   %2 = bitcast <4 x half> %1 to <4 x i16>
2768   %3 = shufflevector <4 x i16> %2, <4 x i16> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2769   store <8 x i16> %3, ptr %a1
2770   ret void
2773 define void @store_cvt_8f32_to_8i16(<8 x float> %a0, ptr %a1) nounwind {
2774 ; AVX-LABEL: store_cvt_8f32_to_8i16:
2775 ; AVX:       # %bb.0:
2776 ; AVX-NEXT:    pushq %rbx
2777 ; AVX-NEXT:    subq $80, %rsp
2778 ; AVX-NEXT:    movq %rdi, %rbx
2779 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2780 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
2781 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2782 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2783 ; AVX-NEXT:    vzeroupper
2784 ; AVX-NEXT:    callq __truncsfhf2@PLT
2785 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2786 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2787 ; AVX-NEXT:    # xmm0 = mem[1,0]
2788 ; AVX-NEXT:    callq __truncsfhf2@PLT
2789 ; AVX-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2790 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2791 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2792 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2793 ; AVX-NEXT:    callq __truncsfhf2@PLT
2794 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2795 ; AVX-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2796 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
2797 ; AVX-NEXT:    callq __truncsfhf2@PLT
2798 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2799 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2800 ; AVX-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2801 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2802 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2803 ; AVX-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2804 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2805 ; AVX-NEXT:    callq __truncsfhf2@PLT
2806 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2807 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2808 ; AVX-NEXT:    # xmm0 = mem[1,0]
2809 ; AVX-NEXT:    callq __truncsfhf2@PLT
2810 ; AVX-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2811 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2812 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2813 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2814 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2815 ; AVX-NEXT:    vzeroupper
2816 ; AVX-NEXT:    callq __truncsfhf2@PLT
2817 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2818 ; AVX-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2819 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
2820 ; AVX-NEXT:    callq __truncsfhf2@PLT
2821 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2822 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2823 ; AVX-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2824 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2825 ; AVX-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2826 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
2827 ; AVX-NEXT:    vmovdqa %xmm0, (%rbx)
2828 ; AVX-NEXT:    addq $80, %rsp
2829 ; AVX-NEXT:    popq %rbx
2830 ; AVX-NEXT:    retq
2832 ; F16C-LABEL: store_cvt_8f32_to_8i16:
2833 ; F16C:       # %bb.0:
2834 ; F16C-NEXT:    vcvtps2ph $4, %ymm0, (%rdi)
2835 ; F16C-NEXT:    vzeroupper
2836 ; F16C-NEXT:    retq
2838 ; AVX512-LABEL: store_cvt_8f32_to_8i16:
2839 ; AVX512:       # %bb.0:
2840 ; AVX512-NEXT:    vcvtps2ph $4, %ymm0, (%rdi)
2841 ; AVX512-NEXT:    vzeroupper
2842 ; AVX512-NEXT:    retq
2843   %1 = fptrunc <8 x float> %a0 to <8 x half>
2844   %2 = bitcast <8 x half> %1 to <8 x i16>
2845   store <8 x i16> %2, ptr %a1
2846   ret void
2849 define void @store_cvt_16f32_to_16i16(<16 x float> %a0, ptr %a1) nounwind {
2850 ; AVX1-LABEL: store_cvt_16f32_to_16i16:
2851 ; AVX1:       # %bb.0:
2852 ; AVX1-NEXT:    pushq %rbx
2853 ; AVX1-NEXT:    subq $112, %rsp
2854 ; AVX1-NEXT:    movq %rdi, %rbx
2855 ; AVX1-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2856 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2857 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0
2858 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2859 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2860 ; AVX1-NEXT:    vzeroupper
2861 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2862 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2863 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2864 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2865 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2866 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2867 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2868 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2869 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2870 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2871 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2872 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2873 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2874 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2875 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2876 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2877 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2878 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2879 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2880 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2881 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
2882 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2883 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2884 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2885 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2886 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2887 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2888 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2889 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2890 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2891 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2892 ; AVX1-NEXT:    vzeroupper
2893 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2894 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2895 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2896 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2897 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2898 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2899 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2900 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2901 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2902 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2903 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
2904 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2905 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2906 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2907 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2908 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2909 ; AVX1-NEXT:    vzeroupper
2910 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2911 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2912 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2913 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2914 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2915 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2916 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2917 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2918 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2919 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2920 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2921 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2922 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2923 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2924 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2925 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2926 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2927 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2928 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2929 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2930 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
2931 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2932 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2933 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2934 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2935 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2936 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2937 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2938 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2939 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2940 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2941 ; AVX1-NEXT:    vzeroupper
2942 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2943 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2944 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2945 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2946 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2947 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2948 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2949 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2950 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2951 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2952 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
2953 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2954 ; AVX1-NEXT:    vmovaps %ymm0, (%rbx)
2955 ; AVX1-NEXT:    addq $112, %rsp
2956 ; AVX1-NEXT:    popq %rbx
2957 ; AVX1-NEXT:    vzeroupper
2958 ; AVX1-NEXT:    retq
2960 ; AVX2-LABEL: store_cvt_16f32_to_16i16:
2961 ; AVX2:       # %bb.0:
2962 ; AVX2-NEXT:    pushq %rbx
2963 ; AVX2-NEXT:    subq $176, %rsp
2964 ; AVX2-NEXT:    movq %rdi, %rbx
2965 ; AVX2-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2966 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2967 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm0
2968 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2969 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2970 ; AVX2-NEXT:    vzeroupper
2971 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2972 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2973 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2974 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2975 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2976 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2977 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2978 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2979 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2980 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
2981 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2982 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2983 ; AVX2-NEXT:    vzeroupper
2984 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2985 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2986 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2987 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2988 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2989 ; AVX2-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2990 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2991 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2992 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2993 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2994 ; AVX2-NEXT:    vzeroupper
2995 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2996 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2997 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2998 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
2999 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3000 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3001 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3002 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3003 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3004 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3005 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3006 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3007 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
3008 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3009 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3010 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3011 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
3012 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
3013 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
3014 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3015 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3016 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
3017 ; AVX2-NEXT:    vzeroupper
3018 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3019 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3020 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3021 ; AVX2-NEXT:    # xmm0 = mem[1,0]
3022 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3023 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3024 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3025 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3026 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3027 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
3028 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3029 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3030 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3031 ; AVX2-NEXT:    # xmm0 = mem[1,0]
3032 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3033 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3034 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3035 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
3036 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3037 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3038 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3039 ; AVX2-NEXT:    vzeroupper
3040 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3041 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3042 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3043 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
3044 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3045 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3046 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3047 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3048 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3049 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3050 ; AVX2-NEXT:    vzeroupper
3051 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3052 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3053 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3054 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
3055 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3056 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3057 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3058 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
3059 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
3060 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
3061 ; AVX2-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
3062 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[2],mem[2]
3063 ; AVX2-NEXT:    vmovdqa %ymm0, (%rbx)
3064 ; AVX2-NEXT:    addq $176, %rsp
3065 ; AVX2-NEXT:    popq %rbx
3066 ; AVX2-NEXT:    vzeroupper
3067 ; AVX2-NEXT:    retq
3069 ; F16C-LABEL: store_cvt_16f32_to_16i16:
3070 ; F16C:       # %bb.0:
3071 ; F16C-NEXT:    vcvtps2ph $4, %ymm1, 16(%rdi)
3072 ; F16C-NEXT:    vcvtps2ph $4, %ymm0, (%rdi)
3073 ; F16C-NEXT:    vzeroupper
3074 ; F16C-NEXT:    retq
3076 ; AVX512-LABEL: store_cvt_16f32_to_16i16:
3077 ; AVX512:       # %bb.0:
3078 ; AVX512-NEXT:    vcvtps2ph $4, %zmm0, (%rdi)
3079 ; AVX512-NEXT:    vzeroupper
3080 ; AVX512-NEXT:    retq
3081   %1 = fptrunc <16 x float> %a0 to <16 x half>
3082   %2 = bitcast <16 x half> %1 to <16 x i16>
3083   store <16 x i16> %2, ptr %a1
3084   ret void
3088 ; Double to Half
3091 define i16 @cvt_f64_to_i16(double %a0) nounwind {
3092 ; ALL-LABEL: cvt_f64_to_i16:
3093 ; ALL:       # %bb.0:
3094 ; ALL-NEXT:    pushq %rax
3095 ; ALL-NEXT:    callq __truncdfhf2@PLT
3096 ; ALL-NEXT:    vpextrw $0, %xmm0, %eax
3097 ; ALL-NEXT:    # kill: def $ax killed $ax killed $eax
3098 ; ALL-NEXT:    popq %rcx
3099 ; ALL-NEXT:    retq
3100 ; AVX-LABEL: cvt_f64_to_i16:
3101 ; AVX:       # %bb.0:
3102 ; AVX-NEXT:    pushq %rax
3103 ; AVX-NEXT:    callq __truncdfhf2@PLT
3104 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
3105 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
3106 ; AVX-NEXT:    popq %rcx
3107 ; AVX-NEXT:    retq
3109 ; F16C-LABEL: cvt_f64_to_i16:
3110 ; F16C:       # %bb.0:
3111 ; F16C-NEXT:    pushq %rax
3112 ; F16C-NEXT:    callq __truncdfhf2@PLT
3113 ; F16C-NEXT:    vpextrw $0, %xmm0, %eax
3114 ; F16C-NEXT:    # kill: def $ax killed $ax killed $eax
3115 ; F16C-NEXT:    popq %rcx
3116 ; F16C-NEXT:    retq
3118 ; AVX512-LABEL: cvt_f64_to_i16:
3119 ; AVX512:       # %bb.0:
3120 ; AVX512-NEXT:    pushq %rax
3121 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3122 ; AVX512-NEXT:    vpextrw $0, %xmm0, %eax
3123 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
3124 ; AVX512-NEXT:    popq %rcx
3125 ; AVX512-NEXT:    retq
3126   %1 = fptrunc double %a0 to half
3127   %2 = bitcast half %1 to i16
3128   ret i16 %2
3131 define <2 x i16> @cvt_2f64_to_2i16(<2 x double> %a0) nounwind {
3132 ; AVX-LABEL: cvt_2f64_to_2i16:
3133 ; AVX:       # %bb.0:
3134 ; AVX-NEXT:    subq $40, %rsp
3135 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3136 ; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3137 ; AVX-NEXT:    callq __truncdfhf2@PLT
3138 ; AVX-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3139 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3140 ; AVX-NEXT:    callq __truncdfhf2@PLT
3141 ; AVX-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
3142 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3143 ; AVX-NEXT:    addq $40, %rsp
3144 ; AVX-NEXT:    retq
3146 ; F16C-LABEL: cvt_2f64_to_2i16:
3147 ; F16C:       # %bb.0:
3148 ; F16C-NEXT:    subq $40, %rsp
3149 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3150 ; F16C-NEXT:    callq __truncdfhf2@PLT
3151 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3152 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3153 ; F16C-NEXT:    # xmm0 = mem[1,0]
3154 ; F16C-NEXT:    callq __truncdfhf2@PLT
3155 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3156 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3157 ; F16C-NEXT:    addq $40, %rsp
3158 ; F16C-NEXT:    retq
3160 ; AVX512F-LABEL: cvt_2f64_to_2i16:
3161 ; AVX512F:       # %bb.0:
3162 ; AVX512F-NEXT:    subq $104, %rsp
3163 ; AVX512F-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
3164 ; AVX512F-NEXT:    callq __truncdfhf2@PLT
3165 ; AVX512F-NEXT:    vpbroadcastw %xmm0, %xmm0
3166 ; AVX512F-NEXT:    vmovdqu64 %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
3167 ; AVX512F-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3168 ; AVX512F-NEXT:    vzeroupper
3169 ; AVX512F-NEXT:    callq __truncdfhf2@PLT
3170 ; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3171 ; AVX512F-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3172 ; AVX512F-NEXT:    # xmm0 = mem[1,0]
3173 ; AVX512F-NEXT:    callq __truncdfhf2@PLT
3174 ; AVX512F-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3175 ; AVX512F-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3176 ; AVX512F-NEXT:    vmovaps {{.*#+}} xmm1 = [16,0,0,0]
3177 ; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
3178 ; AVX512F-NEXT:    vpermt2ps %zmm2, %zmm1, %zmm0
3179 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3180 ; AVX512F-NEXT:    addq $104, %rsp
3181 ; AVX512F-NEXT:    vzeroupper
3182 ; AVX512F-NEXT:    retq
3184 ; AVX512-FASTLANE-LABEL: cvt_2f64_to_2i16:
3185 ; AVX512-FASTLANE:       # %bb.0:
3186 ; AVX512-FASTLANE-NEXT:    subq $40, %rsp
3187 ; AVX512-FASTLANE-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3188 ; AVX512-FASTLANE-NEXT:    callq __truncdfhf2@PLT
3189 ; AVX512-FASTLANE-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3190 ; AVX512-FASTLANE-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3191 ; AVX512-FASTLANE-NEXT:    # xmm0 = mem[1,0]
3192 ; AVX512-FASTLANE-NEXT:    callq __truncdfhf2@PLT
3193 ; AVX512-FASTLANE-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3194 ; AVX512-FASTLANE-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3195 ; AVX512-FASTLANE-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
3196 ; AVX512-FASTLANE-NEXT:    callq __truncdfhf2@PLT
3197 ; AVX512-FASTLANE-NEXT:    vpbroadcastw %xmm0, %xmm1
3198 ; AVX512-FASTLANE-NEXT:    vmovaps {{.*#+}} xmm0 = [4,0,0,0]
3199 ; AVX512-FASTLANE-NEXT:    vpermi2ps (%rsp), %xmm1, %xmm0 # 16-byte Folded Reload
3200 ; AVX512-FASTLANE-NEXT:    addq $40, %rsp
3201 ; AVX512-FASTLANE-NEXT:    retq
3202   %1 = fptrunc <2 x double> %a0 to <2 x half>
3203   %2 = bitcast <2 x half> %1 to <2 x i16>
3204   ret <2 x i16> %2
3207 define <4 x i16> @cvt_4f64_to_4i16(<4 x double> %a0) nounwind {
3208 ; AVX1-LABEL: cvt_4f64_to_4i16:
3209 ; AVX1:       # %bb.0:
3210 ; AVX1-NEXT:    subq $88, %rsp
3211 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3212 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3213 ; AVX1-NEXT:    vzeroupper
3214 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3215 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3216 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3217 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3218 ; AVX1-NEXT:    vzeroupper
3219 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3220 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3221 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3222 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3223 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3224 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3225 ; AVX1-NEXT:    vzeroupper
3226 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3227 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3228 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3229 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3230 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3231 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3232 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3233 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3234 ; AVX1-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3235 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3236 ; AVX1-NEXT:    addq $88, %rsp
3237 ; AVX1-NEXT:    retq
3239 ; AVX2-LABEL: cvt_4f64_to_4i16:
3240 ; AVX2:       # %bb.0:
3241 ; AVX2-NEXT:    subq $88, %rsp
3242 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3243 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3244 ; AVX2-NEXT:    vzeroupper
3245 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3246 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3247 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3248 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3249 ; AVX2-NEXT:    vzeroupper
3250 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3251 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3252 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3253 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3254 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3255 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3256 ; AVX2-NEXT:    vzeroupper
3257 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3258 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3259 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3260 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3261 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3262 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3263 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3264 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3265 ; AVX2-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3266 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3267 ; AVX2-NEXT:    addq $88, %rsp
3268 ; AVX2-NEXT:    retq
3270 ; F16C-LABEL: cvt_4f64_to_4i16:
3271 ; F16C:       # %bb.0:
3272 ; F16C-NEXT:    subq $72, %rsp
3273 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3274 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
3275 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3276 ; F16C-NEXT:    vzeroupper
3277 ; F16C-NEXT:    callq __truncdfhf2@PLT
3278 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3279 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3280 ; F16C-NEXT:    # xmm0 = mem[1,0]
3281 ; F16C-NEXT:    callq __truncdfhf2@PLT
3282 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3283 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3284 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3285 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3286 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3287 ; F16C-NEXT:    vzeroupper
3288 ; F16C-NEXT:    callq __truncdfhf2@PLT
3289 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3290 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3291 ; F16C-NEXT:    # xmm0 = mem[1,0]
3292 ; F16C-NEXT:    callq __truncdfhf2@PLT
3293 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3294 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3295 ; F16C-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3296 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
3297 ; F16C-NEXT:    addq $72, %rsp
3298 ; F16C-NEXT:    retq
3300 ; AVX512-LABEL: cvt_4f64_to_4i16:
3301 ; AVX512:       # %bb.0:
3302 ; AVX512-NEXT:    subq $72, %rsp
3303 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3304 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3305 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3306 ; AVX512-NEXT:    vzeroupper
3307 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3308 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3309 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3310 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3311 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3312 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3313 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3314 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3315 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3316 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3317 ; AVX512-NEXT:    vzeroupper
3318 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3319 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3320 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3321 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3322 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3323 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3324 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3325 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3326 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3327 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3328 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3329 ; AVX512-NEXT:    vpbroadcastw %xmm0, %xmm0
3330 ; AVX512-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3331 ; AVX512-NEXT:    vshufps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0,0]
3332 ; AVX512-NEXT:    addq $72, %rsp
3333 ; AVX512-NEXT:    retq
3334   %1 = fptrunc <4 x double> %a0 to <4 x half>
3335   %2 = bitcast <4 x half> %1 to <4 x i16>
3336   ret <4 x i16> %2
3339 define <8 x i16> @cvt_4f64_to_8i16_undef(<4 x double> %a0) nounwind {
3340 ; AVX1-LABEL: cvt_4f64_to_8i16_undef:
3341 ; AVX1:       # %bb.0:
3342 ; AVX1-NEXT:    subq $88, %rsp
3343 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3344 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3345 ; AVX1-NEXT:    vzeroupper
3346 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3347 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3348 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3349 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3350 ; AVX1-NEXT:    vzeroupper
3351 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3352 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3353 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3354 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3355 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3356 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3357 ; AVX1-NEXT:    vzeroupper
3358 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3359 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3360 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3361 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3362 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3363 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3364 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3365 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3366 ; AVX1-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3367 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3368 ; AVX1-NEXT:    addq $88, %rsp
3369 ; AVX1-NEXT:    retq
3371 ; AVX2-LABEL: cvt_4f64_to_8i16_undef:
3372 ; AVX2:       # %bb.0:
3373 ; AVX2-NEXT:    subq $88, %rsp
3374 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3375 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3376 ; AVX2-NEXT:    vzeroupper
3377 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3378 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3379 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3380 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3381 ; AVX2-NEXT:    vzeroupper
3382 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3383 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3384 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3385 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3386 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3387 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3388 ; AVX2-NEXT:    vzeroupper
3389 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3390 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3391 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3392 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3393 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3394 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3395 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3396 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3397 ; AVX2-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3398 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3399 ; AVX2-NEXT:    addq $88, %rsp
3400 ; AVX2-NEXT:    retq
3402 ; F16C-LABEL: cvt_4f64_to_8i16_undef:
3403 ; F16C:       # %bb.0:
3404 ; F16C-NEXT:    subq $72, %rsp
3405 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3406 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
3407 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3408 ; F16C-NEXT:    vzeroupper
3409 ; F16C-NEXT:    callq __truncdfhf2@PLT
3410 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3411 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3412 ; F16C-NEXT:    # xmm0 = mem[1,0]
3413 ; F16C-NEXT:    callq __truncdfhf2@PLT
3414 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3415 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3416 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3417 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3418 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3419 ; F16C-NEXT:    vzeroupper
3420 ; F16C-NEXT:    callq __truncdfhf2@PLT
3421 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3422 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3423 ; F16C-NEXT:    # xmm0 = mem[1,0]
3424 ; F16C-NEXT:    callq __truncdfhf2@PLT
3425 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3426 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3427 ; F16C-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3428 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
3429 ; F16C-NEXT:    addq $72, %rsp
3430 ; F16C-NEXT:    retq
3432 ; AVX512-LABEL: cvt_4f64_to_8i16_undef:
3433 ; AVX512:       # %bb.0:
3434 ; AVX512-NEXT:    subq $72, %rsp
3435 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3436 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3437 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3438 ; AVX512-NEXT:    vzeroupper
3439 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3440 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3441 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3442 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3443 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3444 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3445 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3446 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3447 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3448 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3449 ; AVX512-NEXT:    vzeroupper
3450 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3451 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3452 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3453 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3454 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3455 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3456 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3457 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3458 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3459 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3460 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3461 ; AVX512-NEXT:    vpbroadcastw %xmm0, %xmm0
3462 ; AVX512-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3463 ; AVX512-NEXT:    vshufps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0,0]
3464 ; AVX512-NEXT:    addq $72, %rsp
3465 ; AVX512-NEXT:    retq
3466   %1 = fptrunc <4 x double> %a0 to <4 x half>
3467   %2 = bitcast <4 x half> %1 to <4 x i16>
3468   %3 = shufflevector <4 x i16> %2, <4 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
3469   ret <8 x i16> %3
3472 define <8 x i16> @cvt_4f64_to_8i16_zero(<4 x double> %a0) nounwind {
3473 ; AVX1-LABEL: cvt_4f64_to_8i16_zero:
3474 ; AVX1:       # %bb.0:
3475 ; AVX1-NEXT:    subq $88, %rsp
3476 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3477 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3478 ; AVX1-NEXT:    vzeroupper
3479 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3480 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3481 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3482 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3483 ; AVX1-NEXT:    vzeroupper
3484 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3485 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3486 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3487 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3488 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3489 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3490 ; AVX1-NEXT:    vzeroupper
3491 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3492 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3493 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3494 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3495 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3496 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3497 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3498 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3499 ; AVX1-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3500 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3501 ; AVX1-NEXT:    addq $88, %rsp
3502 ; AVX1-NEXT:    retq
3504 ; AVX2-LABEL: cvt_4f64_to_8i16_zero:
3505 ; AVX2:       # %bb.0:
3506 ; AVX2-NEXT:    subq $88, %rsp
3507 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3508 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3509 ; AVX2-NEXT:    vzeroupper
3510 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3511 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3512 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3513 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3514 ; AVX2-NEXT:    vzeroupper
3515 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3516 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3517 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3518 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3519 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3520 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3521 ; AVX2-NEXT:    vzeroupper
3522 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3523 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3524 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3525 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3526 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3527 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3528 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3529 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3530 ; AVX2-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3531 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3532 ; AVX2-NEXT:    addq $88, %rsp
3533 ; AVX2-NEXT:    retq
3535 ; F16C-LABEL: cvt_4f64_to_8i16_zero:
3536 ; F16C:       # %bb.0:
3537 ; F16C-NEXT:    subq $72, %rsp
3538 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3539 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
3540 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3541 ; F16C-NEXT:    vzeroupper
3542 ; F16C-NEXT:    callq __truncdfhf2@PLT
3543 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3544 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3545 ; F16C-NEXT:    # xmm0 = mem[1,0]
3546 ; F16C-NEXT:    callq __truncdfhf2@PLT
3547 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3548 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3549 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3550 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3551 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3552 ; F16C-NEXT:    vzeroupper
3553 ; F16C-NEXT:    callq __truncdfhf2@PLT
3554 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3555 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3556 ; F16C-NEXT:    # xmm0 = mem[1,0]
3557 ; F16C-NEXT:    callq __truncdfhf2@PLT
3558 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3559 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3560 ; F16C-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3561 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
3562 ; F16C-NEXT:    addq $72, %rsp
3563 ; F16C-NEXT:    retq
3565 ; AVX512-LABEL: cvt_4f64_to_8i16_zero:
3566 ; AVX512:       # %bb.0:
3567 ; AVX512-NEXT:    subq $72, %rsp
3568 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3569 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3570 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3571 ; AVX512-NEXT:    vzeroupper
3572 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3573 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3574 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3575 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3576 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3577 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3578 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3579 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3580 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3581 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3582 ; AVX512-NEXT:    vzeroupper
3583 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3584 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3585 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3586 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3587 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3588 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3589 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3590 ; AVX512-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3591 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
3592 ; AVX512-NEXT:    addq $72, %rsp
3593 ; AVX512-NEXT:    retq
3594   %1 = fptrunc <4 x double> %a0 to <4 x half>
3595   %2 = bitcast <4 x half> %1 to <4 x i16>
3596   %3 = shufflevector <4 x i16> %2, <4 x i16> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
3597   ret <8 x i16> %3
3600 define <8 x i16> @cvt_8f64_to_8i16(<8 x double> %a0) nounwind {
3601 ; AVX-LABEL: cvt_8f64_to_8i16:
3602 ; AVX:       # %bb.0:
3603 ; AVX-NEXT:    subq $104, %rsp
3604 ; AVX-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3605 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3606 ; AVX-NEXT:    vextractf128 $1, %ymm1, %xmm0
3607 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3608 ; AVX-NEXT:    vzeroupper
3609 ; AVX-NEXT:    callq __truncdfhf2@PLT
3610 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3611 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3612 ; AVX-NEXT:    # xmm0 = mem[1,0]
3613 ; AVX-NEXT:    callq __truncdfhf2@PLT
3614 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3615 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3616 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3617 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3618 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3619 ; AVX-NEXT:    vzeroupper
3620 ; AVX-NEXT:    callq __truncdfhf2@PLT
3621 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3622 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3623 ; AVX-NEXT:    # xmm0 = mem[1,0]
3624 ; AVX-NEXT:    callq __truncdfhf2@PLT
3625 ; AVX-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3626 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3627 ; AVX-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3628 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3629 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3630 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3631 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
3632 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3633 ; AVX-NEXT:    vzeroupper
3634 ; AVX-NEXT:    callq __truncdfhf2@PLT
3635 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3636 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3637 ; AVX-NEXT:    # xmm0 = mem[1,0]
3638 ; AVX-NEXT:    callq __truncdfhf2@PLT
3639 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3640 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3641 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3642 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3643 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3644 ; AVX-NEXT:    vzeroupper
3645 ; AVX-NEXT:    callq __truncdfhf2@PLT
3646 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3647 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3648 ; AVX-NEXT:    # xmm0 = mem[1,0]
3649 ; AVX-NEXT:    callq __truncdfhf2@PLT
3650 ; AVX-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3651 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3652 ; AVX-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3653 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3654 ; AVX-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3655 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
3656 ; AVX-NEXT:    addq $104, %rsp
3657 ; AVX-NEXT:    retq
3659 ; F16C-LABEL: cvt_8f64_to_8i16:
3660 ; F16C:       # %bb.0:
3661 ; F16C-NEXT:    subq $104, %rsp
3662 ; F16C-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3663 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3664 ; F16C-NEXT:    vextractf128 $1, %ymm1, %xmm0
3665 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3666 ; F16C-NEXT:    vzeroupper
3667 ; F16C-NEXT:    callq __truncdfhf2@PLT
3668 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3669 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3670 ; F16C-NEXT:    # xmm0 = mem[1,0]
3671 ; F16C-NEXT:    callq __truncdfhf2@PLT
3672 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3673 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3674 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3675 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3676 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3677 ; F16C-NEXT:    vzeroupper
3678 ; F16C-NEXT:    callq __truncdfhf2@PLT
3679 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3680 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3681 ; F16C-NEXT:    # xmm0 = mem[1,0]
3682 ; F16C-NEXT:    callq __truncdfhf2@PLT
3683 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3684 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3685 ; F16C-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3686 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3687 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3688 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3689 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
3690 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3691 ; F16C-NEXT:    vzeroupper
3692 ; F16C-NEXT:    callq __truncdfhf2@PLT
3693 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3694 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3695 ; F16C-NEXT:    # xmm0 = mem[1,0]
3696 ; F16C-NEXT:    callq __truncdfhf2@PLT
3697 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3698 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3699 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3700 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3701 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3702 ; F16C-NEXT:    vzeroupper
3703 ; F16C-NEXT:    callq __truncdfhf2@PLT
3704 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3705 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3706 ; F16C-NEXT:    # xmm0 = mem[1,0]
3707 ; F16C-NEXT:    callq __truncdfhf2@PLT
3708 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3709 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3710 ; F16C-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3711 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3712 ; F16C-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3713 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0]
3714 ; F16C-NEXT:    addq $104, %rsp
3715 ; F16C-NEXT:    retq
3717 ; AVX512-LABEL: cvt_8f64_to_8i16:
3718 ; AVX512:       # %bb.0:
3719 ; AVX512-NEXT:    subq $120, %rsp
3720 ; AVX512-NEXT:    vmovups %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
3721 ; AVX512-NEXT:    vextractf32x4 $3, %zmm0, %xmm0
3722 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3723 ; AVX512-NEXT:    vzeroupper
3724 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3725 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3726 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3727 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3728 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3729 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3730 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3731 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3732 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
3733 ; AVX512-NEXT:    vextractf32x4 $2, %zmm0, %xmm0
3734 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3735 ; AVX512-NEXT:    vzeroupper
3736 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3737 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3738 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3739 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3740 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3741 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3742 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3743 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3744 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3745 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3746 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
3747 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3748 ; AVX512-NEXT:    vzeroupper
3749 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3750 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3751 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3752 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3753 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3754 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3755 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3756 ; AVX512-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
3757 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
3758 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3759 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3760 ; AVX512-NEXT:    vzeroupper
3761 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3762 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3763 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3764 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3765 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3766 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3767 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3768 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3769 ; AVX512-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
3770 ; AVX512-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3771 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0]
3772 ; AVX512-NEXT:    addq $120, %rsp
3773 ; AVX512-NEXT:    retq
3774   %1 = fptrunc <8 x double> %a0 to <8 x half>
3775   %2 = bitcast <8 x half> %1 to <8 x i16>
3776   ret <8 x i16> %2
3780 ; Double to Half (Store)
3783 define void @store_cvt_f64_to_i16(double %a0, ptr %a1) nounwind {
3784 ; ALL-LABEL: store_cvt_f64_to_i16:
3785 ; ALL:       # %bb.0:
3786 ; ALL-NEXT:    pushq %rbx
3787 ; ALL-NEXT:    movq %rdi, %rbx
3788 ; ALL-NEXT:    callq __truncdfhf2@PLT
3789 ; ALL-NEXT:    vpextrw $0, %xmm0, (%rbx)
3790 ; ALL-NEXT:    popq %rbx
3791 ; ALL-NEXT:    retq
3792 ; AVX-LABEL: store_cvt_f64_to_i16:
3793 ; AVX:       # %bb.0:
3794 ; AVX-NEXT:    pushq %rbx
3795 ; AVX-NEXT:    movq %rdi, %rbx
3796 ; AVX-NEXT:    callq __truncdfhf2@PLT
3797 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rbx)
3798 ; AVX-NEXT:    popq %rbx
3799 ; AVX-NEXT:    retq
3801 ; F16C-LABEL: store_cvt_f64_to_i16:
3802 ; F16C:       # %bb.0:
3803 ; F16C-NEXT:    pushq %rbx
3804 ; F16C-NEXT:    movq %rdi, %rbx
3805 ; F16C-NEXT:    callq __truncdfhf2@PLT
3806 ; F16C-NEXT:    vpextrw $0, %xmm0, (%rbx)
3807 ; F16C-NEXT:    popq %rbx
3808 ; F16C-NEXT:    retq
3810 ; AVX512-LABEL: store_cvt_f64_to_i16:
3811 ; AVX512:       # %bb.0:
3812 ; AVX512-NEXT:    pushq %rbx
3813 ; AVX512-NEXT:    movq %rdi, %rbx
3814 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3815 ; AVX512-NEXT:    vpextrw $0, %xmm0, (%rbx)
3816 ; AVX512-NEXT:    popq %rbx
3817 ; AVX512-NEXT:    retq
3818   %1 = fptrunc double %a0 to half
3819   %2 = bitcast half %1 to i16
3820   store i16 %2, ptr %a1
3821   ret void
3824 define void @store_cvt_2f64_to_2i16(<2 x double> %a0, ptr %a1) nounwind {
3825 ; AVX-LABEL: store_cvt_2f64_to_2i16:
3826 ; AVX:       # %bb.0:
3827 ; AVX-NEXT:    pushq %rbx
3828 ; AVX-NEXT:    subq $32, %rsp
3829 ; AVX-NEXT:    movq %rdi, %rbx
3830 ; AVX-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3831 ; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3832 ; AVX-NEXT:    callq __truncdfhf2@PLT
3833 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3834 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3835 ; AVX-NEXT:    callq __truncdfhf2@PLT
3836 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rbx)
3837 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3838 ; AVX-NEXT:    vpextrw $0, %xmm0, 2(%rbx)
3839 ; AVX-NEXT:    addq $32, %rsp
3840 ; AVX-NEXT:    popq %rbx
3841 ; AVX-NEXT:    retq
3843 ; F16C-LABEL: store_cvt_2f64_to_2i16:
3844 ; F16C:       # %bb.0:
3845 ; F16C-NEXT:    pushq %rbx
3846 ; F16C-NEXT:    subq $32, %rsp
3847 ; F16C-NEXT:    movq %rdi, %rbx
3848 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3849 ; F16C-NEXT:    callq __truncdfhf2@PLT
3850 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3851 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3852 ; F16C-NEXT:    # xmm0 = mem[1,0]
3853 ; F16C-NEXT:    callq __truncdfhf2@PLT
3854 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3855 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3856 ; F16C-NEXT:    vmovd %xmm0, (%rbx)
3857 ; F16C-NEXT:    addq $32, %rsp
3858 ; F16C-NEXT:    popq %rbx
3859 ; F16C-NEXT:    retq
3861 ; AVX512-LABEL: store_cvt_2f64_to_2i16:
3862 ; AVX512:       # %bb.0:
3863 ; AVX512-NEXT:    pushq %rbx
3864 ; AVX512-NEXT:    subq $32, %rsp
3865 ; AVX512-NEXT:    movq %rdi, %rbx
3866 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3867 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3868 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3869 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3870 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3871 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3872 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3873 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3874 ; AVX512-NEXT:    vmovd %xmm0, (%rbx)
3875 ; AVX512-NEXT:    addq $32, %rsp
3876 ; AVX512-NEXT:    popq %rbx
3877 ; AVX512-NEXT:    retq
3878   %1 = fptrunc <2 x double> %a0 to <2 x half>
3879   %2 = bitcast <2 x half> %1 to <2 x i16>
3880   store <2 x i16> %2, ptr %a1
3881   ret void
3884 define void @store_cvt_4f64_to_4i16(<4 x double> %a0, ptr %a1) nounwind {
3885 ; AVX1-LABEL: store_cvt_4f64_to_4i16:
3886 ; AVX1:       # %bb.0:
3887 ; AVX1-NEXT:    pushq %rbx
3888 ; AVX1-NEXT:    subq $80, %rsp
3889 ; AVX1-NEXT:    movq %rdi, %rbx
3890 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3891 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3892 ; AVX1-NEXT:    vzeroupper
3893 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3894 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3895 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3896 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3897 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3898 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3899 ; AVX1-NEXT:    vzeroupper
3900 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3901 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3902 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3903 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3904 ; AVX1-NEXT:    vzeroupper
3905 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3906 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3907 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3908 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3909 ; AVX1-NEXT:    vpextrw $0, %xmm0, 4(%rbx)
3910 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3911 ; AVX1-NEXT:    vpextrw $0, %xmm0, (%rbx)
3912 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3913 ; AVX1-NEXT:    vpextrw $0, %xmm0, 6(%rbx)
3914 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3915 ; AVX1-NEXT:    vpextrw $0, %xmm0, 2(%rbx)
3916 ; AVX1-NEXT:    addq $80, %rsp
3917 ; AVX1-NEXT:    popq %rbx
3918 ; AVX1-NEXT:    retq
3920 ; AVX2-LABEL: store_cvt_4f64_to_4i16:
3921 ; AVX2:       # %bb.0:
3922 ; AVX2-NEXT:    pushq %rbx
3923 ; AVX2-NEXT:    subq $80, %rsp
3924 ; AVX2-NEXT:    movq %rdi, %rbx
3925 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3926 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3927 ; AVX2-NEXT:    vzeroupper
3928 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3929 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3930 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3931 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3932 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3933 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3934 ; AVX2-NEXT:    vzeroupper
3935 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3936 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3937 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3938 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3939 ; AVX2-NEXT:    vzeroupper
3940 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3941 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3942 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3943 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3944 ; AVX2-NEXT:    vpextrw $0, %xmm0, 4(%rbx)
3945 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3946 ; AVX2-NEXT:    vpextrw $0, %xmm0, (%rbx)
3947 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3948 ; AVX2-NEXT:    vpextrw $0, %xmm0, 6(%rbx)
3949 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3950 ; AVX2-NEXT:    vpextrw $0, %xmm0, 2(%rbx)
3951 ; AVX2-NEXT:    addq $80, %rsp
3952 ; AVX2-NEXT:    popq %rbx
3953 ; AVX2-NEXT:    retq
3955 ; F16C-LABEL: store_cvt_4f64_to_4i16:
3956 ; F16C:       # %bb.0:
3957 ; F16C-NEXT:    pushq %rbx
3958 ; F16C-NEXT:    subq $64, %rsp
3959 ; F16C-NEXT:    movq %rdi, %rbx
3960 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3961 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
3962 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3963 ; F16C-NEXT:    vzeroupper
3964 ; F16C-NEXT:    callq __truncdfhf2@PLT
3965 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3966 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3967 ; F16C-NEXT:    # xmm0 = mem[1,0]
3968 ; F16C-NEXT:    callq __truncdfhf2@PLT
3969 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3970 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3971 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3972 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3973 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3974 ; F16C-NEXT:    vzeroupper
3975 ; F16C-NEXT:    callq __truncdfhf2@PLT
3976 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3977 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3978 ; F16C-NEXT:    # xmm0 = mem[1,0]
3979 ; F16C-NEXT:    callq __truncdfhf2@PLT
3980 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3981 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3982 ; F16C-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3983 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3984 ; F16C-NEXT:    vmovq %xmm0, (%rbx)
3985 ; F16C-NEXT:    addq $64, %rsp
3986 ; F16C-NEXT:    popq %rbx
3987 ; F16C-NEXT:    retq
3989 ; AVX512-LABEL: store_cvt_4f64_to_4i16:
3990 ; AVX512:       # %bb.0:
3991 ; AVX512-NEXT:    pushq %rbx
3992 ; AVX512-NEXT:    subq $64, %rsp
3993 ; AVX512-NEXT:    movq %rdi, %rbx
3994 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3995 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3996 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3997 ; AVX512-NEXT:    vzeroupper
3998 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3999 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4000 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4001 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4002 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4003 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4004 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4005 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4006 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4007 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4008 ; AVX512-NEXT:    vzeroupper
4009 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4010 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4011 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4012 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4013 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4014 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4015 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4016 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4017 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4018 ; AVX512-NEXT:    vmovq %xmm0, (%rbx)
4019 ; AVX512-NEXT:    addq $64, %rsp
4020 ; AVX512-NEXT:    popq %rbx
4021 ; AVX512-NEXT:    retq
4022   %1 = fptrunc <4 x double> %a0 to <4 x half>
4023   %2 = bitcast <4 x half> %1 to <4 x i16>
4024   store <4 x i16> %2, ptr %a1
4025   ret void
4028 define void @store_cvt_4f64_to_8i16_undef(<4 x double> %a0, ptr %a1) nounwind {
4029 ; AVX1-LABEL: store_cvt_4f64_to_8i16_undef:
4030 ; AVX1:       # %bb.0:
4031 ; AVX1-NEXT:    pushq %rbx
4032 ; AVX1-NEXT:    subq $80, %rsp
4033 ; AVX1-NEXT:    movq %rdi, %rbx
4034 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
4035 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4036 ; AVX1-NEXT:    vzeroupper
4037 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4038 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4039 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4040 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4041 ; AVX1-NEXT:    vzeroupper
4042 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4043 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4044 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4045 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4046 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4047 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4048 ; AVX1-NEXT:    vzeroupper
4049 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4050 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4051 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
4052 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4053 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4054 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4055 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4056 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
4057 ; AVX1-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
4058 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
4059 ; AVX1-NEXT:    vmovaps %xmm0, (%rbx)
4060 ; AVX1-NEXT:    addq $80, %rsp
4061 ; AVX1-NEXT:    popq %rbx
4062 ; AVX1-NEXT:    retq
4064 ; AVX2-LABEL: store_cvt_4f64_to_8i16_undef:
4065 ; AVX2:       # %bb.0:
4066 ; AVX2-NEXT:    pushq %rbx
4067 ; AVX2-NEXT:    subq $80, %rsp
4068 ; AVX2-NEXT:    movq %rdi, %rbx
4069 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
4070 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4071 ; AVX2-NEXT:    vzeroupper
4072 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4073 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4074 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4075 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4076 ; AVX2-NEXT:    vzeroupper
4077 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4078 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4079 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
4080 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4081 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4082 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4083 ; AVX2-NEXT:    vzeroupper
4084 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4085 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4086 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
4087 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4088 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4089 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4090 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4091 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
4092 ; AVX2-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
4093 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
4094 ; AVX2-NEXT:    vmovaps %xmm0, (%rbx)
4095 ; AVX2-NEXT:    addq $80, %rsp
4096 ; AVX2-NEXT:    popq %rbx
4097 ; AVX2-NEXT:    retq
4099 ; F16C-LABEL: store_cvt_4f64_to_8i16_undef:
4100 ; F16C:       # %bb.0:
4101 ; F16C-NEXT:    pushq %rbx
4102 ; F16C-NEXT:    subq $64, %rsp
4103 ; F16C-NEXT:    movq %rdi, %rbx
4104 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4105 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
4106 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4107 ; F16C-NEXT:    vzeroupper
4108 ; F16C-NEXT:    callq __truncdfhf2@PLT
4109 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4110 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4111 ; F16C-NEXT:    # xmm0 = mem[1,0]
4112 ; F16C-NEXT:    callq __truncdfhf2@PLT
4113 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4114 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4115 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4116 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4117 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4118 ; F16C-NEXT:    vzeroupper
4119 ; F16C-NEXT:    callq __truncdfhf2@PLT
4120 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4121 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4122 ; F16C-NEXT:    # xmm0 = mem[1,0]
4123 ; F16C-NEXT:    callq __truncdfhf2@PLT
4124 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4125 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4126 ; F16C-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4127 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
4128 ; F16C-NEXT:    vmovaps %xmm0, (%rbx)
4129 ; F16C-NEXT:    addq $64, %rsp
4130 ; F16C-NEXT:    popq %rbx
4131 ; F16C-NEXT:    retq
4133 ; AVX512-LABEL: store_cvt_4f64_to_8i16_undef:
4134 ; AVX512:       # %bb.0:
4135 ; AVX512-NEXT:    pushq %rbx
4136 ; AVX512-NEXT:    subq $64, %rsp
4137 ; AVX512-NEXT:    movq %rdi, %rbx
4138 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4139 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
4140 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4141 ; AVX512-NEXT:    vzeroupper
4142 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4143 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4144 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4145 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4146 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4147 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4148 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4149 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4150 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4151 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4152 ; AVX512-NEXT:    vzeroupper
4153 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4154 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4155 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4156 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4157 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4158 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4159 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4160 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4161 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4162 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4163 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4164 ; AVX512-NEXT:    vpbroadcastw %xmm0, %xmm0
4165 ; AVX512-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4166 ; AVX512-NEXT:    vshufps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0,0]
4167 ; AVX512-NEXT:    vmovaps %xmm0, (%rbx)
4168 ; AVX512-NEXT:    addq $64, %rsp
4169 ; AVX512-NEXT:    popq %rbx
4170 ; AVX512-NEXT:    retq
4171   %1 = fptrunc <4 x double> %a0 to <4 x half>
4172   %2 = bitcast <4 x half> %1 to <4 x i16>
4173   %3 = shufflevector <4 x i16> %2, <4 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
4174   store <8 x i16> %3, ptr %a1
4175   ret void
4178 define void @store_cvt_4f64_to_8i16_zero(<4 x double> %a0, ptr %a1) nounwind {
4179 ; AVX1-LABEL: store_cvt_4f64_to_8i16_zero:
4180 ; AVX1:       # %bb.0:
4181 ; AVX1-NEXT:    pushq %rbx
4182 ; AVX1-NEXT:    subq $80, %rsp
4183 ; AVX1-NEXT:    movq %rdi, %rbx
4184 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
4185 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4186 ; AVX1-NEXT:    vzeroupper
4187 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4188 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4189 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4190 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4191 ; AVX1-NEXT:    vzeroupper
4192 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4193 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4194 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4195 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4196 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4197 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4198 ; AVX1-NEXT:    vzeroupper
4199 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4200 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4201 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
4202 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4203 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4204 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4205 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4206 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
4207 ; AVX1-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
4208 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
4209 ; AVX1-NEXT:    vmovaps %xmm0, (%rbx)
4210 ; AVX1-NEXT:    addq $80, %rsp
4211 ; AVX1-NEXT:    popq %rbx
4212 ; AVX1-NEXT:    retq
4214 ; AVX2-LABEL: store_cvt_4f64_to_8i16_zero:
4215 ; AVX2:       # %bb.0:
4216 ; AVX2-NEXT:    pushq %rbx
4217 ; AVX2-NEXT:    subq $80, %rsp
4218 ; AVX2-NEXT:    movq %rdi, %rbx
4219 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
4220 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4221 ; AVX2-NEXT:    vzeroupper
4222 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4223 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4224 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4225 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4226 ; AVX2-NEXT:    vzeroupper
4227 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4228 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4229 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
4230 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4231 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4232 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4233 ; AVX2-NEXT:    vzeroupper
4234 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4235 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4236 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
4237 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4238 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4239 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4240 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4241 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
4242 ; AVX2-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
4243 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
4244 ; AVX2-NEXT:    vmovaps %xmm0, (%rbx)
4245 ; AVX2-NEXT:    addq $80, %rsp
4246 ; AVX2-NEXT:    popq %rbx
4247 ; AVX2-NEXT:    retq
4249 ; F16C-LABEL: store_cvt_4f64_to_8i16_zero:
4250 ; F16C:       # %bb.0:
4251 ; F16C-NEXT:    pushq %rbx
4252 ; F16C-NEXT:    subq $64, %rsp
4253 ; F16C-NEXT:    movq %rdi, %rbx
4254 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4255 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
4256 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4257 ; F16C-NEXT:    vzeroupper
4258 ; F16C-NEXT:    callq __truncdfhf2@PLT
4259 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4260 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4261 ; F16C-NEXT:    # xmm0 = mem[1,0]
4262 ; F16C-NEXT:    callq __truncdfhf2@PLT
4263 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4264 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4265 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4266 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4267 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4268 ; F16C-NEXT:    vzeroupper
4269 ; F16C-NEXT:    callq __truncdfhf2@PLT
4270 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4271 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4272 ; F16C-NEXT:    # xmm0 = mem[1,0]
4273 ; F16C-NEXT:    callq __truncdfhf2@PLT
4274 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4275 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4276 ; F16C-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4277 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
4278 ; F16C-NEXT:    vmovaps %xmm0, (%rbx)
4279 ; F16C-NEXT:    addq $64, %rsp
4280 ; F16C-NEXT:    popq %rbx
4281 ; F16C-NEXT:    retq
4283 ; AVX512-LABEL: store_cvt_4f64_to_8i16_zero:
4284 ; AVX512:       # %bb.0:
4285 ; AVX512-NEXT:    pushq %rbx
4286 ; AVX512-NEXT:    subq $64, %rsp
4287 ; AVX512-NEXT:    movq %rdi, %rbx
4288 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4289 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
4290 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4291 ; AVX512-NEXT:    vzeroupper
4292 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4293 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4294 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4295 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4296 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4297 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4298 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4299 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4300 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4301 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4302 ; AVX512-NEXT:    vzeroupper
4303 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4304 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4305 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4306 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4307 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4308 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4309 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4310 ; AVX512-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4311 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
4312 ; AVX512-NEXT:    vmovaps %xmm0, (%rbx)
4313 ; AVX512-NEXT:    addq $64, %rsp
4314 ; AVX512-NEXT:    popq %rbx
4315 ; AVX512-NEXT:    retq
4316   %1 = fptrunc <4 x double> %a0 to <4 x half>
4317   %2 = bitcast <4 x half> %1 to <4 x i16>
4318   %3 = shufflevector <4 x i16> %2, <4 x i16> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
4319   store <8 x i16> %3, ptr %a1
4320   ret void
4323 define void @store_cvt_8f64_to_8i16(<8 x double> %a0, ptr %a1) nounwind {
4324 ; AVX-LABEL: store_cvt_8f64_to_8i16:
4325 ; AVX:       # %bb.0:
4326 ; AVX-NEXT:    pushq %rbx
4327 ; AVX-NEXT:    subq $96, %rsp
4328 ; AVX-NEXT:    movq %rdi, %rbx
4329 ; AVX-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4330 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4331 ; AVX-NEXT:    vextractf128 $1, %ymm1, %xmm0
4332 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4333 ; AVX-NEXT:    vzeroupper
4334 ; AVX-NEXT:    callq __truncdfhf2@PLT
4335 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4336 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4337 ; AVX-NEXT:    # xmm0 = mem[1,0]
4338 ; AVX-NEXT:    callq __truncdfhf2@PLT
4339 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4340 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4341 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4342 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4343 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4344 ; AVX-NEXT:    vzeroupper
4345 ; AVX-NEXT:    callq __truncdfhf2@PLT
4346 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4347 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4348 ; AVX-NEXT:    # xmm0 = mem[1,0]
4349 ; AVX-NEXT:    callq __truncdfhf2@PLT
4350 ; AVX-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4351 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4352 ; AVX-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4353 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4354 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4355 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4356 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
4357 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4358 ; AVX-NEXT:    vzeroupper
4359 ; AVX-NEXT:    callq __truncdfhf2@PLT
4360 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4361 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4362 ; AVX-NEXT:    # xmm0 = mem[1,0]
4363 ; AVX-NEXT:    callq __truncdfhf2@PLT
4364 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4365 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4366 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4367 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4368 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4369 ; AVX-NEXT:    vzeroupper
4370 ; AVX-NEXT:    callq __truncdfhf2@PLT
4371 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4372 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4373 ; AVX-NEXT:    # xmm0 = mem[1,0]
4374 ; AVX-NEXT:    callq __truncdfhf2@PLT
4375 ; AVX-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4376 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4377 ; AVX-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4378 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4379 ; AVX-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4380 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
4381 ; AVX-NEXT:    vmovdqa %xmm0, (%rbx)
4382 ; AVX-NEXT:    addq $96, %rsp
4383 ; AVX-NEXT:    popq %rbx
4384 ; AVX-NEXT:    retq
4386 ; F16C-LABEL: store_cvt_8f64_to_8i16:
4387 ; F16C:       # %bb.0:
4388 ; F16C-NEXT:    pushq %rbx
4389 ; F16C-NEXT:    subq $96, %rsp
4390 ; F16C-NEXT:    movq %rdi, %rbx
4391 ; F16C-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4392 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4393 ; F16C-NEXT:    vextractf128 $1, %ymm1, %xmm0
4394 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4395 ; F16C-NEXT:    vzeroupper
4396 ; F16C-NEXT:    callq __truncdfhf2@PLT
4397 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4398 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4399 ; F16C-NEXT:    # xmm0 = mem[1,0]
4400 ; F16C-NEXT:    callq __truncdfhf2@PLT
4401 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4402 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4403 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4404 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4405 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4406 ; F16C-NEXT:    vzeroupper
4407 ; F16C-NEXT:    callq __truncdfhf2@PLT
4408 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4409 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4410 ; F16C-NEXT:    # xmm0 = mem[1,0]
4411 ; F16C-NEXT:    callq __truncdfhf2@PLT
4412 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4413 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4414 ; F16C-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4415 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4416 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4417 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4418 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
4419 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4420 ; F16C-NEXT:    vzeroupper
4421 ; F16C-NEXT:    callq __truncdfhf2@PLT
4422 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4423 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4424 ; F16C-NEXT:    # xmm0 = mem[1,0]
4425 ; F16C-NEXT:    callq __truncdfhf2@PLT
4426 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4427 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4428 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4429 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4430 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4431 ; F16C-NEXT:    vzeroupper
4432 ; F16C-NEXT:    callq __truncdfhf2@PLT
4433 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4434 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4435 ; F16C-NEXT:    # xmm0 = mem[1,0]
4436 ; F16C-NEXT:    callq __truncdfhf2@PLT
4437 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4438 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4439 ; F16C-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4440 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4441 ; F16C-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4442 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0]
4443 ; F16C-NEXT:    vmovdqa %xmm0, (%rbx)
4444 ; F16C-NEXT:    addq $96, %rsp
4445 ; F16C-NEXT:    popq %rbx
4446 ; F16C-NEXT:    retq
4448 ; AVX512-LABEL: store_cvt_8f64_to_8i16:
4449 ; AVX512:       # %bb.0:
4450 ; AVX512-NEXT:    pushq %rbx
4451 ; AVX512-NEXT:    subq $112, %rsp
4452 ; AVX512-NEXT:    movq %rdi, %rbx
4453 ; AVX512-NEXT:    vmovups %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
4454 ; AVX512-NEXT:    vextractf32x4 $3, %zmm0, %xmm0
4455 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4456 ; AVX512-NEXT:    vzeroupper
4457 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4458 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4459 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4460 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4461 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4462 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4463 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4464 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4465 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
4466 ; AVX512-NEXT:    vextractf32x4 $2, %zmm0, %xmm0
4467 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4468 ; AVX512-NEXT:    vzeroupper
4469 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4470 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4471 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4472 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4473 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4474 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4475 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4476 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4477 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4478 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4479 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
4480 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
4481 ; AVX512-NEXT:    vzeroupper
4482 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4483 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4484 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4485 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4486 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4487 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4488 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4489 ; AVX512-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4490 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
4491 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
4492 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4493 ; AVX512-NEXT:    vzeroupper
4494 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4495 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4496 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4497 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4498 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4499 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4500 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4501 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4502 ; AVX512-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
4503 ; AVX512-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4504 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0]
4505 ; AVX512-NEXT:    vmovdqa %xmm0, (%rbx)
4506 ; AVX512-NEXT:    addq $112, %rsp
4507 ; AVX512-NEXT:    popq %rbx
4508 ; AVX512-NEXT:    retq
4509   %1 = fptrunc <8 x double> %a0 to <8 x half>
4510   %2 = bitcast <8 x half> %1 to <8 x i16>
4511   store <8 x i16> %2, ptr %a1
4512   ret void
4515 define void @store_cvt_32f32_to_32f16(<32 x float> %a0, ptr %a1) nounwind {
4516 ; AVX1-LABEL: store_cvt_32f32_to_32f16:
4517 ; AVX1:       # %bb.0:
4518 ; AVX1-NEXT:    pushq %rbx
4519 ; AVX1-NEXT:    subq $176, %rsp
4520 ; AVX1-NEXT:    movq %rdi, %rbx
4521 ; AVX1-NEXT:    vmovups %ymm3, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4522 ; AVX1-NEXT:    vmovups %ymm2, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4523 ; AVX1-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4524 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4525 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0
4526 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4527 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4528 ; AVX1-NEXT:    vzeroupper
4529 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4530 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4531 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4532 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4533 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4534 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4535 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4536 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4537 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4538 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4539 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4540 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4541 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4542 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4543 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4544 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4545 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4546 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4547 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4548 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4549 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
4550 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4551 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4552 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4553 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4554 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4555 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4556 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4557 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4558 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4559 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4560 ; AVX1-NEXT:    vzeroupper
4561 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4562 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4563 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4564 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4565 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4566 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4567 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4568 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4569 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4570 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4571 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
4572 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4573 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4574 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4575 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4576 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4577 ; AVX1-NEXT:    vzeroupper
4578 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4579 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4580 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4581 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4582 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4583 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4584 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4585 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4586 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4587 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4588 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4589 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4590 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4591 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4592 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4593 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4594 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4595 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4596 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4597 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4598 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
4599 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4600 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4601 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4602 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4603 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4604 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4605 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4606 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4607 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4608 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4609 ; AVX1-NEXT:    vzeroupper
4610 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4611 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4612 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4613 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4614 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4615 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4616 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4617 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4618 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4619 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4620 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
4621 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4622 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4623 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4624 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4625 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4626 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4627 ; AVX1-NEXT:    vzeroupper
4628 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4629 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4630 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4631 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4632 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4633 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4634 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4635 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4636 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4637 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4638 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4639 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4640 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4641 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4642 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4643 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4644 ; AVX1-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4645 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4646 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4647 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4648 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
4649 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4650 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4651 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4652 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4653 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4654 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4655 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4656 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4657 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4658 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4659 ; AVX1-NEXT:    vzeroupper
4660 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4661 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4662 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4663 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4664 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4665 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4666 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4667 ; AVX1-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4668 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4669 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4670 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
4671 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4672 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4673 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4674 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4675 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4676 ; AVX1-NEXT:    vzeroupper
4677 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4678 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4679 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4680 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4681 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4682 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4683 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4684 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4685 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4686 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4687 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4688 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4689 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4690 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4691 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4692 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4693 ; AVX1-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4694 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4695 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4696 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4697 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
4698 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4699 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4700 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4701 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4702 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4703 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4704 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4705 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4706 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4707 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4708 ; AVX1-NEXT:    vzeroupper
4709 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4710 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4711 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4712 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4713 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4714 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4715 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4716 ; AVX1-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4717 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4718 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4719 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
4720 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4721 ; AVX1-NEXT:    vmovaps %ymm0, 32(%rbx)
4722 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4723 ; AVX1-NEXT:    vmovaps %ymm0, (%rbx)
4724 ; AVX1-NEXT:    addq $176, %rsp
4725 ; AVX1-NEXT:    popq %rbx
4726 ; AVX1-NEXT:    vzeroupper
4727 ; AVX1-NEXT:    retq
4729 ; AVX2-LABEL: store_cvt_32f32_to_32f16:
4730 ; AVX2:       # %bb.0:
4731 ; AVX2-NEXT:    pushq %rbx
4732 ; AVX2-NEXT:    subq $240, %rsp
4733 ; AVX2-NEXT:    movq %rdi, %rbx
4734 ; AVX2-NEXT:    vmovups %ymm3, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4735 ; AVX2-NEXT:    vmovups %ymm2, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4736 ; AVX2-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4737 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4738 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm0
4739 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4740 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4741 ; AVX2-NEXT:    vzeroupper
4742 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4743 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4744 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4745 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4746 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4747 ; AVX2-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4748 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4749 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4750 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4751 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4752 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4753 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4754 ; AVX2-NEXT:    vzeroupper
4755 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4756 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4757 ; AVX2-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4758 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4759 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4760 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4761 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4762 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4763 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4764 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4765 ; AVX2-NEXT:    vzeroupper
4766 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4767 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4768 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4769 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4770 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4771 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4772 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4773 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4774 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
4775 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4776 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4777 ; AVX2-NEXT:    vmovshdup (%rsp), %xmm0 # 16-byte Folded Reload
4778 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4779 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4780 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4781 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4782 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4783 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
4784 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
4785 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4786 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4787 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
4788 ; AVX2-NEXT:    vzeroupper
4789 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4790 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4791 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4792 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4793 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4794 ; AVX2-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4795 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4796 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4797 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4798 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
4799 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4800 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4801 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4802 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4803 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4804 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4805 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4806 ; AVX2-NEXT:    vinserti128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
4807 ; AVX2-NEXT:    vmovdqu %ymm0, (%rsp) # 32-byte Spill
4808 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4809 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4810 ; AVX2-NEXT:    vzeroupper
4811 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4812 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4813 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4814 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4815 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4816 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4817 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4818 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4819 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4820 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4821 ; AVX2-NEXT:    vzeroupper
4822 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4823 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4824 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4825 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4826 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4827 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4828 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4829 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4830 ; AVX2-NEXT:    vpunpckldq (%rsp), %ymm0, %ymm0 # 32-byte Folded Reload
4831 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
4832 ; AVX2-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
4833 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[2],mem[2]
4834 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4835 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4836 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4837 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4838 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4839 ; AVX2-NEXT:    vzeroupper
4840 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4841 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4842 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4843 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4844 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4845 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4846 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4847 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4848 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4849 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4850 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4851 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4852 ; AVX2-NEXT:    vzeroupper
4853 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4854 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4855 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4856 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4857 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4858 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4859 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4860 ; AVX2-NEXT:    vinserti128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
4861 ; AVX2-NEXT:    vmovdqu %ymm0, (%rsp) # 32-byte Spill
4862 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4863 ; AVX2-NEXT:    vzeroupper
4864 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4865 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4866 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4867 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4868 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4869 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4870 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4871 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4872 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4873 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4874 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4875 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4876 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4877 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4878 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4879 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4880 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4881 ; AVX2-NEXT:    vpunpckldq (%rsp), %ymm0, %ymm0 # 32-byte Folded Reload
4882 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
4883 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4884 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4885 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
4886 ; AVX2-NEXT:    vzeroupper
4887 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4888 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4889 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4890 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4891 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4892 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4893 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4894 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4895 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4896 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
4897 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4898 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4899 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4900 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4901 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4902 ; AVX2-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4903 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4904 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4905 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4906 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4907 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4908 ; AVX2-NEXT:    vzeroupper
4909 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4910 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4911 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4912 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4913 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4914 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4915 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4916 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4917 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4918 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4919 ; AVX2-NEXT:    vzeroupper
4920 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4921 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4922 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4923 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4924 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4925 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4926 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4927 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4928 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
4929 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
4930 ; AVX2-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
4931 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[2],mem[2]
4932 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rbx)
4933 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4934 ; AVX2-NEXT:    vmovaps %ymm0, (%rbx)
4935 ; AVX2-NEXT:    addq $240, %rsp
4936 ; AVX2-NEXT:    popq %rbx
4937 ; AVX2-NEXT:    vzeroupper
4938 ; AVX2-NEXT:    retq
4940 ; F16C-LABEL: store_cvt_32f32_to_32f16:
4941 ; F16C:       # %bb.0:
4942 ; F16C-NEXT:    vcvtps2ph $4, %ymm3, 48(%rdi)
4943 ; F16C-NEXT:    vcvtps2ph $4, %ymm2, 32(%rdi)
4944 ; F16C-NEXT:    vcvtps2ph $4, %ymm1, 16(%rdi)
4945 ; F16C-NEXT:    vcvtps2ph $4, %ymm0, (%rdi)
4946 ; F16C-NEXT:    vzeroupper
4947 ; F16C-NEXT:    retq
4949 ; AVX512-LABEL: store_cvt_32f32_to_32f16:
4950 ; AVX512:       # %bb.0:
4951 ; AVX512-NEXT:    vcvtps2ph $4, %zmm1, 32(%rdi)
4952 ; AVX512-NEXT:    vcvtps2ph $4, %zmm0, (%rdi)
4953 ; AVX512-NEXT:    vzeroupper
4954 ; AVX512-NEXT:    retq
4955   %1 = fptrunc <32 x float> %a0 to <32 x half>
4956   store <32 x half> %1, ptr %a1
4957   ret void
4960 define <4 x i32> @fptosi_2f16_to_4i32(<2 x half> %a) nounwind {
4961 ; AVX-LABEL: fptosi_2f16_to_4i32:
4962 ; AVX:       # %bb.0:
4963 ; AVX-NEXT:    subq $40, %rsp
4964 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
4965 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4966 ; AVX-NEXT:    callq __extendhfsf2@PLT
4967 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4968 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4969 ; AVX-NEXT:    callq __extendhfsf2@PLT
4970 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
4971 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
4972 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
4973 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
4974 ; AVX-NEXT:    addq $40, %rsp
4975 ; AVX-NEXT:    retq
4977 ; F16C-LABEL: fptosi_2f16_to_4i32:
4978 ; F16C:       # %bb.0:
4979 ; F16C-NEXT:    vpextrw $0, %xmm0, %eax
4980 ; F16C-NEXT:    movzwl %ax, %eax
4981 ; F16C-NEXT:    vmovd %eax, %xmm1
4982 ; F16C-NEXT:    vcvtph2ps %xmm1, %xmm1
4983 ; F16C-NEXT:    vpsrld $16, %xmm0, %xmm0
4984 ; F16C-NEXT:    vpextrw $0, %xmm0, %eax
4985 ; F16C-NEXT:    movzwl %ax, %eax
4986 ; F16C-NEXT:    vmovd %eax, %xmm0
4987 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
4988 ; F16C-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
4989 ; F16C-NEXT:    vcvttps2dq %xmm0, %xmm0
4990 ; F16C-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
4991 ; F16C-NEXT:    retq
4993 ; AVX512-LABEL: fptosi_2f16_to_4i32:
4994 ; AVX512:       # %bb.0:
4995 ; AVX512-NEXT:    vpextrw $0, %xmm0, %eax
4996 ; AVX512-NEXT:    movzwl %ax, %eax
4997 ; AVX512-NEXT:    vmovd %eax, %xmm1
4998 ; AVX512-NEXT:    vcvtph2ps %xmm1, %xmm1
4999 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm0
5000 ; AVX512-NEXT:    vpextrw $0, %xmm0, %eax
5001 ; AVX512-NEXT:    movzwl %ax, %eax
5002 ; AVX512-NEXT:    vmovd %eax, %xmm0
5003 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
5004 ; AVX512-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
5005 ; AVX512-NEXT:    vcvttps2dq %xmm0, %xmm0
5006 ; AVX512-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
5007 ; AVX512-NEXT:    retq
5008   %cvt = fptosi <2 x half> %a to <2 x i32>
5009   %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
5010   ret <4 x i32> %ext