]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/vector-half-conversions.ll
Vendor import of llvm trunk r321414:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / vector-half-conversions.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+f16c -verify-machineinstrs | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+f16c -verify-machineinstrs | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f -verify-machineinstrs | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl -verify-machineinstrs | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512VL
6
7 ;
8 ; Half to Float
9 ;
10
11 define float @cvt_i16_to_f32(i16 %a0) nounwind {
12 ; ALL-LABEL: cvt_i16_to_f32:
13 ; ALL:       # %bb.0:
14 ; ALL-NEXT:    movswl %di, %eax
15 ; ALL-NEXT:    vmovd %eax, %xmm0
16 ; ALL-NEXT:    vcvtph2ps %xmm0, %xmm0
17 ; ALL-NEXT:    retq
18   %1 = bitcast i16 %a0 to half
19   %2 = fpext half %1 to float
20   ret float %2
21 }
22
23 define <4 x float> @cvt_4i16_to_4f32(<4 x i16> %a0) nounwind {
24 ; AVX1-LABEL: cvt_4i16_to_4f32:
25 ; AVX1:       # %bb.0:
26 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
27 ; AVX1-NEXT:    vmovq %xmm0, %rax
28 ; AVX1-NEXT:    movq %rax, %rcx
29 ; AVX1-NEXT:    movq %rax, %rdx
30 ; AVX1-NEXT:    movswl %ax, %esi
31 ; AVX1-NEXT:    # kill: def %eax killed %eax killed %rax
32 ; AVX1-NEXT:    shrl $16, %eax
33 ; AVX1-NEXT:    shrq $32, %rcx
34 ; AVX1-NEXT:    shrq $48, %rdx
35 ; AVX1-NEXT:    movswl %dx, %edx
36 ; AVX1-NEXT:    vmovd %edx, %xmm0
37 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
38 ; AVX1-NEXT:    movswl %cx, %ecx
39 ; AVX1-NEXT:    vmovd %ecx, %xmm1
40 ; AVX1-NEXT:    vcvtph2ps %xmm1, %xmm1
41 ; AVX1-NEXT:    cwtl
42 ; AVX1-NEXT:    vmovd %eax, %xmm2
43 ; AVX1-NEXT:    vcvtph2ps %xmm2, %xmm2
44 ; AVX1-NEXT:    vmovd %esi, %xmm3
45 ; AVX1-NEXT:    vcvtph2ps %xmm3, %xmm3
46 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
47 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
48 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
49 ; AVX1-NEXT:    retq
50 ;
51 ; AVX2-LABEL: cvt_4i16_to_4f32:
52 ; AVX2:       # %bb.0:
53 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
54 ; AVX2-NEXT:    vmovq %xmm0, %rax
55 ; AVX2-NEXT:    movq %rax, %rcx
56 ; AVX2-NEXT:    movq %rax, %rdx
57 ; AVX2-NEXT:    movswl %ax, %esi
58 ; AVX2-NEXT:    # kill: def %eax killed %eax killed %rax
59 ; AVX2-NEXT:    shrl $16, %eax
60 ; AVX2-NEXT:    shrq $32, %rcx
61 ; AVX2-NEXT:    shrq $48, %rdx
62 ; AVX2-NEXT:    movswl %dx, %edx
63 ; AVX2-NEXT:    vmovd %edx, %xmm0
64 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
65 ; AVX2-NEXT:    movswl %cx, %ecx
66 ; AVX2-NEXT:    vmovd %ecx, %xmm1
67 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
68 ; AVX2-NEXT:    cwtl
69 ; AVX2-NEXT:    vmovd %eax, %xmm2
70 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
71 ; AVX2-NEXT:    vmovd %esi, %xmm3
72 ; AVX2-NEXT:    vcvtph2ps %xmm3, %xmm3
73 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
74 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
75 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
76 ; AVX2-NEXT:    retq
77 ;
78 ; AVX512F-LABEL: cvt_4i16_to_4f32:
79 ; AVX512F:       # %bb.0:
80 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
81 ; AVX512F-NEXT:    vmovq %xmm0, %rax
82 ; AVX512F-NEXT:    movq %rax, %rcx
83 ; AVX512F-NEXT:    movq %rax, %rdx
84 ; AVX512F-NEXT:    movswl %ax, %esi
85 ; AVX512F-NEXT:    # kill: def %eax killed %eax killed %rax
86 ; AVX512F-NEXT:    shrl $16, %eax
87 ; AVX512F-NEXT:    shrq $32, %rcx
88 ; AVX512F-NEXT:    shrq $48, %rdx
89 ; AVX512F-NEXT:    movswl %dx, %edx
90 ; AVX512F-NEXT:    vmovd %edx, %xmm0
91 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0
92 ; AVX512F-NEXT:    movswl %cx, %ecx
93 ; AVX512F-NEXT:    vmovd %ecx, %xmm1
94 ; AVX512F-NEXT:    vcvtph2ps %xmm1, %xmm1
95 ; AVX512F-NEXT:    cwtl
96 ; AVX512F-NEXT:    vmovd %eax, %xmm2
97 ; AVX512F-NEXT:    vcvtph2ps %xmm2, %xmm2
98 ; AVX512F-NEXT:    vmovd %esi, %xmm3
99 ; AVX512F-NEXT:    vcvtph2ps %xmm3, %xmm3
100 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
101 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
102 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
103 ; AVX512F-NEXT:    retq
104 ;
105 ; AVX512VL-LABEL: cvt_4i16_to_4f32:
106 ; AVX512VL:       # %bb.0:
107 ; AVX512VL-NEXT:    vpmovdw %xmm0, -{{[0-9]+}}(%rsp)
108 ; AVX512VL-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
109 ; AVX512VL-NEXT:    movq %rax, %rcx
110 ; AVX512VL-NEXT:    movq %rax, %rdx
111 ; AVX512VL-NEXT:    movswl %ax, %esi
112 ; AVX512VL-NEXT:    # kill: def %eax killed %eax killed %rax
113 ; AVX512VL-NEXT:    shrl $16, %eax
114 ; AVX512VL-NEXT:    shrq $32, %rcx
115 ; AVX512VL-NEXT:    shrq $48, %rdx
116 ; AVX512VL-NEXT:    movswl %dx, %edx
117 ; AVX512VL-NEXT:    vmovd %edx, %xmm0
118 ; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm0
119 ; AVX512VL-NEXT:    movswl %cx, %ecx
120 ; AVX512VL-NEXT:    vmovd %ecx, %xmm1
121 ; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm1
122 ; AVX512VL-NEXT:    cwtl
123 ; AVX512VL-NEXT:    vmovd %eax, %xmm2
124 ; AVX512VL-NEXT:    vcvtph2ps %xmm2, %xmm2
125 ; AVX512VL-NEXT:    vmovd %esi, %xmm3
126 ; AVX512VL-NEXT:    vcvtph2ps %xmm3, %xmm3
127 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
128 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
129 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
130 ; AVX512VL-NEXT:    retq
131   %1 = bitcast <4 x i16> %a0 to <4 x half>
132   %2 = fpext <4 x half> %1 to <4 x float>
133   ret <4 x float> %2
134 }
135
136 define <4 x float> @cvt_8i16_to_4f32(<8 x i16> %a0) nounwind {
137 ; AVX1-LABEL: cvt_8i16_to_4f32:
138 ; AVX1:       # %bb.0:
139 ; AVX1-NEXT:    vmovq %xmm0, %rax
140 ; AVX1-NEXT:    movq %rax, %rcx
141 ; AVX1-NEXT:    movq %rax, %rdx
142 ; AVX1-NEXT:    movswl %ax, %esi
143 ; AVX1-NEXT:    # kill: def %eax killed %eax killed %rax
144 ; AVX1-NEXT:    shrl $16, %eax
145 ; AVX1-NEXT:    shrq $32, %rcx
146 ; AVX1-NEXT:    shrq $48, %rdx
147 ; AVX1-NEXT:    movswl %dx, %edx
148 ; AVX1-NEXT:    vmovd %edx, %xmm0
149 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
150 ; AVX1-NEXT:    movswl %cx, %ecx
151 ; AVX1-NEXT:    vmovd %ecx, %xmm1
152 ; AVX1-NEXT:    vcvtph2ps %xmm1, %xmm1
153 ; AVX1-NEXT:    cwtl
154 ; AVX1-NEXT:    vmovd %eax, %xmm2
155 ; AVX1-NEXT:    vcvtph2ps %xmm2, %xmm2
156 ; AVX1-NEXT:    vmovd %esi, %xmm3
157 ; AVX1-NEXT:    vcvtph2ps %xmm3, %xmm3
158 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
159 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
160 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
161 ; AVX1-NEXT:    retq
162 ;
163 ; AVX2-LABEL: cvt_8i16_to_4f32:
164 ; AVX2:       # %bb.0:
165 ; AVX2-NEXT:    vmovq %xmm0, %rax
166 ; AVX2-NEXT:    movq %rax, %rcx
167 ; AVX2-NEXT:    movq %rax, %rdx
168 ; AVX2-NEXT:    movswl %ax, %esi
169 ; AVX2-NEXT:    # kill: def %eax killed %eax killed %rax
170 ; AVX2-NEXT:    shrl $16, %eax
171 ; AVX2-NEXT:    shrq $32, %rcx
172 ; AVX2-NEXT:    shrq $48, %rdx
173 ; AVX2-NEXT:    movswl %dx, %edx
174 ; AVX2-NEXT:    vmovd %edx, %xmm0
175 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
176 ; AVX2-NEXT:    movswl %cx, %ecx
177 ; AVX2-NEXT:    vmovd %ecx, %xmm1
178 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
179 ; AVX2-NEXT:    cwtl
180 ; AVX2-NEXT:    vmovd %eax, %xmm2
181 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
182 ; AVX2-NEXT:    vmovd %esi, %xmm3
183 ; AVX2-NEXT:    vcvtph2ps %xmm3, %xmm3
184 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
185 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
186 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
187 ; AVX2-NEXT:    retq
188 ;
189 ; AVX512F-LABEL: cvt_8i16_to_4f32:
190 ; AVX512F:       # %bb.0:
191 ; AVX512F-NEXT:    vmovq %xmm0, %rax
192 ; AVX512F-NEXT:    movq %rax, %rcx
193 ; AVX512F-NEXT:    movq %rax, %rdx
194 ; AVX512F-NEXT:    movswl %ax, %esi
195 ; AVX512F-NEXT:    # kill: def %eax killed %eax killed %rax
196 ; AVX512F-NEXT:    shrl $16, %eax
197 ; AVX512F-NEXT:    shrq $32, %rcx
198 ; AVX512F-NEXT:    shrq $48, %rdx
199 ; AVX512F-NEXT:    movswl %dx, %edx
200 ; AVX512F-NEXT:    vmovd %edx, %xmm0
201 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0
202 ; AVX512F-NEXT:    movswl %cx, %ecx
203 ; AVX512F-NEXT:    vmovd %ecx, %xmm1
204 ; AVX512F-NEXT:    vcvtph2ps %xmm1, %xmm1
205 ; AVX512F-NEXT:    cwtl
206 ; AVX512F-NEXT:    vmovd %eax, %xmm2
207 ; AVX512F-NEXT:    vcvtph2ps %xmm2, %xmm2
208 ; AVX512F-NEXT:    vmovd %esi, %xmm3
209 ; AVX512F-NEXT:    vcvtph2ps %xmm3, %xmm3
210 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
211 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
212 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
213 ; AVX512F-NEXT:    retq
214 ;
215 ; AVX512VL-LABEL: cvt_8i16_to_4f32:
216 ; AVX512VL:       # %bb.0:
217 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
218 ; AVX512VL-NEXT:    vpmovdw %xmm0, -{{[0-9]+}}(%rsp)
219 ; AVX512VL-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
220 ; AVX512VL-NEXT:    movq %rax, %rcx
221 ; AVX512VL-NEXT:    movq %rax, %rdx
222 ; AVX512VL-NEXT:    movswl %ax, %esi
223 ; AVX512VL-NEXT:    # kill: def %eax killed %eax killed %rax
224 ; AVX512VL-NEXT:    shrl $16, %eax
225 ; AVX512VL-NEXT:    shrq $32, %rcx
226 ; AVX512VL-NEXT:    shrq $48, %rdx
227 ; AVX512VL-NEXT:    movswl %dx, %edx
228 ; AVX512VL-NEXT:    vmovd %edx, %xmm0
229 ; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm0
230 ; AVX512VL-NEXT:    movswl %cx, %ecx
231 ; AVX512VL-NEXT:    vmovd %ecx, %xmm1
232 ; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm1
233 ; AVX512VL-NEXT:    cwtl
234 ; AVX512VL-NEXT:    vmovd %eax, %xmm2
235 ; AVX512VL-NEXT:    vcvtph2ps %xmm2, %xmm2
236 ; AVX512VL-NEXT:    vmovd %esi, %xmm3
237 ; AVX512VL-NEXT:    vcvtph2ps %xmm3, %xmm3
238 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
239 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
240 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
241 ; AVX512VL-NEXT:    retq
242   %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
243   %2 = bitcast <4 x i16> %1 to <4 x half>
244   %3 = fpext <4 x half> %2 to <4 x float>
245   ret <4 x float> %3
246 }
247
248 define <8 x float> @cvt_8i16_to_8f32(<8 x i16> %a0) nounwind {
249 ; ALL-LABEL: cvt_8i16_to_8f32:
250 ; ALL:       # %bb.0:
251 ; ALL-NEXT:    vpextrq $1, %xmm0, %rdx
252 ; ALL-NEXT:    movq %rdx, %r8
253 ; ALL-NEXT:    movq %rdx, %r10
254 ; ALL-NEXT:    movswl %dx, %r9d
255 ; ALL-NEXT:    # kill: def %edx killed %edx killed %rdx
256 ; ALL-NEXT:    shrl $16, %edx
257 ; ALL-NEXT:    shrq $32, %r8
258 ; ALL-NEXT:    shrq $48, %r10
259 ; ALL-NEXT:    vmovq %xmm0, %rdi
260 ; ALL-NEXT:    movq %rdi, %rax
261 ; ALL-NEXT:    movq %rdi, %rsi
262 ; ALL-NEXT:    movswl %di, %ecx
263 ; ALL-NEXT:    # kill: def %edi killed %edi killed %rdi
264 ; ALL-NEXT:    shrl $16, %edi
265 ; ALL-NEXT:    shrq $32, %rax
266 ; ALL-NEXT:    shrq $48, %rsi
267 ; ALL-NEXT:    movswl %si, %esi
268 ; ALL-NEXT:    vmovd %esi, %xmm0
269 ; ALL-NEXT:    vcvtph2ps %xmm0, %xmm0
270 ; ALL-NEXT:    cwtl
271 ; ALL-NEXT:    vmovd %eax, %xmm1
272 ; ALL-NEXT:    vcvtph2ps %xmm1, %xmm1
273 ; ALL-NEXT:    movswl %di, %eax
274 ; ALL-NEXT:    vmovd %eax, %xmm2
275 ; ALL-NEXT:    vcvtph2ps %xmm2, %xmm2
276 ; ALL-NEXT:    vmovd %ecx, %xmm3
277 ; ALL-NEXT:    vcvtph2ps %xmm3, %xmm3
278 ; ALL-NEXT:    movswl %r10w, %eax
279 ; ALL-NEXT:    vmovd %eax, %xmm4
280 ; ALL-NEXT:    vcvtph2ps %xmm4, %xmm4
281 ; ALL-NEXT:    movswl %r8w, %eax
282 ; ALL-NEXT:    vmovd %eax, %xmm5
283 ; ALL-NEXT:    vcvtph2ps %xmm5, %xmm5
284 ; ALL-NEXT:    movswl %dx, %eax
285 ; ALL-NEXT:    vmovd %eax, %xmm6
286 ; ALL-NEXT:    vcvtph2ps %xmm6, %xmm6
287 ; ALL-NEXT:    vmovd %r9d, %xmm7
288 ; ALL-NEXT:    vcvtph2ps %xmm7, %xmm7
289 ; ALL-NEXT:    vinsertps {{.*#+}} xmm6 = xmm7[0],xmm6[0],xmm7[2,3]
290 ; ALL-NEXT:    vinsertps {{.*#+}} xmm5 = xmm6[0,1],xmm5[0],xmm6[3]
291 ; ALL-NEXT:    vinsertps {{.*#+}} xmm4 = xmm5[0,1,2],xmm4[0]
292 ; ALL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
293 ; ALL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
294 ; ALL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
295 ; ALL-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
296 ; ALL-NEXT:    retq
297   %1 = bitcast <8 x i16> %a0 to <8 x half>
298   %2 = fpext <8 x half> %1 to <8 x float>
299   ret <8 x float> %2
300 }
301
302 define <16 x float> @cvt_16i16_to_16f32(<16 x i16> %a0) nounwind {
303 ; AVX1-LABEL: cvt_16i16_to_16f32:
304 ; AVX1:       # %bb.0:
305 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
306 ; AVX1-NEXT:    vmovq %xmm4, %rax
307 ; AVX1-NEXT:    movq %rax, %rcx
308 ; AVX1-NEXT:    shrq $48, %rcx
309 ; AVX1-NEXT:    movswl %cx, %ecx
310 ; AVX1-NEXT:    vmovd %ecx, %xmm8
311 ; AVX1-NEXT:    movq %rax, %rcx
312 ; AVX1-NEXT:    shrq $32, %rcx
313 ; AVX1-NEXT:    movswl %cx, %ecx
314 ; AVX1-NEXT:    vmovd %ecx, %xmm9
315 ; AVX1-NEXT:    movswl %ax, %ecx
316 ; AVX1-NEXT:    # kill: def %eax killed %eax killed %rax
317 ; AVX1-NEXT:    shrl $16, %eax
318 ; AVX1-NEXT:    cwtl
319 ; AVX1-NEXT:    vmovd %eax, %xmm10
320 ; AVX1-NEXT:    vpextrq $1, %xmm4, %rax
321 ; AVX1-NEXT:    vmovd %ecx, %xmm11
322 ; AVX1-NEXT:    movq %rax, %rcx
323 ; AVX1-NEXT:    shrq $48, %rcx
324 ; AVX1-NEXT:    movswl %cx, %ecx
325 ; AVX1-NEXT:    vmovd %ecx, %xmm12
326 ; AVX1-NEXT:    movq %rax, %rcx
327 ; AVX1-NEXT:    shrq $32, %rcx
328 ; AVX1-NEXT:    movswl %cx, %ecx
329 ; AVX1-NEXT:    vmovd %ecx, %xmm13
330 ; AVX1-NEXT:    movswl %ax, %ecx
331 ; AVX1-NEXT:    # kill: def %eax killed %eax killed %rax
332 ; AVX1-NEXT:    shrl $16, %eax
333 ; AVX1-NEXT:    cwtl
334 ; AVX1-NEXT:    vmovd %eax, %xmm14
335 ; AVX1-NEXT:    vmovq %xmm0, %rax
336 ; AVX1-NEXT:    vmovd %ecx, %xmm15
337 ; AVX1-NEXT:    movq %rax, %rcx
338 ; AVX1-NEXT:    shrq $48, %rcx
339 ; AVX1-NEXT:    movswl %cx, %ecx
340 ; AVX1-NEXT:    vmovd %ecx, %xmm2
341 ; AVX1-NEXT:    movq %rax, %rcx
342 ; AVX1-NEXT:    shrq $32, %rcx
343 ; AVX1-NEXT:    movswl %cx, %ecx
344 ; AVX1-NEXT:    vmovd %ecx, %xmm3
345 ; AVX1-NEXT:    movswl %ax, %ecx
346 ; AVX1-NEXT:    # kill: def %eax killed %eax killed %rax
347 ; AVX1-NEXT:    shrl $16, %eax
348 ; AVX1-NEXT:    cwtl
349 ; AVX1-NEXT:    vmovd %eax, %xmm4
350 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
351 ; AVX1-NEXT:    vmovd %ecx, %xmm0
352 ; AVX1-NEXT:    movq %rax, %rcx
353 ; AVX1-NEXT:    shrq $48, %rcx
354 ; AVX1-NEXT:    movswl %cx, %ecx
355 ; AVX1-NEXT:    vmovd %ecx, %xmm5
356 ; AVX1-NEXT:    movq %rax, %rcx
357 ; AVX1-NEXT:    shrq $32, %rcx
358 ; AVX1-NEXT:    movswl %cx, %ecx
359 ; AVX1-NEXT:    vmovd %ecx, %xmm6
360 ; AVX1-NEXT:    movl %eax, %ecx
361 ; AVX1-NEXT:    shrl $16, %ecx
362 ; AVX1-NEXT:    movswl %cx, %ecx
363 ; AVX1-NEXT:    vmovd %ecx, %xmm7
364 ; AVX1-NEXT:    cwtl
365 ; AVX1-NEXT:    vmovd %eax, %xmm1
366 ; AVX1-NEXT:    vcvtph2ps %xmm8, %xmm8
367 ; AVX1-NEXT:    vcvtph2ps %xmm9, %xmm9
368 ; AVX1-NEXT:    vcvtph2ps %xmm10, %xmm10
369 ; AVX1-NEXT:    vcvtph2ps %xmm11, %xmm11
370 ; AVX1-NEXT:    vcvtph2ps %xmm12, %xmm12
371 ; AVX1-NEXT:    vcvtph2ps %xmm13, %xmm13
372 ; AVX1-NEXT:    vcvtph2ps %xmm14, %xmm14
373 ; AVX1-NEXT:    vcvtph2ps %xmm15, %xmm15
374 ; AVX1-NEXT:    vcvtph2ps %xmm2, %xmm2
375 ; AVX1-NEXT:    vcvtph2ps %xmm3, %xmm3
376 ; AVX1-NEXT:    vcvtph2ps %xmm4, %xmm4
377 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
378 ; AVX1-NEXT:    vcvtph2ps %xmm5, %xmm5
379 ; AVX1-NEXT:    vcvtph2ps %xmm6, %xmm6
380 ; AVX1-NEXT:    vcvtph2ps %xmm7, %xmm7
381 ; AVX1-NEXT:    vcvtph2ps %xmm1, %xmm1
382 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm7[0],xmm1[2,3]
383 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm6[0],xmm1[3]
384 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm5[0]
385 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[2,3]
386 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0],xmm0[3]
387 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm2[0]
388 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
389 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm15[0],xmm14[0],xmm15[2,3]
390 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm13[0],xmm1[3]
391 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm12[0]
392 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm11[0],xmm10[0],xmm11[2,3]
393 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm9[0],xmm2[3]
394 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm8[0]
395 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
396 ; AVX1-NEXT:    retq
397 ;
398 ; AVX2-LABEL: cvt_16i16_to_16f32:
399 ; AVX2:       # %bb.0:
400 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
401 ; AVX2-NEXT:    vmovq %xmm4, %rax
402 ; AVX2-NEXT:    movq %rax, %rcx
403 ; AVX2-NEXT:    shrq $48, %rcx
404 ; AVX2-NEXT:    movswl %cx, %ecx
405 ; AVX2-NEXT:    vmovd %ecx, %xmm8
406 ; AVX2-NEXT:    movq %rax, %rcx
407 ; AVX2-NEXT:    shrq $32, %rcx
408 ; AVX2-NEXT:    movswl %cx, %ecx
409 ; AVX2-NEXT:    vmovd %ecx, %xmm9
410 ; AVX2-NEXT:    movswl %ax, %ecx
411 ; AVX2-NEXT:    # kill: def %eax killed %eax killed %rax
412 ; AVX2-NEXT:    shrl $16, %eax
413 ; AVX2-NEXT:    cwtl
414 ; AVX2-NEXT:    vmovd %eax, %xmm10
415 ; AVX2-NEXT:    vpextrq $1, %xmm4, %rax
416 ; AVX2-NEXT:    vmovd %ecx, %xmm11
417 ; AVX2-NEXT:    movq %rax, %rcx
418 ; AVX2-NEXT:    shrq $48, %rcx
419 ; AVX2-NEXT:    movswl %cx, %ecx
420 ; AVX2-NEXT:    vmovd %ecx, %xmm12
421 ; AVX2-NEXT:    movq %rax, %rcx
422 ; AVX2-NEXT:    shrq $32, %rcx
423 ; AVX2-NEXT:    movswl %cx, %ecx
424 ; AVX2-NEXT:    vmovd %ecx, %xmm13
425 ; AVX2-NEXT:    movswl %ax, %ecx
426 ; AVX2-NEXT:    # kill: def %eax killed %eax killed %rax
427 ; AVX2-NEXT:    shrl $16, %eax
428 ; AVX2-NEXT:    cwtl
429 ; AVX2-NEXT:    vmovd %eax, %xmm14
430 ; AVX2-NEXT:    vmovq %xmm0, %rax
431 ; AVX2-NEXT:    vmovd %ecx, %xmm15
432 ; AVX2-NEXT:    movq %rax, %rcx
433 ; AVX2-NEXT:    shrq $48, %rcx
434 ; AVX2-NEXT:    movswl %cx, %ecx
435 ; AVX2-NEXT:    vmovd %ecx, %xmm2
436 ; AVX2-NEXT:    movq %rax, %rcx
437 ; AVX2-NEXT:    shrq $32, %rcx
438 ; AVX2-NEXT:    movswl %cx, %ecx
439 ; AVX2-NEXT:    vmovd %ecx, %xmm3
440 ; AVX2-NEXT:    movswl %ax, %ecx
441 ; AVX2-NEXT:    # kill: def %eax killed %eax killed %rax
442 ; AVX2-NEXT:    shrl $16, %eax
443 ; AVX2-NEXT:    cwtl
444 ; AVX2-NEXT:    vmovd %eax, %xmm4
445 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
446 ; AVX2-NEXT:    vmovd %ecx, %xmm0
447 ; AVX2-NEXT:    movq %rax, %rcx
448 ; AVX2-NEXT:    shrq $48, %rcx
449 ; AVX2-NEXT:    movswl %cx, %ecx
450 ; AVX2-NEXT:    vmovd %ecx, %xmm5
451 ; AVX2-NEXT:    movq %rax, %rcx
452 ; AVX2-NEXT:    shrq $32, %rcx
453 ; AVX2-NEXT:    movswl %cx, %ecx
454 ; AVX2-NEXT:    vmovd %ecx, %xmm6
455 ; AVX2-NEXT:    movl %eax, %ecx
456 ; AVX2-NEXT:    shrl $16, %ecx
457 ; AVX2-NEXT:    movswl %cx, %ecx
458 ; AVX2-NEXT:    vmovd %ecx, %xmm7
459 ; AVX2-NEXT:    cwtl
460 ; AVX2-NEXT:    vmovd %eax, %xmm1
461 ; AVX2-NEXT:    vcvtph2ps %xmm8, %xmm8
462 ; AVX2-NEXT:    vcvtph2ps %xmm9, %xmm9
463 ; AVX2-NEXT:    vcvtph2ps %xmm10, %xmm10
464 ; AVX2-NEXT:    vcvtph2ps %xmm11, %xmm11
465 ; AVX2-NEXT:    vcvtph2ps %xmm12, %xmm12
466 ; AVX2-NEXT:    vcvtph2ps %xmm13, %xmm13
467 ; AVX2-NEXT:    vcvtph2ps %xmm14, %xmm14
468 ; AVX2-NEXT:    vcvtph2ps %xmm15, %xmm15
469 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
470 ; AVX2-NEXT:    vcvtph2ps %xmm3, %xmm3
471 ; AVX2-NEXT:    vcvtph2ps %xmm4, %xmm4
472 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
473 ; AVX2-NEXT:    vcvtph2ps %xmm5, %xmm5
474 ; AVX2-NEXT:    vcvtph2ps %xmm6, %xmm6
475 ; AVX2-NEXT:    vcvtph2ps %xmm7, %xmm7
476 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
477 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm7[0],xmm1[2,3]
478 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm6[0],xmm1[3]
479 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm5[0]
480 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[2,3]
481 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0],xmm0[3]
482 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm2[0]
483 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
484 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm15[0],xmm14[0],xmm15[2,3]
485 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm13[0],xmm1[3]
486 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm12[0]
487 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm11[0],xmm10[0],xmm11[2,3]
488 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm9[0],xmm2[3]
489 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm8[0]
490 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
491 ; AVX2-NEXT:    retq
492 ;
493 ; AVX512F-LABEL: cvt_16i16_to_16f32:
494 ; AVX512F:       # %bb.0:
495 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm10
496 ; AVX512F-NEXT:    vmovq %xmm0, %rax
497 ; AVX512F-NEXT:    movq %rax, %rcx
498 ; AVX512F-NEXT:    shrq $48, %rcx
499 ; AVX512F-NEXT:    movswl %cx, %ecx
500 ; AVX512F-NEXT:    vmovd %ecx, %xmm8
501 ; AVX512F-NEXT:    movq %rax, %rcx
502 ; AVX512F-NEXT:    shrq $32, %rcx
503 ; AVX512F-NEXT:    movswl %cx, %ecx
504 ; AVX512F-NEXT:    vmovd %ecx, %xmm9
505 ; AVX512F-NEXT:    movswl %ax, %ecx
506 ; AVX512F-NEXT:    # kill: def %eax killed %eax killed %rax
507 ; AVX512F-NEXT:    shrl $16, %eax
508 ; AVX512F-NEXT:    cwtl
509 ; AVX512F-NEXT:    vmovd %eax, %xmm11
510 ; AVX512F-NEXT:    vpextrq $1, %xmm0, %rax
511 ; AVX512F-NEXT:    vmovd %ecx, %xmm12
512 ; AVX512F-NEXT:    movq %rax, %rcx
513 ; AVX512F-NEXT:    shrq $48, %rcx
514 ; AVX512F-NEXT:    movswl %cx, %ecx
515 ; AVX512F-NEXT:    vmovd %ecx, %xmm13
516 ; AVX512F-NEXT:    movq %rax, %rcx
517 ; AVX512F-NEXT:    shrq $32, %rcx
518 ; AVX512F-NEXT:    movswl %cx, %ecx
519 ; AVX512F-NEXT:    vmovd %ecx, %xmm14
520 ; AVX512F-NEXT:    movswl %ax, %ecx
521 ; AVX512F-NEXT:    # kill: def %eax killed %eax killed %rax
522 ; AVX512F-NEXT:    shrl $16, %eax
523 ; AVX512F-NEXT:    cwtl
524 ; AVX512F-NEXT:    vmovd %eax, %xmm15
525 ; AVX512F-NEXT:    vmovq %xmm10, %rax
526 ; AVX512F-NEXT:    vmovd %ecx, %xmm2
527 ; AVX512F-NEXT:    movq %rax, %rcx
528 ; AVX512F-NEXT:    shrq $48, %rcx
529 ; AVX512F-NEXT:    movswl %cx, %ecx
530 ; AVX512F-NEXT:    vmovd %ecx, %xmm3
531 ; AVX512F-NEXT:    movq %rax, %rcx
532 ; AVX512F-NEXT:    shrq $32, %rcx
533 ; AVX512F-NEXT:    movswl %cx, %ecx
534 ; AVX512F-NEXT:    vmovd %ecx, %xmm1
535 ; AVX512F-NEXT:    movswl %ax, %ecx
536 ; AVX512F-NEXT:    # kill: def %eax killed %eax killed %rax
537 ; AVX512F-NEXT:    shrl $16, %eax
538 ; AVX512F-NEXT:    cwtl
539 ; AVX512F-NEXT:    vmovd %eax, %xmm4
540 ; AVX512F-NEXT:    vpextrq $1, %xmm10, %rax
541 ; AVX512F-NEXT:    vmovd %ecx, %xmm10
542 ; AVX512F-NEXT:    movq %rax, %rcx
543 ; AVX512F-NEXT:    shrq $48, %rcx
544 ; AVX512F-NEXT:    movswl %cx, %ecx
545 ; AVX512F-NEXT:    vmovd %ecx, %xmm5
546 ; AVX512F-NEXT:    movq %rax, %rcx
547 ; AVX512F-NEXT:    shrq $32, %rcx
548 ; AVX512F-NEXT:    movswl %cx, %ecx
549 ; AVX512F-NEXT:    vmovd %ecx, %xmm6
550 ; AVX512F-NEXT:    movl %eax, %ecx
551 ; AVX512F-NEXT:    shrl $16, %ecx
552 ; AVX512F-NEXT:    movswl %cx, %ecx
553 ; AVX512F-NEXT:    vmovd %ecx, %xmm7
554 ; AVX512F-NEXT:    cwtl
555 ; AVX512F-NEXT:    vmovd %eax, %xmm0
556 ; AVX512F-NEXT:    vcvtph2ps %xmm8, %xmm8
557 ; AVX512F-NEXT:    vcvtph2ps %xmm9, %xmm9
558 ; AVX512F-NEXT:    vcvtph2ps %xmm11, %xmm11
559 ; AVX512F-NEXT:    vcvtph2ps %xmm12, %xmm12
560 ; AVX512F-NEXT:    vcvtph2ps %xmm13, %xmm13
561 ; AVX512F-NEXT:    vcvtph2ps %xmm14, %xmm14
562 ; AVX512F-NEXT:    vcvtph2ps %xmm15, %xmm15
563 ; AVX512F-NEXT:    vcvtph2ps %xmm2, %xmm2
564 ; AVX512F-NEXT:    vcvtph2ps %xmm3, %xmm3
565 ; AVX512F-NEXT:    vcvtph2ps %xmm1, %xmm1
566 ; AVX512F-NEXT:    vcvtph2ps %xmm4, %xmm4
567 ; AVX512F-NEXT:    vcvtph2ps %xmm10, %xmm10
568 ; AVX512F-NEXT:    vcvtph2ps %xmm5, %xmm5
569 ; AVX512F-NEXT:    vcvtph2ps %xmm6, %xmm6
570 ; AVX512F-NEXT:    vcvtph2ps %xmm7, %xmm7
571 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0
572 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[2,3]
573 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm6[0],xmm0[3]
574 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm5[0]
575 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm4 = xmm10[0],xmm4[0],xmm10[2,3]
576 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm4[0,1],xmm1[0],xmm4[3]
577 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm3[0]
578 ; AVX512F-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
579 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm15[0],xmm2[2,3]
580 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm14[0],xmm1[3]
581 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm13[0]
582 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm12[0],xmm11[0],xmm12[2,3]
583 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm9[0],xmm2[3]
584 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm8[0]
585 ; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
586 ; AVX512F-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
587 ; AVX512F-NEXT:    retq
588 ;
589 ; AVX512VL-LABEL: cvt_16i16_to_16f32:
590 ; AVX512VL:       # %bb.0:
591 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm10
592 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
593 ; AVX512VL-NEXT:    movq %rax, %rcx
594 ; AVX512VL-NEXT:    shrq $48, %rcx
595 ; AVX512VL-NEXT:    movswl %cx, %ecx
596 ; AVX512VL-NEXT:    vmovd %ecx, %xmm8
597 ; AVX512VL-NEXT:    movq %rax, %rcx
598 ; AVX512VL-NEXT:    shrq $32, %rcx
599 ; AVX512VL-NEXT:    movswl %cx, %ecx
600 ; AVX512VL-NEXT:    vmovd %ecx, %xmm9
601 ; AVX512VL-NEXT:    movswl %ax, %ecx
602 ; AVX512VL-NEXT:    # kill: def %eax killed %eax killed %rax
603 ; AVX512VL-NEXT:    shrl $16, %eax
604 ; AVX512VL-NEXT:    cwtl
605 ; AVX512VL-NEXT:    vmovd %eax, %xmm11
606 ; AVX512VL-NEXT:    vpextrq $1, %xmm0, %rax
607 ; AVX512VL-NEXT:    vmovd %ecx, %xmm12
608 ; AVX512VL-NEXT:    movq %rax, %rcx
609 ; AVX512VL-NEXT:    shrq $48, %rcx
610 ; AVX512VL-NEXT:    movswl %cx, %ecx
611 ; AVX512VL-NEXT:    vmovd %ecx, %xmm13
612 ; AVX512VL-NEXT:    movq %rax, %rcx
613 ; AVX512VL-NEXT:    shrq $32, %rcx
614 ; AVX512VL-NEXT:    movswl %cx, %ecx
615 ; AVX512VL-NEXT:    vmovd %ecx, %xmm14
616 ; AVX512VL-NEXT:    movswl %ax, %ecx
617 ; AVX512VL-NEXT:    # kill: def %eax killed %eax killed %rax
618 ; AVX512VL-NEXT:    shrl $16, %eax
619 ; AVX512VL-NEXT:    cwtl
620 ; AVX512VL-NEXT:    vmovd %eax, %xmm15
621 ; AVX512VL-NEXT:    vmovq %xmm10, %rax
622 ; AVX512VL-NEXT:    vmovd %ecx, %xmm16
623 ; AVX512VL-NEXT:    movq %rax, %rcx
624 ; AVX512VL-NEXT:    shrq $48, %rcx
625 ; AVX512VL-NEXT:    movswl %cx, %ecx
626 ; AVX512VL-NEXT:    vmovd %ecx, %xmm17
627 ; AVX512VL-NEXT:    movq %rax, %rcx
628 ; AVX512VL-NEXT:    shrq $32, %rcx
629 ; AVX512VL-NEXT:    movswl %cx, %ecx
630 ; AVX512VL-NEXT:    vmovd %ecx, %xmm18
631 ; AVX512VL-NEXT:    movswl %ax, %ecx
632 ; AVX512VL-NEXT:    # kill: def %eax killed %eax killed %rax
633 ; AVX512VL-NEXT:    shrl $16, %eax
634 ; AVX512VL-NEXT:    cwtl
635 ; AVX512VL-NEXT:    vmovd %eax, %xmm19
636 ; AVX512VL-NEXT:    vpextrq $1, %xmm10, %rax
637 ; AVX512VL-NEXT:    vmovd %ecx, %xmm10
638 ; AVX512VL-NEXT:    movq %rax, %rcx
639 ; AVX512VL-NEXT:    shrq $48, %rcx
640 ; AVX512VL-NEXT:    movswl %cx, %ecx
641 ; AVX512VL-NEXT:    vmovd %ecx, %xmm20
642 ; AVX512VL-NEXT:    movq %rax, %rcx
643 ; AVX512VL-NEXT:    shrq $32, %rcx
644 ; AVX512VL-NEXT:    movswl %cx, %ecx
645 ; AVX512VL-NEXT:    vmovd %ecx, %xmm21
646 ; AVX512VL-NEXT:    movl %eax, %ecx
647 ; AVX512VL-NEXT:    shrl $16, %ecx
648 ; AVX512VL-NEXT:    movswl %cx, %ecx
649 ; AVX512VL-NEXT:    vmovd %ecx, %xmm22
650 ; AVX512VL-NEXT:    cwtl
651 ; AVX512VL-NEXT:    vmovd %eax, %xmm2
652 ; AVX512VL-NEXT:    vcvtph2ps %xmm8, %xmm8
653 ; AVX512VL-NEXT:    vcvtph2ps %xmm9, %xmm9
654 ; AVX512VL-NEXT:    vcvtph2ps %xmm11, %xmm11
655 ; AVX512VL-NEXT:    vcvtph2ps %xmm12, %xmm12
656 ; AVX512VL-NEXT:    vcvtph2ps %xmm13, %xmm13
657 ; AVX512VL-NEXT:    vcvtph2ps %xmm14, %xmm14
658 ; AVX512VL-NEXT:    vcvtph2ps %xmm15, %xmm15
659 ; AVX512VL-NEXT:    vcvtph2ps %xmm16, %xmm16
660 ; AVX512VL-NEXT:    vcvtph2ps %xmm17, %xmm4
661 ; AVX512VL-NEXT:    vcvtph2ps %xmm18, %xmm0
662 ; AVX512VL-NEXT:    vcvtph2ps %xmm19, %xmm5
663 ; AVX512VL-NEXT:    vcvtph2ps %xmm10, %xmm7
664 ; AVX512VL-NEXT:    vcvtph2ps %xmm20, %xmm3
665 ; AVX512VL-NEXT:    vcvtph2ps %xmm21, %xmm6
666 ; AVX512VL-NEXT:    vcvtph2ps %xmm22, %xmm1
667 ; AVX512VL-NEXT:    vcvtph2ps %xmm2, %xmm2
668 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]
669 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm6[0],xmm1[3]
670 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm3[0]
671 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm7[0],xmm5[0],xmm7[2,3]
672 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1],xmm0[0],xmm2[3]
673 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm4[0]
674 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
675 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm16[0],xmm15[0],xmm16[2,3]
676 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm14[0],xmm1[3]
677 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm13[0]
678 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm12[0],xmm11[0],xmm12[2,3]
679 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm9[0],xmm2[3]
680 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm8[0]
681 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
682 ; AVX512VL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
683 ; AVX512VL-NEXT:    retq
684   %1 = bitcast <16 x i16> %a0 to <16 x half>
685   %2 = fpext <16 x half> %1 to <16 x float>
686   ret <16 x float> %2
687 }
688
689 ;
690 ; Half to Float (Load)
691 ;
692
693 define float @load_cvt_i16_to_f32(i16* %a0) nounwind {
694 ; ALL-LABEL: load_cvt_i16_to_f32:
695 ; ALL:       # %bb.0:
696 ; ALL-NEXT:    movswl (%rdi), %eax
697 ; ALL-NEXT:    vmovd %eax, %xmm0
698 ; ALL-NEXT:    vcvtph2ps %xmm0, %xmm0
699 ; ALL-NEXT:    retq
700   %1 = load i16, i16* %a0
701   %2 = bitcast i16 %1 to half
702   %3 = fpext half %2 to float
703   ret float %3
704 }
705
706 define <4 x float> @load_cvt_4i16_to_4f32(<4 x i16>* %a0) nounwind {
707 ; ALL-LABEL: load_cvt_4i16_to_4f32:
708 ; ALL:       # %bb.0:
709 ; ALL-NEXT:    movswl 6(%rdi), %eax
710 ; ALL-NEXT:    vmovd %eax, %xmm0
711 ; ALL-NEXT:    vcvtph2ps %xmm0, %xmm0
712 ; ALL-NEXT:    movswl 4(%rdi), %eax
713 ; ALL-NEXT:    vmovd %eax, %xmm1
714 ; ALL-NEXT:    vcvtph2ps %xmm1, %xmm1
715 ; ALL-NEXT:    movswl (%rdi), %eax
716 ; ALL-NEXT:    vmovd %eax, %xmm2
717 ; ALL-NEXT:    vcvtph2ps %xmm2, %xmm2
718 ; ALL-NEXT:    movswl 2(%rdi), %eax
719 ; ALL-NEXT:    vmovd %eax, %xmm3
720 ; ALL-NEXT:    vcvtph2ps %xmm3, %xmm3
721 ; ALL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
722 ; ALL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
723 ; ALL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
724 ; ALL-NEXT:    retq
725   %1 = load <4 x i16>, <4 x i16>* %a0
726   %2 = bitcast <4 x i16> %1 to <4 x half>
727   %3 = fpext <4 x half> %2 to <4 x float>
728   ret <4 x float> %3
729 }
730
731 define <4 x float> @load_cvt_8i16_to_4f32(<8 x i16>* %a0) nounwind {
732 ; AVX1-LABEL: load_cvt_8i16_to_4f32:
733 ; AVX1:       # %bb.0:
734 ; AVX1-NEXT:    movq (%rdi), %rax
735 ; AVX1-NEXT:    movq %rax, %rcx
736 ; AVX1-NEXT:    movq %rax, %rdx
737 ; AVX1-NEXT:    movswl %ax, %esi
738 ; AVX1-NEXT:    # kill: def %eax killed %eax killed %rax
739 ; AVX1-NEXT:    shrl $16, %eax
740 ; AVX1-NEXT:    shrq $32, %rcx
741 ; AVX1-NEXT:    shrq $48, %rdx
742 ; AVX1-NEXT:    movswl %dx, %edx
743 ; AVX1-NEXT:    vmovd %edx, %xmm0
744 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
745 ; AVX1-NEXT:    movswl %cx, %ecx
746 ; AVX1-NEXT:    vmovd %ecx, %xmm1
747 ; AVX1-NEXT:    vcvtph2ps %xmm1, %xmm1
748 ; AVX1-NEXT:    cwtl
749 ; AVX1-NEXT:    vmovd %eax, %xmm2
750 ; AVX1-NEXT:    vcvtph2ps %xmm2, %xmm2
751 ; AVX1-NEXT:    vmovd %esi, %xmm3
752 ; AVX1-NEXT:    vcvtph2ps %xmm3, %xmm3
753 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
754 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
755 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
756 ; AVX1-NEXT:    retq
757 ;
758 ; AVX2-LABEL: load_cvt_8i16_to_4f32:
759 ; AVX2:       # %bb.0:
760 ; AVX2-NEXT:    movq (%rdi), %rax
761 ; AVX2-NEXT:    movq %rax, %rcx
762 ; AVX2-NEXT:    movq %rax, %rdx
763 ; AVX2-NEXT:    movswl %ax, %esi
764 ; AVX2-NEXT:    # kill: def %eax killed %eax killed %rax
765 ; AVX2-NEXT:    shrl $16, %eax
766 ; AVX2-NEXT:    shrq $32, %rcx
767 ; AVX2-NEXT:    shrq $48, %rdx
768 ; AVX2-NEXT:    movswl %dx, %edx
769 ; AVX2-NEXT:    vmovd %edx, %xmm0
770 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
771 ; AVX2-NEXT:    movswl %cx, %ecx
772 ; AVX2-NEXT:    vmovd %ecx, %xmm1
773 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
774 ; AVX2-NEXT:    cwtl
775 ; AVX2-NEXT:    vmovd %eax, %xmm2
776 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
777 ; AVX2-NEXT:    vmovd %esi, %xmm3
778 ; AVX2-NEXT:    vcvtph2ps %xmm3, %xmm3
779 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
780 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
781 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
782 ; AVX2-NEXT:    retq
783 ;
784 ; AVX512F-LABEL: load_cvt_8i16_to_4f32:
785 ; AVX512F:       # %bb.0:
786 ; AVX512F-NEXT:    movq (%rdi), %rax
787 ; AVX512F-NEXT:    movq %rax, %rcx
788 ; AVX512F-NEXT:    movq %rax, %rdx
789 ; AVX512F-NEXT:    movswl %ax, %esi
790 ; AVX512F-NEXT:    # kill: def %eax killed %eax killed %rax
791 ; AVX512F-NEXT:    shrl $16, %eax
792 ; AVX512F-NEXT:    shrq $32, %rcx
793 ; AVX512F-NEXT:    shrq $48, %rdx
794 ; AVX512F-NEXT:    movswl %dx, %edx
795 ; AVX512F-NEXT:    vmovd %edx, %xmm0
796 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0
797 ; AVX512F-NEXT:    movswl %cx, %ecx
798 ; AVX512F-NEXT:    vmovd %ecx, %xmm1
799 ; AVX512F-NEXT:    vcvtph2ps %xmm1, %xmm1
800 ; AVX512F-NEXT:    cwtl
801 ; AVX512F-NEXT:    vmovd %eax, %xmm2
802 ; AVX512F-NEXT:    vcvtph2ps %xmm2, %xmm2
803 ; AVX512F-NEXT:    vmovd %esi, %xmm3
804 ; AVX512F-NEXT:    vcvtph2ps %xmm3, %xmm3
805 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
806 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
807 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
808 ; AVX512F-NEXT:    retq
809 ;
810 ; AVX512VL-LABEL: load_cvt_8i16_to_4f32:
811 ; AVX512VL:       # %bb.0:
812 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
813 ; AVX512VL-NEXT:    vpmovdw %xmm0, -{{[0-9]+}}(%rsp)
814 ; AVX512VL-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
815 ; AVX512VL-NEXT:    movq %rax, %rcx
816 ; AVX512VL-NEXT:    movq %rax, %rdx
817 ; AVX512VL-NEXT:    movswl %ax, %esi
818 ; AVX512VL-NEXT:    # kill: def %eax killed %eax killed %rax
819 ; AVX512VL-NEXT:    shrl $16, %eax
820 ; AVX512VL-NEXT:    shrq $32, %rcx
821 ; AVX512VL-NEXT:    shrq $48, %rdx
822 ; AVX512VL-NEXT:    movswl %dx, %edx
823 ; AVX512VL-NEXT:    vmovd %edx, %xmm0
824 ; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm0
825 ; AVX512VL-NEXT:    movswl %cx, %ecx
826 ; AVX512VL-NEXT:    vmovd %ecx, %xmm1
827 ; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm1
828 ; AVX512VL-NEXT:    cwtl
829 ; AVX512VL-NEXT:    vmovd %eax, %xmm2
830 ; AVX512VL-NEXT:    vcvtph2ps %xmm2, %xmm2
831 ; AVX512VL-NEXT:    vmovd %esi, %xmm3
832 ; AVX512VL-NEXT:    vcvtph2ps %xmm3, %xmm3
833 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]
834 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
835 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
836 ; AVX512VL-NEXT:    retq
837   %1 = load <8 x i16>, <8 x i16>* %a0
838   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
839   %3 = bitcast <4 x i16> %2 to <4 x half>
840   %4 = fpext <4 x half> %3 to <4 x float>
841   ret <4 x float> %4
842 }
843
844 define <8 x float> @load_cvt_8i16_to_8f32(<8 x i16>* %a0) nounwind {
845 ; ALL-LABEL: load_cvt_8i16_to_8f32:
846 ; ALL:       # %bb.0:
847 ; ALL-NEXT:    movswl 6(%rdi), %eax
848 ; ALL-NEXT:    vmovd %eax, %xmm0
849 ; ALL-NEXT:    vcvtph2ps %xmm0, %xmm0
850 ; ALL-NEXT:    movswl 4(%rdi), %eax
851 ; ALL-NEXT:    vmovd %eax, %xmm1
852 ; ALL-NEXT:    vcvtph2ps %xmm1, %xmm1
853 ; ALL-NEXT:    movswl (%rdi), %eax
854 ; ALL-NEXT:    vmovd %eax, %xmm2
855 ; ALL-NEXT:    vcvtph2ps %xmm2, %xmm2
856 ; ALL-NEXT:    movswl 2(%rdi), %eax
857 ; ALL-NEXT:    vmovd %eax, %xmm3
858 ; ALL-NEXT:    vcvtph2ps %xmm3, %xmm3
859 ; ALL-NEXT:    movswl 14(%rdi), %eax
860 ; ALL-NEXT:    vmovd %eax, %xmm4
861 ; ALL-NEXT:    vcvtph2ps %xmm4, %xmm4
862 ; ALL-NEXT:    movswl 12(%rdi), %eax
863 ; ALL-NEXT:    vmovd %eax, %xmm5
864 ; ALL-NEXT:    vcvtph2ps %xmm5, %xmm5
865 ; ALL-NEXT:    movswl 8(%rdi), %eax
866 ; ALL-NEXT:    vmovd %eax, %xmm6
867 ; ALL-NEXT:    vcvtph2ps %xmm6, %xmm6
868 ; ALL-NEXT:    movswl 10(%rdi), %eax
869 ; ALL-NEXT:    vmovd %eax, %xmm7
870 ; ALL-NEXT:    vcvtph2ps %xmm7, %xmm7
871 ; ALL-NEXT:    vinsertps {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[2,3]
872 ; ALL-NEXT:    vinsertps {{.*#+}} xmm5 = xmm6[0,1],xmm5[0],xmm6[3]
873 ; ALL-NEXT:    vinsertps {{.*#+}} xmm4 = xmm5[0,1,2],xmm4[0]
874 ; ALL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
875 ; ALL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
876 ; ALL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
877 ; ALL-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
878 ; ALL-NEXT:    retq
879   %1 = load <8 x i16>, <8 x i16>* %a0
880   %2 = bitcast <8 x i16> %1 to <8 x half>
881   %3 = fpext <8 x half> %2 to <8 x float>
882   ret <8 x float> %3
883 }
884
885 define <16 x float> @load_cvt_16i16_to_16f32(<16 x i16>* %a0) nounwind {
886 ; AVX1-LABEL: load_cvt_16i16_to_16f32:
887 ; AVX1:       # %bb.0:
888 ; AVX1-NEXT:    movswl 22(%rdi), %eax
889 ; AVX1-NEXT:    vmovd %eax, %xmm0
890 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm8
891 ; AVX1-NEXT:    movswl 20(%rdi), %eax
892 ; AVX1-NEXT:    vmovd %eax, %xmm0
893 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm9
894 ; AVX1-NEXT:    movswl 16(%rdi), %eax
895 ; AVX1-NEXT:    vmovd %eax, %xmm0
896 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm10
897 ; AVX1-NEXT:    movswl 18(%rdi), %eax
898 ; AVX1-NEXT:    vmovd %eax, %xmm0
899 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm11
900 ; AVX1-NEXT:    movswl 30(%rdi), %eax
901 ; AVX1-NEXT:    vmovd %eax, %xmm0
902 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm12
903 ; AVX1-NEXT:    movswl 28(%rdi), %eax
904 ; AVX1-NEXT:    vmovd %eax, %xmm0
905 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm13
906 ; AVX1-NEXT:    movswl 24(%rdi), %eax
907 ; AVX1-NEXT:    vmovd %eax, %xmm0
908 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm14
909 ; AVX1-NEXT:    movswl 26(%rdi), %eax
910 ; AVX1-NEXT:    vmovd %eax, %xmm0
911 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm15
912 ; AVX1-NEXT:    movswl 6(%rdi), %eax
913 ; AVX1-NEXT:    vmovd %eax, %xmm0
914 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
915 ; AVX1-NEXT:    movswl 4(%rdi), %eax
916 ; AVX1-NEXT:    vmovd %eax, %xmm2
917 ; AVX1-NEXT:    vcvtph2ps %xmm2, %xmm2
918 ; AVX1-NEXT:    movswl (%rdi), %eax
919 ; AVX1-NEXT:    vmovd %eax, %xmm3
920 ; AVX1-NEXT:    vcvtph2ps %xmm3, %xmm3
921 ; AVX1-NEXT:    movswl 2(%rdi), %eax
922 ; AVX1-NEXT:    vmovd %eax, %xmm4
923 ; AVX1-NEXT:    vcvtph2ps %xmm4, %xmm4
924 ; AVX1-NEXT:    movswl 14(%rdi), %eax
925 ; AVX1-NEXT:    vmovd %eax, %xmm5
926 ; AVX1-NEXT:    vcvtph2ps %xmm5, %xmm5
927 ; AVX1-NEXT:    movswl 12(%rdi), %eax
928 ; AVX1-NEXT:    vmovd %eax, %xmm6
929 ; AVX1-NEXT:    vcvtph2ps %xmm6, %xmm6
930 ; AVX1-NEXT:    movswl 8(%rdi), %eax
931 ; AVX1-NEXT:    vmovd %eax, %xmm7
932 ; AVX1-NEXT:    vcvtph2ps %xmm7, %xmm7
933 ; AVX1-NEXT:    movswl 10(%rdi), %eax
934 ; AVX1-NEXT:    vmovd %eax, %xmm1
935 ; AVX1-NEXT:    vcvtph2ps %xmm1, %xmm1
936 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm7[0],xmm1[0],xmm7[2,3]
937 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm6[0],xmm1[3]
938 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm5[0]
939 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[2,3]
940 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0,1],xmm2[0],xmm3[3]
941 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
942 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
943 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm14[0],xmm15[0],xmm14[2,3]
944 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm13[0],xmm1[3]
945 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm12[0]
946 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm10[0],xmm11[0],xmm10[2,3]
947 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm9[0],xmm2[3]
948 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm8[0]
949 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
950 ; AVX1-NEXT:    retq
951 ;
952 ; AVX2-LABEL: load_cvt_16i16_to_16f32:
953 ; AVX2:       # %bb.0:
954 ; AVX2-NEXT:    movswl 22(%rdi), %eax
955 ; AVX2-NEXT:    vmovd %eax, %xmm0
956 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm8
957 ; AVX2-NEXT:    movswl 20(%rdi), %eax
958 ; AVX2-NEXT:    vmovd %eax, %xmm0
959 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm9
960 ; AVX2-NEXT:    movswl 16(%rdi), %eax
961 ; AVX2-NEXT:    vmovd %eax, %xmm0
962 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm10
963 ; AVX2-NEXT:    movswl 18(%rdi), %eax
964 ; AVX2-NEXT:    vmovd %eax, %xmm0
965 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm11
966 ; AVX2-NEXT:    movswl 30(%rdi), %eax
967 ; AVX2-NEXT:    vmovd %eax, %xmm0
968 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm12
969 ; AVX2-NEXT:    movswl 28(%rdi), %eax
970 ; AVX2-NEXT:    vmovd %eax, %xmm0
971 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm13
972 ; AVX2-NEXT:    movswl 24(%rdi), %eax
973 ; AVX2-NEXT:    vmovd %eax, %xmm0
974 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm14
975 ; AVX2-NEXT:    movswl 26(%rdi), %eax
976 ; AVX2-NEXT:    vmovd %eax, %xmm0
977 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm15
978 ; AVX2-NEXT:    movswl 6(%rdi), %eax
979 ; AVX2-NEXT:    vmovd %eax, %xmm0
980 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
981 ; AVX2-NEXT:    movswl 4(%rdi), %eax
982 ; AVX2-NEXT:    vmovd %eax, %xmm2
983 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
984 ; AVX2-NEXT:    movswl (%rdi), %eax
985 ; AVX2-NEXT:    vmovd %eax, %xmm3
986 ; AVX2-NEXT:    vcvtph2ps %xmm3, %xmm3
987 ; AVX2-NEXT:    movswl 2(%rdi), %eax
988 ; AVX2-NEXT:    vmovd %eax, %xmm4
989 ; AVX2-NEXT:    vcvtph2ps %xmm4, %xmm4
990 ; AVX2-NEXT:    movswl 14(%rdi), %eax
991 ; AVX2-NEXT:    vmovd %eax, %xmm5
992 ; AVX2-NEXT:    vcvtph2ps %xmm5, %xmm5
993 ; AVX2-NEXT:    movswl 12(%rdi), %eax
994 ; AVX2-NEXT:    vmovd %eax, %xmm6
995 ; AVX2-NEXT:    vcvtph2ps %xmm6, %xmm6
996 ; AVX2-NEXT:    movswl 8(%rdi), %eax
997 ; AVX2-NEXT:    vmovd %eax, %xmm7
998 ; AVX2-NEXT:    vcvtph2ps %xmm7, %xmm7
999 ; AVX2-NEXT:    movswl 10(%rdi), %eax
1000 ; AVX2-NEXT:    vmovd %eax, %xmm1
1001 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
1002 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm7[0],xmm1[0],xmm7[2,3]
1003 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm6[0],xmm1[3]
1004 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm5[0]
1005 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[2,3]
1006 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm3[0,1],xmm2[0],xmm3[3]
1007 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[0]
1008 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1009 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm14[0],xmm15[0],xmm14[2,3]
1010 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm13[0],xmm1[3]
1011 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm12[0]
1012 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm10[0],xmm11[0],xmm10[2,3]
1013 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm9[0],xmm2[3]
1014 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm8[0]
1015 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1016 ; AVX2-NEXT:    retq
1017 ;
1018 ; AVX512F-LABEL: load_cvt_16i16_to_16f32:
1019 ; AVX512F:       # %bb.0:
1020 ; AVX512F-NEXT:    movswl 6(%rdi), %eax
1021 ; AVX512F-NEXT:    vmovd %eax, %xmm0
1022 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm8
1023 ; AVX512F-NEXT:    movswl 4(%rdi), %eax
1024 ; AVX512F-NEXT:    vmovd %eax, %xmm0
1025 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm9
1026 ; AVX512F-NEXT:    movswl (%rdi), %eax
1027 ; AVX512F-NEXT:    vmovd %eax, %xmm0
1028 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm10
1029 ; AVX512F-NEXT:    movswl 2(%rdi), %eax
1030 ; AVX512F-NEXT:    vmovd %eax, %xmm0
1031 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm11
1032 ; AVX512F-NEXT:    movswl 14(%rdi), %eax
1033 ; AVX512F-NEXT:    vmovd %eax, %xmm0
1034 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm12
1035 ; AVX512F-NEXT:    movswl 12(%rdi), %eax
1036 ; AVX512F-NEXT:    vmovd %eax, %xmm0
1037 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm13
1038 ; AVX512F-NEXT:    movswl 8(%rdi), %eax
1039 ; AVX512F-NEXT:    vmovd %eax, %xmm0
1040 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm14
1041 ; AVX512F-NEXT:    movswl 10(%rdi), %eax
1042 ; AVX512F-NEXT:    vmovd %eax, %xmm0
1043 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm15
1044 ; AVX512F-NEXT:    movswl 22(%rdi), %eax
1045 ; AVX512F-NEXT:    vmovd %eax, %xmm0
1046 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0
1047 ; AVX512F-NEXT:    movswl 20(%rdi), %eax
1048 ; AVX512F-NEXT:    vmovd %eax, %xmm1
1049 ; AVX512F-NEXT:    vcvtph2ps %xmm1, %xmm1
1050 ; AVX512F-NEXT:    movswl 16(%rdi), %eax
1051 ; AVX512F-NEXT:    vmovd %eax, %xmm2
1052 ; AVX512F-NEXT:    vcvtph2ps %xmm2, %xmm2
1053 ; AVX512F-NEXT:    movswl 18(%rdi), %eax
1054 ; AVX512F-NEXT:    vmovd %eax, %xmm3
1055 ; AVX512F-NEXT:    vcvtph2ps %xmm3, %xmm3
1056 ; AVX512F-NEXT:    movswl 30(%rdi), %eax
1057 ; AVX512F-NEXT:    vmovd %eax, %xmm4
1058 ; AVX512F-NEXT:    vcvtph2ps %xmm4, %xmm4
1059 ; AVX512F-NEXT:    movswl 28(%rdi), %eax
1060 ; AVX512F-NEXT:    vmovd %eax, %xmm5
1061 ; AVX512F-NEXT:    vcvtph2ps %xmm5, %xmm5
1062 ; AVX512F-NEXT:    movswl 24(%rdi), %eax
1063 ; AVX512F-NEXT:    vmovd %eax, %xmm6
1064 ; AVX512F-NEXT:    vcvtph2ps %xmm6, %xmm6
1065 ; AVX512F-NEXT:    movswl 26(%rdi), %eax
1066 ; AVX512F-NEXT:    vmovd %eax, %xmm7
1067 ; AVX512F-NEXT:    vcvtph2ps %xmm7, %xmm7
1068 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[2,3]
1069 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm5 = xmm6[0,1],xmm5[0],xmm6[3]
1070 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm4 = xmm5[0,1,2],xmm4[0]
1071 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
1072 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
1073 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1074 ; AVX512F-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1075 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm14[0],xmm15[0],xmm14[2,3]
1076 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm13[0],xmm1[3]
1077 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm12[0]
1078 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm10[0],xmm11[0],xmm10[2,3]
1079 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm9[0],xmm2[3]
1080 ; AVX512F-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm8[0]
1081 ; AVX512F-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1082 ; AVX512F-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
1083 ; AVX512F-NEXT:    retq
1084 ;
1085 ; AVX512VL-LABEL: load_cvt_16i16_to_16f32:
1086 ; AVX512VL:       # %bb.0:
1087 ; AVX512VL-NEXT:    movswl 6(%rdi), %eax
1088 ; AVX512VL-NEXT:    vmovd %eax, %xmm0
1089 ; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm8
1090 ; AVX512VL-NEXT:    movswl 4(%rdi), %eax
1091 ; AVX512VL-NEXT:    vmovd %eax, %xmm1
1092 ; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm9
1093 ; AVX512VL-NEXT:    movswl (%rdi), %eax
1094 ; AVX512VL-NEXT:    vmovd %eax, %xmm2
1095 ; AVX512VL-NEXT:    vcvtph2ps %xmm2, %xmm10
1096 ; AVX512VL-NEXT:    movswl 2(%rdi), %eax
1097 ; AVX512VL-NEXT:    vmovd %eax, %xmm3
1098 ; AVX512VL-NEXT:    vcvtph2ps %xmm3, %xmm11
1099 ; AVX512VL-NEXT:    movswl 14(%rdi), %eax
1100 ; AVX512VL-NEXT:    vmovd %eax, %xmm4
1101 ; AVX512VL-NEXT:    vcvtph2ps %xmm4, %xmm12
1102 ; AVX512VL-NEXT:    movswl 12(%rdi), %eax
1103 ; AVX512VL-NEXT:    vmovd %eax, %xmm5
1104 ; AVX512VL-NEXT:    vcvtph2ps %xmm5, %xmm13
1105 ; AVX512VL-NEXT:    movswl 8(%rdi), %eax
1106 ; AVX512VL-NEXT:    vmovd %eax, %xmm6
1107 ; AVX512VL-NEXT:    vcvtph2ps %xmm6, %xmm14
1108 ; AVX512VL-NEXT:    movswl 10(%rdi), %eax
1109 ; AVX512VL-NEXT:    vmovd %eax, %xmm7
1110 ; AVX512VL-NEXT:    vcvtph2ps %xmm7, %xmm15
1111 ; AVX512VL-NEXT:    movswl 22(%rdi), %eax
1112 ; AVX512VL-NEXT:    vmovd %eax, %xmm0
1113 ; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm0
1114 ; AVX512VL-NEXT:    movswl 20(%rdi), %eax
1115 ; AVX512VL-NEXT:    vmovd %eax, %xmm1
1116 ; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm1
1117 ; AVX512VL-NEXT:    movswl 16(%rdi), %eax
1118 ; AVX512VL-NEXT:    vmovd %eax, %xmm2
1119 ; AVX512VL-NEXT:    vcvtph2ps %xmm2, %xmm2
1120 ; AVX512VL-NEXT:    movswl 18(%rdi), %eax
1121 ; AVX512VL-NEXT:    vmovd %eax, %xmm3
1122 ; AVX512VL-NEXT:    vcvtph2ps %xmm3, %xmm3
1123 ; AVX512VL-NEXT:    movswl 30(%rdi), %eax
1124 ; AVX512VL-NEXT:    vmovd %eax, %xmm4
1125 ; AVX512VL-NEXT:    vcvtph2ps %xmm4, %xmm4
1126 ; AVX512VL-NEXT:    movswl 28(%rdi), %eax
1127 ; AVX512VL-NEXT:    vmovd %eax, %xmm5
1128 ; AVX512VL-NEXT:    vcvtph2ps %xmm5, %xmm5
1129 ; AVX512VL-NEXT:    movswl 24(%rdi), %eax
1130 ; AVX512VL-NEXT:    vmovd %eax, %xmm6
1131 ; AVX512VL-NEXT:    vcvtph2ps %xmm6, %xmm6
1132 ; AVX512VL-NEXT:    movswl 26(%rdi), %eax
1133 ; AVX512VL-NEXT:    vmovd %eax, %xmm7
1134 ; AVX512VL-NEXT:    vcvtph2ps %xmm7, %xmm7
1135 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[2,3]
1136 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm5 = xmm6[0,1],xmm5[0],xmm6[3]
1137 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm4 = xmm5[0,1,2],xmm4[0]
1138 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[2,3]
1139 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
1140 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1141 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1142 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm14[0],xmm15[0],xmm14[2,3]
1143 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm13[0],xmm1[3]
1144 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm12[0]
1145 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm10[0],xmm11[0],xmm10[2,3]
1146 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm9[0],xmm2[3]
1147 ; AVX512VL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],xmm8[0]
1148 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1149 ; AVX512VL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
1150 ; AVX512VL-NEXT:    retq
1151   %1 = load <16 x i16>, <16 x i16>* %a0
1152   %2 = bitcast <16 x i16> %1 to <16 x half>
1153   %3 = fpext <16 x half> %2 to <16 x float>
1154   ret <16 x float> %3
1155 }
1156
1157 ;
1158 ; Half to Double
1159 ;
1160
1161 define double @cvt_i16_to_f64(i16 %a0) nounwind {
1162 ; ALL-LABEL: cvt_i16_to_f64:
1163 ; ALL:       # %bb.0:
1164 ; ALL-NEXT:    movswl %di, %eax
1165 ; ALL-NEXT:    vmovd %eax, %xmm0
1166 ; ALL-NEXT:    vcvtph2ps %xmm0, %xmm0
1167 ; ALL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1168 ; ALL-NEXT:    retq
1169   %1 = bitcast i16 %a0 to half
1170   %2 = fpext half %1 to double
1171   ret double %2
1172 }
1173
1174 define <2 x double> @cvt_2i16_to_2f64(<2 x i16> %a0) nounwind {
1175 ; AVX1-LABEL: cvt_2i16_to_2f64:
1176 ; AVX1:       # %bb.0:
1177 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1178 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1179 ; AVX1-NEXT:    vmovd %xmm0, %eax
1180 ; AVX1-NEXT:    movswl %ax, %ecx
1181 ; AVX1-NEXT:    shrl $16, %eax
1182 ; AVX1-NEXT:    cwtl
1183 ; AVX1-NEXT:    vmovd %eax, %xmm0
1184 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
1185 ; AVX1-NEXT:    vmovd %ecx, %xmm1
1186 ; AVX1-NEXT:    vcvtph2ps %xmm1, %xmm1
1187 ; AVX1-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1188 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1189 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1190 ; AVX1-NEXT:    retq
1191 ;
1192 ; AVX2-LABEL: cvt_2i16_to_2f64:
1193 ; AVX2:       # %bb.0:
1194 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1195 ; AVX2-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1196 ; AVX2-NEXT:    vmovd %xmm0, %eax
1197 ; AVX2-NEXT:    movswl %ax, %ecx
1198 ; AVX2-NEXT:    shrl $16, %eax
1199 ; AVX2-NEXT:    cwtl
1200 ; AVX2-NEXT:    vmovd %eax, %xmm0
1201 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
1202 ; AVX2-NEXT:    vmovd %ecx, %xmm1
1203 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
1204 ; AVX2-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1205 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1206 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1207 ; AVX2-NEXT:    retq
1208 ;
1209 ; AVX512F-LABEL: cvt_2i16_to_2f64:
1210 ; AVX512F:       # %bb.0:
1211 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1212 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1213 ; AVX512F-NEXT:    vmovd %xmm0, %eax
1214 ; AVX512F-NEXT:    movswl %ax, %ecx
1215 ; AVX512F-NEXT:    shrl $16, %eax
1216 ; AVX512F-NEXT:    cwtl
1217 ; AVX512F-NEXT:    vmovd %eax, %xmm0
1218 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0
1219 ; AVX512F-NEXT:    vmovd %ecx, %xmm1
1220 ; AVX512F-NEXT:    vcvtph2ps %xmm1, %xmm1
1221 ; AVX512F-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1222 ; AVX512F-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1223 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1224 ; AVX512F-NEXT:    retq
1225 ;
1226 ; AVX512VL-LABEL: cvt_2i16_to_2f64:
1227 ; AVX512VL:       # %bb.0:
1228 ; AVX512VL-NEXT:    vpmovqw %xmm0, -{{[0-9]+}}(%rsp)
1229 ; AVX512VL-NEXT:    movl -{{[0-9]+}}(%rsp), %eax
1230 ; AVX512VL-NEXT:    movswl %ax, %ecx
1231 ; AVX512VL-NEXT:    shrl $16, %eax
1232 ; AVX512VL-NEXT:    cwtl
1233 ; AVX512VL-NEXT:    vmovd %eax, %xmm0
1234 ; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm0
1235 ; AVX512VL-NEXT:    vmovd %ecx, %xmm1
1236 ; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm1
1237 ; AVX512VL-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1238 ; AVX512VL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1239 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1240 ; AVX512VL-NEXT:    retq
1241   %1 = bitcast <2 x i16> %a0 to <2 x half>
1242   %2 = fpext <2 x half> %1 to <2 x double>
1243   ret <2 x double> %2
1244 }
1245
1246 define <4 x double> @cvt_4i16_to_4f64(<4 x i16> %a0) nounwind {
1247 ; AVX1-LABEL: cvt_4i16_to_4f64:
1248 ; AVX1:       # %bb.0:
1249 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1250 ; AVX1-NEXT:    vmovq %xmm0, %rax
1251 ; AVX1-NEXT:    movq %rax, %rcx
1252 ; AVX1-NEXT:    movl %eax, %edx
1253 ; AVX1-NEXT:    movswl %ax, %esi
1254 ; AVX1-NEXT:    shrq $48, %rax
1255 ; AVX1-NEXT:    shrq $32, %rcx
1256 ; AVX1-NEXT:    shrl $16, %edx
1257 ; AVX1-NEXT:    movswl %dx, %edx
1258 ; AVX1-NEXT:    vmovd %edx, %xmm0
1259 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
1260 ; AVX1-NEXT:    vmovd %esi, %xmm1
1261 ; AVX1-NEXT:    vcvtph2ps %xmm1, %xmm1
1262 ; AVX1-NEXT:    movswl %cx, %ecx
1263 ; AVX1-NEXT:    vmovd %ecx, %xmm2
1264 ; AVX1-NEXT:    vcvtph2ps %xmm2, %xmm2
1265 ; AVX1-NEXT:    cwtl
1266 ; AVX1-NEXT:    vmovd %eax, %xmm3
1267 ; AVX1-NEXT:    vcvtph2ps %xmm3, %xmm3
1268 ; AVX1-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1269 ; AVX1-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1270 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1271 ; AVX1-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1272 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1273 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1274 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1275 ; AVX1-NEXT:    retq
1276 ;
1277 ; AVX2-LABEL: cvt_4i16_to_4f64:
1278 ; AVX2:       # %bb.0:
1279 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1280 ; AVX2-NEXT:    vmovq %xmm0, %rax
1281 ; AVX2-NEXT:    movq %rax, %rcx
1282 ; AVX2-NEXT:    movl %eax, %edx
1283 ; AVX2-NEXT:    movswl %ax, %esi
1284 ; AVX2-NEXT:    shrq $48, %rax
1285 ; AVX2-NEXT:    shrq $32, %rcx
1286 ; AVX2-NEXT:    shrl $16, %edx
1287 ; AVX2-NEXT:    movswl %dx, %edx
1288 ; AVX2-NEXT:    vmovd %edx, %xmm0
1289 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
1290 ; AVX2-NEXT:    vmovd %esi, %xmm1
1291 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
1292 ; AVX2-NEXT:    movswl %cx, %ecx
1293 ; AVX2-NEXT:    vmovd %ecx, %xmm2
1294 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
1295 ; AVX2-NEXT:    cwtl
1296 ; AVX2-NEXT:    vmovd %eax, %xmm3
1297 ; AVX2-NEXT:    vcvtph2ps %xmm3, %xmm3
1298 ; AVX2-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1299 ; AVX2-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1300 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1301 ; AVX2-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1302 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1303 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1304 ; AVX2-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1305 ; AVX2-NEXT:    retq
1306 ;
1307 ; AVX512F-LABEL: cvt_4i16_to_4f64:
1308 ; AVX512F:       # %bb.0:
1309 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1310 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1311 ; AVX512F-NEXT:    movq %rax, %rcx
1312 ; AVX512F-NEXT:    movl %eax, %edx
1313 ; AVX512F-NEXT:    movswl %ax, %esi
1314 ; AVX512F-NEXT:    shrq $48, %rax
1315 ; AVX512F-NEXT:    shrq $32, %rcx
1316 ; AVX512F-NEXT:    shrl $16, %edx
1317 ; AVX512F-NEXT:    movswl %dx, %edx
1318 ; AVX512F-NEXT:    vmovd %edx, %xmm0
1319 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0
1320 ; AVX512F-NEXT:    vmovd %esi, %xmm1
1321 ; AVX512F-NEXT:    vcvtph2ps %xmm1, %xmm1
1322 ; AVX512F-NEXT:    movswl %cx, %ecx
1323 ; AVX512F-NEXT:    vmovd %ecx, %xmm2
1324 ; AVX512F-NEXT:    vcvtph2ps %xmm2, %xmm2
1325 ; AVX512F-NEXT:    cwtl
1326 ; AVX512F-NEXT:    vmovd %eax, %xmm3
1327 ; AVX512F-NEXT:    vcvtph2ps %xmm3, %xmm3
1328 ; AVX512F-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1329 ; AVX512F-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1330 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1331 ; AVX512F-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1332 ; AVX512F-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1333 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1334 ; AVX512F-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1335 ; AVX512F-NEXT:    retq
1336 ;
1337 ; AVX512VL-LABEL: cvt_4i16_to_4f64:
1338 ; AVX512VL:       # %bb.0:
1339 ; AVX512VL-NEXT:    vpmovdw %xmm0, -{{[0-9]+}}(%rsp)
1340 ; AVX512VL-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
1341 ; AVX512VL-NEXT:    movq %rax, %rcx
1342 ; AVX512VL-NEXT:    movl %eax, %edx
1343 ; AVX512VL-NEXT:    movswl %ax, %esi
1344 ; AVX512VL-NEXT:    shrq $48, %rax
1345 ; AVX512VL-NEXT:    shrq $32, %rcx
1346 ; AVX512VL-NEXT:    shrl $16, %edx
1347 ; AVX512VL-NEXT:    movswl %dx, %edx
1348 ; AVX512VL-NEXT:    vmovd %edx, %xmm0
1349 ; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm0
1350 ; AVX512VL-NEXT:    vmovd %esi, %xmm1
1351 ; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm1
1352 ; AVX512VL-NEXT:    movswl %cx, %ecx
1353 ; AVX512VL-NEXT:    vmovd %ecx, %xmm2
1354 ; AVX512VL-NEXT:    vcvtph2ps %xmm2, %xmm2
1355 ; AVX512VL-NEXT:    cwtl
1356 ; AVX512VL-NEXT:    vmovd %eax, %xmm3
1357 ; AVX512VL-NEXT:    vcvtph2ps %xmm3, %xmm3
1358 ; AVX512VL-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1359 ; AVX512VL-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1360 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1361 ; AVX512VL-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1362 ; AVX512VL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1363 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1364 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1365 ; AVX512VL-NEXT:    retq
1366   %1 = bitcast <4 x i16> %a0 to <4 x half>
1367   %2 = fpext <4 x half> %1 to <4 x double>
1368   ret <4 x double> %2
1369 }
1370
1371 define <2 x double> @cvt_8i16_to_2f64(<8 x i16> %a0) nounwind {
1372 ; AVX1-LABEL: cvt_8i16_to_2f64:
1373 ; AVX1:       # %bb.0:
1374 ; AVX1-NEXT:    vmovd %xmm0, %eax
1375 ; AVX1-NEXT:    movswl %ax, %ecx
1376 ; AVX1-NEXT:    shrl $16, %eax
1377 ; AVX1-NEXT:    cwtl
1378 ; AVX1-NEXT:    vmovd %eax, %xmm0
1379 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
1380 ; AVX1-NEXT:    vmovd %ecx, %xmm1
1381 ; AVX1-NEXT:    vcvtph2ps %xmm1, %xmm1
1382 ; AVX1-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1383 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1384 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1385 ; AVX1-NEXT:    retq
1386 ;
1387 ; AVX2-LABEL: cvt_8i16_to_2f64:
1388 ; AVX2:       # %bb.0:
1389 ; AVX2-NEXT:    vmovd %xmm0, %eax
1390 ; AVX2-NEXT:    movswl %ax, %ecx
1391 ; AVX2-NEXT:    shrl $16, %eax
1392 ; AVX2-NEXT:    cwtl
1393 ; AVX2-NEXT:    vmovd %eax, %xmm0
1394 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
1395 ; AVX2-NEXT:    vmovd %ecx, %xmm1
1396 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
1397 ; AVX2-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1398 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1399 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1400 ; AVX2-NEXT:    retq
1401 ;
1402 ; AVX512F-LABEL: cvt_8i16_to_2f64:
1403 ; AVX512F:       # %bb.0:
1404 ; AVX512F-NEXT:    vmovd %xmm0, %eax
1405 ; AVX512F-NEXT:    movswl %ax, %ecx
1406 ; AVX512F-NEXT:    shrl $16, %eax
1407 ; AVX512F-NEXT:    cwtl
1408 ; AVX512F-NEXT:    vmovd %eax, %xmm0
1409 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0
1410 ; AVX512F-NEXT:    vmovd %ecx, %xmm1
1411 ; AVX512F-NEXT:    vcvtph2ps %xmm1, %xmm1
1412 ; AVX512F-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1413 ; AVX512F-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1414 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1415 ; AVX512F-NEXT:    retq
1416 ;
1417 ; AVX512VL-LABEL: cvt_8i16_to_2f64:
1418 ; AVX512VL:       # %bb.0:
1419 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1420 ; AVX512VL-NEXT:    vpmovqw %xmm0, -{{[0-9]+}}(%rsp)
1421 ; AVX512VL-NEXT:    movl -{{[0-9]+}}(%rsp), %eax
1422 ; AVX512VL-NEXT:    movswl %ax, %ecx
1423 ; AVX512VL-NEXT:    shrl $16, %eax
1424 ; AVX512VL-NEXT:    cwtl
1425 ; AVX512VL-NEXT:    vmovd %eax, %xmm0
1426 ; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm0
1427 ; AVX512VL-NEXT:    vmovd %ecx, %xmm1
1428 ; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm1
1429 ; AVX512VL-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1430 ; AVX512VL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1431 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1432 ; AVX512VL-NEXT:    retq
1433   %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
1434   %2 = bitcast <2 x i16> %1 to <2 x half>
1435   %3 = fpext <2 x half> %2 to <2 x double>
1436   ret <2 x double> %3
1437 }
1438
1439 define <4 x double> @cvt_8i16_to_4f64(<8 x i16> %a0) nounwind {
1440 ; AVX1-LABEL: cvt_8i16_to_4f64:
1441 ; AVX1:       # %bb.0:
1442 ; AVX1-NEXT:    vmovq %xmm0, %rax
1443 ; AVX1-NEXT:    movq %rax, %rcx
1444 ; AVX1-NEXT:    movl %eax, %edx
1445 ; AVX1-NEXT:    movswl %ax, %esi
1446 ; AVX1-NEXT:    shrq $48, %rax
1447 ; AVX1-NEXT:    shrq $32, %rcx
1448 ; AVX1-NEXT:    shrl $16, %edx
1449 ; AVX1-NEXT:    movswl %dx, %edx
1450 ; AVX1-NEXT:    vmovd %edx, %xmm0
1451 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
1452 ; AVX1-NEXT:    vmovd %esi, %xmm1
1453 ; AVX1-NEXT:    vcvtph2ps %xmm1, %xmm1
1454 ; AVX1-NEXT:    movswl %cx, %ecx
1455 ; AVX1-NEXT:    vmovd %ecx, %xmm2
1456 ; AVX1-NEXT:    vcvtph2ps %xmm2, %xmm2
1457 ; AVX1-NEXT:    cwtl
1458 ; AVX1-NEXT:    vmovd %eax, %xmm3
1459 ; AVX1-NEXT:    vcvtph2ps %xmm3, %xmm3
1460 ; AVX1-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1461 ; AVX1-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1462 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1463 ; AVX1-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1464 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1465 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1466 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1467 ; AVX1-NEXT:    retq
1468 ;
1469 ; AVX2-LABEL: cvt_8i16_to_4f64:
1470 ; AVX2:       # %bb.0:
1471 ; AVX2-NEXT:    vmovq %xmm0, %rax
1472 ; AVX2-NEXT:    movq %rax, %rcx
1473 ; AVX2-NEXT:    movl %eax, %edx
1474 ; AVX2-NEXT:    movswl %ax, %esi
1475 ; AVX2-NEXT:    shrq $48, %rax
1476 ; AVX2-NEXT:    shrq $32, %rcx
1477 ; AVX2-NEXT:    shrl $16, %edx
1478 ; AVX2-NEXT:    movswl %dx, %edx
1479 ; AVX2-NEXT:    vmovd %edx, %xmm0
1480 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
1481 ; AVX2-NEXT:    vmovd %esi, %xmm1
1482 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
1483 ; AVX2-NEXT:    movswl %cx, %ecx
1484 ; AVX2-NEXT:    vmovd %ecx, %xmm2
1485 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
1486 ; AVX2-NEXT:    cwtl
1487 ; AVX2-NEXT:    vmovd %eax, %xmm3
1488 ; AVX2-NEXT:    vcvtph2ps %xmm3, %xmm3
1489 ; AVX2-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1490 ; AVX2-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1491 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1492 ; AVX2-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1493 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1494 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1495 ; AVX2-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1496 ; AVX2-NEXT:    retq
1497 ;
1498 ; AVX512F-LABEL: cvt_8i16_to_4f64:
1499 ; AVX512F:       # %bb.0:
1500 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1501 ; AVX512F-NEXT:    movq %rax, %rcx
1502 ; AVX512F-NEXT:    movl %eax, %edx
1503 ; AVX512F-NEXT:    movswl %ax, %esi
1504 ; AVX512F-NEXT:    shrq $48, %rax
1505 ; AVX512F-NEXT:    shrq $32, %rcx
1506 ; AVX512F-NEXT:    shrl $16, %edx
1507 ; AVX512F-NEXT:    movswl %dx, %edx
1508 ; AVX512F-NEXT:    vmovd %edx, %xmm0
1509 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0
1510 ; AVX512F-NEXT:    vmovd %esi, %xmm1
1511 ; AVX512F-NEXT:    vcvtph2ps %xmm1, %xmm1
1512 ; AVX512F-NEXT:    movswl %cx, %ecx
1513 ; AVX512F-NEXT:    vmovd %ecx, %xmm2
1514 ; AVX512F-NEXT:    vcvtph2ps %xmm2, %xmm2
1515 ; AVX512F-NEXT:    cwtl
1516 ; AVX512F-NEXT:    vmovd %eax, %xmm3
1517 ; AVX512F-NEXT:    vcvtph2ps %xmm3, %xmm3
1518 ; AVX512F-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1519 ; AVX512F-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1520 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1521 ; AVX512F-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1522 ; AVX512F-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1523 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1524 ; AVX512F-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1525 ; AVX512F-NEXT:    retq
1526 ;
1527 ; AVX512VL-LABEL: cvt_8i16_to_4f64:
1528 ; AVX512VL:       # %bb.0:
1529 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1530 ; AVX512VL-NEXT:    vpmovdw %xmm0, -{{[0-9]+}}(%rsp)
1531 ; AVX512VL-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
1532 ; AVX512VL-NEXT:    movq %rax, %rcx
1533 ; AVX512VL-NEXT:    movl %eax, %edx
1534 ; AVX512VL-NEXT:    movswl %ax, %esi
1535 ; AVX512VL-NEXT:    shrq $48, %rax
1536 ; AVX512VL-NEXT:    shrq $32, %rcx
1537 ; AVX512VL-NEXT:    shrl $16, %edx
1538 ; AVX512VL-NEXT:    movswl %dx, %edx
1539 ; AVX512VL-NEXT:    vmovd %edx, %xmm0
1540 ; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm0
1541 ; AVX512VL-NEXT:    vmovd %esi, %xmm1
1542 ; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm1
1543 ; AVX512VL-NEXT:    movswl %cx, %ecx
1544 ; AVX512VL-NEXT:    vmovd %ecx, %xmm2
1545 ; AVX512VL-NEXT:    vcvtph2ps %xmm2, %xmm2
1546 ; AVX512VL-NEXT:    cwtl
1547 ; AVX512VL-NEXT:    vmovd %eax, %xmm3
1548 ; AVX512VL-NEXT:    vcvtph2ps %xmm3, %xmm3
1549 ; AVX512VL-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1550 ; AVX512VL-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1551 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1552 ; AVX512VL-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1553 ; AVX512VL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1554 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1555 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1556 ; AVX512VL-NEXT:    retq
1557   %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1558   %2 = bitcast <4 x i16> %1 to <4 x half>
1559   %3 = fpext <4 x half> %2 to <4 x double>
1560   ret <4 x double> %3
1561 }
1562
1563 define <8 x double> @cvt_8i16_to_8f64(<8 x i16> %a0) nounwind {
1564 ; AVX1-LABEL: cvt_8i16_to_8f64:
1565 ; AVX1:       # %bb.0:
1566 ; AVX1-NEXT:    vmovq %xmm0, %rdx
1567 ; AVX1-NEXT:    movq %rdx, %r9
1568 ; AVX1-NEXT:    movl %edx, %r10d
1569 ; AVX1-NEXT:    movswl %dx, %r8d
1570 ; AVX1-NEXT:    shrq $48, %rdx
1571 ; AVX1-NEXT:    shrq $32, %r9
1572 ; AVX1-NEXT:    shrl $16, %r10d
1573 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rdi
1574 ; AVX1-NEXT:    movq %rdi, %rsi
1575 ; AVX1-NEXT:    movl %edi, %eax
1576 ; AVX1-NEXT:    movswl %di, %ecx
1577 ; AVX1-NEXT:    shrq $48, %rdi
1578 ; AVX1-NEXT:    shrq $32, %rsi
1579 ; AVX1-NEXT:    shrl $16, %eax
1580 ; AVX1-NEXT:    cwtl
1581 ; AVX1-NEXT:    vmovd %eax, %xmm0
1582 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm1
1583 ; AVX1-NEXT:    vmovd %ecx, %xmm0
1584 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm2
1585 ; AVX1-NEXT:    movswl %si, %eax
1586 ; AVX1-NEXT:    vmovd %eax, %xmm0
1587 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm3
1588 ; AVX1-NEXT:    movswl %di, %eax
1589 ; AVX1-NEXT:    vmovd %eax, %xmm0
1590 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm4
1591 ; AVX1-NEXT:    movswl %r10w, %eax
1592 ; AVX1-NEXT:    vmovd %eax, %xmm0
1593 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
1594 ; AVX1-NEXT:    vmovd %r8d, %xmm5
1595 ; AVX1-NEXT:    vcvtph2ps %xmm5, %xmm5
1596 ; AVX1-NEXT:    movswl %r9w, %eax
1597 ; AVX1-NEXT:    vmovd %eax, %xmm6
1598 ; AVX1-NEXT:    vcvtph2ps %xmm6, %xmm6
1599 ; AVX1-NEXT:    movswl %dx, %eax
1600 ; AVX1-NEXT:    vmovd %eax, %xmm7
1601 ; AVX1-NEXT:    vcvtph2ps %xmm7, %xmm7
1602 ; AVX1-NEXT:    vcvtss2sd %xmm7, %xmm7, %xmm7
1603 ; AVX1-NEXT:    vcvtss2sd %xmm6, %xmm6, %xmm6
1604 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm6 = xmm6[0],xmm7[0]
1605 ; AVX1-NEXT:    vcvtss2sd %xmm5, %xmm5, %xmm5
1606 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1607 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm5[0],xmm0[0]
1608 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm0
1609 ; AVX1-NEXT:    vcvtss2sd %xmm4, %xmm4, %xmm4
1610 ; AVX1-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1611 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm3 = xmm3[0],xmm4[0]
1612 ; AVX1-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1613 ; AVX1-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1614 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1615 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1616 ; AVX1-NEXT:    retq
1617 ;
1618 ; AVX2-LABEL: cvt_8i16_to_8f64:
1619 ; AVX2:       # %bb.0:
1620 ; AVX2-NEXT:    vmovq %xmm0, %rdx
1621 ; AVX2-NEXT:    movq %rdx, %r9
1622 ; AVX2-NEXT:    movl %edx, %r10d
1623 ; AVX2-NEXT:    movswl %dx, %r8d
1624 ; AVX2-NEXT:    shrq $48, %rdx
1625 ; AVX2-NEXT:    shrq $32, %r9
1626 ; AVX2-NEXT:    shrl $16, %r10d
1627 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rdi
1628 ; AVX2-NEXT:    movq %rdi, %rsi
1629 ; AVX2-NEXT:    movl %edi, %eax
1630 ; AVX2-NEXT:    movswl %di, %ecx
1631 ; AVX2-NEXT:    shrq $48, %rdi
1632 ; AVX2-NEXT:    shrq $32, %rsi
1633 ; AVX2-NEXT:    shrl $16, %eax
1634 ; AVX2-NEXT:    cwtl
1635 ; AVX2-NEXT:    vmovd %eax, %xmm0
1636 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm1
1637 ; AVX2-NEXT:    vmovd %ecx, %xmm0
1638 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm2
1639 ; AVX2-NEXT:    movswl %si, %eax
1640 ; AVX2-NEXT:    vmovd %eax, %xmm0
1641 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm3
1642 ; AVX2-NEXT:    movswl %di, %eax
1643 ; AVX2-NEXT:    vmovd %eax, %xmm0
1644 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm4
1645 ; AVX2-NEXT:    movswl %r10w, %eax
1646 ; AVX2-NEXT:    vmovd %eax, %xmm0
1647 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
1648 ; AVX2-NEXT:    vmovd %r8d, %xmm5
1649 ; AVX2-NEXT:    vcvtph2ps %xmm5, %xmm5
1650 ; AVX2-NEXT:    movswl %r9w, %eax
1651 ; AVX2-NEXT:    vmovd %eax, %xmm6
1652 ; AVX2-NEXT:    vcvtph2ps %xmm6, %xmm6
1653 ; AVX2-NEXT:    movswl %dx, %eax
1654 ; AVX2-NEXT:    vmovd %eax, %xmm7
1655 ; AVX2-NEXT:    vcvtph2ps %xmm7, %xmm7
1656 ; AVX2-NEXT:    vcvtss2sd %xmm7, %xmm7, %xmm7
1657 ; AVX2-NEXT:    vcvtss2sd %xmm6, %xmm6, %xmm6
1658 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm6 = xmm6[0],xmm7[0]
1659 ; AVX2-NEXT:    vcvtss2sd %xmm5, %xmm5, %xmm5
1660 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1661 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm5[0],xmm0[0]
1662 ; AVX2-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm0
1663 ; AVX2-NEXT:    vcvtss2sd %xmm4, %xmm4, %xmm4
1664 ; AVX2-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1665 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm3 = xmm3[0],xmm4[0]
1666 ; AVX2-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1667 ; AVX2-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1668 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1669 ; AVX2-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1670 ; AVX2-NEXT:    retq
1671 ;
1672 ; AVX512-LABEL: cvt_8i16_to_8f64:
1673 ; AVX512:       # %bb.0:
1674 ; AVX512-NEXT:    vpextrq $1, %xmm0, %rdx
1675 ; AVX512-NEXT:    movq %rdx, %r9
1676 ; AVX512-NEXT:    movl %edx, %r10d
1677 ; AVX512-NEXT:    movswl %dx, %r8d
1678 ; AVX512-NEXT:    shrq $48, %rdx
1679 ; AVX512-NEXT:    shrq $32, %r9
1680 ; AVX512-NEXT:    shrl $16, %r10d
1681 ; AVX512-NEXT:    vmovq %xmm0, %rdi
1682 ; AVX512-NEXT:    movq %rdi, %rsi
1683 ; AVX512-NEXT:    movl %edi, %eax
1684 ; AVX512-NEXT:    movswl %di, %ecx
1685 ; AVX512-NEXT:    shrq $48, %rdi
1686 ; AVX512-NEXT:    shrq $32, %rsi
1687 ; AVX512-NEXT:    shrl $16, %eax
1688 ; AVX512-NEXT:    cwtl
1689 ; AVX512-NEXT:    vmovd %eax, %xmm0
1690 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1691 ; AVX512-NEXT:    vmovd %ecx, %xmm1
1692 ; AVX512-NEXT:    vcvtph2ps %xmm1, %xmm1
1693 ; AVX512-NEXT:    movswl %si, %eax
1694 ; AVX512-NEXT:    vmovd %eax, %xmm2
1695 ; AVX512-NEXT:    vcvtph2ps %xmm2, %xmm2
1696 ; AVX512-NEXT:    movswl %di, %eax
1697 ; AVX512-NEXT:    vmovd %eax, %xmm3
1698 ; AVX512-NEXT:    vcvtph2ps %xmm3, %xmm3
1699 ; AVX512-NEXT:    movswl %r10w, %eax
1700 ; AVX512-NEXT:    vmovd %eax, %xmm4
1701 ; AVX512-NEXT:    vcvtph2ps %xmm4, %xmm4
1702 ; AVX512-NEXT:    vmovd %r8d, %xmm5
1703 ; AVX512-NEXT:    vcvtph2ps %xmm5, %xmm5
1704 ; AVX512-NEXT:    movswl %r9w, %eax
1705 ; AVX512-NEXT:    vmovd %eax, %xmm6
1706 ; AVX512-NEXT:    vcvtph2ps %xmm6, %xmm6
1707 ; AVX512-NEXT:    movswl %dx, %eax
1708 ; AVX512-NEXT:    vmovd %eax, %xmm7
1709 ; AVX512-NEXT:    vcvtph2ps %xmm7, %xmm7
1710 ; AVX512-NEXT:    vcvtss2sd %xmm7, %xmm7, %xmm7
1711 ; AVX512-NEXT:    vcvtss2sd %xmm6, %xmm6, %xmm6
1712 ; AVX512-NEXT:    vmovlhps {{.*#+}} xmm6 = xmm6[0],xmm7[0]
1713 ; AVX512-NEXT:    vcvtss2sd %xmm5, %xmm5, %xmm5
1714 ; AVX512-NEXT:    vcvtss2sd %xmm4, %xmm4, %xmm4
1715 ; AVX512-NEXT:    vmovlhps {{.*#+}} xmm4 = xmm5[0],xmm4[0]
1716 ; AVX512-NEXT:    vinsertf128 $1, %xmm6, %ymm4, %ymm4
1717 ; AVX512-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1718 ; AVX512-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1719 ; AVX512-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1720 ; AVX512-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1721 ; AVX512-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1722 ; AVX512-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1723 ; AVX512-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1724 ; AVX512-NEXT:    vinsertf64x4 $1, %ymm4, %zmm0, %zmm0
1725 ; AVX512-NEXT:    retq
1726   %1 = bitcast <8 x i16> %a0 to <8 x half>
1727   %2 = fpext <8 x half> %1 to <8 x double>
1728   ret <8 x double> %2
1729 }
1730
1731 ;
1732 ; Half to Double (Load)
1733 ;
1734
1735 define double @load_cvt_i16_to_f64(i16* %a0) nounwind {
1736 ; ALL-LABEL: load_cvt_i16_to_f64:
1737 ; ALL:       # %bb.0:
1738 ; ALL-NEXT:    movswl (%rdi), %eax
1739 ; ALL-NEXT:    vmovd %eax, %xmm0
1740 ; ALL-NEXT:    vcvtph2ps %xmm0, %xmm0
1741 ; ALL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1742 ; ALL-NEXT:    retq
1743   %1 = load i16, i16* %a0
1744   %2 = bitcast i16 %1 to half
1745   %3 = fpext half %2 to double
1746   ret double %3
1747 }
1748
1749 define <2 x double> @load_cvt_2i16_to_2f64(<2 x i16>* %a0) nounwind {
1750 ; ALL-LABEL: load_cvt_2i16_to_2f64:
1751 ; ALL:       # %bb.0:
1752 ; ALL-NEXT:    movswl (%rdi), %eax
1753 ; ALL-NEXT:    vmovd %eax, %xmm0
1754 ; ALL-NEXT:    vcvtph2ps %xmm0, %xmm0
1755 ; ALL-NEXT:    movswl 2(%rdi), %eax
1756 ; ALL-NEXT:    vmovd %eax, %xmm1
1757 ; ALL-NEXT:    vcvtph2ps %xmm1, %xmm1
1758 ; ALL-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1759 ; ALL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1760 ; ALL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1761 ; ALL-NEXT:    retq
1762   %1 = load <2 x i16>, <2 x i16>* %a0
1763   %2 = bitcast <2 x i16> %1 to <2 x half>
1764   %3 = fpext <2 x half> %2 to <2 x double>
1765   ret <2 x double> %3
1766 }
1767
1768 define <4 x double> @load_cvt_4i16_to_4f64(<4 x i16>* %a0) nounwind {
1769 ; ALL-LABEL: load_cvt_4i16_to_4f64:
1770 ; ALL:       # %bb.0:
1771 ; ALL-NEXT:    movswl (%rdi), %eax
1772 ; ALL-NEXT:    vmovd %eax, %xmm0
1773 ; ALL-NEXT:    vcvtph2ps %xmm0, %xmm0
1774 ; ALL-NEXT:    movswl 2(%rdi), %eax
1775 ; ALL-NEXT:    vmovd %eax, %xmm1
1776 ; ALL-NEXT:    vcvtph2ps %xmm1, %xmm1
1777 ; ALL-NEXT:    movswl 4(%rdi), %eax
1778 ; ALL-NEXT:    vmovd %eax, %xmm2
1779 ; ALL-NEXT:    vcvtph2ps %xmm2, %xmm2
1780 ; ALL-NEXT:    movswl 6(%rdi), %eax
1781 ; ALL-NEXT:    vmovd %eax, %xmm3
1782 ; ALL-NEXT:    vcvtph2ps %xmm3, %xmm3
1783 ; ALL-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1784 ; ALL-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1785 ; ALL-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1786 ; ALL-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1787 ; ALL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1788 ; ALL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1789 ; ALL-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1790 ; ALL-NEXT:    retq
1791   %1 = load <4 x i16>, <4 x i16>* %a0
1792   %2 = bitcast <4 x i16> %1 to <4 x half>
1793   %3 = fpext <4 x half> %2 to <4 x double>
1794   ret <4 x double> %3
1795 }
1796
1797 define <4 x double> @load_cvt_8i16_to_4f64(<8 x i16>* %a0) nounwind {
1798 ; AVX1-LABEL: load_cvt_8i16_to_4f64:
1799 ; AVX1:       # %bb.0:
1800 ; AVX1-NEXT:    movq (%rdi), %rax
1801 ; AVX1-NEXT:    movq %rax, %rcx
1802 ; AVX1-NEXT:    movl %eax, %edx
1803 ; AVX1-NEXT:    movswl %ax, %esi
1804 ; AVX1-NEXT:    shrq $48, %rax
1805 ; AVX1-NEXT:    shrq $32, %rcx
1806 ; AVX1-NEXT:    shrl $16, %edx
1807 ; AVX1-NEXT:    movswl %dx, %edx
1808 ; AVX1-NEXT:    vmovd %edx, %xmm0
1809 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
1810 ; AVX1-NEXT:    vmovd %esi, %xmm1
1811 ; AVX1-NEXT:    vcvtph2ps %xmm1, %xmm1
1812 ; AVX1-NEXT:    movswl %cx, %ecx
1813 ; AVX1-NEXT:    vmovd %ecx, %xmm2
1814 ; AVX1-NEXT:    vcvtph2ps %xmm2, %xmm2
1815 ; AVX1-NEXT:    cwtl
1816 ; AVX1-NEXT:    vmovd %eax, %xmm3
1817 ; AVX1-NEXT:    vcvtph2ps %xmm3, %xmm3
1818 ; AVX1-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1819 ; AVX1-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1820 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1821 ; AVX1-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1822 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1823 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1824 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1825 ; AVX1-NEXT:    retq
1826 ;
1827 ; AVX2-LABEL: load_cvt_8i16_to_4f64:
1828 ; AVX2:       # %bb.0:
1829 ; AVX2-NEXT:    movq (%rdi), %rax
1830 ; AVX2-NEXT:    movq %rax, %rcx
1831 ; AVX2-NEXT:    movl %eax, %edx
1832 ; AVX2-NEXT:    movswl %ax, %esi
1833 ; AVX2-NEXT:    shrq $48, %rax
1834 ; AVX2-NEXT:    shrq $32, %rcx
1835 ; AVX2-NEXT:    shrl $16, %edx
1836 ; AVX2-NEXT:    movswl %dx, %edx
1837 ; AVX2-NEXT:    vmovd %edx, %xmm0
1838 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
1839 ; AVX2-NEXT:    vmovd %esi, %xmm1
1840 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
1841 ; AVX2-NEXT:    movswl %cx, %ecx
1842 ; AVX2-NEXT:    vmovd %ecx, %xmm2
1843 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
1844 ; AVX2-NEXT:    cwtl
1845 ; AVX2-NEXT:    vmovd %eax, %xmm3
1846 ; AVX2-NEXT:    vcvtph2ps %xmm3, %xmm3
1847 ; AVX2-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1848 ; AVX2-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1849 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1850 ; AVX2-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1851 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1852 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1853 ; AVX2-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1854 ; AVX2-NEXT:    retq
1855 ;
1856 ; AVX512F-LABEL: load_cvt_8i16_to_4f64:
1857 ; AVX512F:       # %bb.0:
1858 ; AVX512F-NEXT:    movq (%rdi), %rax
1859 ; AVX512F-NEXT:    movq %rax, %rcx
1860 ; AVX512F-NEXT:    movl %eax, %edx
1861 ; AVX512F-NEXT:    movswl %ax, %esi
1862 ; AVX512F-NEXT:    shrq $48, %rax
1863 ; AVX512F-NEXT:    shrq $32, %rcx
1864 ; AVX512F-NEXT:    shrl $16, %edx
1865 ; AVX512F-NEXT:    movswl %dx, %edx
1866 ; AVX512F-NEXT:    vmovd %edx, %xmm0
1867 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0
1868 ; AVX512F-NEXT:    vmovd %esi, %xmm1
1869 ; AVX512F-NEXT:    vcvtph2ps %xmm1, %xmm1
1870 ; AVX512F-NEXT:    movswl %cx, %ecx
1871 ; AVX512F-NEXT:    vmovd %ecx, %xmm2
1872 ; AVX512F-NEXT:    vcvtph2ps %xmm2, %xmm2
1873 ; AVX512F-NEXT:    cwtl
1874 ; AVX512F-NEXT:    vmovd %eax, %xmm3
1875 ; AVX512F-NEXT:    vcvtph2ps %xmm3, %xmm3
1876 ; AVX512F-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1877 ; AVX512F-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1878 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1879 ; AVX512F-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1880 ; AVX512F-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1881 ; AVX512F-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1882 ; AVX512F-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1883 ; AVX512F-NEXT:    retq
1884 ;
1885 ; AVX512VL-LABEL: load_cvt_8i16_to_4f64:
1886 ; AVX512VL:       # %bb.0:
1887 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1888 ; AVX512VL-NEXT:    vpmovdw %xmm0, -{{[0-9]+}}(%rsp)
1889 ; AVX512VL-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
1890 ; AVX512VL-NEXT:    movq %rax, %rcx
1891 ; AVX512VL-NEXT:    movl %eax, %edx
1892 ; AVX512VL-NEXT:    movswl %ax, %esi
1893 ; AVX512VL-NEXT:    shrq $48, %rax
1894 ; AVX512VL-NEXT:    shrq $32, %rcx
1895 ; AVX512VL-NEXT:    shrl $16, %edx
1896 ; AVX512VL-NEXT:    movswl %dx, %edx
1897 ; AVX512VL-NEXT:    vmovd %edx, %xmm0
1898 ; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm0
1899 ; AVX512VL-NEXT:    vmovd %esi, %xmm1
1900 ; AVX512VL-NEXT:    vcvtph2ps %xmm1, %xmm1
1901 ; AVX512VL-NEXT:    movswl %cx, %ecx
1902 ; AVX512VL-NEXT:    vmovd %ecx, %xmm2
1903 ; AVX512VL-NEXT:    vcvtph2ps %xmm2, %xmm2
1904 ; AVX512VL-NEXT:    cwtl
1905 ; AVX512VL-NEXT:    vmovd %eax, %xmm3
1906 ; AVX512VL-NEXT:    vcvtph2ps %xmm3, %xmm3
1907 ; AVX512VL-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1908 ; AVX512VL-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1909 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
1910 ; AVX512VL-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1911 ; AVX512VL-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1912 ; AVX512VL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1913 ; AVX512VL-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1914 ; AVX512VL-NEXT:    retq
1915   %1 = load <8 x i16>, <8 x i16>* %a0
1916   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1917   %3 = bitcast <4 x i16> %2 to <4 x half>
1918   %4 = fpext <4 x half> %3 to <4 x double>
1919   ret <4 x double> %4
1920 }
1921
1922 define <8 x double> @load_cvt_8i16_to_8f64(<8 x i16>* %a0) nounwind {
1923 ; AVX1-LABEL: load_cvt_8i16_to_8f64:
1924 ; AVX1:       # %bb.0:
1925 ; AVX1-NEXT:    movswl 8(%rdi), %eax
1926 ; AVX1-NEXT:    vmovd %eax, %xmm0
1927 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm1
1928 ; AVX1-NEXT:    movswl 10(%rdi), %eax
1929 ; AVX1-NEXT:    vmovd %eax, %xmm0
1930 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm2
1931 ; AVX1-NEXT:    movswl 12(%rdi), %eax
1932 ; AVX1-NEXT:    vmovd %eax, %xmm0
1933 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm3
1934 ; AVX1-NEXT:    movswl 14(%rdi), %eax
1935 ; AVX1-NEXT:    vmovd %eax, %xmm0
1936 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm4
1937 ; AVX1-NEXT:    movswl (%rdi), %eax
1938 ; AVX1-NEXT:    vmovd %eax, %xmm0
1939 ; AVX1-NEXT:    vcvtph2ps %xmm0, %xmm0
1940 ; AVX1-NEXT:    movswl 2(%rdi), %eax
1941 ; AVX1-NEXT:    vmovd %eax, %xmm5
1942 ; AVX1-NEXT:    vcvtph2ps %xmm5, %xmm5
1943 ; AVX1-NEXT:    movswl 4(%rdi), %eax
1944 ; AVX1-NEXT:    vmovd %eax, %xmm6
1945 ; AVX1-NEXT:    vcvtph2ps %xmm6, %xmm6
1946 ; AVX1-NEXT:    movswl 6(%rdi), %eax
1947 ; AVX1-NEXT:    vmovd %eax, %xmm7
1948 ; AVX1-NEXT:    vcvtph2ps %xmm7, %xmm7
1949 ; AVX1-NEXT:    vcvtss2sd %xmm7, %xmm7, %xmm7
1950 ; AVX1-NEXT:    vcvtss2sd %xmm6, %xmm6, %xmm6
1951 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm6 = xmm6[0],xmm7[0]
1952 ; AVX1-NEXT:    vcvtss2sd %xmm5, %xmm5, %xmm5
1953 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1954 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm5[0]
1955 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm0
1956 ; AVX1-NEXT:    vcvtss2sd %xmm4, %xmm4, %xmm4
1957 ; AVX1-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
1958 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm3 = xmm3[0],xmm4[0]
1959 ; AVX1-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
1960 ; AVX1-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
1961 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1962 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1963 ; AVX1-NEXT:    retq
1964 ;
1965 ; AVX2-LABEL: load_cvt_8i16_to_8f64:
1966 ; AVX2:       # %bb.0:
1967 ; AVX2-NEXT:    movswl 8(%rdi), %eax
1968 ; AVX2-NEXT:    vmovd %eax, %xmm0
1969 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm1
1970 ; AVX2-NEXT:    movswl 10(%rdi), %eax
1971 ; AVX2-NEXT:    vmovd %eax, %xmm0
1972 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm2
1973 ; AVX2-NEXT:    movswl 12(%rdi), %eax
1974 ; AVX2-NEXT:    vmovd %eax, %xmm0
1975 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm3
1976 ; AVX2-NEXT:    movswl 14(%rdi), %eax
1977 ; AVX2-NEXT:    vmovd %eax, %xmm0
1978 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm4
1979 ; AVX2-NEXT:    movswl (%rdi), %eax
1980 ; AVX2-NEXT:    vmovd %eax, %xmm0
1981 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
1982 ; AVX2-NEXT:    movswl 2(%rdi), %eax
1983 ; AVX2-NEXT:    vmovd %eax, %xmm5
1984 ; AVX2-NEXT:    vcvtph2ps %xmm5, %xmm5
1985 ; AVX2-NEXT:    movswl 4(%rdi), %eax
1986 ; AVX2-NEXT:    vmovd %eax, %xmm6
1987 ; AVX2-NEXT:    vcvtph2ps %xmm6, %xmm6
1988 ; AVX2-NEXT:    movswl 6(%rdi), %eax
1989 ; AVX2-NEXT:    vmovd %eax, %xmm7
1990 ; AVX2-NEXT:    vcvtph2ps %xmm7, %xmm7
1991 ; AVX2-NEXT:    vcvtss2sd %xmm7, %xmm7, %xmm7
1992 ; AVX2-NEXT:    vcvtss2sd %xmm6, %xmm6, %xmm6
1993 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm6 = xmm6[0],xmm7[0]
1994 ; AVX2-NEXT:    vcvtss2sd %xmm5, %xmm5, %xmm5
1995 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1996 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm5[0]
1997 ; AVX2-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm0
1998 ; AVX2-NEXT:    vcvtss2sd %xmm4, %xmm4, %xmm4
1999 ; AVX2-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
2000 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm3 = xmm3[0],xmm4[0]
2001 ; AVX2-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
2002 ; AVX2-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
2003 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2004 ; AVX2-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
2005 ; AVX2-NEXT:    retq
2006 ;
2007 ; AVX512-LABEL: load_cvt_8i16_to_8f64:
2008 ; AVX512:       # %bb.0:
2009 ; AVX512-NEXT:    movswl (%rdi), %eax
2010 ; AVX512-NEXT:    vmovd %eax, %xmm0
2011 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
2012 ; AVX512-NEXT:    movswl 2(%rdi), %eax
2013 ; AVX512-NEXT:    vmovd %eax, %xmm1
2014 ; AVX512-NEXT:    vcvtph2ps %xmm1, %xmm1
2015 ; AVX512-NEXT:    movswl 4(%rdi), %eax
2016 ; AVX512-NEXT:    vmovd %eax, %xmm2
2017 ; AVX512-NEXT:    vcvtph2ps %xmm2, %xmm2
2018 ; AVX512-NEXT:    movswl 6(%rdi), %eax
2019 ; AVX512-NEXT:    vmovd %eax, %xmm3
2020 ; AVX512-NEXT:    vcvtph2ps %xmm3, %xmm3
2021 ; AVX512-NEXT:    movswl 8(%rdi), %eax
2022 ; AVX512-NEXT:    vmovd %eax, %xmm4
2023 ; AVX512-NEXT:    vcvtph2ps %xmm4, %xmm4
2024 ; AVX512-NEXT:    movswl 10(%rdi), %eax
2025 ; AVX512-NEXT:    vmovd %eax, %xmm5
2026 ; AVX512-NEXT:    vcvtph2ps %xmm5, %xmm5
2027 ; AVX512-NEXT:    movswl 12(%rdi), %eax
2028 ; AVX512-NEXT:    vmovd %eax, %xmm6
2029 ; AVX512-NEXT:    vcvtph2ps %xmm6, %xmm6
2030 ; AVX512-NEXT:    movswl 14(%rdi), %eax
2031 ; AVX512-NEXT:    vmovd %eax, %xmm7
2032 ; AVX512-NEXT:    vcvtph2ps %xmm7, %xmm7
2033 ; AVX512-NEXT:    vcvtss2sd %xmm7, %xmm7, %xmm7
2034 ; AVX512-NEXT:    vcvtss2sd %xmm6, %xmm6, %xmm6
2035 ; AVX512-NEXT:    vmovlhps {{.*#+}} xmm6 = xmm6[0],xmm7[0]
2036 ; AVX512-NEXT:    vcvtss2sd %xmm5, %xmm5, %xmm5
2037 ; AVX512-NEXT:    vcvtss2sd %xmm4, %xmm4, %xmm4
2038 ; AVX512-NEXT:    vmovlhps {{.*#+}} xmm4 = xmm4[0],xmm5[0]
2039 ; AVX512-NEXT:    vinsertf128 $1, %xmm6, %ymm4, %ymm4
2040 ; AVX512-NEXT:    vcvtss2sd %xmm3, %xmm3, %xmm3
2041 ; AVX512-NEXT:    vcvtss2sd %xmm2, %xmm2, %xmm2
2042 ; AVX512-NEXT:    vmovlhps {{.*#+}} xmm2 = xmm2[0],xmm3[0]
2043 ; AVX512-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm1
2044 ; AVX512-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2045 ; AVX512-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2046 ; AVX512-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2047 ; AVX512-NEXT:    vinsertf64x4 $1, %ymm4, %zmm0, %zmm0
2048 ; AVX512-NEXT:    retq
2049   %1 = load <8 x i16>, <8 x i16>* %a0
2050   %2 = bitcast <8 x i16> %1 to <8 x half>
2051   %3 = fpext <8 x half> %2 to <8 x double>
2052   ret <8 x double> %3
2053 }
2054
2055 ;
2056 ; Float to Half
2057 ;
2058
2059 define i16 @cvt_f32_to_i16(float %a0) nounwind {
2060 ; ALL-LABEL: cvt_f32_to_i16:
2061 ; ALL:       # %bb.0:
2062 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2063 ; ALL-NEXT:    vmovd %xmm0, %eax
2064 ; ALL-NEXT:    # kill: def %ax killed %ax killed %eax
2065 ; ALL-NEXT:    retq
2066   %1 = fptrunc float %a0 to half
2067   %2 = bitcast half %1 to i16
2068   ret i16 %2
2069 }
2070
2071 define <4 x i16> @cvt_4f32_to_4i16(<4 x float> %a0) nounwind {
2072 ; ALL-LABEL: cvt_4f32_to_4i16:
2073 ; ALL:       # %bb.0:
2074 ; ALL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2075 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2076 ; ALL-NEXT:    vmovd %xmm1, %eax
2077 ; ALL-NEXT:    shll $16, %eax
2078 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2079 ; ALL-NEXT:    vmovd %xmm1, %ecx
2080 ; ALL-NEXT:    movzwl %cx, %ecx
2081 ; ALL-NEXT:    orl %eax, %ecx
2082 ; ALL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2083 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2084 ; ALL-NEXT:    vmovd %xmm1, %eax
2085 ; ALL-NEXT:    shll $16, %eax
2086 ; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2087 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2088 ; ALL-NEXT:    vmovd %xmm0, %edx
2089 ; ALL-NEXT:    movzwl %dx, %edx
2090 ; ALL-NEXT:    orl %eax, %edx
2091 ; ALL-NEXT:    shlq $32, %rdx
2092 ; ALL-NEXT:    orq %rcx, %rdx
2093 ; ALL-NEXT:    vmovq %rdx, %xmm0
2094 ; ALL-NEXT:    retq
2095   %1 = fptrunc <4 x float> %a0 to <4 x half>
2096   %2 = bitcast <4 x half> %1 to <4 x i16>
2097   ret <4 x i16> %2
2098 }
2099
2100 define <8 x i16> @cvt_4f32_to_8i16_undef(<4 x float> %a0) nounwind {
2101 ; AVX1-LABEL: cvt_4f32_to_8i16_undef:
2102 ; AVX1:       # %bb.0:
2103 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2104 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2105 ; AVX1-NEXT:    vmovd %xmm1, %eax
2106 ; AVX1-NEXT:    shll $16, %eax
2107 ; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2108 ; AVX1-NEXT:    vmovd %xmm1, %ecx
2109 ; AVX1-NEXT:    movzwl %cx, %ecx
2110 ; AVX1-NEXT:    orl %eax, %ecx
2111 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2112 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2113 ; AVX1-NEXT:    vmovd %xmm1, %eax
2114 ; AVX1-NEXT:    shll $16, %eax
2115 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2116 ; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2117 ; AVX1-NEXT:    vmovd %xmm0, %edx
2118 ; AVX1-NEXT:    movzwl %dx, %edx
2119 ; AVX1-NEXT:    orl %eax, %edx
2120 ; AVX1-NEXT:    shlq $32, %rdx
2121 ; AVX1-NEXT:    orq %rcx, %rdx
2122 ; AVX1-NEXT:    vmovq %rdx, %xmm0
2123 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
2124 ; AVX1-NEXT:    retq
2125 ;
2126 ; AVX2-LABEL: cvt_4f32_to_8i16_undef:
2127 ; AVX2:       # %bb.0:
2128 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2129 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2130 ; AVX2-NEXT:    vmovd %xmm1, %eax
2131 ; AVX2-NEXT:    shll $16, %eax
2132 ; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2133 ; AVX2-NEXT:    vmovd %xmm1, %ecx
2134 ; AVX2-NEXT:    movzwl %cx, %ecx
2135 ; AVX2-NEXT:    orl %eax, %ecx
2136 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2137 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2138 ; AVX2-NEXT:    vmovd %xmm1, %eax
2139 ; AVX2-NEXT:    shll $16, %eax
2140 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2141 ; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2142 ; AVX2-NEXT:    vmovd %xmm0, %edx
2143 ; AVX2-NEXT:    movzwl %dx, %edx
2144 ; AVX2-NEXT:    orl %eax, %edx
2145 ; AVX2-NEXT:    shlq $32, %rdx
2146 ; AVX2-NEXT:    orq %rcx, %rdx
2147 ; AVX2-NEXT:    vmovq %rdx, %xmm0
2148 ; AVX2-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
2149 ; AVX2-NEXT:    retq
2150 ;
2151 ; AVX512F-LABEL: cvt_4f32_to_8i16_undef:
2152 ; AVX512F:       # %bb.0:
2153 ; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2154 ; AVX512F-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2155 ; AVX512F-NEXT:    vmovd %xmm1, %eax
2156 ; AVX512F-NEXT:    shll $16, %eax
2157 ; AVX512F-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2158 ; AVX512F-NEXT:    vmovd %xmm1, %ecx
2159 ; AVX512F-NEXT:    movzwl %cx, %ecx
2160 ; AVX512F-NEXT:    orl %eax, %ecx
2161 ; AVX512F-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2162 ; AVX512F-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2163 ; AVX512F-NEXT:    vmovd %xmm1, %eax
2164 ; AVX512F-NEXT:    shll $16, %eax
2165 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2166 ; AVX512F-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2167 ; AVX512F-NEXT:    vmovd %xmm0, %edx
2168 ; AVX512F-NEXT:    movzwl %dx, %edx
2169 ; AVX512F-NEXT:    orl %eax, %edx
2170 ; AVX512F-NEXT:    shlq $32, %rdx
2171 ; AVX512F-NEXT:    orq %rcx, %rdx
2172 ; AVX512F-NEXT:    vmovq %rdx, %xmm0
2173 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
2174 ; AVX512F-NEXT:    retq
2175 ;
2176 ; AVX512VL-LABEL: cvt_4f32_to_8i16_undef:
2177 ; AVX512VL:       # %bb.0:
2178 ; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2179 ; AVX512VL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2180 ; AVX512VL-NEXT:    vmovd %xmm1, %eax
2181 ; AVX512VL-NEXT:    shll $16, %eax
2182 ; AVX512VL-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2183 ; AVX512VL-NEXT:    vmovd %xmm1, %ecx
2184 ; AVX512VL-NEXT:    movzwl %cx, %ecx
2185 ; AVX512VL-NEXT:    orl %eax, %ecx
2186 ; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2187 ; AVX512VL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2188 ; AVX512VL-NEXT:    vmovd %xmm1, %eax
2189 ; AVX512VL-NEXT:    shll $16, %eax
2190 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2191 ; AVX512VL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2192 ; AVX512VL-NEXT:    vmovd %xmm0, %edx
2193 ; AVX512VL-NEXT:    movzwl %dx, %edx
2194 ; AVX512VL-NEXT:    orl %eax, %edx
2195 ; AVX512VL-NEXT:    shlq $32, %rdx
2196 ; AVX512VL-NEXT:    orq %rcx, %rdx
2197 ; AVX512VL-NEXT:    vmovq %rdx, %xmm0
2198 ; AVX512VL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u,u,u,u,u,u,u,u,u]
2199 ; AVX512VL-NEXT:    retq
2200   %1 = fptrunc <4 x float> %a0 to <4 x half>
2201   %2 = bitcast <4 x half> %1 to <4 x i16>
2202   %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>
2203   ret <8 x i16> %3
2204 }
2205
2206 define <8 x i16> @cvt_4f32_to_8i16_zero(<4 x float> %a0) nounwind {
2207 ; ALL-LABEL: cvt_4f32_to_8i16_zero:
2208 ; ALL:       # %bb.0:
2209 ; ALL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2210 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2211 ; ALL-NEXT:    vmovd %xmm1, %eax
2212 ; ALL-NEXT:    shll $16, %eax
2213 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2214 ; ALL-NEXT:    vmovd %xmm1, %ecx
2215 ; ALL-NEXT:    movzwl %cx, %ecx
2216 ; ALL-NEXT:    orl %eax, %ecx
2217 ; ALL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2218 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2219 ; ALL-NEXT:    vmovd %xmm1, %eax
2220 ; ALL-NEXT:    shll $16, %eax
2221 ; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2222 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2223 ; ALL-NEXT:    vmovd %xmm0, %edx
2224 ; ALL-NEXT:    movzwl %dx, %edx
2225 ; ALL-NEXT:    orl %eax, %edx
2226 ; ALL-NEXT:    shlq $32, %rdx
2227 ; ALL-NEXT:    orq %rcx, %rdx
2228 ; ALL-NEXT:    vmovq %rdx, %xmm0
2229 ; ALL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u],zero,zero,zero,zero,zero,zero,zero,zero
2230 ; ALL-NEXT:    retq
2231   %1 = fptrunc <4 x float> %a0 to <4 x half>
2232   %2 = bitcast <4 x half> %1 to <4 x i16>
2233   %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>
2234   ret <8 x i16> %3
2235 }
2236
2237 define <8 x i16> @cvt_8f32_to_8i16(<8 x float> %a0) nounwind {
2238 ; ALL-LABEL: cvt_8f32_to_8i16:
2239 ; ALL:       # %bb.0:
2240 ; ALL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2241 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2242 ; ALL-NEXT:    vmovd %xmm1, %eax
2243 ; ALL-NEXT:    shll $16, %eax
2244 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2245 ; ALL-NEXT:    vmovd %xmm1, %ecx
2246 ; ALL-NEXT:    movzwl %cx, %ecx
2247 ; ALL-NEXT:    orl %eax, %ecx
2248 ; ALL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2249 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2250 ; ALL-NEXT:    vmovd %xmm1, %edx
2251 ; ALL-NEXT:    shll $16, %edx
2252 ; ALL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
2253 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2254 ; ALL-NEXT:    vmovd %xmm1, %eax
2255 ; ALL-NEXT:    movzwl %ax, %eax
2256 ; ALL-NEXT:    orl %edx, %eax
2257 ; ALL-NEXT:    shlq $32, %rax
2258 ; ALL-NEXT:    orq %rcx, %rax
2259 ; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm0
2260 ; ALL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2261 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2262 ; ALL-NEXT:    vmovd %xmm1, %ecx
2263 ; ALL-NEXT:    shll $16, %ecx
2264 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2265 ; ALL-NEXT:    vmovd %xmm1, %edx
2266 ; ALL-NEXT:    movzwl %dx, %edx
2267 ; ALL-NEXT:    orl %ecx, %edx
2268 ; ALL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2269 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2270 ; ALL-NEXT:    vmovd %xmm1, %ecx
2271 ; ALL-NEXT:    shll $16, %ecx
2272 ; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2273 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2274 ; ALL-NEXT:    vmovd %xmm0, %esi
2275 ; ALL-NEXT:    movzwl %si, %esi
2276 ; ALL-NEXT:    orl %ecx, %esi
2277 ; ALL-NEXT:    shlq $32, %rsi
2278 ; ALL-NEXT:    orq %rdx, %rsi
2279 ; ALL-NEXT:    vmovq %rsi, %xmm0
2280 ; ALL-NEXT:    vmovq %rax, %xmm1
2281 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2282 ; ALL-NEXT:    vzeroupper
2283 ; ALL-NEXT:    retq
2284   %1 = fptrunc <8 x float> %a0 to <8 x half>
2285   %2 = bitcast <8 x half> %1 to <8 x i16>
2286   ret <8 x i16> %2
2287 }
2288
2289 define <16 x i16> @cvt_16f32_to_16i16(<16 x float> %a0) nounwind {
2290 ; AVX1-LABEL: cvt_16f32_to_16i16:
2291 ; AVX1:       # %bb.0:
2292 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm2
2293 ; AVX1-NEXT:    vmovd %xmm2, %eax
2294 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
2295 ; AVX1-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2296 ; AVX1-NEXT:    vmovd %eax, %xmm3
2297 ; AVX1-NEXT:    vmovd %xmm2, %eax
2298 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm1[1,0]
2299 ; AVX1-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2300 ; AVX1-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
2301 ; AVX1-NEXT:    vmovd %xmm2, %eax
2302 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2303 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3]
2304 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2305 ; AVX1-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
2306 ; AVX1-NEXT:    vmovd %xmm1, %eax
2307 ; AVX1-NEXT:    vcvtps2ph $4, %xmm2, %xmm1
2308 ; AVX1-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
2309 ; AVX1-NEXT:    vmovd %xmm1, %eax
2310 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]
2311 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2312 ; AVX1-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
2313 ; AVX1-NEXT:    vmovd %xmm1, %eax
2314 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm2[1,0]
2315 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2316 ; AVX1-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
2317 ; AVX1-NEXT:    vmovd %xmm1, %eax
2318 ; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2319 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm2[3,1,2,3]
2320 ; AVX1-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2321 ; AVX1-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm3
2322 ; AVX1-NEXT:    vmovd %xmm2, %eax
2323 ; AVX1-NEXT:    vpinsrw $7, %eax, %xmm3, %xmm2
2324 ; AVX1-NEXT:    vmovd %xmm1, %eax
2325 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2326 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2327 ; AVX1-NEXT:    vmovd %eax, %xmm3
2328 ; AVX1-NEXT:    vmovd %xmm1, %eax
2329 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
2330 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2331 ; AVX1-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
2332 ; AVX1-NEXT:    vmovd %xmm1, %eax
2333 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2334 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
2335 ; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2336 ; AVX1-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
2337 ; AVX1-NEXT:    vmovd %xmm0, %eax
2338 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm0
2339 ; AVX1-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
2340 ; AVX1-NEXT:    vmovd %xmm0, %eax
2341 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]
2342 ; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2343 ; AVX1-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
2344 ; AVX1-NEXT:    vmovd %xmm0, %eax
2345 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm1[3,1,2,3]
2346 ; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2347 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
2348 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2349 ; AVX1-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
2350 ; AVX1-NEXT:    vmovd %xmm1, %eax
2351 ; AVX1-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm1
2352 ; AVX1-NEXT:    vmovd %xmm0, %eax
2353 ; AVX1-NEXT:    vpinsrw $7, %eax, %xmm1, %xmm0
2354 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2355 ; AVX1-NEXT:    retq
2356 ;
2357 ; AVX2-LABEL: cvt_16f32_to_16i16:
2358 ; AVX2:       # %bb.0:
2359 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm2
2360 ; AVX2-NEXT:    vmovd %xmm2, %eax
2361 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
2362 ; AVX2-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2363 ; AVX2-NEXT:    vmovd %eax, %xmm3
2364 ; AVX2-NEXT:    vmovd %xmm2, %eax
2365 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm1[1,0]
2366 ; AVX2-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2367 ; AVX2-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
2368 ; AVX2-NEXT:    vmovd %xmm2, %eax
2369 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm2
2370 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3]
2371 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2372 ; AVX2-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
2373 ; AVX2-NEXT:    vmovd %xmm1, %eax
2374 ; AVX2-NEXT:    vcvtps2ph $4, %xmm2, %xmm1
2375 ; AVX2-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
2376 ; AVX2-NEXT:    vmovd %xmm1, %eax
2377 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]
2378 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2379 ; AVX2-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
2380 ; AVX2-NEXT:    vmovd %xmm1, %eax
2381 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm2[1,0]
2382 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2383 ; AVX2-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
2384 ; AVX2-NEXT:    vmovd %xmm1, %eax
2385 ; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2386 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm2 = xmm2[3,1,2,3]
2387 ; AVX2-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2388 ; AVX2-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm3
2389 ; AVX2-NEXT:    vmovd %xmm2, %eax
2390 ; AVX2-NEXT:    vpinsrw $7, %eax, %xmm3, %xmm2
2391 ; AVX2-NEXT:    vmovd %xmm1, %eax
2392 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2393 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2394 ; AVX2-NEXT:    vmovd %eax, %xmm3
2395 ; AVX2-NEXT:    vmovd %xmm1, %eax
2396 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
2397 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2398 ; AVX2-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
2399 ; AVX2-NEXT:    vmovd %xmm1, %eax
2400 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
2401 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
2402 ; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2403 ; AVX2-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
2404 ; AVX2-NEXT:    vmovd %xmm0, %eax
2405 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm0
2406 ; AVX2-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
2407 ; AVX2-NEXT:    vmovd %xmm0, %eax
2408 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]
2409 ; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2410 ; AVX2-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
2411 ; AVX2-NEXT:    vmovd %xmm0, %eax
2412 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm0 = xmm1[3,1,2,3]
2413 ; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2414 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
2415 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2416 ; AVX2-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
2417 ; AVX2-NEXT:    vmovd %xmm1, %eax
2418 ; AVX2-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm1
2419 ; AVX2-NEXT:    vmovd %xmm0, %eax
2420 ; AVX2-NEXT:    vpinsrw $7, %eax, %xmm1, %xmm0
2421 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
2422 ; AVX2-NEXT:    retq
2423 ;
2424 ; AVX512-LABEL: cvt_16f32_to_16i16:
2425 ; AVX512:       # %bb.0:
2426 ; AVX512-NEXT:    vextractf64x4 $1, %zmm0, %ymm1
2427 ; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm2
2428 ; AVX512-NEXT:    vmovd %xmm2, %eax
2429 ; AVX512-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
2430 ; AVX512-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2431 ; AVX512-NEXT:    vmovd %eax, %xmm3
2432 ; AVX512-NEXT:    vmovd %xmm2, %eax
2433 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm1[1,0]
2434 ; AVX512-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2435 ; AVX512-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
2436 ; AVX512-NEXT:    vmovd %xmm2, %eax
2437 ; AVX512-NEXT:    vextractf128 $1, %ymm1, %xmm2
2438 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3]
2439 ; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2440 ; AVX512-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
2441 ; AVX512-NEXT:    vmovd %xmm1, %eax
2442 ; AVX512-NEXT:    vcvtps2ph $4, %xmm2, %xmm1
2443 ; AVX512-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
2444 ; AVX512-NEXT:    vmovd %xmm1, %eax
2445 ; AVX512-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]
2446 ; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2447 ; AVX512-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
2448 ; AVX512-NEXT:    vmovd %xmm1, %eax
2449 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm2[1,0]
2450 ; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2451 ; AVX512-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
2452 ; AVX512-NEXT:    vmovd %xmm1, %eax
2453 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2454 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm2 = xmm2[3,1,2,3]
2455 ; AVX512-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2456 ; AVX512-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm3
2457 ; AVX512-NEXT:    vmovd %xmm2, %eax
2458 ; AVX512-NEXT:    vpinsrw $7, %eax, %xmm3, %xmm2
2459 ; AVX512-NEXT:    vmovd %xmm1, %eax
2460 ; AVX512-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2461 ; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2462 ; AVX512-NEXT:    vmovd %eax, %xmm3
2463 ; AVX512-NEXT:    vmovd %xmm1, %eax
2464 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
2465 ; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2466 ; AVX512-NEXT:    vpinsrw $1, %eax, %xmm3, %xmm3
2467 ; AVX512-NEXT:    vmovd %xmm1, %eax
2468 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm1
2469 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
2470 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2471 ; AVX512-NEXT:    vpinsrw $2, %eax, %xmm3, %xmm3
2472 ; AVX512-NEXT:    vmovd %xmm0, %eax
2473 ; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm0
2474 ; AVX512-NEXT:    vpinsrw $3, %eax, %xmm3, %xmm3
2475 ; AVX512-NEXT:    vmovd %xmm0, %eax
2476 ; AVX512-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]
2477 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2478 ; AVX512-NEXT:    vpinsrw $4, %eax, %xmm3, %xmm3
2479 ; AVX512-NEXT:    vmovd %xmm0, %eax
2480 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm1[1,0]
2481 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2482 ; AVX512-NEXT:    vpinsrw $5, %eax, %xmm3, %xmm3
2483 ; AVX512-NEXT:    vmovd %xmm0, %eax
2484 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm0 = xmm1[3,1,2,3]
2485 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2486 ; AVX512-NEXT:    vpinsrw $6, %eax, %xmm3, %xmm1
2487 ; AVX512-NEXT:    vmovd %xmm0, %eax
2488 ; AVX512-NEXT:    vpinsrw $7, %eax, %xmm1, %xmm0
2489 ; AVX512-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
2490 ; AVX512-NEXT:    retq
2491   %1 = fptrunc <16 x float> %a0 to <16 x half>
2492   %2 = bitcast <16 x half> %1 to <16 x i16>
2493   ret <16 x i16> %2
2494 }
2495
2496 ;
2497 ; Float to Half (Store)
2498 ;
2499
2500 define void @store_cvt_f32_to_i16(float %a0, i16* %a1) nounwind {
2501 ; ALL-LABEL: store_cvt_f32_to_i16:
2502 ; ALL:       # %bb.0:
2503 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2504 ; ALL-NEXT:    vmovd %xmm0, %eax
2505 ; ALL-NEXT:    movw %ax, (%rdi)
2506 ; ALL-NEXT:    retq
2507   %1 = fptrunc float %a0 to half
2508   %2 = bitcast half %1 to i16
2509   store i16 %2, i16* %a1
2510   ret void
2511 }
2512
2513 define void @store_cvt_4f32_to_4i16(<4 x float> %a0, <4 x i16>* %a1) nounwind {
2514 ; ALL-LABEL: store_cvt_4f32_to_4i16:
2515 ; ALL:       # %bb.0:
2516 ; ALL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2517 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2518 ; ALL-NEXT:    vmovd %xmm1, %eax
2519 ; ALL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
2520 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2521 ; ALL-NEXT:    vmovd %xmm1, %ecx
2522 ; ALL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2523 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2524 ; ALL-NEXT:    vmovd %xmm1, %edx
2525 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2526 ; ALL-NEXT:    vmovd %xmm0, %esi
2527 ; ALL-NEXT:    movw %si, (%rdi)
2528 ; ALL-NEXT:    movw %dx, 6(%rdi)
2529 ; ALL-NEXT:    movw %cx, 4(%rdi)
2530 ; ALL-NEXT:    movw %ax, 2(%rdi)
2531 ; ALL-NEXT:    retq
2532   %1 = fptrunc <4 x float> %a0 to <4 x half>
2533   %2 = bitcast <4 x half> %1 to <4 x i16>
2534   store <4 x i16> %2, <4 x i16>* %a1
2535   ret void
2536 }
2537
2538 define void @store_cvt_4f32_to_8i16_undef(<4 x float> %a0, <8 x i16>* %a1) nounwind {
2539 ; AVX1-LABEL: store_cvt_4f32_to_8i16_undef:
2540 ; AVX1:       # %bb.0:
2541 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2542 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2543 ; AVX1-NEXT:    vmovd %xmm1, %eax
2544 ; AVX1-NEXT:    shll $16, %eax
2545 ; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2546 ; AVX1-NEXT:    vmovd %xmm1, %ecx
2547 ; AVX1-NEXT:    movzwl %cx, %ecx
2548 ; AVX1-NEXT:    orl %eax, %ecx
2549 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2550 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2551 ; AVX1-NEXT:    vmovd %xmm1, %eax
2552 ; AVX1-NEXT:    shll $16, %eax
2553 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2554 ; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2555 ; AVX1-NEXT:    vmovd %xmm0, %edx
2556 ; AVX1-NEXT:    movzwl %dx, %edx
2557 ; AVX1-NEXT:    orl %eax, %edx
2558 ; AVX1-NEXT:    shlq $32, %rdx
2559 ; AVX1-NEXT:    orq %rcx, %rdx
2560 ; AVX1-NEXT:    vmovq %rdx, %xmm0
2561 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
2562 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)
2563 ; AVX1-NEXT:    retq
2564 ;
2565 ; AVX2-LABEL: store_cvt_4f32_to_8i16_undef:
2566 ; AVX2:       # %bb.0:
2567 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2568 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2569 ; AVX2-NEXT:    vmovd %xmm1, %eax
2570 ; AVX2-NEXT:    shll $16, %eax
2571 ; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2572 ; AVX2-NEXT:    vmovd %xmm1, %ecx
2573 ; AVX2-NEXT:    movzwl %cx, %ecx
2574 ; AVX2-NEXT:    orl %eax, %ecx
2575 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2576 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2577 ; AVX2-NEXT:    vmovd %xmm1, %eax
2578 ; AVX2-NEXT:    shll $16, %eax
2579 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2580 ; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2581 ; AVX2-NEXT:    vmovd %xmm0, %edx
2582 ; AVX2-NEXT:    movzwl %dx, %edx
2583 ; AVX2-NEXT:    orl %eax, %edx
2584 ; AVX2-NEXT:    shlq $32, %rdx
2585 ; AVX2-NEXT:    orq %rcx, %rdx
2586 ; AVX2-NEXT:    vmovq %rdx, %xmm0
2587 ; AVX2-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
2588 ; AVX2-NEXT:    vmovdqa %xmm0, (%rdi)
2589 ; AVX2-NEXT:    retq
2590 ;
2591 ; AVX512F-LABEL: store_cvt_4f32_to_8i16_undef:
2592 ; AVX512F:       # %bb.0:
2593 ; AVX512F-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2594 ; AVX512F-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2595 ; AVX512F-NEXT:    vmovd %xmm1, %eax
2596 ; AVX512F-NEXT:    shll $16, %eax
2597 ; AVX512F-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2598 ; AVX512F-NEXT:    vmovd %xmm1, %ecx
2599 ; AVX512F-NEXT:    movzwl %cx, %ecx
2600 ; AVX512F-NEXT:    orl %eax, %ecx
2601 ; AVX512F-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2602 ; AVX512F-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2603 ; AVX512F-NEXT:    vmovd %xmm1, %eax
2604 ; AVX512F-NEXT:    shll $16, %eax
2605 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2606 ; AVX512F-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2607 ; AVX512F-NEXT:    vmovd %xmm0, %edx
2608 ; AVX512F-NEXT:    movzwl %dx, %edx
2609 ; AVX512F-NEXT:    orl %eax, %edx
2610 ; AVX512F-NEXT:    shlq $32, %rdx
2611 ; AVX512F-NEXT:    orq %rcx, %rdx
2612 ; AVX512F-NEXT:    vmovq %rdx, %xmm0
2613 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
2614 ; AVX512F-NEXT:    vmovdqa %xmm0, (%rdi)
2615 ; AVX512F-NEXT:    retq
2616 ;
2617 ; AVX512VL-LABEL: store_cvt_4f32_to_8i16_undef:
2618 ; AVX512VL:       # %bb.0:
2619 ; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2620 ; AVX512VL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2621 ; AVX512VL-NEXT:    vmovd %xmm1, %eax
2622 ; AVX512VL-NEXT:    shll $16, %eax
2623 ; AVX512VL-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2624 ; AVX512VL-NEXT:    vmovd %xmm1, %ecx
2625 ; AVX512VL-NEXT:    movzwl %cx, %ecx
2626 ; AVX512VL-NEXT:    orl %eax, %ecx
2627 ; AVX512VL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2628 ; AVX512VL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2629 ; AVX512VL-NEXT:    vmovd %xmm1, %eax
2630 ; AVX512VL-NEXT:    shll $16, %eax
2631 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2632 ; AVX512VL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2633 ; AVX512VL-NEXT:    vmovd %xmm0, %edx
2634 ; AVX512VL-NEXT:    movzwl %dx, %edx
2635 ; AVX512VL-NEXT:    orl %eax, %edx
2636 ; AVX512VL-NEXT:    shlq $32, %rdx
2637 ; AVX512VL-NEXT:    orq %rcx, %rdx
2638 ; AVX512VL-NEXT:    vmovq %rdx, %xmm0
2639 ; AVX512VL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u,u,u,u,u,u,u,u,u]
2640 ; AVX512VL-NEXT:    vmovdqa %xmm0, (%rdi)
2641 ; AVX512VL-NEXT:    retq
2642   %1 = fptrunc <4 x float> %a0 to <4 x half>
2643   %2 = bitcast <4 x half> %1 to <4 x i16>
2644   %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>
2645   store <8 x i16> %3, <8 x i16>* %a1
2646   ret void
2647 }
2648
2649 define void @store_cvt_4f32_to_8i16_zero(<4 x float> %a0, <8 x i16>* %a1) nounwind {
2650 ; ALL-LABEL: store_cvt_4f32_to_8i16_zero:
2651 ; ALL:       # %bb.0:
2652 ; ALL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2653 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2654 ; ALL-NEXT:    vmovd %xmm1, %eax
2655 ; ALL-NEXT:    shll $16, %eax
2656 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm1
2657 ; ALL-NEXT:    vmovd %xmm1, %ecx
2658 ; ALL-NEXT:    movzwl %cx, %ecx
2659 ; ALL-NEXT:    orl %eax, %ecx
2660 ; ALL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2661 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2662 ; ALL-NEXT:    vmovd %xmm1, %eax
2663 ; ALL-NEXT:    shll $16, %eax
2664 ; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2665 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2666 ; ALL-NEXT:    vmovd %xmm0, %edx
2667 ; ALL-NEXT:    movzwl %dx, %edx
2668 ; ALL-NEXT:    orl %eax, %edx
2669 ; ALL-NEXT:    shlq $32, %rdx
2670 ; ALL-NEXT:    orq %rcx, %rdx
2671 ; ALL-NEXT:    vmovq %rdx, %xmm0
2672 ; ALL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u],zero,zero,zero,zero,zero,zero,zero,zero
2673 ; ALL-NEXT:    vmovdqa %xmm0, (%rdi)
2674 ; ALL-NEXT:    retq
2675   %1 = fptrunc <4 x float> %a0 to <4 x half>
2676   %2 = bitcast <4 x half> %1 to <4 x i16>
2677   %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>
2678   store <8 x i16> %3, <8 x i16>* %a1
2679   ret void
2680 }
2681
2682 define void @store_cvt_8f32_to_8i16(<8 x float> %a0, <8 x i16>* %a1) nounwind {
2683 ; ALL-LABEL: store_cvt_8f32_to_8i16:
2684 ; ALL:       # %bb.0:
2685 ; ALL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
2686 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2687 ; ALL-NEXT:    vmovd %xmm1, %r8d
2688 ; ALL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
2689 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2690 ; ALL-NEXT:    vmovd %xmm1, %r9d
2691 ; ALL-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
2692 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2693 ; ALL-NEXT:    vmovd %xmm1, %r10d
2694 ; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1
2695 ; ALL-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
2696 ; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2697 ; ALL-NEXT:    vmovd %xmm2, %r11d
2698 ; ALL-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm1[1,0]
2699 ; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2700 ; ALL-NEXT:    vmovd %xmm2, %eax
2701 ; ALL-NEXT:    vpermilps {{.*#+}} xmm2 = xmm1[3,1,2,3]
2702 ; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2703 ; ALL-NEXT:    vmovd %xmm2, %ecx
2704 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2705 ; ALL-NEXT:    vmovd %xmm0, %edx
2706 ; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm0
2707 ; ALL-NEXT:    vmovd %xmm0, %esi
2708 ; ALL-NEXT:    movw %si, 8(%rdi)
2709 ; ALL-NEXT:    movw %dx, (%rdi)
2710 ; ALL-NEXT:    movw %cx, 14(%rdi)
2711 ; ALL-NEXT:    movw %ax, 12(%rdi)
2712 ; ALL-NEXT:    movw %r11w, 10(%rdi)
2713 ; ALL-NEXT:    movw %r10w, 6(%rdi)
2714 ; ALL-NEXT:    movw %r9w, 4(%rdi)
2715 ; ALL-NEXT:    movw %r8w, 2(%rdi)
2716 ; ALL-NEXT:    vzeroupper
2717 ; ALL-NEXT:    retq
2718   %1 = fptrunc <8 x float> %a0 to <8 x half>
2719   %2 = bitcast <8 x half> %1 to <8 x i16>
2720   store <8 x i16> %2, <8 x i16>* %a1
2721   ret void
2722 }
2723
2724 define void @store_cvt_16f32_to_16i16(<16 x float> %a0, <16 x i16>* %a1) nounwind {
2725 ; AVX1-LABEL: store_cvt_16f32_to_16i16:
2726 ; AVX1:       # %bb.0:
2727 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2728 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
2729 ; AVX1-NEXT:    vcvtps2ph $4, %xmm3, %xmm4
2730 ; AVX1-NEXT:    vmovd %xmm4, %eax
2731 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm4
2732 ; AVX1-NEXT:    movw %ax, 24(%rdi)
2733 ; AVX1-NEXT:    vmovd %xmm4, %eax
2734 ; AVX1-NEXT:    vcvtps2ph $4, %xmm2, %xmm4
2735 ; AVX1-NEXT:    movw %ax, 16(%rdi)
2736 ; AVX1-NEXT:    vmovd %xmm4, %eax
2737 ; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm4
2738 ; AVX1-NEXT:    movw %ax, 8(%rdi)
2739 ; AVX1-NEXT:    vmovd %xmm4, %eax
2740 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm4 = xmm3[3,1,2,3]
2741 ; AVX1-NEXT:    vcvtps2ph $4, %xmm4, %xmm4
2742 ; AVX1-NEXT:    movw %ax, (%rdi)
2743 ; AVX1-NEXT:    vmovd %xmm4, %eax
2744 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm4 = xmm3[1,0]
2745 ; AVX1-NEXT:    vcvtps2ph $4, %xmm4, %xmm4
2746 ; AVX1-NEXT:    movw %ax, 30(%rdi)
2747 ; AVX1-NEXT:    vmovd %xmm4, %eax
2748 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm4 = xmm0[1,1,3,3]
2749 ; AVX1-NEXT:    vcvtps2ph $4, %xmm4, %xmm4
2750 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm3 = xmm3[1,1,3,3]
2751 ; AVX1-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2752 ; AVX1-NEXT:    movw %ax, 28(%rdi)
2753 ; AVX1-NEXT:    vmovd %xmm3, %eax
2754 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm3 = xmm1[3,1,2,3]
2755 ; AVX1-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2756 ; AVX1-NEXT:    movw %ax, 26(%rdi)
2757 ; AVX1-NEXT:    vmovd %xmm3, %eax
2758 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm1[1,0]
2759 ; AVX1-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2760 ; AVX1-NEXT:    movw %ax, 22(%rdi)
2761 ; AVX1-NEXT:    vmovd %xmm3, %eax
2762 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
2763 ; AVX1-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2764 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
2765 ; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2766 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm1[1,1,3,3]
2767 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2768 ; AVX1-NEXT:    movw %ax, 20(%rdi)
2769 ; AVX1-NEXT:    vmovd %xmm1, %eax
2770 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm2[3,1,2,3]
2771 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2772 ; AVX1-NEXT:    movw %ax, 18(%rdi)
2773 ; AVX1-NEXT:    vmovd %xmm1, %eax
2774 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]
2775 ; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2776 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm2[1,0]
2777 ; AVX1-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2778 ; AVX1-NEXT:    movw %ax, 14(%rdi)
2779 ; AVX1-NEXT:    vmovd %xmm2, %eax
2780 ; AVX1-NEXT:    movw %ax, 12(%rdi)
2781 ; AVX1-NEXT:    vmovd %xmm1, %eax
2782 ; AVX1-NEXT:    movw %ax, 10(%rdi)
2783 ; AVX1-NEXT:    vmovd %xmm0, %eax
2784 ; AVX1-NEXT:    movw %ax, 6(%rdi)
2785 ; AVX1-NEXT:    vmovd %xmm3, %eax
2786 ; AVX1-NEXT:    movw %ax, 4(%rdi)
2787 ; AVX1-NEXT:    vmovd %xmm4, %eax
2788 ; AVX1-NEXT:    movw %ax, 2(%rdi)
2789 ; AVX1-NEXT:    vzeroupper
2790 ; AVX1-NEXT:    retq
2791 ;
2792 ; AVX2-LABEL: store_cvt_16f32_to_16i16:
2793 ; AVX2:       # %bb.0:
2794 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
2795 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm3
2796 ; AVX2-NEXT:    vcvtps2ph $4, %xmm3, %xmm4
2797 ; AVX2-NEXT:    vmovd %xmm4, %eax
2798 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm4
2799 ; AVX2-NEXT:    movw %ax, 24(%rdi)
2800 ; AVX2-NEXT:    vmovd %xmm4, %eax
2801 ; AVX2-NEXT:    vcvtps2ph $4, %xmm2, %xmm4
2802 ; AVX2-NEXT:    movw %ax, 16(%rdi)
2803 ; AVX2-NEXT:    vmovd %xmm4, %eax
2804 ; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm4
2805 ; AVX2-NEXT:    movw %ax, 8(%rdi)
2806 ; AVX2-NEXT:    vmovd %xmm4, %eax
2807 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm4 = xmm3[3,1,2,3]
2808 ; AVX2-NEXT:    vcvtps2ph $4, %xmm4, %xmm4
2809 ; AVX2-NEXT:    movw %ax, (%rdi)
2810 ; AVX2-NEXT:    vmovd %xmm4, %eax
2811 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm4 = xmm3[1,0]
2812 ; AVX2-NEXT:    vcvtps2ph $4, %xmm4, %xmm4
2813 ; AVX2-NEXT:    movw %ax, 30(%rdi)
2814 ; AVX2-NEXT:    vmovd %xmm4, %eax
2815 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm4 = xmm0[1,1,3,3]
2816 ; AVX2-NEXT:    vcvtps2ph $4, %xmm4, %xmm4
2817 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm3 = xmm3[1,1,3,3]
2818 ; AVX2-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2819 ; AVX2-NEXT:    movw %ax, 28(%rdi)
2820 ; AVX2-NEXT:    vmovd %xmm3, %eax
2821 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm3 = xmm1[3,1,2,3]
2822 ; AVX2-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2823 ; AVX2-NEXT:    movw %ax, 26(%rdi)
2824 ; AVX2-NEXT:    vmovd %xmm3, %eax
2825 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm1[1,0]
2826 ; AVX2-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2827 ; AVX2-NEXT:    movw %ax, 22(%rdi)
2828 ; AVX2-NEXT:    vmovd %xmm3, %eax
2829 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
2830 ; AVX2-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2831 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
2832 ; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2833 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm1[1,1,3,3]
2834 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2835 ; AVX2-NEXT:    movw %ax, 20(%rdi)
2836 ; AVX2-NEXT:    vmovd %xmm1, %eax
2837 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm2[3,1,2,3]
2838 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2839 ; AVX2-NEXT:    movw %ax, 18(%rdi)
2840 ; AVX2-NEXT:    vmovd %xmm1, %eax
2841 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]
2842 ; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2843 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm2[1,0]
2844 ; AVX2-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2845 ; AVX2-NEXT:    movw %ax, 14(%rdi)
2846 ; AVX2-NEXT:    vmovd %xmm2, %eax
2847 ; AVX2-NEXT:    movw %ax, 12(%rdi)
2848 ; AVX2-NEXT:    vmovd %xmm1, %eax
2849 ; AVX2-NEXT:    movw %ax, 10(%rdi)
2850 ; AVX2-NEXT:    vmovd %xmm0, %eax
2851 ; AVX2-NEXT:    movw %ax, 6(%rdi)
2852 ; AVX2-NEXT:    vmovd %xmm3, %eax
2853 ; AVX2-NEXT:    movw %ax, 4(%rdi)
2854 ; AVX2-NEXT:    vmovd %xmm4, %eax
2855 ; AVX2-NEXT:    movw %ax, 2(%rdi)
2856 ; AVX2-NEXT:    vzeroupper
2857 ; AVX2-NEXT:    retq
2858 ;
2859 ; AVX512-LABEL: store_cvt_16f32_to_16i16:
2860 ; AVX512:       # %bb.0:
2861 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm1
2862 ; AVX512-NEXT:    vextractf64x4 $1, %zmm0, %ymm2
2863 ; AVX512-NEXT:    vextractf128 $1, %ymm2, %xmm3
2864 ; AVX512-NEXT:    vcvtps2ph $4, %xmm3, %xmm4
2865 ; AVX512-NEXT:    vmovd %xmm4, %eax
2866 ; AVX512-NEXT:    vcvtps2ph $4, %xmm2, %xmm4
2867 ; AVX512-NEXT:    movw %ax, 24(%rdi)
2868 ; AVX512-NEXT:    vmovd %xmm4, %eax
2869 ; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm4
2870 ; AVX512-NEXT:    movw %ax, 16(%rdi)
2871 ; AVX512-NEXT:    vmovd %xmm4, %eax
2872 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm4
2873 ; AVX512-NEXT:    movw %ax, 8(%rdi)
2874 ; AVX512-NEXT:    vmovd %xmm4, %eax
2875 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm4 = xmm3[3,1,2,3]
2876 ; AVX512-NEXT:    vcvtps2ph $4, %xmm4, %xmm4
2877 ; AVX512-NEXT:    movw %ax, (%rdi)
2878 ; AVX512-NEXT:    vmovd %xmm4, %eax
2879 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm4 = xmm3[1,0]
2880 ; AVX512-NEXT:    vcvtps2ph $4, %xmm4, %xmm4
2881 ; AVX512-NEXT:    movw %ax, 30(%rdi)
2882 ; AVX512-NEXT:    vmovd %xmm4, %eax
2883 ; AVX512-NEXT:    vmovshdup {{.*#+}} xmm4 = xmm0[1,1,3,3]
2884 ; AVX512-NEXT:    vcvtps2ph $4, %xmm4, %xmm4
2885 ; AVX512-NEXT:    vmovshdup {{.*#+}} xmm3 = xmm3[1,1,3,3]
2886 ; AVX512-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2887 ; AVX512-NEXT:    movw %ax, 28(%rdi)
2888 ; AVX512-NEXT:    vmovd %xmm3, %eax
2889 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm3 = xmm2[3,1,2,3]
2890 ; AVX512-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2891 ; AVX512-NEXT:    movw %ax, 26(%rdi)
2892 ; AVX512-NEXT:    vmovd %xmm3, %eax
2893 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm2[1,0]
2894 ; AVX512-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2895 ; AVX512-NEXT:    movw %ax, 22(%rdi)
2896 ; AVX512-NEXT:    vmovd %xmm3, %eax
2897 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
2898 ; AVX512-NEXT:    vcvtps2ph $4, %xmm3, %xmm3
2899 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
2900 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2901 ; AVX512-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm2[1,1,3,3]
2902 ; AVX512-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2903 ; AVX512-NEXT:    movw %ax, 20(%rdi)
2904 ; AVX512-NEXT:    vmovd %xmm2, %eax
2905 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm2 = xmm1[3,1,2,3]
2906 ; AVX512-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2907 ; AVX512-NEXT:    movw %ax, 18(%rdi)
2908 ; AVX512-NEXT:    vmovd %xmm2, %eax
2909 ; AVX512-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
2910 ; AVX512-NEXT:    vcvtps2ph $4, %xmm2, %xmm2
2911 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
2912 ; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1
2913 ; AVX512-NEXT:    movw %ax, 14(%rdi)
2914 ; AVX512-NEXT:    vmovd %xmm1, %eax
2915 ; AVX512-NEXT:    movw %ax, 12(%rdi)
2916 ; AVX512-NEXT:    vmovd %xmm2, %eax
2917 ; AVX512-NEXT:    movw %ax, 10(%rdi)
2918 ; AVX512-NEXT:    vmovd %xmm0, %eax
2919 ; AVX512-NEXT:    movw %ax, 6(%rdi)
2920 ; AVX512-NEXT:    vmovd %xmm3, %eax
2921 ; AVX512-NEXT:    movw %ax, 4(%rdi)
2922 ; AVX512-NEXT:    vmovd %xmm4, %eax
2923 ; AVX512-NEXT:    movw %ax, 2(%rdi)
2924 ; AVX512-NEXT:    vzeroupper
2925 ; AVX512-NEXT:    retq
2926   %1 = fptrunc <16 x float> %a0 to <16 x half>
2927   %2 = bitcast <16 x half> %1 to <16 x i16>
2928   store <16 x i16> %2, <16 x i16>* %a1
2929   ret void
2930 }
2931
2932 ;
2933 ; Double to Half
2934 ;
2935
2936 define i16 @cvt_f64_to_i16(double %a0) nounwind {
2937 ; ALL-LABEL: cvt_f64_to_i16:
2938 ; ALL:       # %bb.0:
2939 ; ALL-NEXT:    jmp __truncdfhf2 # TAILCALL
2940   %1 = fptrunc double %a0 to half
2941   %2 = bitcast half %1 to i16
2942   ret i16 %2
2943 }
2944
2945 define <2 x i16> @cvt_2f64_to_2i16(<2 x double> %a0) nounwind {
2946 ; ALL-LABEL: cvt_2f64_to_2i16:
2947 ; ALL:       # %bb.0:
2948 ; ALL-NEXT:    pushq %rbx
2949 ; ALL-NEXT:    subq $16, %rsp
2950 ; ALL-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
2951 ; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2952 ; ALL-NEXT:    callq __truncdfhf2
2953 ; ALL-NEXT:    movl %eax, %ebx
2954 ; ALL-NEXT:    shll $16, %ebx
2955 ; ALL-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2956 ; ALL-NEXT:    callq __truncdfhf2
2957 ; ALL-NEXT:    movzwl %ax, %eax
2958 ; ALL-NEXT:    orl %ebx, %eax
2959 ; ALL-NEXT:    vmovd %eax, %xmm0
2960 ; ALL-NEXT:    addq $16, %rsp
2961 ; ALL-NEXT:    popq %rbx
2962 ; ALL-NEXT:    retq
2963   %1 = fptrunc <2 x double> %a0 to <2 x half>
2964   %2 = bitcast <2 x half> %1 to <2 x i16>
2965   ret <2 x i16> %2
2966 }
2967
2968 define <4 x i16> @cvt_4f64_to_4i16(<4 x double> %a0) nounwind {
2969 ; AVX1-LABEL: cvt_4f64_to_4i16:
2970 ; AVX1:       # %bb.0:
2971 ; AVX1-NEXT:    pushq %r14
2972 ; AVX1-NEXT:    pushq %rbx
2973 ; AVX1-NEXT:    subq $40, %rsp
2974 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
2975 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2976 ; AVX1-NEXT:    vzeroupper
2977 ; AVX1-NEXT:    callq __truncdfhf2
2978 ; AVX1-NEXT:    movl %eax, %ebx
2979 ; AVX1-NEXT:    shll $16, %ebx
2980 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
2981 ; AVX1-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
2982 ; AVX1-NEXT:    vzeroupper
2983 ; AVX1-NEXT:    callq __truncdfhf2
2984 ; AVX1-NEXT:    movzwl %ax, %r14d
2985 ; AVX1-NEXT:    orl %ebx, %r14d
2986 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
2987 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2988 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
2989 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
2990 ; AVX1-NEXT:    vzeroupper
2991 ; AVX1-NEXT:    callq __truncdfhf2
2992 ; AVX1-NEXT:    movl %eax, %ebx
2993 ; AVX1-NEXT:    shll $16, %ebx
2994 ; AVX1-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2995 ; AVX1-NEXT:    callq __truncdfhf2
2996 ; AVX1-NEXT:    movzwl %ax, %eax
2997 ; AVX1-NEXT:    orl %ebx, %eax
2998 ; AVX1-NEXT:    shlq $32, %rax
2999 ; AVX1-NEXT:    orq %r14, %rax
3000 ; AVX1-NEXT:    vmovq %rax, %xmm0
3001 ; AVX1-NEXT:    addq $40, %rsp
3002 ; AVX1-NEXT:    popq %rbx
3003 ; AVX1-NEXT:    popq %r14
3004 ; AVX1-NEXT:    retq
3005 ;
3006 ; AVX2-LABEL: cvt_4f64_to_4i16:
3007 ; AVX2:       # %bb.0:
3008 ; AVX2-NEXT:    pushq %r14
3009 ; AVX2-NEXT:    pushq %rbx
3010 ; AVX2-NEXT:    subq $40, %rsp
3011 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3012 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3013 ; AVX2-NEXT:    vzeroupper
3014 ; AVX2-NEXT:    callq __truncdfhf2
3015 ; AVX2-NEXT:    movl %eax, %ebx
3016 ; AVX2-NEXT:    shll $16, %ebx
3017 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3018 ; AVX2-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3019 ; AVX2-NEXT:    vzeroupper
3020 ; AVX2-NEXT:    callq __truncdfhf2
3021 ; AVX2-NEXT:    movzwl %ax, %r14d
3022 ; AVX2-NEXT:    orl %ebx, %r14d
3023 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3024 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3025 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3026 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3027 ; AVX2-NEXT:    vzeroupper
3028 ; AVX2-NEXT:    callq __truncdfhf2
3029 ; AVX2-NEXT:    movl %eax, %ebx
3030 ; AVX2-NEXT:    shll $16, %ebx
3031 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3032 ; AVX2-NEXT:    callq __truncdfhf2
3033 ; AVX2-NEXT:    movzwl %ax, %eax
3034 ; AVX2-NEXT:    orl %ebx, %eax
3035 ; AVX2-NEXT:    shlq $32, %rax
3036 ; AVX2-NEXT:    orq %r14, %rax
3037 ; AVX2-NEXT:    vmovq %rax, %xmm0
3038 ; AVX2-NEXT:    addq $40, %rsp
3039 ; AVX2-NEXT:    popq %rbx
3040 ; AVX2-NEXT:    popq %r14
3041 ; AVX2-NEXT:    retq
3042 ;
3043 ; AVX512-LABEL: cvt_4f64_to_4i16:
3044 ; AVX512:       # %bb.0:
3045 ; AVX512-NEXT:    pushq %r14
3046 ; AVX512-NEXT:    pushq %rbx
3047 ; AVX512-NEXT:    subq $40, %rsp
3048 ; AVX512-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3049 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3050 ; AVX512-NEXT:    vzeroupper
3051 ; AVX512-NEXT:    callq __truncdfhf2
3052 ; AVX512-NEXT:    movl %eax, %ebx
3053 ; AVX512-NEXT:    shll $16, %ebx
3054 ; AVX512-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3055 ; AVX512-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3056 ; AVX512-NEXT:    vzeroupper
3057 ; AVX512-NEXT:    callq __truncdfhf2
3058 ; AVX512-NEXT:    movzwl %ax, %r14d
3059 ; AVX512-NEXT:    orl %ebx, %r14d
3060 ; AVX512-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3061 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3062 ; AVX512-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3063 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3064 ; AVX512-NEXT:    vzeroupper
3065 ; AVX512-NEXT:    callq __truncdfhf2
3066 ; AVX512-NEXT:    movl %eax, %ebx
3067 ; AVX512-NEXT:    shll $16, %ebx
3068 ; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3069 ; AVX512-NEXT:    callq __truncdfhf2
3070 ; AVX512-NEXT:    movzwl %ax, %eax
3071 ; AVX512-NEXT:    orl %ebx, %eax
3072 ; AVX512-NEXT:    shlq $32, %rax
3073 ; AVX512-NEXT:    orq %r14, %rax
3074 ; AVX512-NEXT:    vmovq %rax, %xmm0
3075 ; AVX512-NEXT:    addq $40, %rsp
3076 ; AVX512-NEXT:    popq %rbx
3077 ; AVX512-NEXT:    popq %r14
3078 ; AVX512-NEXT:    retq
3079   %1 = fptrunc <4 x double> %a0 to <4 x half>
3080   %2 = bitcast <4 x half> %1 to <4 x i16>
3081   ret <4 x i16> %2
3082 }
3083
3084 define <8 x i16> @cvt_4f64_to_8i16_undef(<4 x double> %a0) nounwind {
3085 ; AVX1-LABEL: cvt_4f64_to_8i16_undef:
3086 ; AVX1:       # %bb.0:
3087 ; AVX1-NEXT:    pushq %r14
3088 ; AVX1-NEXT:    pushq %rbx
3089 ; AVX1-NEXT:    subq $40, %rsp
3090 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3091 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3092 ; AVX1-NEXT:    vzeroupper
3093 ; AVX1-NEXT:    callq __truncdfhf2
3094 ; AVX1-NEXT:    movl %eax, %ebx
3095 ; AVX1-NEXT:    shll $16, %ebx
3096 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3097 ; AVX1-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3098 ; AVX1-NEXT:    vzeroupper
3099 ; AVX1-NEXT:    callq __truncdfhf2
3100 ; AVX1-NEXT:    movzwl %ax, %r14d
3101 ; AVX1-NEXT:    orl %ebx, %r14d
3102 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3103 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3104 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3105 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3106 ; AVX1-NEXT:    vzeroupper
3107 ; AVX1-NEXT:    callq __truncdfhf2
3108 ; AVX1-NEXT:    movl %eax, %ebx
3109 ; AVX1-NEXT:    shll $16, %ebx
3110 ; AVX1-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3111 ; AVX1-NEXT:    callq __truncdfhf2
3112 ; AVX1-NEXT:    movzwl %ax, %eax
3113 ; AVX1-NEXT:    orl %ebx, %eax
3114 ; AVX1-NEXT:    shlq $32, %rax
3115 ; AVX1-NEXT:    orq %r14, %rax
3116 ; AVX1-NEXT:    vmovq %rax, %xmm0
3117 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
3118 ; AVX1-NEXT:    addq $40, %rsp
3119 ; AVX1-NEXT:    popq %rbx
3120 ; AVX1-NEXT:    popq %r14
3121 ; AVX1-NEXT:    retq
3122 ;
3123 ; AVX2-LABEL: cvt_4f64_to_8i16_undef:
3124 ; AVX2:       # %bb.0:
3125 ; AVX2-NEXT:    pushq %r14
3126 ; AVX2-NEXT:    pushq %rbx
3127 ; AVX2-NEXT:    subq $40, %rsp
3128 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3129 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3130 ; AVX2-NEXT:    vzeroupper
3131 ; AVX2-NEXT:    callq __truncdfhf2
3132 ; AVX2-NEXT:    movl %eax, %ebx
3133 ; AVX2-NEXT:    shll $16, %ebx
3134 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3135 ; AVX2-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3136 ; AVX2-NEXT:    vzeroupper
3137 ; AVX2-NEXT:    callq __truncdfhf2
3138 ; AVX2-NEXT:    movzwl %ax, %r14d
3139 ; AVX2-NEXT:    orl %ebx, %r14d
3140 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3141 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3142 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3143 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3144 ; AVX2-NEXT:    vzeroupper
3145 ; AVX2-NEXT:    callq __truncdfhf2
3146 ; AVX2-NEXT:    movl %eax, %ebx
3147 ; AVX2-NEXT:    shll $16, %ebx
3148 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3149 ; AVX2-NEXT:    callq __truncdfhf2
3150 ; AVX2-NEXT:    movzwl %ax, %eax
3151 ; AVX2-NEXT:    orl %ebx, %eax
3152 ; AVX2-NEXT:    shlq $32, %rax
3153 ; AVX2-NEXT:    orq %r14, %rax
3154 ; AVX2-NEXT:    vmovq %rax, %xmm0
3155 ; AVX2-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
3156 ; AVX2-NEXT:    addq $40, %rsp
3157 ; AVX2-NEXT:    popq %rbx
3158 ; AVX2-NEXT:    popq %r14
3159 ; AVX2-NEXT:    retq
3160 ;
3161 ; AVX512F-LABEL: cvt_4f64_to_8i16_undef:
3162 ; AVX512F:       # %bb.0:
3163 ; AVX512F-NEXT:    pushq %r14
3164 ; AVX512F-NEXT:    pushq %rbx
3165 ; AVX512F-NEXT:    subq $40, %rsp
3166 ; AVX512F-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3167 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3168 ; AVX512F-NEXT:    vzeroupper
3169 ; AVX512F-NEXT:    callq __truncdfhf2
3170 ; AVX512F-NEXT:    movl %eax, %ebx
3171 ; AVX512F-NEXT:    shll $16, %ebx
3172 ; AVX512F-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3173 ; AVX512F-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3174 ; AVX512F-NEXT:    vzeroupper
3175 ; AVX512F-NEXT:    callq __truncdfhf2
3176 ; AVX512F-NEXT:    movzwl %ax, %r14d
3177 ; AVX512F-NEXT:    orl %ebx, %r14d
3178 ; AVX512F-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3179 ; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm0
3180 ; AVX512F-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3181 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3182 ; AVX512F-NEXT:    vzeroupper
3183 ; AVX512F-NEXT:    callq __truncdfhf2
3184 ; AVX512F-NEXT:    movl %eax, %ebx
3185 ; AVX512F-NEXT:    shll $16, %ebx
3186 ; AVX512F-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3187 ; AVX512F-NEXT:    callq __truncdfhf2
3188 ; AVX512F-NEXT:    movzwl %ax, %eax
3189 ; AVX512F-NEXT:    orl %ebx, %eax
3190 ; AVX512F-NEXT:    shlq $32, %rax
3191 ; AVX512F-NEXT:    orq %r14, %rax
3192 ; AVX512F-NEXT:    vmovq %rax, %xmm0
3193 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
3194 ; AVX512F-NEXT:    addq $40, %rsp
3195 ; AVX512F-NEXT:    popq %rbx
3196 ; AVX512F-NEXT:    popq %r14
3197 ; AVX512F-NEXT:    retq
3198 ;
3199 ; AVX512VL-LABEL: cvt_4f64_to_8i16_undef:
3200 ; AVX512VL:       # %bb.0:
3201 ; AVX512VL-NEXT:    pushq %r14
3202 ; AVX512VL-NEXT:    pushq %rbx
3203 ; AVX512VL-NEXT:    subq $40, %rsp
3204 ; AVX512VL-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3205 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3206 ; AVX512VL-NEXT:    vzeroupper
3207 ; AVX512VL-NEXT:    callq __truncdfhf2
3208 ; AVX512VL-NEXT:    movl %eax, %ebx
3209 ; AVX512VL-NEXT:    shll $16, %ebx
3210 ; AVX512VL-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3211 ; AVX512VL-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3212 ; AVX512VL-NEXT:    vzeroupper
3213 ; AVX512VL-NEXT:    callq __truncdfhf2
3214 ; AVX512VL-NEXT:    movzwl %ax, %r14d
3215 ; AVX512VL-NEXT:    orl %ebx, %r14d
3216 ; AVX512VL-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3217 ; AVX512VL-NEXT:    vextractf128 $1, %ymm0, %xmm0
3218 ; AVX512VL-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3219 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3220 ; AVX512VL-NEXT:    vzeroupper
3221 ; AVX512VL-NEXT:    callq __truncdfhf2
3222 ; AVX512VL-NEXT:    movl %eax, %ebx
3223 ; AVX512VL-NEXT:    shll $16, %ebx
3224 ; AVX512VL-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3225 ; AVX512VL-NEXT:    callq __truncdfhf2
3226 ; AVX512VL-NEXT:    movzwl %ax, %eax
3227 ; AVX512VL-NEXT:    orl %ebx, %eax
3228 ; AVX512VL-NEXT:    shlq $32, %rax
3229 ; AVX512VL-NEXT:    orq %r14, %rax
3230 ; AVX512VL-NEXT:    vmovq %rax, %xmm0
3231 ; AVX512VL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u,u,u,u,u,u,u,u,u]
3232 ; AVX512VL-NEXT:    addq $40, %rsp
3233 ; AVX512VL-NEXT:    popq %rbx
3234 ; AVX512VL-NEXT:    popq %r14
3235 ; AVX512VL-NEXT:    retq
3236   %1 = fptrunc <4 x double> %a0 to <4 x half>
3237   %2 = bitcast <4 x half> %1 to <4 x i16>
3238   %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>
3239   ret <8 x i16> %3
3240 }
3241
3242 define <8 x i16> @cvt_4f64_to_8i16_zero(<4 x double> %a0) nounwind {
3243 ; AVX1-LABEL: cvt_4f64_to_8i16_zero:
3244 ; AVX1:       # %bb.0:
3245 ; AVX1-NEXT:    pushq %r14
3246 ; AVX1-NEXT:    pushq %rbx
3247 ; AVX1-NEXT:    subq $40, %rsp
3248 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3249 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3250 ; AVX1-NEXT:    vzeroupper
3251 ; AVX1-NEXT:    callq __truncdfhf2
3252 ; AVX1-NEXT:    movl %eax, %ebx
3253 ; AVX1-NEXT:    shll $16, %ebx
3254 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3255 ; AVX1-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3256 ; AVX1-NEXT:    vzeroupper
3257 ; AVX1-NEXT:    callq __truncdfhf2
3258 ; AVX1-NEXT:    movzwl %ax, %r14d
3259 ; AVX1-NEXT:    orl %ebx, %r14d
3260 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3261 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3262 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3263 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3264 ; AVX1-NEXT:    vzeroupper
3265 ; AVX1-NEXT:    callq __truncdfhf2
3266 ; AVX1-NEXT:    movl %eax, %ebx
3267 ; AVX1-NEXT:    shll $16, %ebx
3268 ; AVX1-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3269 ; AVX1-NEXT:    callq __truncdfhf2
3270 ; AVX1-NEXT:    movzwl %ax, %eax
3271 ; AVX1-NEXT:    orl %ebx, %eax
3272 ; AVX1-NEXT:    shlq $32, %rax
3273 ; AVX1-NEXT:    orq %r14, %rax
3274 ; AVX1-NEXT:    vmovq %rax, %xmm0
3275 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u],zero,zero,zero,zero,zero,zero,zero,zero
3276 ; AVX1-NEXT:    addq $40, %rsp
3277 ; AVX1-NEXT:    popq %rbx
3278 ; AVX1-NEXT:    popq %r14
3279 ; AVX1-NEXT:    retq
3280 ;
3281 ; AVX2-LABEL: cvt_4f64_to_8i16_zero:
3282 ; AVX2:       # %bb.0:
3283 ; AVX2-NEXT:    pushq %r14
3284 ; AVX2-NEXT:    pushq %rbx
3285 ; AVX2-NEXT:    subq $40, %rsp
3286 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3287 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3288 ; AVX2-NEXT:    vzeroupper
3289 ; AVX2-NEXT:    callq __truncdfhf2
3290 ; AVX2-NEXT:    movl %eax, %ebx
3291 ; AVX2-NEXT:    shll $16, %ebx
3292 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3293 ; AVX2-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3294 ; AVX2-NEXT:    vzeroupper
3295 ; AVX2-NEXT:    callq __truncdfhf2
3296 ; AVX2-NEXT:    movzwl %ax, %r14d
3297 ; AVX2-NEXT:    orl %ebx, %r14d
3298 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3299 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3300 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3301 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3302 ; AVX2-NEXT:    vzeroupper
3303 ; AVX2-NEXT:    callq __truncdfhf2
3304 ; AVX2-NEXT:    movl %eax, %ebx
3305 ; AVX2-NEXT:    shll $16, %ebx
3306 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3307 ; AVX2-NEXT:    callq __truncdfhf2
3308 ; AVX2-NEXT:    movzwl %ax, %eax
3309 ; AVX2-NEXT:    orl %ebx, %eax
3310 ; AVX2-NEXT:    shlq $32, %rax
3311 ; AVX2-NEXT:    orq %r14, %rax
3312 ; AVX2-NEXT:    vmovq %rax, %xmm0
3313 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u],zero,zero,zero,zero,zero,zero,zero,zero
3314 ; AVX2-NEXT:    addq $40, %rsp
3315 ; AVX2-NEXT:    popq %rbx
3316 ; AVX2-NEXT:    popq %r14
3317 ; AVX2-NEXT:    retq
3318 ;
3319 ; AVX512-LABEL: cvt_4f64_to_8i16_zero:
3320 ; AVX512:       # %bb.0:
3321 ; AVX512-NEXT:    pushq %r14
3322 ; AVX512-NEXT:    pushq %rbx
3323 ; AVX512-NEXT:    subq $40, %rsp
3324 ; AVX512-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3325 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3326 ; AVX512-NEXT:    vzeroupper
3327 ; AVX512-NEXT:    callq __truncdfhf2
3328 ; AVX512-NEXT:    movl %eax, %ebx
3329 ; AVX512-NEXT:    shll $16, %ebx
3330 ; AVX512-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3331 ; AVX512-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3332 ; AVX512-NEXT:    vzeroupper
3333 ; AVX512-NEXT:    callq __truncdfhf2
3334 ; AVX512-NEXT:    movzwl %ax, %r14d
3335 ; AVX512-NEXT:    orl %ebx, %r14d
3336 ; AVX512-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3337 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3338 ; AVX512-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3339 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3340 ; AVX512-NEXT:    vzeroupper
3341 ; AVX512-NEXT:    callq __truncdfhf2
3342 ; AVX512-NEXT:    movl %eax, %ebx
3343 ; AVX512-NEXT:    shll $16, %ebx
3344 ; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3345 ; AVX512-NEXT:    callq __truncdfhf2
3346 ; AVX512-NEXT:    movzwl %ax, %eax
3347 ; AVX512-NEXT:    orl %ebx, %eax
3348 ; AVX512-NEXT:    shlq $32, %rax
3349 ; AVX512-NEXT:    orq %r14, %rax
3350 ; AVX512-NEXT:    vmovq %rax, %xmm0
3351 ; AVX512-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u],zero,zero,zero,zero,zero,zero,zero,zero
3352 ; AVX512-NEXT:    addq $40, %rsp
3353 ; AVX512-NEXT:    popq %rbx
3354 ; AVX512-NEXT:    popq %r14
3355 ; AVX512-NEXT:    retq
3356   %1 = fptrunc <4 x double> %a0 to <4 x half>
3357   %2 = bitcast <4 x half> %1 to <4 x i16>
3358   %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>
3359   ret <8 x i16> %3
3360 }
3361
3362 define <8 x i16> @cvt_8f64_to_8i16(<8 x double> %a0) nounwind {
3363 ; AVX1-LABEL: cvt_8f64_to_8i16:
3364 ; AVX1:       # %bb.0:
3365 ; AVX1-NEXT:    pushq %r15
3366 ; AVX1-NEXT:    pushq %r14
3367 ; AVX1-NEXT:    pushq %rbx
3368 ; AVX1-NEXT:    subq $64, %rsp
3369 ; AVX1-NEXT:    vmovups %ymm1, (%rsp) # 32-byte Spill
3370 ; AVX1-NEXT:    vmovupd %ymm0, {{[0-9]+}}(%rsp) # 32-byte Spill
3371 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3372 ; AVX1-NEXT:    vzeroupper
3373 ; AVX1-NEXT:    callq __truncdfhf2
3374 ; AVX1-NEXT:    movl %eax, %ebx
3375 ; AVX1-NEXT:    shll $16, %ebx
3376 ; AVX1-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
3377 ; AVX1-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3378 ; AVX1-NEXT:    vzeroupper
3379 ; AVX1-NEXT:    callq __truncdfhf2
3380 ; AVX1-NEXT:    movzwl %ax, %r15d
3381 ; AVX1-NEXT:    orl %ebx, %r15d
3382 ; AVX1-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
3383 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3384 ; AVX1-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
3385 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3386 ; AVX1-NEXT:    vzeroupper
3387 ; AVX1-NEXT:    callq __truncdfhf2
3388 ; AVX1-NEXT:    movl %eax, %ebx
3389 ; AVX1-NEXT:    shll $16, %ebx
3390 ; AVX1-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
3391 ; AVX1-NEXT:    callq __truncdfhf2
3392 ; AVX1-NEXT:    movzwl %ax, %r14d
3393 ; AVX1-NEXT:    orl %ebx, %r14d
3394 ; AVX1-NEXT:    shlq $32, %r14
3395 ; AVX1-NEXT:    orq %r15, %r14
3396 ; AVX1-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3397 ; AVX1-NEXT:    # xmm0 = mem[1,0]
3398 ; AVX1-NEXT:    callq __truncdfhf2
3399 ; AVX1-NEXT:    movl %eax, %ebx
3400 ; AVX1-NEXT:    shll $16, %ebx
3401 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3402 ; AVX1-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3403 ; AVX1-NEXT:    vzeroupper
3404 ; AVX1-NEXT:    callq __truncdfhf2
3405 ; AVX1-NEXT:    movzwl %ax, %r15d
3406 ; AVX1-NEXT:    orl %ebx, %r15d
3407 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3408 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3409 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3410 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3411 ; AVX1-NEXT:    vzeroupper
3412 ; AVX1-NEXT:    callq __truncdfhf2
3413 ; AVX1-NEXT:    movl %eax, %ebx
3414 ; AVX1-NEXT:    shll $16, %ebx
3415 ; AVX1-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3416 ; AVX1-NEXT:    callq __truncdfhf2
3417 ; AVX1-NEXT:    movzwl %ax, %eax
3418 ; AVX1-NEXT:    orl %ebx, %eax
3419 ; AVX1-NEXT:    shlq $32, %rax
3420 ; AVX1-NEXT:    orq %r15, %rax
3421 ; AVX1-NEXT:    vmovq %rax, %xmm0
3422 ; AVX1-NEXT:    vmovq %r14, %xmm1
3423 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
3424 ; AVX1-NEXT:    addq $64, %rsp
3425 ; AVX1-NEXT:    popq %rbx
3426 ; AVX1-NEXT:    popq %r14
3427 ; AVX1-NEXT:    popq %r15
3428 ; AVX1-NEXT:    retq
3429 ;
3430 ; AVX2-LABEL: cvt_8f64_to_8i16:
3431 ; AVX2:       # %bb.0:
3432 ; AVX2-NEXT:    pushq %r15
3433 ; AVX2-NEXT:    pushq %r14
3434 ; AVX2-NEXT:    pushq %rbx
3435 ; AVX2-NEXT:    subq $64, %rsp
3436 ; AVX2-NEXT:    vmovups %ymm1, (%rsp) # 32-byte Spill
3437 ; AVX2-NEXT:    vmovupd %ymm0, {{[0-9]+}}(%rsp) # 32-byte Spill
3438 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3439 ; AVX2-NEXT:    vzeroupper
3440 ; AVX2-NEXT:    callq __truncdfhf2
3441 ; AVX2-NEXT:    movl %eax, %ebx
3442 ; AVX2-NEXT:    shll $16, %ebx
3443 ; AVX2-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
3444 ; AVX2-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3445 ; AVX2-NEXT:    vzeroupper
3446 ; AVX2-NEXT:    callq __truncdfhf2
3447 ; AVX2-NEXT:    movzwl %ax, %r15d
3448 ; AVX2-NEXT:    orl %ebx, %r15d
3449 ; AVX2-NEXT:    vmovupd {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
3450 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3451 ; AVX2-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
3452 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3453 ; AVX2-NEXT:    vzeroupper
3454 ; AVX2-NEXT:    callq __truncdfhf2
3455 ; AVX2-NEXT:    movl %eax, %ebx
3456 ; AVX2-NEXT:    shll $16, %ebx
3457 ; AVX2-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
3458 ; AVX2-NEXT:    callq __truncdfhf2
3459 ; AVX2-NEXT:    movzwl %ax, %r14d
3460 ; AVX2-NEXT:    orl %ebx, %r14d
3461 ; AVX2-NEXT:    shlq $32, %r14
3462 ; AVX2-NEXT:    orq %r15, %r14
3463 ; AVX2-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3464 ; AVX2-NEXT:    # xmm0 = mem[1,0]
3465 ; AVX2-NEXT:    callq __truncdfhf2
3466 ; AVX2-NEXT:    movl %eax, %ebx
3467 ; AVX2-NEXT:    shll $16, %ebx
3468 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3469 ; AVX2-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3470 ; AVX2-NEXT:    vzeroupper
3471 ; AVX2-NEXT:    callq __truncdfhf2
3472 ; AVX2-NEXT:    movzwl %ax, %r15d
3473 ; AVX2-NEXT:    orl %ebx, %r15d
3474 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3475 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3476 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3477 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3478 ; AVX2-NEXT:    vzeroupper
3479 ; AVX2-NEXT:    callq __truncdfhf2
3480 ; AVX2-NEXT:    movl %eax, %ebx
3481 ; AVX2-NEXT:    shll $16, %ebx
3482 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3483 ; AVX2-NEXT:    callq __truncdfhf2
3484 ; AVX2-NEXT:    movzwl %ax, %eax
3485 ; AVX2-NEXT:    orl %ebx, %eax
3486 ; AVX2-NEXT:    shlq $32, %rax
3487 ; AVX2-NEXT:    orq %r15, %rax
3488 ; AVX2-NEXT:    vmovq %rax, %xmm0
3489 ; AVX2-NEXT:    vmovq %r14, %xmm1
3490 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
3491 ; AVX2-NEXT:    addq $64, %rsp
3492 ; AVX2-NEXT:    popq %rbx
3493 ; AVX2-NEXT:    popq %r14
3494 ; AVX2-NEXT:    popq %r15
3495 ; AVX2-NEXT:    retq
3496 ;
3497 ; AVX512-LABEL: cvt_8f64_to_8i16:
3498 ; AVX512:       # %bb.0:
3499 ; AVX512-NEXT:    pushq %r15
3500 ; AVX512-NEXT:    pushq %r14
3501 ; AVX512-NEXT:    pushq %rbx
3502 ; AVX512-NEXT:    subq $96, %rsp
3503 ; AVX512-NEXT:    vmovupd %zmm0, (%rsp) # 64-byte Spill
3504 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3505 ; AVX512-NEXT:    vzeroupper
3506 ; AVX512-NEXT:    callq __truncdfhf2
3507 ; AVX512-NEXT:    movl %eax, %ebx
3508 ; AVX512-NEXT:    shll $16, %ebx
3509 ; AVX512-NEXT:    vmovups (%rsp), %zmm0 # 64-byte Reload
3510 ; AVX512-NEXT:    # kill: def %xmm0 killed %xmm0 killed %zmm0
3511 ; AVX512-NEXT:    vzeroupper
3512 ; AVX512-NEXT:    callq __truncdfhf2
3513 ; AVX512-NEXT:    movzwl %ax, %r15d
3514 ; AVX512-NEXT:    orl %ebx, %r15d
3515 ; AVX512-NEXT:    vmovupd (%rsp), %zmm0 # 64-byte Reload
3516 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3517 ; AVX512-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
3518 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3519 ; AVX512-NEXT:    vzeroupper
3520 ; AVX512-NEXT:    callq __truncdfhf2
3521 ; AVX512-NEXT:    movl %eax, %ebx
3522 ; AVX512-NEXT:    shll $16, %ebx
3523 ; AVX512-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
3524 ; AVX512-NEXT:    callq __truncdfhf2
3525 ; AVX512-NEXT:    movzwl %ax, %r14d
3526 ; AVX512-NEXT:    orl %ebx, %r14d
3527 ; AVX512-NEXT:    shlq $32, %r14
3528 ; AVX512-NEXT:    orq %r15, %r14
3529 ; AVX512-NEXT:    vmovupd (%rsp), %zmm0 # 64-byte Reload
3530 ; AVX512-NEXT:    vextractf64x4 $1, %zmm0, %ymm0
3531 ; AVX512-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3532 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3533 ; AVX512-NEXT:    vzeroupper
3534 ; AVX512-NEXT:    callq __truncdfhf2
3535 ; AVX512-NEXT:    movl %eax, %ebx
3536 ; AVX512-NEXT:    shll $16, %ebx
3537 ; AVX512-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3538 ; AVX512-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3539 ; AVX512-NEXT:    vzeroupper
3540 ; AVX512-NEXT:    callq __truncdfhf2
3541 ; AVX512-NEXT:    movzwl %ax, %r15d
3542 ; AVX512-NEXT:    orl %ebx, %r15d
3543 ; AVX512-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3544 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3545 ; AVX512-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3546 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3547 ; AVX512-NEXT:    vzeroupper
3548 ; AVX512-NEXT:    callq __truncdfhf2
3549 ; AVX512-NEXT:    movl %eax, %ebx
3550 ; AVX512-NEXT:    shll $16, %ebx
3551 ; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3552 ; AVX512-NEXT:    callq __truncdfhf2
3553 ; AVX512-NEXT:    movzwl %ax, %eax
3554 ; AVX512-NEXT:    orl %ebx, %eax
3555 ; AVX512-NEXT:    shlq $32, %rax
3556 ; AVX512-NEXT:    orq %r15, %rax
3557 ; AVX512-NEXT:    vmovq %rax, %xmm0
3558 ; AVX512-NEXT:    vmovq %r14, %xmm1
3559 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
3560 ; AVX512-NEXT:    addq $96, %rsp
3561 ; AVX512-NEXT:    popq %rbx
3562 ; AVX512-NEXT:    popq %r14
3563 ; AVX512-NEXT:    popq %r15
3564 ; AVX512-NEXT:    retq
3565   %1 = fptrunc <8 x double> %a0 to <8 x half>
3566   %2 = bitcast <8 x half> %1 to <8 x i16>
3567   ret <8 x i16> %2
3568 }
3569
3570 ;
3571 ; Double to Half (Store)
3572 ;
3573
3574 define void @store_cvt_f64_to_i16(double %a0, i16* %a1) nounwind {
3575 ; ALL-LABEL: store_cvt_f64_to_i16:
3576 ; ALL:       # %bb.0:
3577 ; ALL-NEXT:    pushq %rbx
3578 ; ALL-NEXT:    movq %rdi, %rbx
3579 ; ALL-NEXT:    callq __truncdfhf2
3580 ; ALL-NEXT:    movw %ax, (%rbx)
3581 ; ALL-NEXT:    popq %rbx
3582 ; ALL-NEXT:    retq
3583   %1 = fptrunc double %a0 to half
3584   %2 = bitcast half %1 to i16
3585   store i16 %2, i16* %a1
3586   ret void
3587 }
3588
3589 define void @store_cvt_2f64_to_2i16(<2 x double> %a0, <2 x i16>* %a1) nounwind {
3590 ; ALL-LABEL: store_cvt_2f64_to_2i16:
3591 ; ALL:       # %bb.0:
3592 ; ALL-NEXT:    pushq %rbp
3593 ; ALL-NEXT:    pushq %rbx
3594 ; ALL-NEXT:    subq $24, %rsp
3595 ; ALL-NEXT:    movq %rdi, %rbx
3596 ; ALL-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3597 ; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3598 ; ALL-NEXT:    callq __truncdfhf2
3599 ; ALL-NEXT:    movl %eax, %ebp
3600 ; ALL-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3601 ; ALL-NEXT:    callq __truncdfhf2
3602 ; ALL-NEXT:    movw %ax, (%rbx)
3603 ; ALL-NEXT:    movw %bp, 2(%rbx)
3604 ; ALL-NEXT:    addq $24, %rsp
3605 ; ALL-NEXT:    popq %rbx
3606 ; ALL-NEXT:    popq %rbp
3607 ; ALL-NEXT:    retq
3608   %1 = fptrunc <2 x double> %a0 to <2 x half>
3609   %2 = bitcast <2 x half> %1 to <2 x i16>
3610   store <2 x i16> %2, <2 x i16>* %a1
3611   ret void
3612 }
3613
3614 define void @store_cvt_4f64_to_4i16(<4 x double> %a0, <4 x i16>* %a1) nounwind {
3615 ; AVX1-LABEL: store_cvt_4f64_to_4i16:
3616 ; AVX1:       # %bb.0:
3617 ; AVX1-NEXT:    pushq %rbp
3618 ; AVX1-NEXT:    pushq %r15
3619 ; AVX1-NEXT:    pushq %r14
3620 ; AVX1-NEXT:    pushq %rbx
3621 ; AVX1-NEXT:    subq $88, %rsp
3622 ; AVX1-NEXT:    movq %rdi, %rbx
3623 ; AVX1-NEXT:    vmovupd %ymm0, {{[0-9]+}}(%rsp) # 32-byte Spill
3624 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3625 ; AVX1-NEXT:    vzeroupper
3626 ; AVX1-NEXT:    callq __truncdfhf2
3627 ; AVX1-NEXT:    movl %eax, %r14d
3628 ; AVX1-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
3629 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3630 ; AVX1-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
3631 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3632 ; AVX1-NEXT:    vzeroupper
3633 ; AVX1-NEXT:    callq __truncdfhf2
3634 ; AVX1-NEXT:    movl %eax, %r15d
3635 ; AVX1-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
3636 ; AVX1-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3637 ; AVX1-NEXT:    vzeroupper
3638 ; AVX1-NEXT:    callq __truncdfhf2
3639 ; AVX1-NEXT:    movl %eax, %ebp
3640 ; AVX1-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
3641 ; AVX1-NEXT:    callq __truncdfhf2
3642 ; AVX1-NEXT:    movw %ax, 4(%rbx)
3643 ; AVX1-NEXT:    movw %bp, (%rbx)
3644 ; AVX1-NEXT:    movw %r15w, 6(%rbx)
3645 ; AVX1-NEXT:    movw %r14w, 2(%rbx)
3646 ; AVX1-NEXT:    addq $88, %rsp
3647 ; AVX1-NEXT:    popq %rbx
3648 ; AVX1-NEXT:    popq %r14
3649 ; AVX1-NEXT:    popq %r15
3650 ; AVX1-NEXT:    popq %rbp
3651 ; AVX1-NEXT:    retq
3652 ;
3653 ; AVX2-LABEL: store_cvt_4f64_to_4i16:
3654 ; AVX2:       # %bb.0:
3655 ; AVX2-NEXT:    pushq %rbp
3656 ; AVX2-NEXT:    pushq %r15
3657 ; AVX2-NEXT:    pushq %r14
3658 ; AVX2-NEXT:    pushq %rbx
3659 ; AVX2-NEXT:    subq $88, %rsp
3660 ; AVX2-NEXT:    movq %rdi, %rbx
3661 ; AVX2-NEXT:    vmovupd %ymm0, {{[0-9]+}}(%rsp) # 32-byte Spill
3662 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3663 ; AVX2-NEXT:    vzeroupper
3664 ; AVX2-NEXT:    callq __truncdfhf2
3665 ; AVX2-NEXT:    movl %eax, %r14d
3666 ; AVX2-NEXT:    vmovupd {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
3667 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3668 ; AVX2-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
3669 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3670 ; AVX2-NEXT:    vzeroupper
3671 ; AVX2-NEXT:    callq __truncdfhf2
3672 ; AVX2-NEXT:    movl %eax, %r15d
3673 ; AVX2-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
3674 ; AVX2-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3675 ; AVX2-NEXT:    vzeroupper
3676 ; AVX2-NEXT:    callq __truncdfhf2
3677 ; AVX2-NEXT:    movl %eax, %ebp
3678 ; AVX2-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
3679 ; AVX2-NEXT:    callq __truncdfhf2
3680 ; AVX2-NEXT:    movw %ax, 4(%rbx)
3681 ; AVX2-NEXT:    movw %bp, (%rbx)
3682 ; AVX2-NEXT:    movw %r15w, 6(%rbx)
3683 ; AVX2-NEXT:    movw %r14w, 2(%rbx)
3684 ; AVX2-NEXT:    addq $88, %rsp
3685 ; AVX2-NEXT:    popq %rbx
3686 ; AVX2-NEXT:    popq %r14
3687 ; AVX2-NEXT:    popq %r15
3688 ; AVX2-NEXT:    popq %rbp
3689 ; AVX2-NEXT:    retq
3690 ;
3691 ; AVX512-LABEL: store_cvt_4f64_to_4i16:
3692 ; AVX512:       # %bb.0:
3693 ; AVX512-NEXT:    pushq %rbp
3694 ; AVX512-NEXT:    pushq %r15
3695 ; AVX512-NEXT:    pushq %r14
3696 ; AVX512-NEXT:    pushq %rbx
3697 ; AVX512-NEXT:    subq $88, %rsp
3698 ; AVX512-NEXT:    movq %rdi, %rbx
3699 ; AVX512-NEXT:    vmovupd %ymm0, {{[0-9]+}}(%rsp) # 32-byte Spill
3700 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3701 ; AVX512-NEXT:    vzeroupper
3702 ; AVX512-NEXT:    callq __truncdfhf2
3703 ; AVX512-NEXT:    movl %eax, %r14d
3704 ; AVX512-NEXT:    vmovupd {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
3705 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3706 ; AVX512-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
3707 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3708 ; AVX512-NEXT:    vzeroupper
3709 ; AVX512-NEXT:    callq __truncdfhf2
3710 ; AVX512-NEXT:    movl %eax, %r15d
3711 ; AVX512-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
3712 ; AVX512-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3713 ; AVX512-NEXT:    vzeroupper
3714 ; AVX512-NEXT:    callq __truncdfhf2
3715 ; AVX512-NEXT:    movl %eax, %ebp
3716 ; AVX512-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
3717 ; AVX512-NEXT:    callq __truncdfhf2
3718 ; AVX512-NEXT:    movw %ax, 4(%rbx)
3719 ; AVX512-NEXT:    movw %bp, (%rbx)
3720 ; AVX512-NEXT:    movw %r15w, 6(%rbx)
3721 ; AVX512-NEXT:    movw %r14w, 2(%rbx)
3722 ; AVX512-NEXT:    addq $88, %rsp
3723 ; AVX512-NEXT:    popq %rbx
3724 ; AVX512-NEXT:    popq %r14
3725 ; AVX512-NEXT:    popq %r15
3726 ; AVX512-NEXT:    popq %rbp
3727 ; AVX512-NEXT:    retq
3728   %1 = fptrunc <4 x double> %a0 to <4 x half>
3729   %2 = bitcast <4 x half> %1 to <4 x i16>
3730   store <4 x i16> %2, <4 x i16>* %a1
3731   ret void
3732 }
3733
3734 define void @store_cvt_4f64_to_8i16_undef(<4 x double> %a0, <8 x i16>* %a1) nounwind {
3735 ; AVX1-LABEL: store_cvt_4f64_to_8i16_undef:
3736 ; AVX1:       # %bb.0:
3737 ; AVX1-NEXT:    pushq %rbp
3738 ; AVX1-NEXT:    pushq %r14
3739 ; AVX1-NEXT:    pushq %rbx
3740 ; AVX1-NEXT:    subq $32, %rsp
3741 ; AVX1-NEXT:    movq %rdi, %r14
3742 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3743 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3744 ; AVX1-NEXT:    vzeroupper
3745 ; AVX1-NEXT:    callq __truncdfhf2
3746 ; AVX1-NEXT:    movl %eax, %ebp
3747 ; AVX1-NEXT:    shll $16, %ebp
3748 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3749 ; AVX1-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3750 ; AVX1-NEXT:    vzeroupper
3751 ; AVX1-NEXT:    callq __truncdfhf2
3752 ; AVX1-NEXT:    movzwl %ax, %ebx
3753 ; AVX1-NEXT:    orl %ebp, %ebx
3754 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3755 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3756 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3757 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3758 ; AVX1-NEXT:    vzeroupper
3759 ; AVX1-NEXT:    callq __truncdfhf2
3760 ; AVX1-NEXT:    movl %eax, %ebp
3761 ; AVX1-NEXT:    shll $16, %ebp
3762 ; AVX1-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3763 ; AVX1-NEXT:    callq __truncdfhf2
3764 ; AVX1-NEXT:    movzwl %ax, %eax
3765 ; AVX1-NEXT:    orl %ebp, %eax
3766 ; AVX1-NEXT:    shlq $32, %rax
3767 ; AVX1-NEXT:    orq %rbx, %rax
3768 ; AVX1-NEXT:    vmovq %rax, %xmm0
3769 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
3770 ; AVX1-NEXT:    vmovdqa %xmm0, (%r14)
3771 ; AVX1-NEXT:    addq $32, %rsp
3772 ; AVX1-NEXT:    popq %rbx
3773 ; AVX1-NEXT:    popq %r14
3774 ; AVX1-NEXT:    popq %rbp
3775 ; AVX1-NEXT:    retq
3776 ;
3777 ; AVX2-LABEL: store_cvt_4f64_to_8i16_undef:
3778 ; AVX2:       # %bb.0:
3779 ; AVX2-NEXT:    pushq %rbp
3780 ; AVX2-NEXT:    pushq %r14
3781 ; AVX2-NEXT:    pushq %rbx
3782 ; AVX2-NEXT:    subq $32, %rsp
3783 ; AVX2-NEXT:    movq %rdi, %r14
3784 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3785 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3786 ; AVX2-NEXT:    vzeroupper
3787 ; AVX2-NEXT:    callq __truncdfhf2
3788 ; AVX2-NEXT:    movl %eax, %ebp
3789 ; AVX2-NEXT:    shll $16, %ebp
3790 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3791 ; AVX2-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3792 ; AVX2-NEXT:    vzeroupper
3793 ; AVX2-NEXT:    callq __truncdfhf2
3794 ; AVX2-NEXT:    movzwl %ax, %ebx
3795 ; AVX2-NEXT:    orl %ebp, %ebx
3796 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3797 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3798 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3799 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3800 ; AVX2-NEXT:    vzeroupper
3801 ; AVX2-NEXT:    callq __truncdfhf2
3802 ; AVX2-NEXT:    movl %eax, %ebp
3803 ; AVX2-NEXT:    shll $16, %ebp
3804 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3805 ; AVX2-NEXT:    callq __truncdfhf2
3806 ; AVX2-NEXT:    movzwl %ax, %eax
3807 ; AVX2-NEXT:    orl %ebp, %eax
3808 ; AVX2-NEXT:    shlq $32, %rax
3809 ; AVX2-NEXT:    orq %rbx, %rax
3810 ; AVX2-NEXT:    vmovq %rax, %xmm0
3811 ; AVX2-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
3812 ; AVX2-NEXT:    vmovdqa %xmm0, (%r14)
3813 ; AVX2-NEXT:    addq $32, %rsp
3814 ; AVX2-NEXT:    popq %rbx
3815 ; AVX2-NEXT:    popq %r14
3816 ; AVX2-NEXT:    popq %rbp
3817 ; AVX2-NEXT:    retq
3818 ;
3819 ; AVX512F-LABEL: store_cvt_4f64_to_8i16_undef:
3820 ; AVX512F:       # %bb.0:
3821 ; AVX512F-NEXT:    pushq %rbp
3822 ; AVX512F-NEXT:    pushq %r14
3823 ; AVX512F-NEXT:    pushq %rbx
3824 ; AVX512F-NEXT:    subq $32, %rsp
3825 ; AVX512F-NEXT:    movq %rdi, %r14
3826 ; AVX512F-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3827 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3828 ; AVX512F-NEXT:    vzeroupper
3829 ; AVX512F-NEXT:    callq __truncdfhf2
3830 ; AVX512F-NEXT:    movl %eax, %ebp
3831 ; AVX512F-NEXT:    shll $16, %ebp
3832 ; AVX512F-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3833 ; AVX512F-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3834 ; AVX512F-NEXT:    vzeroupper
3835 ; AVX512F-NEXT:    callq __truncdfhf2
3836 ; AVX512F-NEXT:    movzwl %ax, %ebx
3837 ; AVX512F-NEXT:    orl %ebp, %ebx
3838 ; AVX512F-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3839 ; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm0
3840 ; AVX512F-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3841 ; AVX512F-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3842 ; AVX512F-NEXT:    vzeroupper
3843 ; AVX512F-NEXT:    callq __truncdfhf2
3844 ; AVX512F-NEXT:    movl %eax, %ebp
3845 ; AVX512F-NEXT:    shll $16, %ebp
3846 ; AVX512F-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3847 ; AVX512F-NEXT:    callq __truncdfhf2
3848 ; AVX512F-NEXT:    movzwl %ax, %eax
3849 ; AVX512F-NEXT:    orl %ebp, %eax
3850 ; AVX512F-NEXT:    shlq $32, %rax
3851 ; AVX512F-NEXT:    orq %rbx, %rax
3852 ; AVX512F-NEXT:    vmovq %rax, %xmm0
3853 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
3854 ; AVX512F-NEXT:    vmovdqa %xmm0, (%r14)
3855 ; AVX512F-NEXT:    addq $32, %rsp
3856 ; AVX512F-NEXT:    popq %rbx
3857 ; AVX512F-NEXT:    popq %r14
3858 ; AVX512F-NEXT:    popq %rbp
3859 ; AVX512F-NEXT:    retq
3860 ;
3861 ; AVX512VL-LABEL: store_cvt_4f64_to_8i16_undef:
3862 ; AVX512VL:       # %bb.0:
3863 ; AVX512VL-NEXT:    pushq %rbp
3864 ; AVX512VL-NEXT:    pushq %r14
3865 ; AVX512VL-NEXT:    pushq %rbx
3866 ; AVX512VL-NEXT:    subq $32, %rsp
3867 ; AVX512VL-NEXT:    movq %rdi, %r14
3868 ; AVX512VL-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3869 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3870 ; AVX512VL-NEXT:    vzeroupper
3871 ; AVX512VL-NEXT:    callq __truncdfhf2
3872 ; AVX512VL-NEXT:    movl %eax, %ebp
3873 ; AVX512VL-NEXT:    shll $16, %ebp
3874 ; AVX512VL-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3875 ; AVX512VL-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3876 ; AVX512VL-NEXT:    vzeroupper
3877 ; AVX512VL-NEXT:    callq __truncdfhf2
3878 ; AVX512VL-NEXT:    movzwl %ax, %ebx
3879 ; AVX512VL-NEXT:    orl %ebp, %ebx
3880 ; AVX512VL-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3881 ; AVX512VL-NEXT:    vextractf128 $1, %ymm0, %xmm0
3882 ; AVX512VL-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3883 ; AVX512VL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3884 ; AVX512VL-NEXT:    vzeroupper
3885 ; AVX512VL-NEXT:    callq __truncdfhf2
3886 ; AVX512VL-NEXT:    movl %eax, %ebp
3887 ; AVX512VL-NEXT:    shll $16, %ebp
3888 ; AVX512VL-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3889 ; AVX512VL-NEXT:    callq __truncdfhf2
3890 ; AVX512VL-NEXT:    movzwl %ax, %eax
3891 ; AVX512VL-NEXT:    orl %ebp, %eax
3892 ; AVX512VL-NEXT:    shlq $32, %rax
3893 ; AVX512VL-NEXT:    orq %rbx, %rax
3894 ; AVX512VL-NEXT:    vmovq %rax, %xmm0
3895 ; AVX512VL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u,u,u,u,u,u,u,u,u]
3896 ; AVX512VL-NEXT:    vmovdqa %xmm0, (%r14)
3897 ; AVX512VL-NEXT:    addq $32, %rsp
3898 ; AVX512VL-NEXT:    popq %rbx
3899 ; AVX512VL-NEXT:    popq %r14
3900 ; AVX512VL-NEXT:    popq %rbp
3901 ; AVX512VL-NEXT:    retq
3902   %1 = fptrunc <4 x double> %a0 to <4 x half>
3903   %2 = bitcast <4 x half> %1 to <4 x i16>
3904   %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>
3905   store <8 x i16> %3, <8 x i16>* %a1
3906   ret void
3907 }
3908
3909 define void @store_cvt_4f64_to_8i16_zero(<4 x double> %a0, <8 x i16>* %a1) nounwind {
3910 ; AVX1-LABEL: store_cvt_4f64_to_8i16_zero:
3911 ; AVX1:       # %bb.0:
3912 ; AVX1-NEXT:    pushq %rbp
3913 ; AVX1-NEXT:    pushq %r14
3914 ; AVX1-NEXT:    pushq %rbx
3915 ; AVX1-NEXT:    subq $32, %rsp
3916 ; AVX1-NEXT:    movq %rdi, %r14
3917 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3918 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3919 ; AVX1-NEXT:    vzeroupper
3920 ; AVX1-NEXT:    callq __truncdfhf2
3921 ; AVX1-NEXT:    movl %eax, %ebp
3922 ; AVX1-NEXT:    shll $16, %ebp
3923 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3924 ; AVX1-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3925 ; AVX1-NEXT:    vzeroupper
3926 ; AVX1-NEXT:    callq __truncdfhf2
3927 ; AVX1-NEXT:    movzwl %ax, %ebx
3928 ; AVX1-NEXT:    orl %ebp, %ebx
3929 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3930 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3931 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3932 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3933 ; AVX1-NEXT:    vzeroupper
3934 ; AVX1-NEXT:    callq __truncdfhf2
3935 ; AVX1-NEXT:    movl %eax, %ebp
3936 ; AVX1-NEXT:    shll $16, %ebp
3937 ; AVX1-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3938 ; AVX1-NEXT:    callq __truncdfhf2
3939 ; AVX1-NEXT:    movzwl %ax, %eax
3940 ; AVX1-NEXT:    orl %ebp, %eax
3941 ; AVX1-NEXT:    shlq $32, %rax
3942 ; AVX1-NEXT:    orq %rbx, %rax
3943 ; AVX1-NEXT:    vmovq %rax, %xmm0
3944 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u],zero,zero,zero,zero,zero,zero,zero,zero
3945 ; AVX1-NEXT:    vmovdqa %xmm0, (%r14)
3946 ; AVX1-NEXT:    addq $32, %rsp
3947 ; AVX1-NEXT:    popq %rbx
3948 ; AVX1-NEXT:    popq %r14
3949 ; AVX1-NEXT:    popq %rbp
3950 ; AVX1-NEXT:    retq
3951 ;
3952 ; AVX2-LABEL: store_cvt_4f64_to_8i16_zero:
3953 ; AVX2:       # %bb.0:
3954 ; AVX2-NEXT:    pushq %rbp
3955 ; AVX2-NEXT:    pushq %r14
3956 ; AVX2-NEXT:    pushq %rbx
3957 ; AVX2-NEXT:    subq $32, %rsp
3958 ; AVX2-NEXT:    movq %rdi, %r14
3959 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3960 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3961 ; AVX2-NEXT:    vzeroupper
3962 ; AVX2-NEXT:    callq __truncdfhf2
3963 ; AVX2-NEXT:    movl %eax, %ebp
3964 ; AVX2-NEXT:    shll $16, %ebp
3965 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3966 ; AVX2-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
3967 ; AVX2-NEXT:    vzeroupper
3968 ; AVX2-NEXT:    callq __truncdfhf2
3969 ; AVX2-NEXT:    movzwl %ax, %ebx
3970 ; AVX2-NEXT:    orl %ebp, %ebx
3971 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3972 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3973 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3974 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
3975 ; AVX2-NEXT:    vzeroupper
3976 ; AVX2-NEXT:    callq __truncdfhf2
3977 ; AVX2-NEXT:    movl %eax, %ebp
3978 ; AVX2-NEXT:    shll $16, %ebp
3979 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3980 ; AVX2-NEXT:    callq __truncdfhf2
3981 ; AVX2-NEXT:    movzwl %ax, %eax
3982 ; AVX2-NEXT:    orl %ebp, %eax
3983 ; AVX2-NEXT:    shlq $32, %rax
3984 ; AVX2-NEXT:    orq %rbx, %rax
3985 ; AVX2-NEXT:    vmovq %rax, %xmm0
3986 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u],zero,zero,zero,zero,zero,zero,zero,zero
3987 ; AVX2-NEXT:    vmovdqa %xmm0, (%r14)
3988 ; AVX2-NEXT:    addq $32, %rsp
3989 ; AVX2-NEXT:    popq %rbx
3990 ; AVX2-NEXT:    popq %r14
3991 ; AVX2-NEXT:    popq %rbp
3992 ; AVX2-NEXT:    retq
3993 ;
3994 ; AVX512-LABEL: store_cvt_4f64_to_8i16_zero:
3995 ; AVX512:       # %bb.0:
3996 ; AVX512-NEXT:    pushq %rbp
3997 ; AVX512-NEXT:    pushq %r14
3998 ; AVX512-NEXT:    pushq %rbx
3999 ; AVX512-NEXT:    subq $32, %rsp
4000 ; AVX512-NEXT:    movq %rdi, %r14
4001 ; AVX512-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
4002 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4003 ; AVX512-NEXT:    vzeroupper
4004 ; AVX512-NEXT:    callq __truncdfhf2
4005 ; AVX512-NEXT:    movl %eax, %ebp
4006 ; AVX512-NEXT:    shll $16, %ebp
4007 ; AVX512-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4008 ; AVX512-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
4009 ; AVX512-NEXT:    vzeroupper
4010 ; AVX512-NEXT:    callq __truncdfhf2
4011 ; AVX512-NEXT:    movzwl %ax, %ebx
4012 ; AVX512-NEXT:    orl %ebp, %ebx
4013 ; AVX512-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
4014 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
4015 ; AVX512-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4016 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4017 ; AVX512-NEXT:    vzeroupper
4018 ; AVX512-NEXT:    callq __truncdfhf2
4019 ; AVX512-NEXT:    movl %eax, %ebp
4020 ; AVX512-NEXT:    shll $16, %ebp
4021 ; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
4022 ; AVX512-NEXT:    callq __truncdfhf2
4023 ; AVX512-NEXT:    movzwl %ax, %eax
4024 ; AVX512-NEXT:    orl %ebp, %eax
4025 ; AVX512-NEXT:    shlq $32, %rax
4026 ; AVX512-NEXT:    orq %rbx, %rax
4027 ; AVX512-NEXT:    vmovq %rax, %xmm0
4028 ; AVX512-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,u,u,u,u],zero,zero,zero,zero,zero,zero,zero,zero
4029 ; AVX512-NEXT:    vmovdqa %xmm0, (%r14)
4030 ; AVX512-NEXT:    addq $32, %rsp
4031 ; AVX512-NEXT:    popq %rbx
4032 ; AVX512-NEXT:    popq %r14
4033 ; AVX512-NEXT:    popq %rbp
4034 ; AVX512-NEXT:    retq
4035   %1 = fptrunc <4 x double> %a0 to <4 x half>
4036   %2 = bitcast <4 x half> %1 to <4 x i16>
4037   %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>
4038   store <8 x i16> %3, <8 x i16>* %a1
4039   ret void
4040 }
4041
4042 define void @store_cvt_8f64_to_8i16(<8 x double> %a0, <8 x i16>* %a1) nounwind {
4043 ; AVX1-LABEL: store_cvt_8f64_to_8i16:
4044 ; AVX1:       # %bb.0:
4045 ; AVX1-NEXT:    pushq %rbp
4046 ; AVX1-NEXT:    pushq %r15
4047 ; AVX1-NEXT:    pushq %r14
4048 ; AVX1-NEXT:    pushq %r13
4049 ; AVX1-NEXT:    pushq %r12
4050 ; AVX1-NEXT:    pushq %rbx
4051 ; AVX1-NEXT:    subq $136, %rsp
4052 ; AVX1-NEXT:    movq %rdi, %rbx
4053 ; AVX1-NEXT:    vmovups %ymm1, {{[0-9]+}}(%rsp) # 32-byte Spill
4054 ; AVX1-NEXT:    vmovupd %ymm0, {{[0-9]+}}(%rsp) # 32-byte Spill
4055 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4056 ; AVX1-NEXT:    vzeroupper
4057 ; AVX1-NEXT:    callq __truncdfhf2
4058 ; AVX1-NEXT:    movw %ax, {{[0-9]+}}(%rsp) # 2-byte Spill
4059 ; AVX1-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
4060 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4061 ; AVX1-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
4062 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4063 ; AVX1-NEXT:    vzeroupper
4064 ; AVX1-NEXT:    callq __truncdfhf2
4065 ; AVX1-NEXT:    movw %ax, {{[0-9]+}}(%rsp) # 2-byte Spill
4066 ; AVX1-NEXT:    vpermilpd $1, {{[0-9]+}}(%rsp), %xmm0 # 16-byte Folded Reload
4067 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4068 ; AVX1-NEXT:    callq __truncdfhf2
4069 ; AVX1-NEXT:    movl %eax, %r12d
4070 ; AVX1-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
4071 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4072 ; AVX1-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
4073 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4074 ; AVX1-NEXT:    vzeroupper
4075 ; AVX1-NEXT:    callq __truncdfhf2
4076 ; AVX1-NEXT:    movl %eax, %r13d
4077 ; AVX1-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
4078 ; AVX1-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
4079 ; AVX1-NEXT:    vzeroupper
4080 ; AVX1-NEXT:    callq __truncdfhf2
4081 ; AVX1-NEXT:    movl %eax, %ebp
4082 ; AVX1-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
4083 ; AVX1-NEXT:    callq __truncdfhf2
4084 ; AVX1-NEXT:    movl %eax, %r14d
4085 ; AVX1-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
4086 ; AVX1-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
4087 ; AVX1-NEXT:    vzeroupper
4088 ; AVX1-NEXT:    callq __truncdfhf2
4089 ; AVX1-NEXT:    movl %eax, %r15d
4090 ; AVX1-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
4091 ; AVX1-NEXT:    callq __truncdfhf2
4092 ; AVX1-NEXT:    movw %ax, 12(%rbx)
4093 ; AVX1-NEXT:    movw %r15w, 8(%rbx)
4094 ; AVX1-NEXT:    movw %r14w, 4(%rbx)
4095 ; AVX1-NEXT:    movw %bp, (%rbx)
4096 ; AVX1-NEXT:    movw %r13w, 14(%rbx)
4097 ; AVX1-NEXT:    movw %r12w, 10(%rbx)
4098 ; AVX1-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax # 2-byte Folded Reload
4099 ; AVX1-NEXT:    movw %ax, 6(%rbx)
4100 ; AVX1-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax # 2-byte Folded Reload
4101 ; AVX1-NEXT:    movw %ax, 2(%rbx)
4102 ; AVX1-NEXT:    addq $136, %rsp
4103 ; AVX1-NEXT:    popq %rbx
4104 ; AVX1-NEXT:    popq %r12
4105 ; AVX1-NEXT:    popq %r13
4106 ; AVX1-NEXT:    popq %r14
4107 ; AVX1-NEXT:    popq %r15
4108 ; AVX1-NEXT:    popq %rbp
4109 ; AVX1-NEXT:    retq
4110 ;
4111 ; AVX2-LABEL: store_cvt_8f64_to_8i16:
4112 ; AVX2:       # %bb.0:
4113 ; AVX2-NEXT:    pushq %rbp
4114 ; AVX2-NEXT:    pushq %r15
4115 ; AVX2-NEXT:    pushq %r14
4116 ; AVX2-NEXT:    pushq %r13
4117 ; AVX2-NEXT:    pushq %r12
4118 ; AVX2-NEXT:    pushq %rbx
4119 ; AVX2-NEXT:    subq $136, %rsp
4120 ; AVX2-NEXT:    movq %rdi, %rbx
4121 ; AVX2-NEXT:    vmovups %ymm1, {{[0-9]+}}(%rsp) # 32-byte Spill
4122 ; AVX2-NEXT:    vmovupd %ymm0, {{[0-9]+}}(%rsp) # 32-byte Spill
4123 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4124 ; AVX2-NEXT:    vzeroupper
4125 ; AVX2-NEXT:    callq __truncdfhf2
4126 ; AVX2-NEXT:    movw %ax, {{[0-9]+}}(%rsp) # 2-byte Spill
4127 ; AVX2-NEXT:    vmovupd {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
4128 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4129 ; AVX2-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
4130 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4131 ; AVX2-NEXT:    vzeroupper
4132 ; AVX2-NEXT:    callq __truncdfhf2
4133 ; AVX2-NEXT:    movw %ax, {{[0-9]+}}(%rsp) # 2-byte Spill
4134 ; AVX2-NEXT:    vpermilpd $1, {{[0-9]+}}(%rsp), %xmm0 # 16-byte Folded Reload
4135 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4136 ; AVX2-NEXT:    callq __truncdfhf2
4137 ; AVX2-NEXT:    movl %eax, %r12d
4138 ; AVX2-NEXT:    vmovupd {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
4139 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4140 ; AVX2-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
4141 ; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4142 ; AVX2-NEXT:    vzeroupper
4143 ; AVX2-NEXT:    callq __truncdfhf2
4144 ; AVX2-NEXT:    movl %eax, %r13d
4145 ; AVX2-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
4146 ; AVX2-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
4147 ; AVX2-NEXT:    vzeroupper
4148 ; AVX2-NEXT:    callq __truncdfhf2
4149 ; AVX2-NEXT:    movl %eax, %ebp
4150 ; AVX2-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
4151 ; AVX2-NEXT:    callq __truncdfhf2
4152 ; AVX2-NEXT:    movl %eax, %r14d
4153 ; AVX2-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
4154 ; AVX2-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
4155 ; AVX2-NEXT:    vzeroupper
4156 ; AVX2-NEXT:    callq __truncdfhf2
4157 ; AVX2-NEXT:    movl %eax, %r15d
4158 ; AVX2-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
4159 ; AVX2-NEXT:    callq __truncdfhf2
4160 ; AVX2-NEXT:    movw %ax, 12(%rbx)
4161 ; AVX2-NEXT:    movw %r15w, 8(%rbx)
4162 ; AVX2-NEXT:    movw %r14w, 4(%rbx)
4163 ; AVX2-NEXT:    movw %bp, (%rbx)
4164 ; AVX2-NEXT:    movw %r13w, 14(%rbx)
4165 ; AVX2-NEXT:    movw %r12w, 10(%rbx)
4166 ; AVX2-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax # 2-byte Folded Reload
4167 ; AVX2-NEXT:    movw %ax, 6(%rbx)
4168 ; AVX2-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax # 2-byte Folded Reload
4169 ; AVX2-NEXT:    movw %ax, 2(%rbx)
4170 ; AVX2-NEXT:    addq $136, %rsp
4171 ; AVX2-NEXT:    popq %rbx
4172 ; AVX2-NEXT:    popq %r12
4173 ; AVX2-NEXT:    popq %r13
4174 ; AVX2-NEXT:    popq %r14
4175 ; AVX2-NEXT:    popq %r15
4176 ; AVX2-NEXT:    popq %rbp
4177 ; AVX2-NEXT:    retq
4178 ;
4179 ; AVX512-LABEL: store_cvt_8f64_to_8i16:
4180 ; AVX512:       # %bb.0:
4181 ; AVX512-NEXT:    pushq %rbp
4182 ; AVX512-NEXT:    pushq %r15
4183 ; AVX512-NEXT:    pushq %r14
4184 ; AVX512-NEXT:    pushq %r13
4185 ; AVX512-NEXT:    pushq %r12
4186 ; AVX512-NEXT:    pushq %rbx
4187 ; AVX512-NEXT:    subq $200, %rsp
4188 ; AVX512-NEXT:    movq %rdi, %rbx
4189 ; AVX512-NEXT:    vmovupd %zmm0, {{[0-9]+}}(%rsp) # 64-byte Spill
4190 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4191 ; AVX512-NEXT:    vzeroupper
4192 ; AVX512-NEXT:    callq __truncdfhf2
4193 ; AVX512-NEXT:    movw %ax, {{[0-9]+}}(%rsp) # 2-byte Spill
4194 ; AVX512-NEXT:    vmovupd {{[0-9]+}}(%rsp), %zmm0 # 64-byte Reload
4195 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
4196 ; AVX512-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
4197 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4198 ; AVX512-NEXT:    vzeroupper
4199 ; AVX512-NEXT:    callq __truncdfhf2
4200 ; AVX512-NEXT:    movw %ax, {{[0-9]+}}(%rsp) # 2-byte Spill
4201 ; AVX512-NEXT:    vmovupd {{[0-9]+}}(%rsp), %zmm0 # 64-byte Reload
4202 ; AVX512-NEXT:    vextractf64x4 $1, %zmm0, %ymm0
4203 ; AVX512-NEXT:    vmovupd %ymm0, {{[0-9]+}}(%rsp) # 32-byte Spill
4204 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4205 ; AVX512-NEXT:    vzeroupper
4206 ; AVX512-NEXT:    callq __truncdfhf2
4207 ; AVX512-NEXT:    movl %eax, %r12d
4208 ; AVX512-NEXT:    vmovupd {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
4209 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
4210 ; AVX512-NEXT:    vmovapd %xmm0, {{[0-9]+}}(%rsp) # 16-byte Spill
4211 ; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
4212 ; AVX512-NEXT:    vzeroupper
4213 ; AVX512-NEXT:    callq __truncdfhf2
4214 ; AVX512-NEXT:    movl %eax, %r13d
4215 ; AVX512-NEXT:    vmovups {{[0-9]+}}(%rsp), %zmm0 # 64-byte Reload
4216 ; AVX512-NEXT:    # kill: def %xmm0 killed %xmm0 killed %zmm0
4217 ; AVX512-NEXT:    vzeroupper
4218 ; AVX512-NEXT:    callq __truncdfhf2
4219 ; AVX512-NEXT:    movl %eax, %ebp
4220 ; AVX512-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
4221 ; AVX512-NEXT:    callq __truncdfhf2
4222 ; AVX512-NEXT:    movl %eax, %r14d
4223 ; AVX512-NEXT:    vmovups {{[0-9]+}}(%rsp), %ymm0 # 32-byte Reload
4224 ; AVX512-NEXT:    # kill: def %xmm0 killed %xmm0 killed %ymm0
4225 ; AVX512-NEXT:    vzeroupper
4226 ; AVX512-NEXT:    callq __truncdfhf2
4227 ; AVX512-NEXT:    movl %eax, %r15d
4228 ; AVX512-NEXT:    vmovaps {{[0-9]+}}(%rsp), %xmm0 # 16-byte Reload
4229 ; AVX512-NEXT:    callq __truncdfhf2
4230 ; AVX512-NEXT:    movw %ax, 12(%rbx)
4231 ; AVX512-NEXT:    movw %r15w, 8(%rbx)
4232 ; AVX512-NEXT:    movw %r14w, 4(%rbx)
4233 ; AVX512-NEXT:    movw %bp, (%rbx)
4234 ; AVX512-NEXT:    movw %r13w, 14(%rbx)
4235 ; AVX512-NEXT:    movw %r12w, 10(%rbx)
4236 ; AVX512-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax # 2-byte Folded Reload
4237 ; AVX512-NEXT:    movw %ax, 6(%rbx)
4238 ; AVX512-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax # 2-byte Folded Reload
4239 ; AVX512-NEXT:    movw %ax, 2(%rbx)
4240 ; AVX512-NEXT:    addq $200, %rsp
4241 ; AVX512-NEXT:    popq %rbx
4242 ; AVX512-NEXT:    popq %r12
4243 ; AVX512-NEXT:    popq %r13
4244 ; AVX512-NEXT:    popq %r14
4245 ; AVX512-NEXT:    popq %r15
4246 ; AVX512-NEXT:    popq %rbp
4247 ; AVX512-NEXT:    retq
4248   %1 = fptrunc <8 x double> %a0 to <8 x half>
4249   %2 = bitcast <8 x half> %1 to <8 x i16>
4250   store <8 x i16> %2, <8 x i16>* %a1
4251   ret void
4252 }