Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-half-conversions.ll
bloba360cf8ca83d0334321e89dbd6380195efe27b3d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx -verify-machineinstrs | FileCheck %s --check-prefixes=AVX,AVX1
3 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx2 -verify-machineinstrs | FileCheck %s --check-prefixes=AVX,AVX2
4 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+f16c -verify-machineinstrs | FileCheck %s --check-prefixes=F16C
5 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+f16c -verify-machineinstrs | FileCheck %s --check-prefixes=F16C
6 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+f16c,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle -verify-machineinstrs | FileCheck %s --check-prefixes=F16C
7 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+f16c,+fast-variable-perlane-shuffle -verify-machineinstrs | FileCheck %s --check-prefixes=F16C
8 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f -verify-machineinstrs | FileCheck %s --check-prefixes=AVX512,AVX512F
9 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle -verify-machineinstrs | FileCheck %s --check-prefixes=AVX512,AVX512-FASTLANE
10 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+fast-variable-perlane-shuffle -verify-machineinstrs | FileCheck %s --check-prefixes=AVX512,AVX512-FASTLANE
13 ; Half to Float
16 define float @cvt_i16_to_f32(i16 %a0) nounwind {
17 ; AVX-LABEL: cvt_i16_to_f32:
18 ; AVX:       # %bb.0:
19 ; AVX-NEXT:    vpinsrw $0, %edi, %xmm0, %xmm0
20 ; AVX-NEXT:    jmp __extendhfsf2@PLT # TAILCALL
22 ; F16C-LABEL: cvt_i16_to_f32:
23 ; F16C:       # %bb.0:
24 ; F16C-NEXT:    vmovd %edi, %xmm0
25 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
26 ; F16C-NEXT:    retq
28 ; AVX512-LABEL: cvt_i16_to_f32:
29 ; AVX512:       # %bb.0:
30 ; AVX512-NEXT:    vmovd %edi, %xmm0
31 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
32 ; AVX512-NEXT:    retq
33   %1 = bitcast i16 %a0 to half
34   %2 = fpext half %1 to float
35   ret float %2
38 define <4 x float> @cvt_4i16_to_4f32(<4 x i16> %a0) nounwind {
39 ; AVX-LABEL: cvt_4i16_to_4f32:
40 ; AVX:       # %bb.0:
41 ; AVX-NEXT:    subq $72, %rsp
42 ; AVX-NEXT:    vmovq %xmm0, %rax
43 ; AVX-NEXT:    movq %rax, %rcx
44 ; AVX-NEXT:    movq %rax, %rdx
45 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
46 ; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
47 ; AVX-NEXT:    shrl $16, %eax
48 ; AVX-NEXT:    shrq $32, %rcx
49 ; AVX-NEXT:    shrq $48, %rdx
50 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm1
51 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
52 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm1
53 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
54 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
55 ; AVX-NEXT:    vmovdqa %xmm1, (%rsp) # 16-byte Spill
56 ; AVX-NEXT:    callq __extendhfsf2@PLT
57 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
58 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
59 ; AVX-NEXT:    callq __extendhfsf2@PLT
60 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
61 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
62 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
63 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
64 ; AVX-NEXT:    callq __extendhfsf2@PLT
65 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
66 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
67 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
68 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
69 ; AVX-NEXT:    callq __extendhfsf2@PLT
70 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
71 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
72 ; AVX-NEXT:    addq $72, %rsp
73 ; AVX-NEXT:    retq
75 ; F16C-LABEL: cvt_4i16_to_4f32:
76 ; F16C:       # %bb.0:
77 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
78 ; F16C-NEXT:    retq
80 ; AVX512-LABEL: cvt_4i16_to_4f32:
81 ; AVX512:       # %bb.0:
82 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
83 ; AVX512-NEXT:    retq
84   %1 = bitcast <4 x i16> %a0 to <4 x half>
85   %2 = fpext <4 x half> %1 to <4 x float>
86   ret <4 x float> %2
89 define <4 x float> @cvt_8i16_to_4f32(<8 x i16> %a0) nounwind {
90 ; AVX-LABEL: cvt_8i16_to_4f32:
91 ; AVX:       # %bb.0:
92 ; AVX-NEXT:    subq $72, %rsp
93 ; AVX-NEXT:    vmovq %xmm0, %rax
94 ; AVX-NEXT:    movq %rax, %rcx
95 ; AVX-NEXT:    movq %rax, %rdx
96 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
97 ; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
98 ; AVX-NEXT:    shrl $16, %eax
99 ; AVX-NEXT:    shrq $32, %rcx
100 ; AVX-NEXT:    shrq $48, %rdx
101 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm1
102 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
103 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm1
104 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
105 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
106 ; AVX-NEXT:    vmovdqa %xmm1, (%rsp) # 16-byte Spill
107 ; AVX-NEXT:    callq __extendhfsf2@PLT
108 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
109 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
110 ; AVX-NEXT:    callq __extendhfsf2@PLT
111 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
112 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
113 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
114 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
115 ; AVX-NEXT:    callq __extendhfsf2@PLT
116 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
117 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
118 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
119 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
120 ; AVX-NEXT:    callq __extendhfsf2@PLT
121 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
122 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
123 ; AVX-NEXT:    addq $72, %rsp
124 ; AVX-NEXT:    retq
126 ; F16C-LABEL: cvt_8i16_to_4f32:
127 ; F16C:       # %bb.0:
128 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
129 ; F16C-NEXT:    retq
131 ; AVX512-LABEL: cvt_8i16_to_4f32:
132 ; AVX512:       # %bb.0:
133 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
134 ; AVX512-NEXT:    retq
135   %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
136   %2 = bitcast <4 x i16> %1 to <4 x half>
137   %3 = fpext <4 x half> %2 to <4 x float>
138   ret <4 x float> %3
141 define <8 x float> @cvt_8i16_to_8f32(<8 x i16> %a0) nounwind {
142 ; AVX-LABEL: cvt_8i16_to_8f32:
143 ; AVX:       # %bb.0:
144 ; AVX-NEXT:    subq $56, %rsp
145 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
146 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
147 ; AVX-NEXT:    callq __extendhfsf2@PLT
148 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
149 ; AVX-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
150 ; AVX-NEXT:    # xmm0 = mem[2,3,0,1]
151 ; AVX-NEXT:    callq __extendhfsf2@PLT
152 ; AVX-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
153 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
154 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
155 ; AVX-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
156 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
157 ; AVX-NEXT:    callq __extendhfsf2@PLT
158 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
159 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
160 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
161 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
162 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
163 ; AVX-NEXT:    callq __extendhfsf2@PLT
164 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
165 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
166 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
167 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
168 ; AVX-NEXT:    callq __extendhfsf2@PLT
169 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
170 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
171 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
172 ; AVX-NEXT:    callq __extendhfsf2@PLT
173 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
174 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
175 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
176 ; AVX-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
177 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
178 ; AVX-NEXT:    callq __extendhfsf2@PLT
179 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
180 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
181 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
182 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
183 ; AVX-NEXT:    vpsrlq $48, %xmm0, %xmm0
184 ; AVX-NEXT:    callq __extendhfsf2@PLT
185 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
186 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
187 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
188 ; AVX-NEXT:    addq $56, %rsp
189 ; AVX-NEXT:    retq
191 ; F16C-LABEL: cvt_8i16_to_8f32:
192 ; F16C:       # %bb.0:
193 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm0
194 ; F16C-NEXT:    retq
196 ; AVX512-LABEL: cvt_8i16_to_8f32:
197 ; AVX512:       # %bb.0:
198 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
199 ; AVX512-NEXT:    retq
200   %1 = bitcast <8 x i16> %a0 to <8 x half>
201   %2 = fpext <8 x half> %1 to <8 x float>
202   ret <8 x float> %2
205 define <16 x float> @cvt_16i16_to_16f32(<16 x i16> %a0) nounwind {
206 ; AVX1-LABEL: cvt_16i16_to_16f32:
207 ; AVX1:       # %bb.0:
208 ; AVX1-NEXT:    subq $104, %rsp
209 ; AVX1-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
210 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
211 ; AVX1-NEXT:    vzeroupper
212 ; AVX1-NEXT:    callq __extendhfsf2@PLT
213 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
214 ; AVX1-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
215 ; AVX1-NEXT:    # xmm0 = mem[2,3,0,1]
216 ; AVX1-NEXT:    callq __extendhfsf2@PLT
217 ; AVX1-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
218 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
219 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
220 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
221 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
222 ; AVX1-NEXT:    callq __extendhfsf2@PLT
223 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
224 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
225 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
226 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
227 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
228 ; AVX1-NEXT:    vzeroupper
229 ; AVX1-NEXT:    callq __extendhfsf2@PLT
230 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
231 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
232 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
233 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
234 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
235 ; AVX1-NEXT:    vzeroupper
236 ; AVX1-NEXT:    callq __extendhfsf2@PLT
237 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
238 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
239 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
240 ; AVX1-NEXT:    vzeroupper
241 ; AVX1-NEXT:    callq __extendhfsf2@PLT
242 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
243 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
244 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
245 ; AVX1-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
246 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
247 ; AVX1-NEXT:    callq __extendhfsf2@PLT
248 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
249 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
250 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
251 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
252 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
253 ; AVX1-NEXT:    vzeroupper
254 ; AVX1-NEXT:    callq __extendhfsf2@PLT
255 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
256 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
257 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
258 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
259 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
260 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
261 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
262 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
263 ; AVX1-NEXT:    vzeroupper
264 ; AVX1-NEXT:    callq __extendhfsf2@PLT
265 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
266 ; AVX1-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
267 ; AVX1-NEXT:    # xmm0 = mem[2,3,0,1]
268 ; AVX1-NEXT:    callq __extendhfsf2@PLT
269 ; AVX1-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
270 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
271 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
272 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
273 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
274 ; AVX1-NEXT:    callq __extendhfsf2@PLT
275 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
276 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
277 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
278 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
279 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
280 ; AVX1-NEXT:    callq __extendhfsf2@PLT
281 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
282 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
283 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
284 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
285 ; AVX1-NEXT:    callq __extendhfsf2@PLT
286 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
287 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
288 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
289 ; AVX1-NEXT:    callq __extendhfsf2@PLT
290 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
291 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
292 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
293 ; AVX1-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
294 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
295 ; AVX1-NEXT:    callq __extendhfsf2@PLT
296 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
297 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
298 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
299 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
300 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
301 ; AVX1-NEXT:    callq __extendhfsf2@PLT
302 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
303 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
304 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
305 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
306 ; AVX1-NEXT:    addq $104, %rsp
307 ; AVX1-NEXT:    retq
309 ; AVX2-LABEL: cvt_16i16_to_16f32:
310 ; AVX2:       # %bb.0:
311 ; AVX2-NEXT:    subq $104, %rsp
312 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
313 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
314 ; AVX2-NEXT:    vzeroupper
315 ; AVX2-NEXT:    callq __extendhfsf2@PLT
316 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
317 ; AVX2-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
318 ; AVX2-NEXT:    # xmm0 = mem[2,3,0,1]
319 ; AVX2-NEXT:    callq __extendhfsf2@PLT
320 ; AVX2-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
321 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
322 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
323 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
324 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
325 ; AVX2-NEXT:    callq __extendhfsf2@PLT
326 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
327 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
328 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
329 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
330 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
331 ; AVX2-NEXT:    vzeroupper
332 ; AVX2-NEXT:    callq __extendhfsf2@PLT
333 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
334 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
335 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
336 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
337 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
338 ; AVX2-NEXT:    vzeroupper
339 ; AVX2-NEXT:    callq __extendhfsf2@PLT
340 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
341 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
342 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
343 ; AVX2-NEXT:    vzeroupper
344 ; AVX2-NEXT:    callq __extendhfsf2@PLT
345 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
346 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
347 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
348 ; AVX2-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
349 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
350 ; AVX2-NEXT:    callq __extendhfsf2@PLT
351 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
352 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
353 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
354 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
355 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
356 ; AVX2-NEXT:    vzeroupper
357 ; AVX2-NEXT:    callq __extendhfsf2@PLT
358 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
359 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
360 ; AVX2-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
361 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
362 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
363 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
364 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
365 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
366 ; AVX2-NEXT:    vzeroupper
367 ; AVX2-NEXT:    callq __extendhfsf2@PLT
368 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
369 ; AVX2-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
370 ; AVX2-NEXT:    # xmm0 = mem[2,3,0,1]
371 ; AVX2-NEXT:    callq __extendhfsf2@PLT
372 ; AVX2-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
373 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
374 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
375 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
376 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
377 ; AVX2-NEXT:    callq __extendhfsf2@PLT
378 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
379 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
380 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
381 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
382 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
383 ; AVX2-NEXT:    callq __extendhfsf2@PLT
384 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
385 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
386 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
387 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
388 ; AVX2-NEXT:    callq __extendhfsf2@PLT
389 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
390 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
391 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
392 ; AVX2-NEXT:    callq __extendhfsf2@PLT
393 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
394 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
395 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
396 ; AVX2-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
397 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
398 ; AVX2-NEXT:    callq __extendhfsf2@PLT
399 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
400 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
401 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
402 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
403 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
404 ; AVX2-NEXT:    callq __extendhfsf2@PLT
405 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
406 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
407 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
408 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
409 ; AVX2-NEXT:    addq $104, %rsp
410 ; AVX2-NEXT:    retq
412 ; F16C-LABEL: cvt_16i16_to_16f32:
413 ; F16C:       # %bb.0:
414 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm2
415 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
416 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm1
417 ; F16C-NEXT:    vmovaps %ymm2, %ymm0
418 ; F16C-NEXT:    retq
420 ; AVX512-LABEL: cvt_16i16_to_16f32:
421 ; AVX512:       # %bb.0:
422 ; AVX512-NEXT:    vcvtph2ps %ymm0, %zmm0
423 ; AVX512-NEXT:    retq
424   %1 = bitcast <16 x i16> %a0 to <16 x half>
425   %2 = fpext <16 x half> %1 to <16 x float>
426   ret <16 x float> %2
429 define <2 x float> @cvt_2i16_to_2f32_constrained(<2 x i16> %a0) nounwind strictfp {
430 ; AVX-LABEL: cvt_2i16_to_2f32_constrained:
431 ; AVX:       # %bb.0:
432 ; AVX-NEXT:    subq $40, %rsp
433 ; AVX-NEXT:    vmovd %xmm0, %eax
434 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
435 ; AVX-NEXT:    shrl $16, %eax
436 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
437 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
438 ; AVX-NEXT:    callq __extendhfsf2@PLT
439 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
440 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
441 ; AVX-NEXT:    callq __extendhfsf2@PLT
442 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
443 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
444 ; AVX-NEXT:    addq $40, %rsp
445 ; AVX-NEXT:    retq
447 ; F16C-LABEL: cvt_2i16_to_2f32_constrained:
448 ; F16C:       # %bb.0:
449 ; F16C-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
450 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
451 ; F16C-NEXT:    retq
453 ; AVX512-LABEL: cvt_2i16_to_2f32_constrained:
454 ; AVX512:       # %bb.0:
455 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
456 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
457 ; AVX512-NEXT:    retq
458   %1 = bitcast <2 x i16> %a0 to <2 x half>
459   %2 = call <2 x float> @llvm.experimental.constrained.fpext.v2f32.v2f16(<2 x half> %1, metadata !"fpexcept.strict") strictfp
460   ret <2 x float> %2
462 declare <2 x float> @llvm.experimental.constrained.fpext.v2f32.v2f16(<2 x half>, metadata) strictfp
464 define <4 x float> @cvt_4i16_to_4f32_constrained(<4 x i16> %a0) nounwind strictfp {
465 ; AVX-LABEL: cvt_4i16_to_4f32_constrained:
466 ; AVX:       # %bb.0:
467 ; AVX-NEXT:    subq $72, %rsp
468 ; AVX-NEXT:    vmovq %xmm0, %rax
469 ; AVX-NEXT:    movq %rax, %rcx
470 ; AVX-NEXT:    movq %rax, %rdx
471 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
472 ; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
473 ; AVX-NEXT:    shrl $16, %eax
474 ; AVX-NEXT:    shrq $32, %rcx
475 ; AVX-NEXT:    shrq $48, %rdx
476 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm1
477 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
478 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm1
479 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
480 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
481 ; AVX-NEXT:    vmovdqa %xmm1, (%rsp) # 16-byte Spill
482 ; AVX-NEXT:    callq __extendhfsf2@PLT
483 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
484 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
485 ; AVX-NEXT:    callq __extendhfsf2@PLT
486 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
487 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
488 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
489 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
490 ; AVX-NEXT:    callq __extendhfsf2@PLT
491 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
492 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
493 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
494 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
495 ; AVX-NEXT:    callq __extendhfsf2@PLT
496 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
497 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
498 ; AVX-NEXT:    addq $72, %rsp
499 ; AVX-NEXT:    retq
501 ; F16C-LABEL: cvt_4i16_to_4f32_constrained:
502 ; F16C:       # %bb.0:
503 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
504 ; F16C-NEXT:    retq
506 ; AVX512-LABEL: cvt_4i16_to_4f32_constrained:
507 ; AVX512:       # %bb.0:
508 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
509 ; AVX512-NEXT:    retq
510   %1 = bitcast <4 x i16> %a0 to <4 x half>
511   %2 = call <4 x float> @llvm.experimental.constrained.fpext.v4f32.v4f16(<4 x half> %1, metadata !"fpexcept.strict") strictfp
512   ret <4 x float> %2
514 declare <4 x float> @llvm.experimental.constrained.fpext.v4f32.v4f16(<4 x half>, metadata) strictfp
516 define <8 x float> @cvt_8i16_to_8f32_constrained(<8 x i16> %a0) nounwind strictfp {
517 ; AVX-LABEL: cvt_8i16_to_8f32_constrained:
518 ; AVX:       # %bb.0:
519 ; AVX-NEXT:    subq $56, %rsp
520 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
521 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
522 ; AVX-NEXT:    callq __extendhfsf2@PLT
523 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
524 ; AVX-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
525 ; AVX-NEXT:    # xmm0 = mem[2,3,0,1]
526 ; AVX-NEXT:    callq __extendhfsf2@PLT
527 ; AVX-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
528 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
529 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
530 ; AVX-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
531 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
532 ; AVX-NEXT:    callq __extendhfsf2@PLT
533 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
534 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
535 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
536 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
537 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
538 ; AVX-NEXT:    callq __extendhfsf2@PLT
539 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
540 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
541 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
542 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
543 ; AVX-NEXT:    callq __extendhfsf2@PLT
544 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
545 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
546 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
547 ; AVX-NEXT:    callq __extendhfsf2@PLT
548 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
549 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
550 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
551 ; AVX-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
552 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
553 ; AVX-NEXT:    callq __extendhfsf2@PLT
554 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
555 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
556 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
557 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
558 ; AVX-NEXT:    vpsrlq $48, %xmm0, %xmm0
559 ; AVX-NEXT:    callq __extendhfsf2@PLT
560 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
561 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
562 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
563 ; AVX-NEXT:    addq $56, %rsp
564 ; AVX-NEXT:    retq
566 ; F16C-LABEL: cvt_8i16_to_8f32_constrained:
567 ; F16C:       # %bb.0:
568 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm0
569 ; F16C-NEXT:    retq
571 ; AVX512-LABEL: cvt_8i16_to_8f32_constrained:
572 ; AVX512:       # %bb.0:
573 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
574 ; AVX512-NEXT:    retq
575   %1 = bitcast <8 x i16> %a0 to <8 x half>
576   %2 = call <8 x float> @llvm.experimental.constrained.fpext.v8f32.v8f16(<8 x half> %1, metadata !"fpexcept.strict") strictfp
577   ret <8 x float> %2
579 declare <8 x float> @llvm.experimental.constrained.fpext.v8f32.v8f16(<8 x half>, metadata) strictfp
581 define <16 x float> @cvt_16i16_to_16f32_constrained(<16 x i16> %a0) nounwind strictfp {
582 ; AVX1-LABEL: cvt_16i16_to_16f32_constrained:
583 ; AVX1:       # %bb.0:
584 ; AVX1-NEXT:    subq $104, %rsp
585 ; AVX1-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
586 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
587 ; AVX1-NEXT:    vzeroupper
588 ; AVX1-NEXT:    callq __extendhfsf2@PLT
589 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
590 ; AVX1-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
591 ; AVX1-NEXT:    # xmm0 = mem[2,3,0,1]
592 ; AVX1-NEXT:    callq __extendhfsf2@PLT
593 ; AVX1-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
594 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
595 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
596 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
597 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
598 ; AVX1-NEXT:    callq __extendhfsf2@PLT
599 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
600 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
601 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
602 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
603 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
604 ; AVX1-NEXT:    vzeroupper
605 ; AVX1-NEXT:    callq __extendhfsf2@PLT
606 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
607 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
608 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
609 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
610 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
611 ; AVX1-NEXT:    vzeroupper
612 ; AVX1-NEXT:    callq __extendhfsf2@PLT
613 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
614 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
615 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
616 ; AVX1-NEXT:    vzeroupper
617 ; AVX1-NEXT:    callq __extendhfsf2@PLT
618 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
619 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
620 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
621 ; AVX1-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
622 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
623 ; AVX1-NEXT:    callq __extendhfsf2@PLT
624 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
625 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
626 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
627 ; AVX1-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
628 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
629 ; AVX1-NEXT:    vzeroupper
630 ; AVX1-NEXT:    callq __extendhfsf2@PLT
631 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
632 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
633 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
634 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
635 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
636 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
637 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
638 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
639 ; AVX1-NEXT:    vzeroupper
640 ; AVX1-NEXT:    callq __extendhfsf2@PLT
641 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
642 ; AVX1-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
643 ; AVX1-NEXT:    # xmm0 = mem[2,3,0,1]
644 ; AVX1-NEXT:    callq __extendhfsf2@PLT
645 ; AVX1-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
646 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
647 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
648 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
649 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
650 ; AVX1-NEXT:    callq __extendhfsf2@PLT
651 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
652 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
653 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
654 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
655 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
656 ; AVX1-NEXT:    callq __extendhfsf2@PLT
657 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
658 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
659 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
660 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
661 ; AVX1-NEXT:    callq __extendhfsf2@PLT
662 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
663 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
664 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
665 ; AVX1-NEXT:    callq __extendhfsf2@PLT
666 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
667 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
668 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
669 ; AVX1-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
670 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
671 ; AVX1-NEXT:    callq __extendhfsf2@PLT
672 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
673 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
674 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
675 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
676 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
677 ; AVX1-NEXT:    callq __extendhfsf2@PLT
678 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
679 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
680 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
681 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
682 ; AVX1-NEXT:    addq $104, %rsp
683 ; AVX1-NEXT:    retq
685 ; AVX2-LABEL: cvt_16i16_to_16f32_constrained:
686 ; AVX2:       # %bb.0:
687 ; AVX2-NEXT:    subq $104, %rsp
688 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
689 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
690 ; AVX2-NEXT:    vzeroupper
691 ; AVX2-NEXT:    callq __extendhfsf2@PLT
692 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
693 ; AVX2-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
694 ; AVX2-NEXT:    # xmm0 = mem[2,3,0,1]
695 ; AVX2-NEXT:    callq __extendhfsf2@PLT
696 ; AVX2-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
697 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
698 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
699 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
700 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
701 ; AVX2-NEXT:    callq __extendhfsf2@PLT
702 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
703 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
704 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
705 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
706 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
707 ; AVX2-NEXT:    vzeroupper
708 ; AVX2-NEXT:    callq __extendhfsf2@PLT
709 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
710 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
711 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
712 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
713 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
714 ; AVX2-NEXT:    vzeroupper
715 ; AVX2-NEXT:    callq __extendhfsf2@PLT
716 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
717 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
718 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
719 ; AVX2-NEXT:    vzeroupper
720 ; AVX2-NEXT:    callq __extendhfsf2@PLT
721 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
722 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
723 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
724 ; AVX2-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
725 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
726 ; AVX2-NEXT:    callq __extendhfsf2@PLT
727 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
728 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
729 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
730 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
731 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
732 ; AVX2-NEXT:    vzeroupper
733 ; AVX2-NEXT:    callq __extendhfsf2@PLT
734 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
735 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
736 ; AVX2-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
737 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
738 ; AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
739 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
740 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
741 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
742 ; AVX2-NEXT:    vzeroupper
743 ; AVX2-NEXT:    callq __extendhfsf2@PLT
744 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
745 ; AVX2-NEXT:    vpermilps $78, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
746 ; AVX2-NEXT:    # xmm0 = mem[2,3,0,1]
747 ; AVX2-NEXT:    callq __extendhfsf2@PLT
748 ; AVX2-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
749 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
750 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
751 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
752 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
753 ; AVX2-NEXT:    callq __extendhfsf2@PLT
754 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
755 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
756 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
757 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
758 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
759 ; AVX2-NEXT:    callq __extendhfsf2@PLT
760 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
761 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
762 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
763 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
764 ; AVX2-NEXT:    callq __extendhfsf2@PLT
765 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
766 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
767 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
768 ; AVX2-NEXT:    callq __extendhfsf2@PLT
769 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
770 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
771 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
772 ; AVX2-NEXT:    vpermilps $245, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
773 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
774 ; AVX2-NEXT:    callq __extendhfsf2@PLT
775 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
776 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
777 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
778 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
779 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
780 ; AVX2-NEXT:    callq __extendhfsf2@PLT
781 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
782 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
783 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
784 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
785 ; AVX2-NEXT:    addq $104, %rsp
786 ; AVX2-NEXT:    retq
788 ; F16C-LABEL: cvt_16i16_to_16f32_constrained:
789 ; F16C:       # %bb.0:
790 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm1
791 ; F16C-NEXT:    vcvtph2ps %xmm1, %ymm1
792 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm0
793 ; F16C-NEXT:    retq
795 ; AVX512-LABEL: cvt_16i16_to_16f32_constrained:
796 ; AVX512:       # %bb.0:
797 ; AVX512-NEXT:    vcvtph2ps %ymm0, %zmm0
798 ; AVX512-NEXT:    retq
799   %1 = bitcast <16 x i16> %a0 to <16 x half>
800   %2 = call <16 x float> @llvm.experimental.constrained.fpext.v16f32.v16f16(<16 x half> %1, metadata !"fpexcept.strict") strictfp
801   ret <16 x float> %2
803 declare <16 x float> @llvm.experimental.constrained.fpext.v16f32.v16f16(<16 x half>, metadata) strictfp
806 ; Half to Float (Load)
809 define float @load_cvt_i16_to_f32(ptr %a0) nounwind {
810 ; AVX-LABEL: load_cvt_i16_to_f32:
811 ; AVX:       # %bb.0:
812 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
813 ; AVX-NEXT:    jmp __extendhfsf2@PLT # TAILCALL
815 ; F16C-LABEL: load_cvt_i16_to_f32:
816 ; F16C:       # %bb.0:
817 ; F16C-NEXT:    movzwl (%rdi), %eax
818 ; F16C-NEXT:    vmovd %eax, %xmm0
819 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
820 ; F16C-NEXT:    retq
822 ; AVX512-LABEL: load_cvt_i16_to_f32:
823 ; AVX512:       # %bb.0:
824 ; AVX512-NEXT:    movzwl (%rdi), %eax
825 ; AVX512-NEXT:    vmovd %eax, %xmm0
826 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
827 ; AVX512-NEXT:    retq
828   %1 = load i16, ptr %a0
829   %2 = bitcast i16 %1 to half
830   %3 = fpext half %2 to float
831   ret float %3
834 define <4 x float> @load_cvt_4i16_to_4f32(ptr %a0) nounwind {
835 ; AVX-LABEL: load_cvt_4i16_to_4f32:
836 ; AVX:       # %bb.0:
837 ; AVX-NEXT:    subq $72, %rsp
838 ; AVX-NEXT:    vpinsrw $0, 6(%rdi), %xmm0, %xmm0
839 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
840 ; AVX-NEXT:    vpinsrw $0, 4(%rdi), %xmm0, %xmm0
841 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
842 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
843 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
844 ; AVX-NEXT:    vpinsrw $0, 2(%rdi), %xmm0, %xmm0
845 ; AVX-NEXT:    callq __extendhfsf2@PLT
846 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
847 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
848 ; AVX-NEXT:    callq __extendhfsf2@PLT
849 ; AVX-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
850 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
851 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
852 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
853 ; AVX-NEXT:    callq __extendhfsf2@PLT
854 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
855 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
856 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
857 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
858 ; AVX-NEXT:    callq __extendhfsf2@PLT
859 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
860 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
861 ; AVX-NEXT:    addq $72, %rsp
862 ; AVX-NEXT:    retq
864 ; F16C-LABEL: load_cvt_4i16_to_4f32:
865 ; F16C:       # %bb.0:
866 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
867 ; F16C-NEXT:    retq
869 ; AVX512-LABEL: load_cvt_4i16_to_4f32:
870 ; AVX512:       # %bb.0:
871 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
872 ; AVX512-NEXT:    retq
873   %1 = load <4 x i16>, ptr %a0
874   %2 = bitcast <4 x i16> %1 to <4 x half>
875   %3 = fpext <4 x half> %2 to <4 x float>
876   ret <4 x float> %3
879 define <4 x float> @load_cvt_8i16_to_4f32(ptr %a0) nounwind {
880 ; AVX-LABEL: load_cvt_8i16_to_4f32:
881 ; AVX:       # %bb.0:
882 ; AVX-NEXT:    subq $72, %rsp
883 ; AVX-NEXT:    movq (%rdi), %rax
884 ; AVX-NEXT:    movq %rax, %rcx
885 ; AVX-NEXT:    movq %rax, %rdx
886 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
887 ; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
888 ; AVX-NEXT:    shrl $16, %eax
889 ; AVX-NEXT:    shrq $32, %rcx
890 ; AVX-NEXT:    shrq $48, %rdx
891 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm1
892 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
893 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm1
894 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
895 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
896 ; AVX-NEXT:    vmovdqa %xmm1, (%rsp) # 16-byte Spill
897 ; AVX-NEXT:    callq __extendhfsf2@PLT
898 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
899 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
900 ; AVX-NEXT:    callq __extendhfsf2@PLT
901 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
902 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
903 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
904 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
905 ; AVX-NEXT:    callq __extendhfsf2@PLT
906 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
907 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
908 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
909 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
910 ; AVX-NEXT:    callq __extendhfsf2@PLT
911 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
912 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
913 ; AVX-NEXT:    addq $72, %rsp
914 ; AVX-NEXT:    retq
916 ; F16C-LABEL: load_cvt_8i16_to_4f32:
917 ; F16C:       # %bb.0:
918 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
919 ; F16C-NEXT:    retq
921 ; AVX512-LABEL: load_cvt_8i16_to_4f32:
922 ; AVX512:       # %bb.0:
923 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
924 ; AVX512-NEXT:    retq
925   %1 = load <8 x i16>, ptr %a0
926   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
927   %3 = bitcast <4 x i16> %2 to <4 x half>
928   %4 = fpext <4 x half> %3 to <4 x float>
929   ret <4 x float> %4
932 define <8 x float> @load_cvt_8i16_to_8f32(ptr %a0) nounwind {
933 ; AVX1-LABEL: load_cvt_8i16_to_8f32:
934 ; AVX1:       # %bb.0:
935 ; AVX1-NEXT:    pushq %rbx
936 ; AVX1-NEXT:    subq $48, %rsp
937 ; AVX1-NEXT:    movq %rdi, %rbx
938 ; AVX1-NEXT:    vmovaps (%rdi), %xmm0
939 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
940 ; AVX1-NEXT:    vbroadcastss 8(%rdi), %xmm0
941 ; AVX1-NEXT:    callq __extendhfsf2@PLT
942 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
943 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
944 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
945 ; AVX1-NEXT:    callq __extendhfsf2@PLT
946 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
947 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
948 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
949 ; AVX1-NEXT:    vbroadcastss 12(%rbx), %xmm0
950 ; AVX1-NEXT:    callq __extendhfsf2@PLT
951 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
952 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
953 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
954 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
955 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
956 ; AVX1-NEXT:    callq __extendhfsf2@PLT
957 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
958 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
959 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
960 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
961 ; AVX1-NEXT:    callq __extendhfsf2@PLT
962 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
963 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
964 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
965 ; AVX1-NEXT:    callq __extendhfsf2@PLT
966 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
967 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
968 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
969 ; AVX1-NEXT:    vbroadcastss 4(%rbx), %xmm0
970 ; AVX1-NEXT:    callq __extendhfsf2@PLT
971 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
972 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
973 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
974 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
975 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
976 ; AVX1-NEXT:    callq __extendhfsf2@PLT
977 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
978 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
979 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
980 ; AVX1-NEXT:    addq $48, %rsp
981 ; AVX1-NEXT:    popq %rbx
982 ; AVX1-NEXT:    retq
984 ; AVX2-LABEL: load_cvt_8i16_to_8f32:
985 ; AVX2:       # %bb.0:
986 ; AVX2-NEXT:    pushq %rbx
987 ; AVX2-NEXT:    subq $48, %rsp
988 ; AVX2-NEXT:    movq %rdi, %rbx
989 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
990 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
991 ; AVX2-NEXT:    vpinsrw $0, 8(%rdi), %xmm0, %xmm0
992 ; AVX2-NEXT:    callq __extendhfsf2@PLT
993 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
994 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
995 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
996 ; AVX2-NEXT:    callq __extendhfsf2@PLT
997 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
998 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
999 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1000 ; AVX2-NEXT:    vpinsrw $0, 12(%rbx), %xmm0, %xmm0
1001 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1002 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1003 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1004 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1005 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1006 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1007 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1008 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1009 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1010 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1011 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1012 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1013 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1014 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1015 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
1016 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1017 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1018 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1019 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1020 ; AVX2-NEXT:    vpinsrw $0, 4(%rbx), %xmm0, %xmm0
1021 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1022 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1023 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1024 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1025 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1026 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
1027 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1028 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1029 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1030 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1031 ; AVX2-NEXT:    addq $48, %rsp
1032 ; AVX2-NEXT:    popq %rbx
1033 ; AVX2-NEXT:    retq
1035 ; F16C-LABEL: load_cvt_8i16_to_8f32:
1036 ; F16C:       # %bb.0:
1037 ; F16C-NEXT:    vcvtph2ps (%rdi), %ymm0
1038 ; F16C-NEXT:    retq
1040 ; AVX512-LABEL: load_cvt_8i16_to_8f32:
1041 ; AVX512:       # %bb.0:
1042 ; AVX512-NEXT:    vcvtph2ps (%rdi), %ymm0
1043 ; AVX512-NEXT:    retq
1044   %1 = load <8 x i16>, ptr %a0
1045   %2 = bitcast <8 x i16> %1 to <8 x half>
1046   %3 = fpext <8 x half> %2 to <8 x float>
1047   ret <8 x float> %3
1050 define <16 x float> @load_cvt_16i16_to_16f32(ptr %a0) nounwind {
1051 ; AVX1-LABEL: load_cvt_16i16_to_16f32:
1052 ; AVX1:       # %bb.0:
1053 ; AVX1-NEXT:    pushq %rbx
1054 ; AVX1-NEXT:    subq $80, %rsp
1055 ; AVX1-NEXT:    movq %rdi, %rbx
1056 ; AVX1-NEXT:    vbroadcastss 8(%rdi), %xmm0
1057 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1058 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1059 ; AVX1-NEXT:    vmovdqa (%rbx), %xmm1
1060 ; AVX1-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1061 ; AVX1-NEXT:    vmovaps 16(%rbx), %xmm0
1062 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1063 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1064 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1065 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1066 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1067 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1068 ; AVX1-NEXT:    vbroadcastss 12(%rbx), %xmm0
1069 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1070 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1071 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1072 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1073 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1074 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1075 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1076 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1077 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1078 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1079 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1080 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1081 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1082 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1083 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
1084 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1085 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1086 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1087 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1088 ; AVX1-NEXT:    vbroadcastss 4(%rbx), %xmm0
1089 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1090 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1091 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1092 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1093 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1094 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
1095 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1096 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1097 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1098 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1099 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
1100 ; AVX1-NEXT:    vbroadcastss 24(%rbx), %xmm0
1101 ; AVX1-NEXT:    vzeroupper
1102 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1103 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1104 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1105 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1106 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1107 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1108 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1109 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1110 ; AVX1-NEXT:    vbroadcastss 28(%rbx), %xmm0
1111 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1112 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1113 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1114 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1115 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1116 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1117 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1118 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1119 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1120 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1121 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1122 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1123 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1124 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1125 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
1126 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1127 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1128 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1129 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1130 ; AVX1-NEXT:    vbroadcastss 20(%rbx), %xmm0
1131 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1132 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1133 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1134 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1135 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1136 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
1137 ; AVX1-NEXT:    callq __extendhfsf2@PLT
1138 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1139 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1140 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
1141 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
1142 ; AVX1-NEXT:    addq $80, %rsp
1143 ; AVX1-NEXT:    popq %rbx
1144 ; AVX1-NEXT:    retq
1146 ; AVX2-LABEL: load_cvt_16i16_to_16f32:
1147 ; AVX2:       # %bb.0:
1148 ; AVX2-NEXT:    pushq %rbx
1149 ; AVX2-NEXT:    subq $80, %rsp
1150 ; AVX2-NEXT:    movq %rdi, %rbx
1151 ; AVX2-NEXT:    vpinsrw $0, 8(%rdi), %xmm0, %xmm0
1152 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1153 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1154 ; AVX2-NEXT:    vmovdqa (%rbx), %xmm1
1155 ; AVX2-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1156 ; AVX2-NEXT:    vmovaps 16(%rbx), %xmm0
1157 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1158 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1159 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1160 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1161 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1162 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1163 ; AVX2-NEXT:    vpinsrw $0, 12(%rbx), %xmm0, %xmm0
1164 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1165 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1166 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1167 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1168 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1169 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1170 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1171 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1172 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1173 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1174 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1175 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1176 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1177 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1178 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
1179 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1180 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1181 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1182 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1183 ; AVX2-NEXT:    vpinsrw $0, 4(%rbx), %xmm0, %xmm0
1184 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1185 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1186 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1187 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1188 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1189 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
1190 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1191 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1192 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1193 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1194 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
1195 ; AVX2-NEXT:    vpinsrw $0, 24(%rbx), %xmm0, %xmm0
1196 ; AVX2-NEXT:    vzeroupper
1197 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1198 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1199 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1200 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1201 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1202 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1203 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1204 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1205 ; AVX2-NEXT:    vpinsrw $0, 28(%rbx), %xmm0, %xmm0
1206 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1207 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1208 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1209 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1210 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1211 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1212 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1213 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1214 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1215 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1216 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1217 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1218 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1219 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1220 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
1221 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1222 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1223 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1224 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1225 ; AVX2-NEXT:    vpinsrw $0, 20(%rbx), %xmm0, %xmm0
1226 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1227 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1228 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1229 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1230 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1231 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
1232 ; AVX2-NEXT:    callq __extendhfsf2@PLT
1233 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1234 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1235 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
1236 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
1237 ; AVX2-NEXT:    addq $80, %rsp
1238 ; AVX2-NEXT:    popq %rbx
1239 ; AVX2-NEXT:    retq
1241 ; F16C-LABEL: load_cvt_16i16_to_16f32:
1242 ; F16C:       # %bb.0:
1243 ; F16C-NEXT:    vcvtph2ps (%rdi), %ymm0
1244 ; F16C-NEXT:    vcvtph2ps 16(%rdi), %ymm1
1245 ; F16C-NEXT:    retq
1247 ; AVX512-LABEL: load_cvt_16i16_to_16f32:
1248 ; AVX512:       # %bb.0:
1249 ; AVX512-NEXT:    vcvtph2ps (%rdi), %zmm0
1250 ; AVX512-NEXT:    retq
1251   %1 = load <16 x i16>, ptr %a0
1252   %2 = bitcast <16 x i16> %1 to <16 x half>
1253   %3 = fpext <16 x half> %2 to <16 x float>
1254   ret <16 x float> %3
1257 define <4 x float> @load_cvt_4i16_to_4f32_constrained(ptr %a0) nounwind strictfp {
1258 ; AVX-LABEL: load_cvt_4i16_to_4f32_constrained:
1259 ; AVX:       # %bb.0:
1260 ; AVX-NEXT:    subq $72, %rsp
1261 ; AVX-NEXT:    vpinsrw $0, 6(%rdi), %xmm0, %xmm0
1262 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1263 ; AVX-NEXT:    vpinsrw $0, 4(%rdi), %xmm0, %xmm0
1264 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1265 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
1266 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1267 ; AVX-NEXT:    vpinsrw $0, 2(%rdi), %xmm0, %xmm0
1268 ; AVX-NEXT:    callq __extendhfsf2@PLT
1269 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1270 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1271 ; AVX-NEXT:    callq __extendhfsf2@PLT
1272 ; AVX-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1273 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
1274 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1275 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1276 ; AVX-NEXT:    callq __extendhfsf2@PLT
1277 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1278 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1279 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1280 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1281 ; AVX-NEXT:    callq __extendhfsf2@PLT
1282 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1283 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1284 ; AVX-NEXT:    addq $72, %rsp
1285 ; AVX-NEXT:    retq
1287 ; F16C-LABEL: load_cvt_4i16_to_4f32_constrained:
1288 ; F16C:       # %bb.0:
1289 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
1290 ; F16C-NEXT:    retq
1292 ; AVX512-LABEL: load_cvt_4i16_to_4f32_constrained:
1293 ; AVX512:       # %bb.0:
1294 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
1295 ; AVX512-NEXT:    retq
1296   %1 = load <4 x i16>, ptr %a0
1297   %2 = bitcast <4 x i16> %1 to <4 x half>
1298   %3 = call <4 x float> @llvm.experimental.constrained.fpext.v4f32.v4f16(<4 x half> %2, metadata !"fpexcept.strict") strictfp
1299   ret <4 x float> %3
1302 define <4 x float> @load_cvt_8i16_to_4f32_constrained(ptr %a0) nounwind strictfp {
1303 ; AVX-LABEL: load_cvt_8i16_to_4f32_constrained:
1304 ; AVX:       # %bb.0:
1305 ; AVX-NEXT:    subq $72, %rsp
1306 ; AVX-NEXT:    movq (%rdi), %rax
1307 ; AVX-NEXT:    movq %rax, %rcx
1308 ; AVX-NEXT:    movq %rax, %rdx
1309 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1310 ; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
1311 ; AVX-NEXT:    shrl $16, %eax
1312 ; AVX-NEXT:    shrq $32, %rcx
1313 ; AVX-NEXT:    shrq $48, %rdx
1314 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm1
1315 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1316 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm1
1317 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1318 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
1319 ; AVX-NEXT:    vmovdqa %xmm1, (%rsp) # 16-byte Spill
1320 ; AVX-NEXT:    callq __extendhfsf2@PLT
1321 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1322 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1323 ; AVX-NEXT:    callq __extendhfsf2@PLT
1324 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1325 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
1326 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1327 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1328 ; AVX-NEXT:    callq __extendhfsf2@PLT
1329 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1330 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
1331 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1332 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1333 ; AVX-NEXT:    callq __extendhfsf2@PLT
1334 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1335 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]
1336 ; AVX-NEXT:    addq $72, %rsp
1337 ; AVX-NEXT:    retq
1339 ; F16C-LABEL: load_cvt_8i16_to_4f32_constrained:
1340 ; F16C:       # %bb.0:
1341 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
1342 ; F16C-NEXT:    retq
1344 ; AVX512-LABEL: load_cvt_8i16_to_4f32_constrained:
1345 ; AVX512:       # %bb.0:
1346 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
1347 ; AVX512-NEXT:    retq
1348   %1 = load <8 x i16>, ptr %a0
1349   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1350   %3 = bitcast <4 x i16> %2 to <4 x half>
1351   %4 = call <4 x float> @llvm.experimental.constrained.fpext.v4f32.v4f16(<4 x half> %3, metadata !"fpexcept.strict") strictfp
1352   ret <4 x float> %4
1356 ; Half to Double
1359 define double @cvt_i16_to_f64(i16 %a0) nounwind {
1360 ; AVX-LABEL: cvt_i16_to_f64:
1361 ; AVX:       # %bb.0:
1362 ; AVX-NEXT:    pushq %rax
1363 ; AVX-NEXT:    vpinsrw $0, %edi, %xmm0, %xmm0
1364 ; AVX-NEXT:    callq __extendhfsf2@PLT
1365 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1366 ; AVX-NEXT:    popq %rax
1367 ; AVX-NEXT:    retq
1369 ; F16C-LABEL: cvt_i16_to_f64:
1370 ; F16C:       # %bb.0:
1371 ; F16C-NEXT:    vmovd %edi, %xmm0
1372 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1373 ; F16C-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1374 ; F16C-NEXT:    retq
1376 ; AVX512-LABEL: cvt_i16_to_f64:
1377 ; AVX512:       # %bb.0:
1378 ; AVX512-NEXT:    vmovd %edi, %xmm0
1379 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1380 ; AVX512-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1381 ; AVX512-NEXT:    retq
1382   %1 = bitcast i16 %a0 to half
1383   %2 = fpext half %1 to double
1384   ret double %2
1387 define <2 x double> @cvt_2i16_to_2f64(<2 x i16> %a0) nounwind {
1388 ; AVX-LABEL: cvt_2i16_to_2f64:
1389 ; AVX:       # %bb.0:
1390 ; AVX-NEXT:    subq $40, %rsp
1391 ; AVX-NEXT:    vmovd %xmm0, %eax
1392 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1393 ; AVX-NEXT:    shrl $16, %eax
1394 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
1395 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1396 ; AVX-NEXT:    callq __extendhfsf2@PLT
1397 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1398 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1399 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1400 ; AVX-NEXT:    callq __extendhfsf2@PLT
1401 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1402 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1403 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1404 ; AVX-NEXT:    addq $40, %rsp
1405 ; AVX-NEXT:    retq
1407 ; F16C-LABEL: cvt_2i16_to_2f64:
1408 ; F16C:       # %bb.0:
1409 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1410 ; F16C-NEXT:    vcvtps2pd %xmm0, %xmm0
1411 ; F16C-NEXT:    retq
1413 ; AVX512-LABEL: cvt_2i16_to_2f64:
1414 ; AVX512:       # %bb.0:
1415 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1416 ; AVX512-NEXT:    vcvtps2pd %xmm0, %xmm0
1417 ; AVX512-NEXT:    retq
1418   %1 = bitcast <2 x i16> %a0 to <2 x half>
1419   %2 = fpext <2 x half> %1 to <2 x double>
1420   ret <2 x double> %2
1423 define <4 x double> @cvt_4i16_to_4f64(<4 x i16> %a0) nounwind {
1424 ; AVX-LABEL: cvt_4i16_to_4f64:
1425 ; AVX:       # %bb.0:
1426 ; AVX-NEXT:    subq $72, %rsp
1427 ; AVX-NEXT:    vmovq %xmm0, %rax
1428 ; AVX-NEXT:    movq %rax, %rcx
1429 ; AVX-NEXT:    movl %eax, %edx
1430 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1431 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1432 ; AVX-NEXT:    shrq $48, %rax
1433 ; AVX-NEXT:    shrq $32, %rcx
1434 ; AVX-NEXT:    shrl $16, %edx
1435 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm0
1436 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1437 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm0
1438 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1439 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1440 ; AVX-NEXT:    callq __extendhfsf2@PLT
1441 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1442 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1443 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1444 ; AVX-NEXT:    callq __extendhfsf2@PLT
1445 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1446 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1447 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1448 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1449 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1450 ; AVX-NEXT:    callq __extendhfsf2@PLT
1451 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1452 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1453 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1454 ; AVX-NEXT:    callq __extendhfsf2@PLT
1455 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1456 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1457 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1458 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1459 ; AVX-NEXT:    addq $72, %rsp
1460 ; AVX-NEXT:    retq
1462 ; F16C-LABEL: cvt_4i16_to_4f64:
1463 ; F16C:       # %bb.0:
1464 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1465 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1466 ; F16C-NEXT:    retq
1468 ; AVX512-LABEL: cvt_4i16_to_4f64:
1469 ; AVX512:       # %bb.0:
1470 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1471 ; AVX512-NEXT:    vcvtps2pd %xmm0, %ymm0
1472 ; AVX512-NEXT:    retq
1473   %1 = bitcast <4 x i16> %a0 to <4 x half>
1474   %2 = fpext <4 x half> %1 to <4 x double>
1475   ret <4 x double> %2
1478 define <2 x double> @cvt_8i16_to_2f64(<8 x i16> %a0) nounwind {
1479 ; AVX-LABEL: cvt_8i16_to_2f64:
1480 ; AVX:       # %bb.0:
1481 ; AVX-NEXT:    subq $40, %rsp
1482 ; AVX-NEXT:    vmovd %xmm0, %eax
1483 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1484 ; AVX-NEXT:    shrl $16, %eax
1485 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
1486 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1487 ; AVX-NEXT:    callq __extendhfsf2@PLT
1488 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1489 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1490 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1491 ; AVX-NEXT:    callq __extendhfsf2@PLT
1492 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1493 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1494 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1495 ; AVX-NEXT:    addq $40, %rsp
1496 ; AVX-NEXT:    retq
1498 ; F16C-LABEL: cvt_8i16_to_2f64:
1499 ; F16C:       # %bb.0:
1500 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1501 ; F16C-NEXT:    vcvtps2pd %xmm0, %xmm0
1502 ; F16C-NEXT:    retq
1504 ; AVX512-LABEL: cvt_8i16_to_2f64:
1505 ; AVX512:       # %bb.0:
1506 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1507 ; AVX512-NEXT:    vcvtps2pd %xmm0, %xmm0
1508 ; AVX512-NEXT:    retq
1509   %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
1510   %2 = bitcast <2 x i16> %1 to <2 x half>
1511   %3 = fpext <2 x half> %2 to <2 x double>
1512   ret <2 x double> %3
1515 define <4 x double> @cvt_8i16_to_4f64(<8 x i16> %a0) nounwind {
1516 ; AVX-LABEL: cvt_8i16_to_4f64:
1517 ; AVX:       # %bb.0:
1518 ; AVX-NEXT:    subq $72, %rsp
1519 ; AVX-NEXT:    vmovq %xmm0, %rax
1520 ; AVX-NEXT:    movq %rax, %rcx
1521 ; AVX-NEXT:    movl %eax, %edx
1522 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1523 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1524 ; AVX-NEXT:    shrq $48, %rax
1525 ; AVX-NEXT:    shrq $32, %rcx
1526 ; AVX-NEXT:    shrl $16, %edx
1527 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm0
1528 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1529 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm0
1530 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1531 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1532 ; AVX-NEXT:    callq __extendhfsf2@PLT
1533 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1534 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1535 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1536 ; AVX-NEXT:    callq __extendhfsf2@PLT
1537 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1538 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1539 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1540 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1541 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1542 ; AVX-NEXT:    callq __extendhfsf2@PLT
1543 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1544 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1545 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1546 ; AVX-NEXT:    callq __extendhfsf2@PLT
1547 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1548 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1549 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1550 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1551 ; AVX-NEXT:    addq $72, %rsp
1552 ; AVX-NEXT:    retq
1554 ; F16C-LABEL: cvt_8i16_to_4f64:
1555 ; F16C:       # %bb.0:
1556 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1557 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1558 ; F16C-NEXT:    retq
1560 ; AVX512-LABEL: cvt_8i16_to_4f64:
1561 ; AVX512:       # %bb.0:
1562 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1563 ; AVX512-NEXT:    vcvtps2pd %xmm0, %ymm0
1564 ; AVX512-NEXT:    retq
1565   %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1566   %2 = bitcast <4 x i16> %1 to <4 x half>
1567   %3 = fpext <4 x half> %2 to <4 x double>
1568   ret <4 x double> %3
1571 define <8 x double> @cvt_8i16_to_8f64(<8 x i16> %a0) nounwind {
1572 ; AVX-LABEL: cvt_8i16_to_8f64:
1573 ; AVX:       # %bb.0:
1574 ; AVX-NEXT:    subq $88, %rsp
1575 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1576 ; AVX-NEXT:    vpsrlq $48, %xmm0, %xmm0
1577 ; AVX-NEXT:    callq __extendhfsf2@PLT
1578 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1579 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1580 ; AVX-NEXT:    vpermilps $245, (%rsp), %xmm0 # 16-byte Folded Reload
1581 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
1582 ; AVX-NEXT:    callq __extendhfsf2@PLT
1583 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1584 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1585 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1586 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1587 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1588 ; AVX-NEXT:    callq __extendhfsf2@PLT
1589 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1590 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1591 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1592 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
1593 ; AVX-NEXT:    callq __extendhfsf2@PLT
1594 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1595 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1596 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1597 ; AVX-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
1598 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
1599 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1600 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1601 ; AVX-NEXT:    vzeroupper
1602 ; AVX-NEXT:    callq __extendhfsf2@PLT
1603 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1604 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1605 ; AVX-NEXT:    vpermilps $255, (%rsp), %xmm0 # 16-byte Folded Reload
1606 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
1607 ; AVX-NEXT:    callq __extendhfsf2@PLT
1608 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1609 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1610 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1611 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1612 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1613 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1614 ; AVX-NEXT:    callq __extendhfsf2@PLT
1615 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1616 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1617 ; AVX-NEXT:    vpermilps $78, (%rsp), %xmm0 # 16-byte Folded Reload
1618 ; AVX-NEXT:    # xmm0 = mem[2,3,0,1]
1619 ; AVX-NEXT:    callq __extendhfsf2@PLT
1620 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1621 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1622 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1623 ; AVX-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm1 # 16-byte Folded Reload
1624 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
1625 ; AVX-NEXT:    addq $88, %rsp
1626 ; AVX-NEXT:    retq
1628 ; F16C-LABEL: cvt_8i16_to_8f64:
1629 ; F16C:       # %bb.0:
1630 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm1
1631 ; F16C-NEXT:    vcvtps2pd %xmm1, %ymm0
1632 ; F16C-NEXT:    vextractf128 $1, %ymm1, %xmm1
1633 ; F16C-NEXT:    vcvtps2pd %xmm1, %ymm1
1634 ; F16C-NEXT:    retq
1636 ; AVX512-LABEL: cvt_8i16_to_8f64:
1637 ; AVX512:       # %bb.0:
1638 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
1639 ; AVX512-NEXT:    vcvtps2pd %ymm0, %zmm0
1640 ; AVX512-NEXT:    retq
1641   %1 = bitcast <8 x i16> %a0 to <8 x half>
1642   %2 = fpext <8 x half> %1 to <8 x double>
1643   ret <8 x double> %2
1646 define <2 x double> @cvt_2i16_to_2f64_constrained(<2 x i16> %a0) nounwind strictfp {
1647 ; AVX-LABEL: cvt_2i16_to_2f64_constrained:
1648 ; AVX:       # %bb.0:
1649 ; AVX-NEXT:    subq $40, %rsp
1650 ; AVX-NEXT:    vmovd %xmm0, %eax
1651 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1652 ; AVX-NEXT:    shrl $16, %eax
1653 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1
1654 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1655 ; AVX-NEXT:    callq __extendhfsf2@PLT
1656 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1657 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1658 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1659 ; AVX-NEXT:    callq __extendhfsf2@PLT
1660 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1661 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
1662 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1663 ; AVX-NEXT:    addq $40, %rsp
1664 ; AVX-NEXT:    retq
1666 ; F16C-LABEL: cvt_2i16_to_2f64_constrained:
1667 ; F16C:       # %bb.0:
1668 ; F16C-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1669 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1670 ; F16C-NEXT:    vcvtps2pd %xmm0, %xmm0
1671 ; F16C-NEXT:    retq
1673 ; AVX512-LABEL: cvt_2i16_to_2f64_constrained:
1674 ; AVX512:       # %bb.0:
1675 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1676 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1677 ; AVX512-NEXT:    vcvtps2pd %xmm0, %xmm0
1678 ; AVX512-NEXT:    retq
1679   %1 = bitcast <2 x i16> %a0 to <2 x half>
1680   %2 = call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f16(<2 x half> %1, metadata !"fpexcept.strict") strictfp
1681   ret <2 x double> %2
1683 declare <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f16(<2 x half>, metadata) strictfp
1685 define <4 x double> @cvt_4i16_to_4f64_constrained(<4 x i16> %a0) nounwind strictfp {
1686 ; AVX-LABEL: cvt_4i16_to_4f64_constrained:
1687 ; AVX:       # %bb.0:
1688 ; AVX-NEXT:    subq $72, %rsp
1689 ; AVX-NEXT:    vmovq %xmm0, %rax
1690 ; AVX-NEXT:    movq %rax, %rcx
1691 ; AVX-NEXT:    movl %eax, %edx
1692 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1693 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1694 ; AVX-NEXT:    shrq $48, %rax
1695 ; AVX-NEXT:    shrq $32, %rcx
1696 ; AVX-NEXT:    shrl $16, %edx
1697 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm0
1698 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1699 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm0
1700 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1701 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1702 ; AVX-NEXT:    callq __extendhfsf2@PLT
1703 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1704 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1705 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1706 ; AVX-NEXT:    callq __extendhfsf2@PLT
1707 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1708 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1709 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1710 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1711 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1712 ; AVX-NEXT:    callq __extendhfsf2@PLT
1713 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1714 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1715 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1716 ; AVX-NEXT:    callq __extendhfsf2@PLT
1717 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1718 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1719 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1720 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1721 ; AVX-NEXT:    addq $72, %rsp
1722 ; AVX-NEXT:    retq
1724 ; F16C-LABEL: cvt_4i16_to_4f64_constrained:
1725 ; F16C:       # %bb.0:
1726 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1727 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1728 ; F16C-NEXT:    retq
1730 ; AVX512-LABEL: cvt_4i16_to_4f64_constrained:
1731 ; AVX512:       # %bb.0:
1732 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1733 ; AVX512-NEXT:    vcvtps2pd %xmm0, %ymm0
1734 ; AVX512-NEXT:    retq
1735   %1 = bitcast <4 x i16> %a0 to <4 x half>
1736   %2 = call <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f16(<4 x half> %1, metadata !"fpexcept.strict") strictfp
1737   ret <4 x double> %2
1739 declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f16(<4 x half>, metadata) strictfp
1741 define <8 x double> @cvt_8i16_to_8f64_constrained(<8 x i16> %a0) nounwind strictfp {
1742 ; AVX-LABEL: cvt_8i16_to_8f64_constrained:
1743 ; AVX:       # %bb.0:
1744 ; AVX-NEXT:    subq $88, %rsp
1745 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1746 ; AVX-NEXT:    vpsrlq $48, %xmm0, %xmm0
1747 ; AVX-NEXT:    callq __extendhfsf2@PLT
1748 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1749 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1750 ; AVX-NEXT:    vpermilps $245, (%rsp), %xmm0 # 16-byte Folded Reload
1751 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
1752 ; AVX-NEXT:    callq __extendhfsf2@PLT
1753 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1754 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1755 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1756 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1757 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1758 ; AVX-NEXT:    callq __extendhfsf2@PLT
1759 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1760 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1761 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1762 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
1763 ; AVX-NEXT:    callq __extendhfsf2@PLT
1764 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1765 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1766 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1767 ; AVX-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
1768 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
1769 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1770 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1771 ; AVX-NEXT:    vzeroupper
1772 ; AVX-NEXT:    callq __extendhfsf2@PLT
1773 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1774 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1775 ; AVX-NEXT:    vpermilps $255, (%rsp), %xmm0 # 16-byte Folded Reload
1776 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
1777 ; AVX-NEXT:    callq __extendhfsf2@PLT
1778 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1779 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1780 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1781 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1782 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
1783 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1784 ; AVX-NEXT:    callq __extendhfsf2@PLT
1785 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1786 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1787 ; AVX-NEXT:    vpermilps $78, (%rsp), %xmm0 # 16-byte Folded Reload
1788 ; AVX-NEXT:    # xmm0 = mem[2,3,0,1]
1789 ; AVX-NEXT:    callq __extendhfsf2@PLT
1790 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1791 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1792 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1793 ; AVX-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm1 # 16-byte Folded Reload
1794 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
1795 ; AVX-NEXT:    addq $88, %rsp
1796 ; AVX-NEXT:    retq
1798 ; F16C-LABEL: cvt_8i16_to_8f64_constrained:
1799 ; F16C:       # %bb.0:
1800 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm0
1801 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm1
1802 ; F16C-NEXT:    vcvtps2pd %xmm1, %ymm1
1803 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1804 ; F16C-NEXT:    retq
1806 ; AVX512-LABEL: cvt_8i16_to_8f64_constrained:
1807 ; AVX512:       # %bb.0:
1808 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
1809 ; AVX512-NEXT:    vcvtps2pd %ymm0, %zmm0
1810 ; AVX512-NEXT:    retq
1811   %1 = bitcast <8 x i16> %a0 to <8 x half>
1812   %2 = call <8 x double> @llvm.experimental.constrained.fpext.v8f64.v8f16(<8 x half> %1, metadata !"fpexcept.strict") strictfp
1813   ret <8 x double> %2
1815 declare <8 x double> @llvm.experimental.constrained.fpext.v8f64.v8f16(<8 x half>, metadata) strictfp
1818 ; Half to Double (Load)
1821 define double @load_cvt_i16_to_f64(ptr %a0) nounwind {
1822 ; AVX-LABEL: load_cvt_i16_to_f64:
1823 ; AVX:       # %bb.0:
1824 ; AVX-NEXT:    pushq %rax
1825 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
1826 ; AVX-NEXT:    callq __extendhfsf2@PLT
1827 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1828 ; AVX-NEXT:    popq %rax
1829 ; AVX-NEXT:    retq
1831 ; F16C-LABEL: load_cvt_i16_to_f64:
1832 ; F16C:       # %bb.0:
1833 ; F16C-NEXT:    movzwl (%rdi), %eax
1834 ; F16C-NEXT:    vmovd %eax, %xmm0
1835 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1836 ; F16C-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1837 ; F16C-NEXT:    retq
1839 ; AVX512-LABEL: load_cvt_i16_to_f64:
1840 ; AVX512:       # %bb.0:
1841 ; AVX512-NEXT:    movzwl (%rdi), %eax
1842 ; AVX512-NEXT:    vmovd %eax, %xmm0
1843 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1844 ; AVX512-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1845 ; AVX512-NEXT:    retq
1846   %1 = load i16, ptr %a0
1847   %2 = bitcast i16 %1 to half
1848   %3 = fpext half %2 to double
1849   ret double %3
1852 define <2 x double> @load_cvt_2i16_to_2f64(ptr %a0) nounwind {
1853 ; AVX-LABEL: load_cvt_2i16_to_2f64:
1854 ; AVX:       # %bb.0:
1855 ; AVX-NEXT:    subq $40, %rsp
1856 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
1857 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1858 ; AVX-NEXT:    vpinsrw $0, 2(%rdi), %xmm0, %xmm0
1859 ; AVX-NEXT:    callq __extendhfsf2@PLT
1860 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1861 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1862 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1863 ; AVX-NEXT:    callq __extendhfsf2@PLT
1864 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1865 ; AVX-NEXT:    vunpcklpd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
1866 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1867 ; AVX-NEXT:    addq $40, %rsp
1868 ; AVX-NEXT:    retq
1870 ; F16C-LABEL: load_cvt_2i16_to_2f64:
1871 ; F16C:       # %bb.0:
1872 ; F16C-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1873 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1874 ; F16C-NEXT:    vcvtps2pd %xmm0, %xmm0
1875 ; F16C-NEXT:    retq
1877 ; AVX512-LABEL: load_cvt_2i16_to_2f64:
1878 ; AVX512:       # %bb.0:
1879 ; AVX512-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1880 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
1881 ; AVX512-NEXT:    vcvtps2pd %xmm0, %xmm0
1882 ; AVX512-NEXT:    retq
1883   %1 = load <2 x i16>, ptr %a0
1884   %2 = bitcast <2 x i16> %1 to <2 x half>
1885   %3 = fpext <2 x half> %2 to <2 x double>
1886   ret <2 x double> %3
1889 define <4 x double> @load_cvt_4i16_to_4f64(ptr %a0) nounwind {
1890 ; AVX-LABEL: load_cvt_4i16_to_4f64:
1891 ; AVX:       # %bb.0:
1892 ; AVX-NEXT:    subq $72, %rsp
1893 ; AVX-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
1894 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1895 ; AVX-NEXT:    vpinsrw $0, 2(%rdi), %xmm0, %xmm0
1896 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1897 ; AVX-NEXT:    vpinsrw $0, 4(%rdi), %xmm0, %xmm0
1898 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1899 ; AVX-NEXT:    vpinsrw $0, 6(%rdi), %xmm0, %xmm0
1900 ; AVX-NEXT:    callq __extendhfsf2@PLT
1901 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1902 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1903 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1904 ; AVX-NEXT:    callq __extendhfsf2@PLT
1905 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1906 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1907 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1908 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1909 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1910 ; AVX-NEXT:    callq __extendhfsf2@PLT
1911 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1912 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1913 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1914 ; AVX-NEXT:    callq __extendhfsf2@PLT
1915 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1916 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1917 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1918 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1919 ; AVX-NEXT:    addq $72, %rsp
1920 ; AVX-NEXT:    retq
1922 ; F16C-LABEL: load_cvt_4i16_to_4f64:
1923 ; F16C:       # %bb.0:
1924 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
1925 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1926 ; F16C-NEXT:    retq
1928 ; AVX512-LABEL: load_cvt_4i16_to_4f64:
1929 ; AVX512:       # %bb.0:
1930 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
1931 ; AVX512-NEXT:    vcvtps2pd %xmm0, %ymm0
1932 ; AVX512-NEXT:    retq
1933   %1 = load <4 x i16>, ptr %a0
1934   %2 = bitcast <4 x i16> %1 to <4 x half>
1935   %3 = fpext <4 x half> %2 to <4 x double>
1936   ret <4 x double> %3
1939 define <4 x double> @load_cvt_8i16_to_4f64(ptr %a0) nounwind {
1940 ; AVX-LABEL: load_cvt_8i16_to_4f64:
1941 ; AVX:       # %bb.0:
1942 ; AVX-NEXT:    subq $72, %rsp
1943 ; AVX-NEXT:    movq (%rdi), %rax
1944 ; AVX-NEXT:    movq %rax, %rcx
1945 ; AVX-NEXT:    movl %eax, %edx
1946 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1947 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1948 ; AVX-NEXT:    shrq $48, %rax
1949 ; AVX-NEXT:    shrq $32, %rcx
1950 ; AVX-NEXT:    shrl $16, %edx
1951 ; AVX-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm0
1952 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1953 ; AVX-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm0
1954 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
1955 ; AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1956 ; AVX-NEXT:    callq __extendhfsf2@PLT
1957 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1958 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1959 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1960 ; AVX-NEXT:    callq __extendhfsf2@PLT
1961 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1962 ; AVX-NEXT:    vunpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
1963 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
1964 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1965 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1966 ; AVX-NEXT:    callq __extendhfsf2@PLT
1967 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1968 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1969 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1970 ; AVX-NEXT:    callq __extendhfsf2@PLT
1971 ; AVX-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
1972 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1973 ; AVX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1974 ; AVX-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
1975 ; AVX-NEXT:    addq $72, %rsp
1976 ; AVX-NEXT:    retq
1978 ; F16C-LABEL: load_cvt_8i16_to_4f64:
1979 ; F16C:       # %bb.0:
1980 ; F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
1981 ; F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
1982 ; F16C-NEXT:    retq
1984 ; AVX512-LABEL: load_cvt_8i16_to_4f64:
1985 ; AVX512:       # %bb.0:
1986 ; AVX512-NEXT:    vcvtph2ps (%rdi), %xmm0
1987 ; AVX512-NEXT:    vcvtps2pd %xmm0, %ymm0
1988 ; AVX512-NEXT:    retq
1989   %1 = load <8 x i16>, ptr %a0
1990   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1991   %3 = bitcast <4 x i16> %2 to <4 x half>
1992   %4 = fpext <4 x half> %3 to <4 x double>
1993   ret <4 x double> %4
1996 define <8 x double> @load_cvt_8i16_to_8f64(ptr %a0) nounwind {
1997 ; AVX1-LABEL: load_cvt_8i16_to_8f64:
1998 ; AVX1:       # %bb.0:
1999 ; AVX1-NEXT:    pushq %rbx
2000 ; AVX1-NEXT:    subq $80, %rsp
2001 ; AVX1-NEXT:    movq %rdi, %rbx
2002 ; AVX1-NEXT:    vmovaps (%rdi), %xmm0
2003 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2004 ; AVX1-NEXT:    vbroadcastss 4(%rdi), %xmm0
2005 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2006 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2007 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2008 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2009 ; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
2010 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2011 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2012 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2013 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2014 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2015 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2016 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2017 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2018 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2019 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2020 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
2021 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2022 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2023 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
2024 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2025 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2026 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2027 ; AVX1-NEXT:    vbroadcastss 12(%rbx), %xmm0
2028 ; AVX1-NEXT:    vzeroupper
2029 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2030 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2031 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2032 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2033 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2034 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2035 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2036 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
2037 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2038 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2039 ; AVX1-NEXT:    vbroadcastss 8(%rbx), %xmm0
2040 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2041 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2042 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2043 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2044 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2045 ; AVX1-NEXT:    callq __extendhfsf2@PLT
2046 ; AVX1-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2047 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2048 ; AVX1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2049 ; AVX1-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
2050 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2051 ; AVX1-NEXT:    addq $80, %rsp
2052 ; AVX1-NEXT:    popq %rbx
2053 ; AVX1-NEXT:    retq
2055 ; AVX2-LABEL: load_cvt_8i16_to_8f64:
2056 ; AVX2:       # %bb.0:
2057 ; AVX2-NEXT:    pushq %rbx
2058 ; AVX2-NEXT:    subq $80, %rsp
2059 ; AVX2-NEXT:    movq %rdi, %rbx
2060 ; AVX2-NEXT:    vmovdqa (%rdi), %xmm0
2061 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2062 ; AVX2-NEXT:    vpinsrw $0, 4(%rdi), %xmm0, %xmm0
2063 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2064 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2065 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2066 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2067 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm0
2068 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2069 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2070 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2071 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2072 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2073 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2074 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2075 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2076 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2077 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2078 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
2079 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2080 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2081 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
2082 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2083 ; AVX2-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2084 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2085 ; AVX2-NEXT:    vpinsrw $0, 12(%rbx), %xmm0, %xmm0
2086 ; AVX2-NEXT:    vzeroupper
2087 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2088 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2089 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2090 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2091 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2092 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2093 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2094 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
2095 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2096 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2097 ; AVX2-NEXT:    vpinsrw $0, 8(%rbx), %xmm0, %xmm0
2098 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2099 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2100 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2101 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2102 ; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2103 ; AVX2-NEXT:    callq __extendhfsf2@PLT
2104 ; AVX2-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
2105 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2106 ; AVX2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2107 ; AVX2-NEXT:    vinsertf128 $1, (%rsp), %ymm0, %ymm1 # 16-byte Folded Reload
2108 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2109 ; AVX2-NEXT:    addq $80, %rsp
2110 ; AVX2-NEXT:    popq %rbx
2111 ; AVX2-NEXT:    retq
2113 ; F16C-LABEL: load_cvt_8i16_to_8f64:
2114 ; F16C:       # %bb.0:
2115 ; F16C-NEXT:    vcvtph2ps (%rdi), %ymm1
2116 ; F16C-NEXT:    vcvtps2pd %xmm1, %ymm0
2117 ; F16C-NEXT:    vextractf128 $1, %ymm1, %xmm1
2118 ; F16C-NEXT:    vcvtps2pd %xmm1, %ymm1
2119 ; F16C-NEXT:    retq
2121 ; AVX512-LABEL: load_cvt_8i16_to_8f64:
2122 ; AVX512:       # %bb.0:
2123 ; AVX512-NEXT:    vcvtph2ps (%rdi), %ymm0
2124 ; AVX512-NEXT:    vcvtps2pd %ymm0, %zmm0
2125 ; AVX512-NEXT:    retq
2126   %1 = load <8 x i16>, ptr %a0
2127   %2 = bitcast <8 x i16> %1 to <8 x half>
2128   %3 = fpext <8 x half> %2 to <8 x double>
2129   ret <8 x double> %3
2133 ; Float to Half
2136 define i16 @cvt_f32_to_i16(float %a0) nounwind {
2137 ; AVX-LABEL: cvt_f32_to_i16:
2138 ; AVX:       # %bb.0:
2139 ; AVX-NEXT:    pushq %rax
2140 ; AVX-NEXT:    callq __truncsfhf2@PLT
2141 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
2142 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
2143 ; AVX-NEXT:    popq %rcx
2144 ; AVX-NEXT:    retq
2146 ; F16C-LABEL: cvt_f32_to_i16:
2147 ; F16C:       # %bb.0:
2148 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2149 ; F16C-NEXT:    vmovd %xmm0, %eax
2150 ; F16C-NEXT:    # kill: def $ax killed $ax killed $eax
2151 ; F16C-NEXT:    retq
2153 ; AVX512-LABEL: cvt_f32_to_i16:
2154 ; AVX512:       # %bb.0:
2155 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2156 ; AVX512-NEXT:    vmovd %xmm0, %eax
2157 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
2158 ; AVX512-NEXT:    retq
2159   %1 = fptrunc float %a0 to half
2160   %2 = bitcast half %1 to i16
2161   ret i16 %2
2164 define <4 x i16> @cvt_4f32_to_4i16(<4 x float> %a0) nounwind {
2165 ; AVX-LABEL: cvt_4f32_to_4i16:
2166 ; AVX:       # %bb.0:
2167 ; AVX-NEXT:    subq $72, %rsp
2168 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2169 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2170 ; AVX-NEXT:    callq __truncsfhf2@PLT
2171 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2172 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2173 ; AVX-NEXT:    callq __truncsfhf2@PLT
2174 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2175 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2176 ; AVX-NEXT:    # xmm0 = mem[1,0]
2177 ; AVX-NEXT:    callq __truncsfhf2@PLT
2178 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2179 ; AVX-NEXT:    vpshufd $255, (%rsp), %xmm0 # 16-byte Folded Reload
2180 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2181 ; AVX-NEXT:    callq __truncsfhf2@PLT
2182 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2183 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2184 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2185 ; AVX-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
2186 ; AVX-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
2187 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2188 ; AVX-NEXT:    addq $72, %rsp
2189 ; AVX-NEXT:    retq
2191 ; F16C-LABEL: cvt_4f32_to_4i16:
2192 ; F16C:       # %bb.0:
2193 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2194 ; F16C-NEXT:    retq
2196 ; AVX512-LABEL: cvt_4f32_to_4i16:
2197 ; AVX512:       # %bb.0:
2198 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2199 ; AVX512-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   ret <4 x i16> %2
2205 define <8 x i16> @cvt_4f32_to_8i16_undef(<4 x float> %a0) nounwind {
2206 ; AVX-LABEL: cvt_4f32_to_8i16_undef:
2207 ; AVX:       # %bb.0:
2208 ; AVX-NEXT:    subq $72, %rsp
2209 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2210 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2211 ; AVX-NEXT:    callq __truncsfhf2@PLT
2212 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2213 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2214 ; AVX-NEXT:    callq __truncsfhf2@PLT
2215 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2216 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2217 ; AVX-NEXT:    # xmm0 = mem[1,0]
2218 ; AVX-NEXT:    callq __truncsfhf2@PLT
2219 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2220 ; AVX-NEXT:    vpshufd $255, (%rsp), %xmm0 # 16-byte Folded Reload
2221 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2222 ; AVX-NEXT:    callq __truncsfhf2@PLT
2223 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2224 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2225 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2226 ; AVX-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
2227 ; AVX-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
2228 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2229 ; AVX-NEXT:    addq $72, %rsp
2230 ; AVX-NEXT:    retq
2232 ; F16C-LABEL: cvt_4f32_to_8i16_undef:
2233 ; F16C:       # %bb.0:
2234 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2235 ; F16C-NEXT:    retq
2237 ; AVX512-LABEL: cvt_4f32_to_8i16_undef:
2238 ; AVX512:       # %bb.0:
2239 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2240 ; AVX512-NEXT:    retq
2241   %1 = fptrunc <4 x float> %a0 to <4 x half>
2242   %2 = bitcast <4 x half> %1 to <4 x i16>
2243   %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>
2244   ret <8 x i16> %3
2247 define <8 x i16> @cvt_4f32_to_8i16_zero(<4 x float> %a0) nounwind {
2248 ; AVX-LABEL: cvt_4f32_to_8i16_zero:
2249 ; AVX:       # %bb.0:
2250 ; AVX-NEXT:    subq $72, %rsp
2251 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2252 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2253 ; AVX-NEXT:    callq __truncsfhf2@PLT
2254 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2255 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2256 ; AVX-NEXT:    callq __truncsfhf2@PLT
2257 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2258 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2259 ; AVX-NEXT:    # xmm0 = mem[1,0]
2260 ; AVX-NEXT:    callq __truncsfhf2@PLT
2261 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2262 ; AVX-NEXT:    vpshufd $255, (%rsp), %xmm0 # 16-byte Folded Reload
2263 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2264 ; AVX-NEXT:    callq __truncsfhf2@PLT
2265 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2266 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2267 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2268 ; AVX-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
2269 ; AVX-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
2270 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2271 ; AVX-NEXT:    addq $72, %rsp
2272 ; AVX-NEXT:    retq
2274 ; F16C-LABEL: cvt_4f32_to_8i16_zero:
2275 ; F16C:       # %bb.0:
2276 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2277 ; F16C-NEXT:    retq
2279 ; AVX512-LABEL: cvt_4f32_to_8i16_zero:
2280 ; AVX512:       # %bb.0:
2281 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2282 ; AVX512-NEXT:    retq
2283   %1 = fptrunc <4 x float> %a0 to <4 x half>
2284   %2 = bitcast <4 x half> %1 to <4 x i16>
2285   %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>
2286   ret <8 x i16> %3
2289 define <8 x i16> @cvt_8f32_to_8i16(<8 x float> %a0) nounwind {
2290 ; AVX-LABEL: cvt_8f32_to_8i16:
2291 ; AVX:       # %bb.0:
2292 ; AVX-NEXT:    subq $88, %rsp
2293 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2294 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
2295 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2296 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2297 ; AVX-NEXT:    vzeroupper
2298 ; AVX-NEXT:    callq __truncsfhf2@PLT
2299 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2300 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2301 ; AVX-NEXT:    # xmm0 = mem[1,0]
2302 ; AVX-NEXT:    callq __truncsfhf2@PLT
2303 ; AVX-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2304 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2305 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2306 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2307 ; AVX-NEXT:    callq __truncsfhf2@PLT
2308 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2309 ; AVX-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2310 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
2311 ; AVX-NEXT:    callq __truncsfhf2@PLT
2312 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2313 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2314 ; AVX-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2315 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2316 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2317 ; AVX-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2318 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2319 ; AVX-NEXT:    callq __truncsfhf2@PLT
2320 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2321 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2322 ; AVX-NEXT:    # xmm0 = mem[1,0]
2323 ; AVX-NEXT:    callq __truncsfhf2@PLT
2324 ; AVX-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2325 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2326 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2327 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2328 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2329 ; AVX-NEXT:    vzeroupper
2330 ; AVX-NEXT:    callq __truncsfhf2@PLT
2331 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2332 ; AVX-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2333 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
2334 ; AVX-NEXT:    callq __truncsfhf2@PLT
2335 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2336 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2337 ; AVX-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2338 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2339 ; AVX-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2340 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
2341 ; AVX-NEXT:    addq $88, %rsp
2342 ; AVX-NEXT:    retq
2344 ; F16C-LABEL: cvt_8f32_to_8i16:
2345 ; F16C:       # %bb.0:
2346 ; F16C-NEXT:    vcvtps2ph $4, %ymm0, %xmm0
2347 ; F16C-NEXT:    vzeroupper
2348 ; F16C-NEXT:    retq
2350 ; AVX512-LABEL: cvt_8f32_to_8i16:
2351 ; AVX512:       # %bb.0:
2352 ; AVX512-NEXT:    vcvtps2ph $4, %ymm0, %xmm0
2353 ; AVX512-NEXT:    vzeroupper
2354 ; AVX512-NEXT:    retq
2355   %1 = fptrunc <8 x float> %a0 to <8 x half>
2356   %2 = bitcast <8 x half> %1 to <8 x i16>
2357   ret <8 x i16> %2
2360 define <16 x i16> @cvt_16f32_to_16i16(<16 x float> %a0) nounwind {
2361 ; AVX1-LABEL: cvt_16f32_to_16i16:
2362 ; AVX1:       # %bb.0:
2363 ; AVX1-NEXT:    subq $120, %rsp
2364 ; AVX1-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2365 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2366 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0
2367 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2368 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2369 ; AVX1-NEXT:    vzeroupper
2370 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2371 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2372 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2373 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2374 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2375 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2376 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2377 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2378 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2379 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2380 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2381 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2382 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2383 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2384 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2385 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2386 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2387 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2388 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2389 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2390 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
2391 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2392 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2393 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2394 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2395 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2396 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2397 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2398 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2399 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2400 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2401 ; AVX1-NEXT:    vzeroupper
2402 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2403 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2404 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2405 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2406 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2407 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2408 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2409 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2410 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2411 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2412 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
2413 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2414 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2415 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2416 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2417 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2418 ; AVX1-NEXT:    vzeroupper
2419 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2420 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2421 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2422 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2423 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2424 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2425 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2426 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2427 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2428 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2429 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2430 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2431 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2432 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2433 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2434 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2435 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2436 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2437 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2438 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2439 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
2440 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2441 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2442 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2443 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2444 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2445 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2446 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2447 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2448 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2449 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2450 ; AVX1-NEXT:    vzeroupper
2451 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2452 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2453 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2454 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2455 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2456 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2457 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2458 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2459 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2460 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2461 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
2462 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2463 ; AVX1-NEXT:    addq $120, %rsp
2464 ; AVX1-NEXT:    retq
2466 ; AVX2-LABEL: cvt_16f32_to_16i16:
2467 ; AVX2:       # %bb.0:
2468 ; AVX2-NEXT:    subq $184, %rsp
2469 ; AVX2-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2470 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2471 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm0
2472 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2473 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2474 ; AVX2-NEXT:    vzeroupper
2475 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2476 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2477 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2478 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2479 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2480 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2481 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2482 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2483 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2484 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
2485 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2486 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2487 ; AVX2-NEXT:    vzeroupper
2488 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2489 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2490 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2491 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2492 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2493 ; AVX2-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2494 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2495 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2496 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2497 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2498 ; AVX2-NEXT:    vzeroupper
2499 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2500 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2501 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2502 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
2503 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2504 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
2505 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2506 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2507 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2508 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2509 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2510 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2511 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
2512 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2513 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
2514 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2515 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2516 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
2517 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
2518 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2519 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2520 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
2521 ; AVX2-NEXT:    vzeroupper
2522 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2523 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2524 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2525 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2526 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2527 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2528 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2529 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2530 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2531 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
2532 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2533 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2534 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2535 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2536 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2537 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2538 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2539 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2540 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2541 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2542 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2543 ; AVX2-NEXT:    vzeroupper
2544 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2545 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2546 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2547 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
2548 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2549 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2550 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2551 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2552 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2553 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2554 ; AVX2-NEXT:    vzeroupper
2555 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2556 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2557 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2558 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
2559 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2560 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2561 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2562 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2563 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
2564 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
2565 ; AVX2-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
2566 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[2],mem[2]
2567 ; AVX2-NEXT:    addq $184, %rsp
2568 ; AVX2-NEXT:    retq
2570 ; F16C-LABEL: cvt_16f32_to_16i16:
2571 ; F16C:       # %bb.0:
2572 ; F16C-NEXT:    vcvtps2ph $4, %ymm0, %xmm0
2573 ; F16C-NEXT:    vcvtps2ph $4, %ymm1, %xmm1
2574 ; F16C-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2575 ; F16C-NEXT:    retq
2577 ; AVX512-LABEL: cvt_16f32_to_16i16:
2578 ; AVX512:       # %bb.0:
2579 ; AVX512-NEXT:    vcvtps2ph $4, %zmm0, %ymm0
2580 ; AVX512-NEXT:    retq
2581   %1 = fptrunc <16 x float> %a0 to <16 x half>
2582   %2 = bitcast <16 x half> %1 to <16 x i16>
2583   ret <16 x i16> %2
2587 ; Float to Half (Store)
2590 define void @store_cvt_f32_to_i16(float %a0, ptr %a1) nounwind {
2591 ; AVX-LABEL: store_cvt_f32_to_i16:
2592 ; AVX:       # %bb.0:
2593 ; AVX-NEXT:    pushq %rbx
2594 ; AVX-NEXT:    movq %rdi, %rbx
2595 ; AVX-NEXT:    callq __truncsfhf2@PLT
2596 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rbx)
2597 ; AVX-NEXT:    popq %rbx
2598 ; AVX-NEXT:    retq
2600 ; F16C-LABEL: store_cvt_f32_to_i16:
2601 ; F16C:       # %bb.0:
2602 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2603 ; F16C-NEXT:    vmovd %xmm0, %eax
2604 ; F16C-NEXT:    movw %ax, (%rdi)
2605 ; F16C-NEXT:    retq
2607 ; AVX512-LABEL: store_cvt_f32_to_i16:
2608 ; AVX512:       # %bb.0:
2609 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2610 ; AVX512-NEXT:    vmovd %xmm0, %eax
2611 ; AVX512-NEXT:    movw %ax, (%rdi)
2612 ; AVX512-NEXT:    retq
2613   %1 = fptrunc float %a0 to half
2614   %2 = bitcast half %1 to i16
2615   store i16 %2, ptr %a1
2616   ret void
2619 define void @store_cvt_4f32_to_4i16(<4 x float> %a0, ptr %a1) nounwind {
2620 ; AVX-LABEL: store_cvt_4f32_to_4i16:
2621 ; AVX:       # %bb.0:
2622 ; AVX-NEXT:    pushq %rbx
2623 ; AVX-NEXT:    subq $64, %rsp
2624 ; AVX-NEXT:    movq %rdi, %rbx
2625 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2626 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2627 ; AVX-NEXT:    callq __truncsfhf2@PLT
2628 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2629 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2630 ; AVX-NEXT:    # xmm0 = mem[1,0]
2631 ; AVX-NEXT:    callq __truncsfhf2@PLT
2632 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2633 ; AVX-NEXT:    vpermilps $255, (%rsp), %xmm0 # 16-byte Folded Reload
2634 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2635 ; AVX-NEXT:    callq __truncsfhf2@PLT
2636 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2637 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
2638 ; AVX-NEXT:    callq __truncsfhf2@PLT
2639 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rbx)
2640 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2641 ; AVX-NEXT:    vpextrw $0, %xmm0, 6(%rbx)
2642 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2643 ; AVX-NEXT:    vpextrw $0, %xmm0, 4(%rbx)
2644 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2645 ; AVX-NEXT:    vpextrw $0, %xmm0, 2(%rbx)
2646 ; AVX-NEXT:    addq $64, %rsp
2647 ; AVX-NEXT:    popq %rbx
2648 ; AVX-NEXT:    retq
2650 ; F16C-LABEL: store_cvt_4f32_to_4i16:
2651 ; F16C:       # %bb.0:
2652 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, (%rdi)
2653 ; F16C-NEXT:    retq
2655 ; AVX512-LABEL: store_cvt_4f32_to_4i16:
2656 ; AVX512:       # %bb.0:
2657 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, (%rdi)
2658 ; AVX512-NEXT:    retq
2659   %1 = fptrunc <4 x float> %a0 to <4 x half>
2660   %2 = bitcast <4 x half> %1 to <4 x i16>
2661   store <4 x i16> %2, ptr %a1
2662   ret void
2665 define void @store_cvt_4f32_to_8i16_undef(<4 x float> %a0, ptr %a1) nounwind {
2666 ; AVX-LABEL: store_cvt_4f32_to_8i16_undef:
2667 ; AVX:       # %bb.0:
2668 ; AVX-NEXT:    pushq %rbx
2669 ; AVX-NEXT:    subq $64, %rsp
2670 ; AVX-NEXT:    movq %rdi, %rbx
2671 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2672 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2673 ; AVX-NEXT:    callq __truncsfhf2@PLT
2674 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2675 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2676 ; AVX-NEXT:    callq __truncsfhf2@PLT
2677 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2678 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2679 ; AVX-NEXT:    # xmm0 = mem[1,0]
2680 ; AVX-NEXT:    callq __truncsfhf2@PLT
2681 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2682 ; AVX-NEXT:    vpshufd $255, (%rsp), %xmm0 # 16-byte Folded Reload
2683 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2684 ; AVX-NEXT:    callq __truncsfhf2@PLT
2685 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2686 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2687 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2688 ; AVX-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
2689 ; AVX-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
2690 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2691 ; AVX-NEXT:    vmovaps %xmm0, (%rbx)
2692 ; AVX-NEXT:    addq $64, %rsp
2693 ; AVX-NEXT:    popq %rbx
2694 ; AVX-NEXT:    retq
2696 ; F16C-LABEL: store_cvt_4f32_to_8i16_undef:
2697 ; F16C:       # %bb.0:
2698 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2699 ; F16C-NEXT:    vmovaps %xmm0, (%rdi)
2700 ; F16C-NEXT:    retq
2702 ; AVX512-LABEL: store_cvt_4f32_to_8i16_undef:
2703 ; AVX512:       # %bb.0:
2704 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2705 ; AVX512-NEXT:    vmovaps %xmm0, (%rdi)
2706 ; AVX512-NEXT:    retq
2707   %1 = fptrunc <4 x float> %a0 to <4 x half>
2708   %2 = bitcast <4 x half> %1 to <4 x i16>
2709   %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>
2710   store <8 x i16> %3, ptr %a1
2711   ret void
2714 define void @store_cvt_4f32_to_8i16_zero(<4 x float> %a0, ptr %a1) nounwind {
2715 ; AVX-LABEL: store_cvt_4f32_to_8i16_zero:
2716 ; AVX:       # %bb.0:
2717 ; AVX-NEXT:    pushq %rbx
2718 ; AVX-NEXT:    subq $64, %rsp
2719 ; AVX-NEXT:    movq %rdi, %rbx
2720 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2721 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2722 ; AVX-NEXT:    callq __truncsfhf2@PLT
2723 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2724 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2725 ; AVX-NEXT:    callq __truncsfhf2@PLT
2726 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2727 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
2728 ; AVX-NEXT:    # xmm0 = mem[1,0]
2729 ; AVX-NEXT:    callq __truncsfhf2@PLT
2730 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2731 ; AVX-NEXT:    vpshufd $255, (%rsp), %xmm0 # 16-byte Folded Reload
2732 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2733 ; AVX-NEXT:    callq __truncsfhf2@PLT
2734 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2735 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2736 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2737 ; AVX-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
2738 ; AVX-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
2739 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
2740 ; AVX-NEXT:    vmovaps %xmm0, (%rbx)
2741 ; AVX-NEXT:    addq $64, %rsp
2742 ; AVX-NEXT:    popq %rbx
2743 ; AVX-NEXT:    retq
2745 ; F16C-LABEL: store_cvt_4f32_to_8i16_zero:
2746 ; F16C:       # %bb.0:
2747 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2748 ; F16C-NEXT:    vmovaps %xmm0, (%rdi)
2749 ; F16C-NEXT:    retq
2751 ; AVX512-LABEL: store_cvt_4f32_to_8i16_zero:
2752 ; AVX512:       # %bb.0:
2753 ; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
2754 ; AVX512-NEXT:    vmovaps %xmm0, (%rdi)
2755 ; AVX512-NEXT:    retq
2756   %1 = fptrunc <4 x float> %a0 to <4 x half>
2757   %2 = bitcast <4 x half> %1 to <4 x i16>
2758   %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>
2759   store <8 x i16> %3, ptr %a1
2760   ret void
2763 define void @store_cvt_8f32_to_8i16(<8 x float> %a0, ptr %a1) nounwind {
2764 ; AVX-LABEL: store_cvt_8f32_to_8i16:
2765 ; AVX:       # %bb.0:
2766 ; AVX-NEXT:    pushq %rbx
2767 ; AVX-NEXT:    subq $80, %rsp
2768 ; AVX-NEXT:    movq %rdi, %rbx
2769 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2770 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
2771 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2772 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2773 ; AVX-NEXT:    vzeroupper
2774 ; AVX-NEXT:    callq __truncsfhf2@PLT
2775 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2776 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2777 ; AVX-NEXT:    # xmm0 = mem[1,0]
2778 ; AVX-NEXT:    callq __truncsfhf2@PLT
2779 ; AVX-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2780 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2781 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2782 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2783 ; AVX-NEXT:    callq __truncsfhf2@PLT
2784 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2785 ; AVX-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2786 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
2787 ; AVX-NEXT:    callq __truncsfhf2@PLT
2788 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2789 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2790 ; AVX-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2791 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2792 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2793 ; AVX-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2794 ; AVX-NEXT:    # xmm0 = mem[3,3,3,3]
2795 ; AVX-NEXT:    callq __truncsfhf2@PLT
2796 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2797 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2798 ; AVX-NEXT:    # xmm0 = mem[1,0]
2799 ; AVX-NEXT:    callq __truncsfhf2@PLT
2800 ; AVX-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2801 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2802 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2803 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2804 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2805 ; AVX-NEXT:    vzeroupper
2806 ; AVX-NEXT:    callq __truncsfhf2@PLT
2807 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2808 ; AVX-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2809 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
2810 ; AVX-NEXT:    callq __truncsfhf2@PLT
2811 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2812 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2813 ; AVX-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2814 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2815 ; AVX-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2816 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
2817 ; AVX-NEXT:    vmovdqa %xmm0, (%rbx)
2818 ; AVX-NEXT:    addq $80, %rsp
2819 ; AVX-NEXT:    popq %rbx
2820 ; AVX-NEXT:    retq
2822 ; F16C-LABEL: store_cvt_8f32_to_8i16:
2823 ; F16C:       # %bb.0:
2824 ; F16C-NEXT:    vcvtps2ph $4, %ymm0, (%rdi)
2825 ; F16C-NEXT:    vzeroupper
2826 ; F16C-NEXT:    retq
2828 ; AVX512-LABEL: store_cvt_8f32_to_8i16:
2829 ; AVX512:       # %bb.0:
2830 ; AVX512-NEXT:    vcvtps2ph $4, %ymm0, (%rdi)
2831 ; AVX512-NEXT:    vzeroupper
2832 ; AVX512-NEXT:    retq
2833   %1 = fptrunc <8 x float> %a0 to <8 x half>
2834   %2 = bitcast <8 x half> %1 to <8 x i16>
2835   store <8 x i16> %2, ptr %a1
2836   ret void
2839 define void @store_cvt_16f32_to_16i16(<16 x float> %a0, ptr %a1) nounwind {
2840 ; AVX1-LABEL: store_cvt_16f32_to_16i16:
2841 ; AVX1:       # %bb.0:
2842 ; AVX1-NEXT:    pushq %rbx
2843 ; AVX1-NEXT:    subq $112, %rsp
2844 ; AVX1-NEXT:    movq %rdi, %rbx
2845 ; AVX1-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2846 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2847 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0
2848 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2849 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2850 ; AVX1-NEXT:    vzeroupper
2851 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2852 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2853 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2854 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2855 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2856 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2857 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2858 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2859 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2860 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2861 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2862 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2863 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2864 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2865 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2866 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2867 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2868 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2869 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2870 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2871 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
2872 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2873 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2874 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2875 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2876 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2877 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2878 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2879 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2880 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2881 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2882 ; AVX1-NEXT:    vzeroupper
2883 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2884 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2885 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2886 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2887 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2888 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2889 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2890 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2891 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2892 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2893 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
2894 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2895 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2896 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2897 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2898 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2899 ; AVX1-NEXT:    vzeroupper
2900 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2901 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2902 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2903 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2904 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2905 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2906 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2907 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2908 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2909 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2910 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2911 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2912 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2913 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2914 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2915 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2916 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2917 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2918 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2919 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2920 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
2921 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2922 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2923 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2924 ; AVX1-NEXT:    # xmm0 = mem[1,0]
2925 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2926 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2927 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2928 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2929 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2930 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2931 ; AVX1-NEXT:    vzeroupper
2932 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2933 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2934 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2935 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
2936 ; AVX1-NEXT:    callq __truncsfhf2@PLT
2937 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
2938 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2939 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2940 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
2941 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2942 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
2943 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2944 ; AVX1-NEXT:    vmovaps %ymm0, (%rbx)
2945 ; AVX1-NEXT:    addq $112, %rsp
2946 ; AVX1-NEXT:    popq %rbx
2947 ; AVX1-NEXT:    vzeroupper
2948 ; AVX1-NEXT:    retq
2950 ; AVX2-LABEL: store_cvt_16f32_to_16i16:
2951 ; AVX2:       # %bb.0:
2952 ; AVX2-NEXT:    pushq %rbx
2953 ; AVX2-NEXT:    subq $176, %rsp
2954 ; AVX2-NEXT:    movq %rdi, %rbx
2955 ; AVX2-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2956 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2957 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm0
2958 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2959 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2960 ; AVX2-NEXT:    vzeroupper
2961 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2962 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2963 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2964 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2965 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2966 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
2967 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2968 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2969 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
2970 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
2971 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2972 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
2973 ; AVX2-NEXT:    vzeroupper
2974 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2975 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2976 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2977 ; AVX2-NEXT:    # xmm0 = mem[1,0]
2978 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2979 ; AVX2-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
2980 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2981 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
2982 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
2983 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2984 ; AVX2-NEXT:    vzeroupper
2985 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2986 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2987 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2988 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
2989 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2990 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
2991 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2992 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2993 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
2994 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2995 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2996 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2997 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
2998 ; AVX2-NEXT:    callq __truncsfhf2@PLT
2999 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3000 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3001 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
3002 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
3003 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
3004 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3005 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3006 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
3007 ; AVX2-NEXT:    vzeroupper
3008 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3009 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3010 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3011 ; AVX2-NEXT:    # xmm0 = mem[1,0]
3012 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3013 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3014 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3015 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3016 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3017 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
3018 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3019 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3020 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3021 ; AVX2-NEXT:    # xmm0 = mem[1,0]
3022 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3023 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3024 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3025 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
3026 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3027 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3028 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3029 ; AVX2-NEXT:    vzeroupper
3030 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3031 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3032 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3033 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
3034 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3035 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3036 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3037 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3038 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3039 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3040 ; AVX2-NEXT:    vzeroupper
3041 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3042 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3043 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3044 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
3045 ; AVX2-NEXT:    callq __truncsfhf2@PLT
3046 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3047 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3048 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
3049 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
3050 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
3051 ; AVX2-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
3052 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[2],mem[2]
3053 ; AVX2-NEXT:    vmovdqa %ymm0, (%rbx)
3054 ; AVX2-NEXT:    addq $176, %rsp
3055 ; AVX2-NEXT:    popq %rbx
3056 ; AVX2-NEXT:    vzeroupper
3057 ; AVX2-NEXT:    retq
3059 ; F16C-LABEL: store_cvt_16f32_to_16i16:
3060 ; F16C:       # %bb.0:
3061 ; F16C-NEXT:    vcvtps2ph $4, %ymm1, 16(%rdi)
3062 ; F16C-NEXT:    vcvtps2ph $4, %ymm0, (%rdi)
3063 ; F16C-NEXT:    vzeroupper
3064 ; F16C-NEXT:    retq
3066 ; AVX512-LABEL: store_cvt_16f32_to_16i16:
3067 ; AVX512:       # %bb.0:
3068 ; AVX512-NEXT:    vcvtps2ph $4, %zmm0, (%rdi)
3069 ; AVX512-NEXT:    vzeroupper
3070 ; AVX512-NEXT:    retq
3071   %1 = fptrunc <16 x float> %a0 to <16 x half>
3072   %2 = bitcast <16 x half> %1 to <16 x i16>
3073   store <16 x i16> %2, ptr %a1
3074   ret void
3078 ; Double to Half
3081 define i16 @cvt_f64_to_i16(double %a0) nounwind {
3082 ; ALL-LABEL: cvt_f64_to_i16:
3083 ; ALL:       # %bb.0:
3084 ; ALL-NEXT:    pushq %rax
3085 ; ALL-NEXT:    callq __truncdfhf2@PLT
3086 ; ALL-NEXT:    vpextrw $0, %xmm0, %eax
3087 ; ALL-NEXT:    # kill: def $ax killed $ax killed $eax
3088 ; ALL-NEXT:    popq %rcx
3089 ; ALL-NEXT:    retq
3090 ; AVX-LABEL: cvt_f64_to_i16:
3091 ; AVX:       # %bb.0:
3092 ; AVX-NEXT:    pushq %rax
3093 ; AVX-NEXT:    callq __truncdfhf2@PLT
3094 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
3095 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
3096 ; AVX-NEXT:    popq %rcx
3097 ; AVX-NEXT:    retq
3099 ; F16C-LABEL: cvt_f64_to_i16:
3100 ; F16C:       # %bb.0:
3101 ; F16C-NEXT:    pushq %rax
3102 ; F16C-NEXT:    callq __truncdfhf2@PLT
3103 ; F16C-NEXT:    vpextrw $0, %xmm0, %eax
3104 ; F16C-NEXT:    # kill: def $ax killed $ax killed $eax
3105 ; F16C-NEXT:    popq %rcx
3106 ; F16C-NEXT:    retq
3108 ; AVX512-LABEL: cvt_f64_to_i16:
3109 ; AVX512:       # %bb.0:
3110 ; AVX512-NEXT:    pushq %rax
3111 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3112 ; AVX512-NEXT:    vpextrw $0, %xmm0, %eax
3113 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
3114 ; AVX512-NEXT:    popq %rcx
3115 ; AVX512-NEXT:    retq
3116   %1 = fptrunc double %a0 to half
3117   %2 = bitcast half %1 to i16
3118   ret i16 %2
3121 define <2 x i16> @cvt_2f64_to_2i16(<2 x double> %a0) nounwind {
3122 ; AVX-LABEL: cvt_2f64_to_2i16:
3123 ; AVX:       # %bb.0:
3124 ; AVX-NEXT:    subq $40, %rsp
3125 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3126 ; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3127 ; AVX-NEXT:    callq __truncdfhf2@PLT
3128 ; AVX-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3129 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3130 ; AVX-NEXT:    callq __truncdfhf2@PLT
3131 ; AVX-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
3132 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3133 ; AVX-NEXT:    addq $40, %rsp
3134 ; AVX-NEXT:    retq
3136 ; F16C-LABEL: cvt_2f64_to_2i16:
3137 ; F16C:       # %bb.0:
3138 ; F16C-NEXT:    subq $40, %rsp
3139 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3140 ; F16C-NEXT:    callq __truncdfhf2@PLT
3141 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3142 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3143 ; F16C-NEXT:    # xmm0 = mem[1,0]
3144 ; F16C-NEXT:    callq __truncdfhf2@PLT
3145 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3146 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3147 ; F16C-NEXT:    addq $40, %rsp
3148 ; F16C-NEXT:    retq
3150 ; AVX512F-LABEL: cvt_2f64_to_2i16:
3151 ; AVX512F:       # %bb.0:
3152 ; AVX512F-NEXT:    subq $104, %rsp
3153 ; AVX512F-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
3154 ; AVX512F-NEXT:    callq __truncdfhf2@PLT
3155 ; AVX512F-NEXT:    vpbroadcastw %xmm0, %xmm0
3156 ; AVX512F-NEXT:    vmovdqu64 %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
3157 ; AVX512F-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
3158 ; AVX512F-NEXT:    vzeroupper
3159 ; AVX512F-NEXT:    callq __truncdfhf2@PLT
3160 ; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3161 ; AVX512F-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3162 ; AVX512F-NEXT:    # xmm0 = mem[1,0]
3163 ; AVX512F-NEXT:    callq __truncdfhf2@PLT
3164 ; AVX512F-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3165 ; AVX512F-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3166 ; AVX512F-NEXT:    vmovss {{.*#+}} xmm1 = [16,0,0,0]
3167 ; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
3168 ; AVX512F-NEXT:    vpermt2ps %zmm2, %zmm1, %zmm0
3169 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3170 ; AVX512F-NEXT:    addq $104, %rsp
3171 ; AVX512F-NEXT:    vzeroupper
3172 ; AVX512F-NEXT:    retq
3174 ; AVX512-FASTLANE-LABEL: cvt_2f64_to_2i16:
3175 ; AVX512-FASTLANE:       # %bb.0:
3176 ; AVX512-FASTLANE-NEXT:    subq $40, %rsp
3177 ; AVX512-FASTLANE-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3178 ; AVX512-FASTLANE-NEXT:    callq __truncdfhf2@PLT
3179 ; AVX512-FASTLANE-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3180 ; AVX512-FASTLANE-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3181 ; AVX512-FASTLANE-NEXT:    # xmm0 = mem[1,0]
3182 ; AVX512-FASTLANE-NEXT:    callq __truncdfhf2@PLT
3183 ; AVX512-FASTLANE-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3184 ; AVX512-FASTLANE-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3185 ; AVX512-FASTLANE-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
3186 ; AVX512-FASTLANE-NEXT:    callq __truncdfhf2@PLT
3187 ; AVX512-FASTLANE-NEXT:    vpbroadcastw %xmm0, %xmm1
3188 ; AVX512-FASTLANE-NEXT:    vmovss {{.*#+}} xmm0 = [4,0,0,0]
3189 ; AVX512-FASTLANE-NEXT:    vpermi2ps (%rsp), %xmm1, %xmm0 # 16-byte Folded Reload
3190 ; AVX512-FASTLANE-NEXT:    addq $40, %rsp
3191 ; AVX512-FASTLANE-NEXT:    retq
3192   %1 = fptrunc <2 x double> %a0 to <2 x half>
3193   %2 = bitcast <2 x half> %1 to <2 x i16>
3194   ret <2 x i16> %2
3197 define <4 x i16> @cvt_4f64_to_4i16(<4 x double> %a0) nounwind {
3198 ; AVX1-LABEL: cvt_4f64_to_4i16:
3199 ; AVX1:       # %bb.0:
3200 ; AVX1-NEXT:    subq $88, %rsp
3201 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3202 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3203 ; AVX1-NEXT:    vzeroupper
3204 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3205 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3206 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3207 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3208 ; AVX1-NEXT:    vzeroupper
3209 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3210 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3211 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3212 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3213 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3214 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3215 ; AVX1-NEXT:    vzeroupper
3216 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3217 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3218 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3219 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3220 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3221 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3222 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3223 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3224 ; AVX1-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3225 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3226 ; AVX1-NEXT:    addq $88, %rsp
3227 ; AVX1-NEXT:    retq
3229 ; AVX2-LABEL: cvt_4f64_to_4i16:
3230 ; AVX2:       # %bb.0:
3231 ; AVX2-NEXT:    subq $88, %rsp
3232 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3233 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3234 ; AVX2-NEXT:    vzeroupper
3235 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3236 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3237 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3238 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3239 ; AVX2-NEXT:    vzeroupper
3240 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3241 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3242 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3243 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3244 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3245 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3246 ; AVX2-NEXT:    vzeroupper
3247 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3248 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3249 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3250 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3251 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3252 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3253 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3254 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3255 ; AVX2-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3256 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3257 ; AVX2-NEXT:    addq $88, %rsp
3258 ; AVX2-NEXT:    retq
3260 ; F16C-LABEL: cvt_4f64_to_4i16:
3261 ; F16C:       # %bb.0:
3262 ; F16C-NEXT:    subq $72, %rsp
3263 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3264 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
3265 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3266 ; F16C-NEXT:    vzeroupper
3267 ; F16C-NEXT:    callq __truncdfhf2@PLT
3268 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3269 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3270 ; F16C-NEXT:    # xmm0 = mem[1,0]
3271 ; F16C-NEXT:    callq __truncdfhf2@PLT
3272 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3273 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3274 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3275 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3276 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3277 ; F16C-NEXT:    vzeroupper
3278 ; F16C-NEXT:    callq __truncdfhf2@PLT
3279 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3280 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3281 ; F16C-NEXT:    # xmm0 = mem[1,0]
3282 ; F16C-NEXT:    callq __truncdfhf2@PLT
3283 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3284 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3285 ; F16C-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3286 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
3287 ; F16C-NEXT:    addq $72, %rsp
3288 ; F16C-NEXT:    retq
3290 ; AVX512-LABEL: cvt_4f64_to_4i16:
3291 ; AVX512:       # %bb.0:
3292 ; AVX512-NEXT:    subq $72, %rsp
3293 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3294 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3295 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3296 ; AVX512-NEXT:    vzeroupper
3297 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3298 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3299 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3300 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3301 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3302 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3303 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3304 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3305 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3306 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3307 ; AVX512-NEXT:    vzeroupper
3308 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3309 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3310 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3311 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3312 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3313 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3314 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3315 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3316 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3317 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3318 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3319 ; AVX512-NEXT:    vpbroadcastw %xmm0, %xmm0
3320 ; AVX512-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3321 ; AVX512-NEXT:    vshufps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0,0]
3322 ; AVX512-NEXT:    addq $72, %rsp
3323 ; AVX512-NEXT:    retq
3324   %1 = fptrunc <4 x double> %a0 to <4 x half>
3325   %2 = bitcast <4 x half> %1 to <4 x i16>
3326   ret <4 x i16> %2
3329 define <8 x i16> @cvt_4f64_to_8i16_undef(<4 x double> %a0) nounwind {
3330 ; AVX1-LABEL: cvt_4f64_to_8i16_undef:
3331 ; AVX1:       # %bb.0:
3332 ; AVX1-NEXT:    subq $88, %rsp
3333 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3334 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3335 ; AVX1-NEXT:    vzeroupper
3336 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3337 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3338 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3339 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3340 ; AVX1-NEXT:    vzeroupper
3341 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3342 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3343 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3344 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3345 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3346 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3347 ; AVX1-NEXT:    vzeroupper
3348 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3349 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3350 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3351 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3352 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3353 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3354 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3355 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3356 ; AVX1-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3357 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3358 ; AVX1-NEXT:    addq $88, %rsp
3359 ; AVX1-NEXT:    retq
3361 ; AVX2-LABEL: cvt_4f64_to_8i16_undef:
3362 ; AVX2:       # %bb.0:
3363 ; AVX2-NEXT:    subq $88, %rsp
3364 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3365 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3366 ; AVX2-NEXT:    vzeroupper
3367 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3368 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3369 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3370 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3371 ; AVX2-NEXT:    vzeroupper
3372 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3373 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3374 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3375 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3376 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3377 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3378 ; AVX2-NEXT:    vzeroupper
3379 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3380 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3381 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3382 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3383 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3384 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3385 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3386 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3387 ; AVX2-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3388 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3389 ; AVX2-NEXT:    addq $88, %rsp
3390 ; AVX2-NEXT:    retq
3392 ; F16C-LABEL: cvt_4f64_to_8i16_undef:
3393 ; F16C:       # %bb.0:
3394 ; F16C-NEXT:    subq $72, %rsp
3395 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3396 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
3397 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3398 ; F16C-NEXT:    vzeroupper
3399 ; F16C-NEXT:    callq __truncdfhf2@PLT
3400 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3401 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3402 ; F16C-NEXT:    # xmm0 = mem[1,0]
3403 ; F16C-NEXT:    callq __truncdfhf2@PLT
3404 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3405 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3406 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3407 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3408 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3409 ; F16C-NEXT:    vzeroupper
3410 ; F16C-NEXT:    callq __truncdfhf2@PLT
3411 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3412 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3413 ; F16C-NEXT:    # xmm0 = mem[1,0]
3414 ; F16C-NEXT:    callq __truncdfhf2@PLT
3415 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3416 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3417 ; F16C-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3418 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
3419 ; F16C-NEXT:    addq $72, %rsp
3420 ; F16C-NEXT:    retq
3422 ; AVX512-LABEL: cvt_4f64_to_8i16_undef:
3423 ; AVX512:       # %bb.0:
3424 ; AVX512-NEXT:    subq $72, %rsp
3425 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3426 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3427 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3428 ; AVX512-NEXT:    vzeroupper
3429 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3430 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3431 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3432 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3433 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3434 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3435 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3436 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3437 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3438 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3439 ; AVX512-NEXT:    vzeroupper
3440 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3441 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3442 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3443 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3444 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3445 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3446 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3447 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3448 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3449 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3450 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3451 ; AVX512-NEXT:    vpbroadcastw %xmm0, %xmm0
3452 ; AVX512-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3453 ; AVX512-NEXT:    vshufps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0,0]
3454 ; AVX512-NEXT:    addq $72, %rsp
3455 ; AVX512-NEXT:    retq
3456   %1 = fptrunc <4 x double> %a0 to <4 x half>
3457   %2 = bitcast <4 x half> %1 to <4 x i16>
3458   %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>
3459   ret <8 x i16> %3
3462 define <8 x i16> @cvt_4f64_to_8i16_zero(<4 x double> %a0) nounwind {
3463 ; AVX1-LABEL: cvt_4f64_to_8i16_zero:
3464 ; AVX1:       # %bb.0:
3465 ; AVX1-NEXT:    subq $88, %rsp
3466 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3467 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3468 ; AVX1-NEXT:    vzeroupper
3469 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3470 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3471 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3472 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3473 ; AVX1-NEXT:    vzeroupper
3474 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3475 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3476 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3477 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3478 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3479 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3480 ; AVX1-NEXT:    vzeroupper
3481 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3482 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3483 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3484 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3485 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3486 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3487 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3488 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3489 ; AVX1-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3490 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3491 ; AVX1-NEXT:    addq $88, %rsp
3492 ; AVX1-NEXT:    retq
3494 ; AVX2-LABEL: cvt_4f64_to_8i16_zero:
3495 ; AVX2:       # %bb.0:
3496 ; AVX2-NEXT:    subq $88, %rsp
3497 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3498 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3499 ; AVX2-NEXT:    vzeroupper
3500 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3501 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3502 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3503 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3504 ; AVX2-NEXT:    vzeroupper
3505 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3506 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3507 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3508 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3509 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3510 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3511 ; AVX2-NEXT:    vzeroupper
3512 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3513 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3514 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3515 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3516 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3517 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
3518 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3519 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
3520 ; AVX2-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
3521 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
3522 ; AVX2-NEXT:    addq $88, %rsp
3523 ; AVX2-NEXT:    retq
3525 ; F16C-LABEL: cvt_4f64_to_8i16_zero:
3526 ; F16C:       # %bb.0:
3527 ; F16C-NEXT:    subq $72, %rsp
3528 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3529 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
3530 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3531 ; F16C-NEXT:    vzeroupper
3532 ; F16C-NEXT:    callq __truncdfhf2@PLT
3533 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3534 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3535 ; F16C-NEXT:    # xmm0 = mem[1,0]
3536 ; F16C-NEXT:    callq __truncdfhf2@PLT
3537 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3538 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3539 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3540 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3541 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3542 ; F16C-NEXT:    vzeroupper
3543 ; F16C-NEXT:    callq __truncdfhf2@PLT
3544 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3545 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3546 ; F16C-NEXT:    # xmm0 = mem[1,0]
3547 ; F16C-NEXT:    callq __truncdfhf2@PLT
3548 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3549 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3550 ; F16C-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3551 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
3552 ; F16C-NEXT:    addq $72, %rsp
3553 ; F16C-NEXT:    retq
3555 ; AVX512-LABEL: cvt_4f64_to_8i16_zero:
3556 ; AVX512:       # %bb.0:
3557 ; AVX512-NEXT:    subq $72, %rsp
3558 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3559 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3560 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3561 ; AVX512-NEXT:    vzeroupper
3562 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3563 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3564 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3565 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3566 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3567 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3568 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3569 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3570 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3571 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3572 ; AVX512-NEXT:    vzeroupper
3573 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3574 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3575 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3576 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3577 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3578 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3579 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3580 ; AVX512-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3581 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
3582 ; AVX512-NEXT:    addq $72, %rsp
3583 ; AVX512-NEXT:    retq
3584   %1 = fptrunc <4 x double> %a0 to <4 x half>
3585   %2 = bitcast <4 x half> %1 to <4 x i16>
3586   %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>
3587   ret <8 x i16> %3
3590 define <8 x i16> @cvt_8f64_to_8i16(<8 x double> %a0) nounwind {
3591 ; AVX-LABEL: cvt_8f64_to_8i16:
3592 ; AVX:       # %bb.0:
3593 ; AVX-NEXT:    subq $104, %rsp
3594 ; AVX-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3595 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3596 ; AVX-NEXT:    vextractf128 $1, %ymm1, %xmm0
3597 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3598 ; AVX-NEXT:    vzeroupper
3599 ; AVX-NEXT:    callq __truncdfhf2@PLT
3600 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3601 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3602 ; AVX-NEXT:    # xmm0 = mem[1,0]
3603 ; AVX-NEXT:    callq __truncdfhf2@PLT
3604 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3605 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3606 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3607 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3608 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3609 ; AVX-NEXT:    vzeroupper
3610 ; AVX-NEXT:    callq __truncdfhf2@PLT
3611 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3612 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3613 ; AVX-NEXT:    # xmm0 = mem[1,0]
3614 ; AVX-NEXT:    callq __truncdfhf2@PLT
3615 ; AVX-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3616 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3617 ; AVX-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3618 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3619 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3620 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3621 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
3622 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3623 ; AVX-NEXT:    vzeroupper
3624 ; AVX-NEXT:    callq __truncdfhf2@PLT
3625 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3626 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3627 ; AVX-NEXT:    # xmm0 = mem[1,0]
3628 ; AVX-NEXT:    callq __truncdfhf2@PLT
3629 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3630 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3631 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3632 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3633 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3634 ; AVX-NEXT:    vzeroupper
3635 ; AVX-NEXT:    callq __truncdfhf2@PLT
3636 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3637 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3638 ; AVX-NEXT:    # xmm0 = mem[1,0]
3639 ; AVX-NEXT:    callq __truncdfhf2@PLT
3640 ; AVX-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3641 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3642 ; AVX-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3643 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3644 ; AVX-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3645 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
3646 ; AVX-NEXT:    addq $104, %rsp
3647 ; AVX-NEXT:    retq
3649 ; F16C-LABEL: cvt_8f64_to_8i16:
3650 ; F16C:       # %bb.0:
3651 ; F16C-NEXT:    subq $104, %rsp
3652 ; F16C-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3653 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3654 ; F16C-NEXT:    vextractf128 $1, %ymm1, %xmm0
3655 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3656 ; F16C-NEXT:    vzeroupper
3657 ; F16C-NEXT:    callq __truncdfhf2@PLT
3658 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3659 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3660 ; F16C-NEXT:    # xmm0 = mem[1,0]
3661 ; F16C-NEXT:    callq __truncdfhf2@PLT
3662 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3663 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3664 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3665 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3666 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3667 ; F16C-NEXT:    vzeroupper
3668 ; F16C-NEXT:    callq __truncdfhf2@PLT
3669 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3670 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3671 ; F16C-NEXT:    # xmm0 = mem[1,0]
3672 ; F16C-NEXT:    callq __truncdfhf2@PLT
3673 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3674 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3675 ; F16C-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3676 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3677 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3678 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3679 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
3680 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3681 ; F16C-NEXT:    vzeroupper
3682 ; F16C-NEXT:    callq __truncdfhf2@PLT
3683 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3684 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3685 ; F16C-NEXT:    # xmm0 = mem[1,0]
3686 ; F16C-NEXT:    callq __truncdfhf2@PLT
3687 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3688 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3689 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3690 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3691 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3692 ; F16C-NEXT:    vzeroupper
3693 ; F16C-NEXT:    callq __truncdfhf2@PLT
3694 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3695 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3696 ; F16C-NEXT:    # xmm0 = mem[1,0]
3697 ; F16C-NEXT:    callq __truncdfhf2@PLT
3698 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3699 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3700 ; F16C-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3701 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3702 ; F16C-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3703 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0]
3704 ; F16C-NEXT:    addq $104, %rsp
3705 ; F16C-NEXT:    retq
3707 ; AVX512-LABEL: cvt_8f64_to_8i16:
3708 ; AVX512:       # %bb.0:
3709 ; AVX512-NEXT:    subq $120, %rsp
3710 ; AVX512-NEXT:    vmovups %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
3711 ; AVX512-NEXT:    vextractf32x4 $3, %zmm0, %xmm0
3712 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3713 ; AVX512-NEXT:    vzeroupper
3714 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3715 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3716 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3717 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3718 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3719 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3720 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3721 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3722 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
3723 ; AVX512-NEXT:    vextractf32x4 $2, %zmm0, %xmm0
3724 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3725 ; AVX512-NEXT:    vzeroupper
3726 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3727 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3728 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3729 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3730 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3731 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3732 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3733 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3734 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3735 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3736 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
3737 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
3738 ; AVX512-NEXT:    vzeroupper
3739 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3740 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3741 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3742 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3743 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3744 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3745 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3746 ; AVX512-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
3747 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
3748 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3749 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3750 ; AVX512-NEXT:    vzeroupper
3751 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3752 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3753 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3754 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3755 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3756 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3757 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3758 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3759 ; AVX512-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
3760 ; AVX512-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3761 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0]
3762 ; AVX512-NEXT:    addq $120, %rsp
3763 ; AVX512-NEXT:    retq
3764   %1 = fptrunc <8 x double> %a0 to <8 x half>
3765   %2 = bitcast <8 x half> %1 to <8 x i16>
3766   ret <8 x i16> %2
3770 ; Double to Half (Store)
3773 define void @store_cvt_f64_to_i16(double %a0, ptr %a1) nounwind {
3774 ; ALL-LABEL: store_cvt_f64_to_i16:
3775 ; ALL:       # %bb.0:
3776 ; ALL-NEXT:    pushq %rbx
3777 ; ALL-NEXT:    movq %rdi, %rbx
3778 ; ALL-NEXT:    callq __truncdfhf2@PLT
3779 ; ALL-NEXT:    vpextrw $0, %xmm0, (%rbx)
3780 ; ALL-NEXT:    popq %rbx
3781 ; ALL-NEXT:    retq
3782 ; AVX-LABEL: store_cvt_f64_to_i16:
3783 ; AVX:       # %bb.0:
3784 ; AVX-NEXT:    pushq %rbx
3785 ; AVX-NEXT:    movq %rdi, %rbx
3786 ; AVX-NEXT:    callq __truncdfhf2@PLT
3787 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rbx)
3788 ; AVX-NEXT:    popq %rbx
3789 ; AVX-NEXT:    retq
3791 ; F16C-LABEL: store_cvt_f64_to_i16:
3792 ; F16C:       # %bb.0:
3793 ; F16C-NEXT:    pushq %rbx
3794 ; F16C-NEXT:    movq %rdi, %rbx
3795 ; F16C-NEXT:    callq __truncdfhf2@PLT
3796 ; F16C-NEXT:    vpextrw $0, %xmm0, (%rbx)
3797 ; F16C-NEXT:    popq %rbx
3798 ; F16C-NEXT:    retq
3800 ; AVX512-LABEL: store_cvt_f64_to_i16:
3801 ; AVX512:       # %bb.0:
3802 ; AVX512-NEXT:    pushq %rbx
3803 ; AVX512-NEXT:    movq %rdi, %rbx
3804 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3805 ; AVX512-NEXT:    vpextrw $0, %xmm0, (%rbx)
3806 ; AVX512-NEXT:    popq %rbx
3807 ; AVX512-NEXT:    retq
3808   %1 = fptrunc double %a0 to half
3809   %2 = bitcast half %1 to i16
3810   store i16 %2, ptr %a1
3811   ret void
3814 define void @store_cvt_2f64_to_2i16(<2 x double> %a0, ptr %a1) nounwind {
3815 ; AVX-LABEL: store_cvt_2f64_to_2i16:
3816 ; AVX:       # %bb.0:
3817 ; AVX-NEXT:    pushq %rbx
3818 ; AVX-NEXT:    subq $32, %rsp
3819 ; AVX-NEXT:    movq %rdi, %rbx
3820 ; AVX-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
3821 ; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3822 ; AVX-NEXT:    callq __truncdfhf2@PLT
3823 ; AVX-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3824 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3825 ; AVX-NEXT:    callq __truncdfhf2@PLT
3826 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rbx)
3827 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3828 ; AVX-NEXT:    vpextrw $0, %xmm0, 2(%rbx)
3829 ; AVX-NEXT:    addq $32, %rsp
3830 ; AVX-NEXT:    popq %rbx
3831 ; AVX-NEXT:    retq
3833 ; F16C-LABEL: store_cvt_2f64_to_2i16:
3834 ; F16C:       # %bb.0:
3835 ; F16C-NEXT:    pushq %rbx
3836 ; F16C-NEXT:    subq $32, %rsp
3837 ; F16C-NEXT:    movq %rdi, %rbx
3838 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3839 ; F16C-NEXT:    callq __truncdfhf2@PLT
3840 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3841 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3842 ; F16C-NEXT:    # xmm0 = mem[1,0]
3843 ; F16C-NEXT:    callq __truncdfhf2@PLT
3844 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3845 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3846 ; F16C-NEXT:    vmovd %xmm0, (%rbx)
3847 ; F16C-NEXT:    addq $32, %rsp
3848 ; F16C-NEXT:    popq %rbx
3849 ; F16C-NEXT:    retq
3851 ; AVX512-LABEL: store_cvt_2f64_to_2i16:
3852 ; AVX512:       # %bb.0:
3853 ; AVX512-NEXT:    pushq %rbx
3854 ; AVX512-NEXT:    subq $32, %rsp
3855 ; AVX512-NEXT:    movq %rdi, %rbx
3856 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3857 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3858 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3859 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3860 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3861 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3862 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3863 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3864 ; AVX512-NEXT:    vmovd %xmm0, (%rbx)
3865 ; AVX512-NEXT:    addq $32, %rsp
3866 ; AVX512-NEXT:    popq %rbx
3867 ; AVX512-NEXT:    retq
3868   %1 = fptrunc <2 x double> %a0 to <2 x half>
3869   %2 = bitcast <2 x half> %1 to <2 x i16>
3870   store <2 x i16> %2, ptr %a1
3871   ret void
3874 define void @store_cvt_4f64_to_4i16(<4 x double> %a0, ptr %a1) nounwind {
3875 ; AVX1-LABEL: store_cvt_4f64_to_4i16:
3876 ; AVX1:       # %bb.0:
3877 ; AVX1-NEXT:    pushq %rbx
3878 ; AVX1-NEXT:    subq $80, %rsp
3879 ; AVX1-NEXT:    movq %rdi, %rbx
3880 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3881 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3882 ; AVX1-NEXT:    vzeroupper
3883 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3884 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3885 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3886 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3887 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3888 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3889 ; AVX1-NEXT:    vzeroupper
3890 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3891 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3892 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3893 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3894 ; AVX1-NEXT:    vzeroupper
3895 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3896 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3897 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3898 ; AVX1-NEXT:    callq __truncdfhf2@PLT
3899 ; AVX1-NEXT:    vpextrw $0, %xmm0, 4(%rbx)
3900 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3901 ; AVX1-NEXT:    vpextrw $0, %xmm0, (%rbx)
3902 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3903 ; AVX1-NEXT:    vpextrw $0, %xmm0, 6(%rbx)
3904 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3905 ; AVX1-NEXT:    vpextrw $0, %xmm0, 2(%rbx)
3906 ; AVX1-NEXT:    addq $80, %rsp
3907 ; AVX1-NEXT:    popq %rbx
3908 ; AVX1-NEXT:    retq
3910 ; AVX2-LABEL: store_cvt_4f64_to_4i16:
3911 ; AVX2:       # %bb.0:
3912 ; AVX2-NEXT:    pushq %rbx
3913 ; AVX2-NEXT:    subq $80, %rsp
3914 ; AVX2-NEXT:    movq %rdi, %rbx
3915 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
3916 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3917 ; AVX2-NEXT:    vzeroupper
3918 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3919 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3920 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
3921 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
3922 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3923 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
3924 ; AVX2-NEXT:    vzeroupper
3925 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3926 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3927 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
3928 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3929 ; AVX2-NEXT:    vzeroupper
3930 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3931 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3932 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3933 ; AVX2-NEXT:    callq __truncdfhf2@PLT
3934 ; AVX2-NEXT:    vpextrw $0, %xmm0, 4(%rbx)
3935 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
3936 ; AVX2-NEXT:    vpextrw $0, %xmm0, (%rbx)
3937 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3938 ; AVX2-NEXT:    vpextrw $0, %xmm0, 6(%rbx)
3939 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3940 ; AVX2-NEXT:    vpextrw $0, %xmm0, 2(%rbx)
3941 ; AVX2-NEXT:    addq $80, %rsp
3942 ; AVX2-NEXT:    popq %rbx
3943 ; AVX2-NEXT:    retq
3945 ; F16C-LABEL: store_cvt_4f64_to_4i16:
3946 ; F16C:       # %bb.0:
3947 ; F16C-NEXT:    pushq %rbx
3948 ; F16C-NEXT:    subq $64, %rsp
3949 ; F16C-NEXT:    movq %rdi, %rbx
3950 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3951 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
3952 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3953 ; F16C-NEXT:    vzeroupper
3954 ; F16C-NEXT:    callq __truncdfhf2@PLT
3955 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3956 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3957 ; F16C-NEXT:    # xmm0 = mem[1,0]
3958 ; F16C-NEXT:    callq __truncdfhf2@PLT
3959 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3960 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3961 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3962 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3963 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3964 ; F16C-NEXT:    vzeroupper
3965 ; F16C-NEXT:    callq __truncdfhf2@PLT
3966 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3967 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3968 ; F16C-NEXT:    # xmm0 = mem[1,0]
3969 ; F16C-NEXT:    callq __truncdfhf2@PLT
3970 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
3971 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3972 ; F16C-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
3973 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3974 ; F16C-NEXT:    vmovq %xmm0, (%rbx)
3975 ; F16C-NEXT:    addq $64, %rsp
3976 ; F16C-NEXT:    popq %rbx
3977 ; F16C-NEXT:    retq
3979 ; AVX512-LABEL: store_cvt_4f64_to_4i16:
3980 ; AVX512:       # %bb.0:
3981 ; AVX512-NEXT:    pushq %rbx
3982 ; AVX512-NEXT:    subq $64, %rsp
3983 ; AVX512-NEXT:    movq %rdi, %rbx
3984 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
3985 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
3986 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
3987 ; AVX512-NEXT:    vzeroupper
3988 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3989 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3990 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
3991 ; AVX512-NEXT:    # xmm0 = mem[1,0]
3992 ; AVX512-NEXT:    callq __truncdfhf2@PLT
3993 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3994 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3995 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3996 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
3997 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3998 ; AVX512-NEXT:    vzeroupper
3999 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4000 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4001 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4002 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4003 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4004 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4005 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4006 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4007 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4008 ; AVX512-NEXT:    vmovq %xmm0, (%rbx)
4009 ; AVX512-NEXT:    addq $64, %rsp
4010 ; AVX512-NEXT:    popq %rbx
4011 ; AVX512-NEXT:    retq
4012   %1 = fptrunc <4 x double> %a0 to <4 x half>
4013   %2 = bitcast <4 x half> %1 to <4 x i16>
4014   store <4 x i16> %2, ptr %a1
4015   ret void
4018 define void @store_cvt_4f64_to_8i16_undef(<4 x double> %a0, ptr %a1) nounwind {
4019 ; AVX1-LABEL: store_cvt_4f64_to_8i16_undef:
4020 ; AVX1:       # %bb.0:
4021 ; AVX1-NEXT:    pushq %rbx
4022 ; AVX1-NEXT:    subq $80, %rsp
4023 ; AVX1-NEXT:    movq %rdi, %rbx
4024 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
4025 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4026 ; AVX1-NEXT:    vzeroupper
4027 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4028 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4029 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4030 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4031 ; AVX1-NEXT:    vzeroupper
4032 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4033 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4034 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4035 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4036 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4037 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4038 ; AVX1-NEXT:    vzeroupper
4039 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4040 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4041 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
4042 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4043 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4044 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4045 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4046 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
4047 ; AVX1-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
4048 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
4049 ; AVX1-NEXT:    vmovaps %xmm0, (%rbx)
4050 ; AVX1-NEXT:    addq $80, %rsp
4051 ; AVX1-NEXT:    popq %rbx
4052 ; AVX1-NEXT:    retq
4054 ; AVX2-LABEL: store_cvt_4f64_to_8i16_undef:
4055 ; AVX2:       # %bb.0:
4056 ; AVX2-NEXT:    pushq %rbx
4057 ; AVX2-NEXT:    subq $80, %rsp
4058 ; AVX2-NEXT:    movq %rdi, %rbx
4059 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
4060 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4061 ; AVX2-NEXT:    vzeroupper
4062 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4063 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4064 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4065 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4066 ; AVX2-NEXT:    vzeroupper
4067 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4068 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4069 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
4070 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4071 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4072 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4073 ; AVX2-NEXT:    vzeroupper
4074 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4075 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4076 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
4077 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4078 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4079 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4080 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4081 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
4082 ; AVX2-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
4083 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
4084 ; AVX2-NEXT:    vmovaps %xmm0, (%rbx)
4085 ; AVX2-NEXT:    addq $80, %rsp
4086 ; AVX2-NEXT:    popq %rbx
4087 ; AVX2-NEXT:    retq
4089 ; F16C-LABEL: store_cvt_4f64_to_8i16_undef:
4090 ; F16C:       # %bb.0:
4091 ; F16C-NEXT:    pushq %rbx
4092 ; F16C-NEXT:    subq $64, %rsp
4093 ; F16C-NEXT:    movq %rdi, %rbx
4094 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4095 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
4096 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4097 ; F16C-NEXT:    vzeroupper
4098 ; F16C-NEXT:    callq __truncdfhf2@PLT
4099 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4100 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4101 ; F16C-NEXT:    # xmm0 = mem[1,0]
4102 ; F16C-NEXT:    callq __truncdfhf2@PLT
4103 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4104 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4105 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4106 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4107 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4108 ; F16C-NEXT:    vzeroupper
4109 ; F16C-NEXT:    callq __truncdfhf2@PLT
4110 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4111 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4112 ; F16C-NEXT:    # xmm0 = mem[1,0]
4113 ; F16C-NEXT:    callq __truncdfhf2@PLT
4114 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4115 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4116 ; F16C-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4117 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
4118 ; F16C-NEXT:    vmovaps %xmm0, (%rbx)
4119 ; F16C-NEXT:    addq $64, %rsp
4120 ; F16C-NEXT:    popq %rbx
4121 ; F16C-NEXT:    retq
4123 ; AVX512-LABEL: store_cvt_4f64_to_8i16_undef:
4124 ; AVX512:       # %bb.0:
4125 ; AVX512-NEXT:    pushq %rbx
4126 ; AVX512-NEXT:    subq $64, %rsp
4127 ; AVX512-NEXT:    movq %rdi, %rbx
4128 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4129 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
4130 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4131 ; AVX512-NEXT:    vzeroupper
4132 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4133 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4134 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4135 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4136 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4137 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4138 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4139 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4140 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4141 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4142 ; AVX512-NEXT:    vzeroupper
4143 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4144 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4145 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4146 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4147 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4148 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4149 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4150 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4151 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4152 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4153 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4154 ; AVX512-NEXT:    vpbroadcastw %xmm0, %xmm0
4155 ; AVX512-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4156 ; AVX512-NEXT:    vshufps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0,0]
4157 ; AVX512-NEXT:    vmovaps %xmm0, (%rbx)
4158 ; AVX512-NEXT:    addq $64, %rsp
4159 ; AVX512-NEXT:    popq %rbx
4160 ; AVX512-NEXT:    retq
4161   %1 = fptrunc <4 x double> %a0 to <4 x half>
4162   %2 = bitcast <4 x half> %1 to <4 x i16>
4163   %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>
4164   store <8 x i16> %3, ptr %a1
4165   ret void
4168 define void @store_cvt_4f64_to_8i16_zero(<4 x double> %a0, ptr %a1) nounwind {
4169 ; AVX1-LABEL: store_cvt_4f64_to_8i16_zero:
4170 ; AVX1:       # %bb.0:
4171 ; AVX1-NEXT:    pushq %rbx
4172 ; AVX1-NEXT:    subq $80, %rsp
4173 ; AVX1-NEXT:    movq %rdi, %rbx
4174 ; AVX1-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
4175 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4176 ; AVX1-NEXT:    vzeroupper
4177 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4178 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4179 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4180 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4181 ; AVX1-NEXT:    vzeroupper
4182 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4183 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4184 ; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4185 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4186 ; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4187 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4188 ; AVX1-NEXT:    vzeroupper
4189 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4190 ; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4191 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
4192 ; AVX1-NEXT:    callq __truncdfhf2@PLT
4193 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4194 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4195 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4196 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
4197 ; AVX1-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
4198 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
4199 ; AVX1-NEXT:    vmovaps %xmm0, (%rbx)
4200 ; AVX1-NEXT:    addq $80, %rsp
4201 ; AVX1-NEXT:    popq %rbx
4202 ; AVX1-NEXT:    retq
4204 ; AVX2-LABEL: store_cvt_4f64_to_8i16_zero:
4205 ; AVX2:       # %bb.0:
4206 ; AVX2-NEXT:    pushq %rbx
4207 ; AVX2-NEXT:    subq $80, %rsp
4208 ; AVX2-NEXT:    movq %rdi, %rbx
4209 ; AVX2-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill
4210 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4211 ; AVX2-NEXT:    vzeroupper
4212 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4213 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4214 ; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload
4215 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4216 ; AVX2-NEXT:    vzeroupper
4217 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4218 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4219 ; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload
4220 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4221 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4222 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4223 ; AVX2-NEXT:    vzeroupper
4224 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4225 ; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4226 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
4227 ; AVX2-NEXT:    callq __truncdfhf2@PLT
4228 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4229 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4230 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4231 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload
4232 ; AVX2-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]
4233 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero
4234 ; AVX2-NEXT:    vmovaps %xmm0, (%rbx)
4235 ; AVX2-NEXT:    addq $80, %rsp
4236 ; AVX2-NEXT:    popq %rbx
4237 ; AVX2-NEXT:    retq
4239 ; F16C-LABEL: store_cvt_4f64_to_8i16_zero:
4240 ; F16C:       # %bb.0:
4241 ; F16C-NEXT:    pushq %rbx
4242 ; F16C-NEXT:    subq $64, %rsp
4243 ; F16C-NEXT:    movq %rdi, %rbx
4244 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4245 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
4246 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4247 ; F16C-NEXT:    vzeroupper
4248 ; F16C-NEXT:    callq __truncdfhf2@PLT
4249 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4250 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4251 ; F16C-NEXT:    # xmm0 = mem[1,0]
4252 ; F16C-NEXT:    callq __truncdfhf2@PLT
4253 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4254 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4255 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4256 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4257 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4258 ; F16C-NEXT:    vzeroupper
4259 ; F16C-NEXT:    callq __truncdfhf2@PLT
4260 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4261 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4262 ; F16C-NEXT:    # xmm0 = mem[1,0]
4263 ; F16C-NEXT:    callq __truncdfhf2@PLT
4264 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4265 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4266 ; F16C-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4267 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
4268 ; F16C-NEXT:    vmovaps %xmm0, (%rbx)
4269 ; F16C-NEXT:    addq $64, %rsp
4270 ; F16C-NEXT:    popq %rbx
4271 ; F16C-NEXT:    retq
4273 ; AVX512-LABEL: store_cvt_4f64_to_8i16_zero:
4274 ; AVX512:       # %bb.0:
4275 ; AVX512-NEXT:    pushq %rbx
4276 ; AVX512-NEXT:    subq $64, %rsp
4277 ; AVX512-NEXT:    movq %rdi, %rbx
4278 ; AVX512-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4279 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
4280 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4281 ; AVX512-NEXT:    vzeroupper
4282 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4283 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4284 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4285 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4286 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4287 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4288 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4289 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4290 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4291 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4292 ; AVX512-NEXT:    vzeroupper
4293 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4294 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4295 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4296 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4297 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4298 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4299 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4300 ; AVX512-NEXT:    vinsertps $28, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4301 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],zero,zero
4302 ; AVX512-NEXT:    vmovaps %xmm0, (%rbx)
4303 ; AVX512-NEXT:    addq $64, %rsp
4304 ; AVX512-NEXT:    popq %rbx
4305 ; AVX512-NEXT:    retq
4306   %1 = fptrunc <4 x double> %a0 to <4 x half>
4307   %2 = bitcast <4 x half> %1 to <4 x i16>
4308   %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>
4309   store <8 x i16> %3, ptr %a1
4310   ret void
4313 define void @store_cvt_8f64_to_8i16(<8 x double> %a0, ptr %a1) nounwind {
4314 ; AVX-LABEL: store_cvt_8f64_to_8i16:
4315 ; AVX:       # %bb.0:
4316 ; AVX-NEXT:    pushq %rbx
4317 ; AVX-NEXT:    subq $96, %rsp
4318 ; AVX-NEXT:    movq %rdi, %rbx
4319 ; AVX-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4320 ; AVX-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4321 ; AVX-NEXT:    vextractf128 $1, %ymm1, %xmm0
4322 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4323 ; AVX-NEXT:    vzeroupper
4324 ; AVX-NEXT:    callq __truncdfhf2@PLT
4325 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4326 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4327 ; AVX-NEXT:    # xmm0 = mem[1,0]
4328 ; AVX-NEXT:    callq __truncdfhf2@PLT
4329 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4330 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4331 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4332 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4333 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4334 ; AVX-NEXT:    vzeroupper
4335 ; AVX-NEXT:    callq __truncdfhf2@PLT
4336 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4337 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4338 ; AVX-NEXT:    # xmm0 = mem[1,0]
4339 ; AVX-NEXT:    callq __truncdfhf2@PLT
4340 ; AVX-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4341 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4342 ; AVX-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4343 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4344 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4345 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4346 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
4347 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4348 ; AVX-NEXT:    vzeroupper
4349 ; AVX-NEXT:    callq __truncdfhf2@PLT
4350 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4351 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4352 ; AVX-NEXT:    # xmm0 = mem[1,0]
4353 ; AVX-NEXT:    callq __truncdfhf2@PLT
4354 ; AVX-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4355 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4356 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4357 ; AVX-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4358 ; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4359 ; AVX-NEXT:    vzeroupper
4360 ; AVX-NEXT:    callq __truncdfhf2@PLT
4361 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4362 ; AVX-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4363 ; AVX-NEXT:    # xmm0 = mem[1,0]
4364 ; AVX-NEXT:    callq __truncdfhf2@PLT
4365 ; AVX-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4366 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4367 ; AVX-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4368 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4369 ; AVX-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4370 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
4371 ; AVX-NEXT:    vmovdqa %xmm0, (%rbx)
4372 ; AVX-NEXT:    addq $96, %rsp
4373 ; AVX-NEXT:    popq %rbx
4374 ; AVX-NEXT:    retq
4376 ; F16C-LABEL: store_cvt_8f64_to_8i16:
4377 ; F16C:       # %bb.0:
4378 ; F16C-NEXT:    pushq %rbx
4379 ; F16C-NEXT:    subq $96, %rsp
4380 ; F16C-NEXT:    movq %rdi, %rbx
4381 ; F16C-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4382 ; F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4383 ; F16C-NEXT:    vextractf128 $1, %ymm1, %xmm0
4384 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4385 ; F16C-NEXT:    vzeroupper
4386 ; F16C-NEXT:    callq __truncdfhf2@PLT
4387 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4388 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4389 ; F16C-NEXT:    # xmm0 = mem[1,0]
4390 ; F16C-NEXT:    callq __truncdfhf2@PLT
4391 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4392 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4393 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4394 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4395 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4396 ; F16C-NEXT:    vzeroupper
4397 ; F16C-NEXT:    callq __truncdfhf2@PLT
4398 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4399 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4400 ; F16C-NEXT:    # xmm0 = mem[1,0]
4401 ; F16C-NEXT:    callq __truncdfhf2@PLT
4402 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4403 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4404 ; F16C-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4405 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4406 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4407 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4408 ; F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
4409 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4410 ; F16C-NEXT:    vzeroupper
4411 ; F16C-NEXT:    callq __truncdfhf2@PLT
4412 ; F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4413 ; F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4414 ; F16C-NEXT:    # xmm0 = mem[1,0]
4415 ; F16C-NEXT:    callq __truncdfhf2@PLT
4416 ; F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4417 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4418 ; F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4419 ; F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4420 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4421 ; F16C-NEXT:    vzeroupper
4422 ; F16C-NEXT:    callq __truncdfhf2@PLT
4423 ; F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4424 ; F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4425 ; F16C-NEXT:    # xmm0 = mem[1,0]
4426 ; F16C-NEXT:    callq __truncdfhf2@PLT
4427 ; F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4428 ; F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4429 ; F16C-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4430 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4431 ; F16C-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4432 ; F16C-NEXT:    # xmm0 = xmm0[0],mem[0]
4433 ; F16C-NEXT:    vmovdqa %xmm0, (%rbx)
4434 ; F16C-NEXT:    addq $96, %rsp
4435 ; F16C-NEXT:    popq %rbx
4436 ; F16C-NEXT:    retq
4438 ; AVX512-LABEL: store_cvt_8f64_to_8i16:
4439 ; AVX512:       # %bb.0:
4440 ; AVX512-NEXT:    pushq %rbx
4441 ; AVX512-NEXT:    subq $112, %rsp
4442 ; AVX512-NEXT:    movq %rdi, %rbx
4443 ; AVX512-NEXT:    vmovups %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill
4444 ; AVX512-NEXT:    vextractf32x4 $3, %zmm0, %xmm0
4445 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4446 ; AVX512-NEXT:    vzeroupper
4447 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4448 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4449 ; AVX512-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4450 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4451 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4452 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4453 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4454 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4455 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
4456 ; AVX512-NEXT:    vextractf32x4 $2, %zmm0, %xmm0
4457 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4458 ; AVX512-NEXT:    vzeroupper
4459 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4460 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4461 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4462 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4463 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4464 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4465 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4466 ; AVX512-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4467 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4468 ; AVX512-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4469 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
4470 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
4471 ; AVX512-NEXT:    vzeroupper
4472 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4473 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4474 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4475 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4476 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4477 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4478 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4479 ; AVX512-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4480 ; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload
4481 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0
4482 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4483 ; AVX512-NEXT:    vzeroupper
4484 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4485 ; AVX512-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4486 ; AVX512-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4487 ; AVX512-NEXT:    # xmm0 = mem[1,0]
4488 ; AVX512-NEXT:    callq __truncdfhf2@PLT
4489 ; AVX512-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4490 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4491 ; AVX512-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4492 ; AVX512-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
4493 ; AVX512-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4494 ; AVX512-NEXT:    # xmm0 = xmm0[0],mem[0]
4495 ; AVX512-NEXT:    vmovdqa %xmm0, (%rbx)
4496 ; AVX512-NEXT:    addq $112, %rsp
4497 ; AVX512-NEXT:    popq %rbx
4498 ; AVX512-NEXT:    retq
4499   %1 = fptrunc <8 x double> %a0 to <8 x half>
4500   %2 = bitcast <8 x half> %1 to <8 x i16>
4501   store <8 x i16> %2, ptr %a1
4502   ret void
4505 define void @store_cvt_32f32_to_32f16(<32 x float> %a0, ptr %a1) nounwind {
4506 ; AVX1-LABEL: store_cvt_32f32_to_32f16:
4507 ; AVX1:       # %bb.0:
4508 ; AVX1-NEXT:    pushq %rbx
4509 ; AVX1-NEXT:    subq $176, %rsp
4510 ; AVX1-NEXT:    movq %rdi, %rbx
4511 ; AVX1-NEXT:    vmovups %ymm3, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4512 ; AVX1-NEXT:    vmovups %ymm2, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4513 ; AVX1-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4514 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4515 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0
4516 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4517 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4518 ; AVX1-NEXT:    vzeroupper
4519 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4520 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4521 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4522 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4523 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4524 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4525 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4526 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4527 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4528 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4529 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4530 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4531 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4532 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4533 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4534 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4535 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4536 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4537 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4538 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4539 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
4540 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4541 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4542 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4543 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4544 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4545 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4546 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4547 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4548 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4549 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4550 ; AVX1-NEXT:    vzeroupper
4551 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4552 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4553 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4554 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4555 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4556 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4557 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4558 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4559 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4560 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4561 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
4562 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4563 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4564 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4565 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4566 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4567 ; AVX1-NEXT:    vzeroupper
4568 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4569 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4570 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4571 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4572 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4573 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4574 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4575 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4576 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4577 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4578 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4579 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4580 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4581 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4582 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4583 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4584 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4585 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4586 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4587 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4588 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
4589 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4590 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4591 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4592 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4593 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4594 ; AVX1-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4595 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4596 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4597 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4598 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4599 ; AVX1-NEXT:    vzeroupper
4600 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4601 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4602 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4603 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4604 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4605 ; AVX1-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4606 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4607 ; AVX1-NEXT:    vpunpckldq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4608 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4609 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4610 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
4611 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4612 ; AVX1-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4613 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4614 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4615 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4616 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4617 ; AVX1-NEXT:    vzeroupper
4618 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4619 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4620 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4621 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4622 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4623 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4624 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4625 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4626 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4627 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4628 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4629 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4630 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4631 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4632 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4633 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4634 ; AVX1-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4635 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4636 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4637 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4638 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
4639 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4640 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4641 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4642 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4643 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4644 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4645 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4646 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4647 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4648 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4649 ; AVX1-NEXT:    vzeroupper
4650 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4651 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4652 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4653 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4654 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4655 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4656 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4657 ; AVX1-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4658 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4659 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4660 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
4661 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4662 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4663 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4664 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4665 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4666 ; AVX1-NEXT:    vzeroupper
4667 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4668 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4669 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4670 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4671 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4672 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4673 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4674 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4675 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4676 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4677 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4678 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4679 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4680 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4681 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4682 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4683 ; AVX1-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4684 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4685 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4686 ; AVX1-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4687 ; AVX1-NEXT:    # xmm0 = mem[3,3,3,3]
4688 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4689 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4690 ; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4691 ; AVX1-NEXT:    # xmm0 = mem[1,0]
4692 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4693 ; AVX1-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4694 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4695 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4696 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4697 ; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4698 ; AVX1-NEXT:    vzeroupper
4699 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4700 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4701 ; AVX1-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4702 ; AVX1-NEXT:    # xmm0 = mem[1,1,3,3]
4703 ; AVX1-NEXT:    callq __truncsfhf2@PLT
4704 ; AVX1-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4705 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4706 ; AVX1-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4707 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4708 ; AVX1-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4709 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
4710 ; AVX1-NEXT:    vinsertf128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4711 ; AVX1-NEXT:    vmovaps %ymm0, 32(%rbx)
4712 ; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4713 ; AVX1-NEXT:    vmovaps %ymm0, (%rbx)
4714 ; AVX1-NEXT:    addq $176, %rsp
4715 ; AVX1-NEXT:    popq %rbx
4716 ; AVX1-NEXT:    vzeroupper
4717 ; AVX1-NEXT:    retq
4719 ; AVX2-LABEL: store_cvt_32f32_to_32f16:
4720 ; AVX2:       # %bb.0:
4721 ; AVX2-NEXT:    pushq %rbx
4722 ; AVX2-NEXT:    subq $240, %rsp
4723 ; AVX2-NEXT:    movq %rdi, %rbx
4724 ; AVX2-NEXT:    vmovups %ymm3, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4725 ; AVX2-NEXT:    vmovups %ymm2, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4726 ; AVX2-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4727 ; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4728 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm0
4729 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4730 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4731 ; AVX2-NEXT:    vzeroupper
4732 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4733 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4734 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4735 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4736 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4737 ; AVX2-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4738 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4739 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4740 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4741 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4742 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4743 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4744 ; AVX2-NEXT:    vzeroupper
4745 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4746 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4747 ; AVX2-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4748 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4749 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4750 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4751 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4752 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4753 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4754 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4755 ; AVX2-NEXT:    vzeroupper
4756 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4757 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4758 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4759 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4760 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4761 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4762 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4763 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4764 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
4765 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4766 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4767 ; AVX2-NEXT:    vmovshdup (%rsp), %xmm0 # 16-byte Folded Reload
4768 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4769 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4770 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4771 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4772 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4773 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
4774 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
4775 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4776 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4777 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
4778 ; AVX2-NEXT:    vzeroupper
4779 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4780 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4781 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4782 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4783 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4784 ; AVX2-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4785 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4786 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4787 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4788 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
4789 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4790 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4791 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4792 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4793 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4794 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4795 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4796 ; AVX2-NEXT:    vinserti128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
4797 ; AVX2-NEXT:    vmovdqu %ymm0, (%rsp) # 32-byte Spill
4798 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4799 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4800 ; AVX2-NEXT:    vzeroupper
4801 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4802 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4803 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4804 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4805 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4806 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4807 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4808 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4809 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4810 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4811 ; AVX2-NEXT:    vzeroupper
4812 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4813 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4814 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4815 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4816 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4817 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4818 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4819 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4820 ; AVX2-NEXT:    vpunpckldq (%rsp), %ymm0, %ymm0 # 32-byte Folded Reload
4821 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
4822 ; AVX2-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
4823 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[2],mem[2]
4824 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4825 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4826 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4827 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4828 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4829 ; AVX2-NEXT:    vzeroupper
4830 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4831 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4832 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4833 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4834 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4835 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4836 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4837 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4838 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4839 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
4840 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4841 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4842 ; AVX2-NEXT:    vzeroupper
4843 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4844 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4845 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4846 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4847 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4848 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4849 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4850 ; AVX2-NEXT:    vinserti128 $1, (%rsp), %ymm0, %ymm0 # 16-byte Folded Reload
4851 ; AVX2-NEXT:    vmovdqu %ymm0, (%rsp) # 32-byte Spill
4852 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4853 ; AVX2-NEXT:    vzeroupper
4854 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4855 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4856 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4857 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4858 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4859 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4860 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4861 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4862 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4863 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4864 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4865 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4866 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4867 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4868 ; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4869 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4870 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4871 ; AVX2-NEXT:    vpunpckldq (%rsp), %ymm0, %ymm0 # 32-byte Folded Reload
4872 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
4873 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4874 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4875 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
4876 ; AVX2-NEXT:    vzeroupper
4877 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4878 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4879 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4880 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4881 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4882 ; AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
4883 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4884 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4885 ; AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4886 ; AVX2-NEXT:    # xmm0 = mem[3,3,3,3]
4887 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4888 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4889 ; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4890 ; AVX2-NEXT:    # xmm0 = mem[1,0]
4891 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4892 ; AVX2-NEXT:    vpunpcklwd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
4893 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
4894 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4895 ; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
4896 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4897 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4898 ; AVX2-NEXT:    vzeroupper
4899 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4900 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4901 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4902 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4903 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4904 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4905 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4906 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4907 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4908 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4909 ; AVX2-NEXT:    vzeroupper
4910 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4911 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4912 ; AVX2-NEXT:    vmovshdup {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4913 ; AVX2-NEXT:    # xmm0 = mem[1,1,3,3]
4914 ; AVX2-NEXT:    callq __truncsfhf2@PLT
4915 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
4916 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
4917 ; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
4918 ; AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
4919 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[1],mem[1],ymm0[4],mem[4],ymm0[5],mem[5]
4920 ; AVX2-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %ymm0, %ymm0 # 32-byte Folded Reload
4921 ; AVX2-NEXT:    # ymm0 = ymm0[0],mem[0],ymm0[2],mem[2]
4922 ; AVX2-NEXT:    vmovdqa %ymm0, 32(%rbx)
4923 ; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
4924 ; AVX2-NEXT:    vmovaps %ymm0, (%rbx)
4925 ; AVX2-NEXT:    addq $240, %rsp
4926 ; AVX2-NEXT:    popq %rbx
4927 ; AVX2-NEXT:    vzeroupper
4928 ; AVX2-NEXT:    retq
4930 ; F16C-LABEL: store_cvt_32f32_to_32f16:
4931 ; F16C:       # %bb.0:
4932 ; F16C-NEXT:    vcvtps2ph $4, %ymm3, 48(%rdi)
4933 ; F16C-NEXT:    vcvtps2ph $4, %ymm2, 32(%rdi)
4934 ; F16C-NEXT:    vcvtps2ph $4, %ymm1, 16(%rdi)
4935 ; F16C-NEXT:    vcvtps2ph $4, %ymm0, (%rdi)
4936 ; F16C-NEXT:    vzeroupper
4937 ; F16C-NEXT:    retq
4939 ; AVX512-LABEL: store_cvt_32f32_to_32f16:
4940 ; AVX512:       # %bb.0:
4941 ; AVX512-NEXT:    vcvtps2ph $4, %zmm1, 32(%rdi)
4942 ; AVX512-NEXT:    vcvtps2ph $4, %zmm0, (%rdi)
4943 ; AVX512-NEXT:    vzeroupper
4944 ; AVX512-NEXT:    retq
4945   %1 = fptrunc <32 x float> %a0 to <32 x half>
4946   store <32 x half> %1, ptr %a1
4947   ret void
4950 define <4 x i32> @fptosi_2f16_to_4i32(<2 x half> %a) nounwind {
4951 ; AVX-LABEL: fptosi_2f16_to_4i32:
4952 ; AVX:       # %bb.0:
4953 ; AVX-NEXT:    subq $40, %rsp
4954 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
4955 ; AVX-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4956 ; AVX-NEXT:    callq __extendhfsf2@PLT
4957 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4958 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4959 ; AVX-NEXT:    callq __extendhfsf2@PLT
4960 ; AVX-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
4961 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
4962 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
4963 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
4964 ; AVX-NEXT:    addq $40, %rsp
4965 ; AVX-NEXT:    retq
4967 ; F16C-LABEL: fptosi_2f16_to_4i32:
4968 ; F16C:       # %bb.0:
4969 ; F16C-NEXT:    vpsrld $16, %xmm0, %xmm1
4970 ; F16C-NEXT:    vcvtph2ps %xmm1, %xmm1
4971 ; F16C-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
4972 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
4973 ; F16C-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4974 ; F16C-NEXT:    vcvttps2dq %xmm0, %xmm0
4975 ; F16C-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
4976 ; F16C-NEXT:    retq
4978 ; AVX512-LABEL: fptosi_2f16_to_4i32:
4979 ; AVX512:       # %bb.0:
4980 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
4981 ; AVX512-NEXT:    vcvtph2ps %xmm1, %xmm1
4982 ; AVX512-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
4983 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0
4984 ; AVX512-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4985 ; AVX512-NEXT:    vcvttps2dq %xmm0, %xmm0
4986 ; AVX512-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
4987 ; AVX512-NEXT:    retq
4988   %cvt = fptosi <2 x half> %a to <2 x i32>
4989   %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
4990   ret <4 x i32> %ext
4993 define <4 x i32> @fptosi_4f16_to_4i32(<4 x half> %a) nounwind {
4994 ; AVX-LABEL: fptosi_4f16_to_4i32:
4995 ; AVX:       # %bb.0:
4996 ; AVX-NEXT:    subq $72, %rsp
4997 ; AVX-NEXT:    vmovdqa %xmm0, %xmm1
4998 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4999 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
5000 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5001 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]
5002 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
5003 ; AVX-NEXT:    vpsrlq $48, %xmm1, %xmm0
5004 ; AVX-NEXT:    callq __extendhfsf2@PLT
5005 ; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5006 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
5007 ; AVX-NEXT:    callq __extendhfsf2@PLT
5008 ; AVX-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
5009 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
5010 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
5011 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
5012 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
5013 ; AVX-NEXT:    callq __extendhfsf2@PLT
5014 ; AVX-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5015 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
5016 ; AVX-NEXT:    callq __extendhfsf2@PLT
5017 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
5018 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
5019 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
5020 ; AVX-NEXT:    vunpcklpd (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
5021 ; AVX-NEXT:    # xmm0 = xmm0[0],mem[0]
5022 ; AVX-NEXT:    addq $72, %rsp
5023 ; AVX-NEXT:    retq
5025 ; F16C-LABEL: fptosi_4f16_to_4i32:
5026 ; F16C:       # %bb.0:
5027 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm0
5028 ; F16C-NEXT:    vcvttps2dq %xmm0, %xmm0
5029 ; F16C-NEXT:    vzeroupper
5030 ; F16C-NEXT:    retq
5032 ; AVX512-LABEL: fptosi_4f16_to_4i32:
5033 ; AVX512:       # %bb.0:
5034 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
5035 ; AVX512-NEXT:    vcvttps2dq %xmm0, %xmm0
5036 ; AVX512-NEXT:    vzeroupper
5037 ; AVX512-NEXT:    retq
5038   %cvt = fptosi <4 x half> %a to <4 x i32>
5039   ret <4 x i32> %cvt
5042 define <4 x i32> @fptoui_2f16_to_4i32(<2 x half> %a) nounwind {
5043 ; AVX1-LABEL: fptoui_2f16_to_4i32:
5044 ; AVX1:       # %bb.0:
5045 ; AVX1-NEXT:    subq $40, %rsp
5046 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
5047 ; AVX1-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5048 ; AVX1-NEXT:    callq __extendhfsf2@PLT
5049 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
5050 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
5051 ; AVX1-NEXT:    callq __extendhfsf2@PLT
5052 ; AVX1-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
5053 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
5054 ; AVX1-NEXT:    vcvttps2dq %xmm0, %xmm1
5055 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
5056 ; AVX1-NEXT:    vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
5057 ; AVX1-NEXT:    vcvttps2dq %xmm0, %xmm0
5058 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
5059 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
5060 ; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
5061 ; AVX1-NEXT:    addq $40, %rsp
5062 ; AVX1-NEXT:    retq
5064 ; AVX2-LABEL: fptoui_2f16_to_4i32:
5065 ; AVX2:       # %bb.0:
5066 ; AVX2-NEXT:    subq $40, %rsp
5067 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
5068 ; AVX2-NEXT:    vmovdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5069 ; AVX2-NEXT:    callq __extendhfsf2@PLT
5070 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
5071 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
5072 ; AVX2-NEXT:    callq __extendhfsf2@PLT
5073 ; AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload
5074 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
5075 ; AVX2-NEXT:    vcvttps2dq %xmm0, %xmm1
5076 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm2
5077 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
5078 ; AVX2-NEXT:    vsubps %xmm3, %xmm0, %xmm0
5079 ; AVX2-NEXT:    vcvttps2dq %xmm0, %xmm0
5080 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
5081 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
5082 ; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
5083 ; AVX2-NEXT:    addq $40, %rsp
5084 ; AVX2-NEXT:    retq
5086 ; F16C-LABEL: fptoui_2f16_to_4i32:
5087 ; F16C:       # %bb.0:
5088 ; F16C-NEXT:    vpsrld $16, %xmm0, %xmm1
5089 ; F16C-NEXT:    vcvtph2ps %xmm1, %xmm1
5090 ; F16C-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
5091 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
5092 ; F16C-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
5093 ; F16C-NEXT:    vcvttps2dq %xmm0, %xmm1
5094 ; F16C-NEXT:    vpsrad $31, %xmm1, %xmm2
5095 ; F16C-NEXT:    vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
5096 ; F16C-NEXT:    vcvttps2dq %xmm0, %xmm0
5097 ; F16C-NEXT:    vpand %xmm2, %xmm0, %xmm0
5098 ; F16C-NEXT:    vpor %xmm0, %xmm1, %xmm0
5099 ; F16C-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
5100 ; F16C-NEXT:    retq
5102 ; AVX512F-LABEL: fptoui_2f16_to_4i32:
5103 ; AVX512F:       # %bb.0:
5104 ; AVX512F-NEXT:    vpsrld $16, %xmm0, %xmm1
5105 ; AVX512F-NEXT:    vcvtph2ps %xmm1, %xmm1
5106 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
5107 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0
5108 ; AVX512F-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
5109 ; AVX512F-NEXT:    vcvttps2udq %zmm0, %zmm0
5110 ; AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
5111 ; AVX512F-NEXT:    vzeroupper
5112 ; AVX512F-NEXT:    retq
5114 ; AVX512-FASTLANE-LABEL: fptoui_2f16_to_4i32:
5115 ; AVX512-FASTLANE:       # %bb.0:
5116 ; AVX512-FASTLANE-NEXT:    vpsrld $16, %xmm0, %xmm1
5117 ; AVX512-FASTLANE-NEXT:    vcvtph2ps %xmm1, %xmm1
5118 ; AVX512-FASTLANE-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
5119 ; AVX512-FASTLANE-NEXT:    vcvtph2ps %xmm0, %xmm0
5120 ; AVX512-FASTLANE-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
5121 ; AVX512-FASTLANE-NEXT:    vcvttps2udq %xmm0, %xmm0
5122 ; AVX512-FASTLANE-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
5123 ; AVX512-FASTLANE-NEXT:    retq
5124   %cvt = fptoui <2 x half> %a to <2 x i32>
5125   %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
5126   ret <4 x i32> %ext
5129 define <4 x i32> @fptoui_4f16_to_4i32(<4 x half> %a) nounwind {
5130 ; AVX1-LABEL: fptoui_4f16_to_4i32:
5131 ; AVX1:       # %bb.0:
5132 ; AVX1-NEXT:    subq $72, %rsp
5133 ; AVX1-NEXT:    vmovdqa %xmm0, %xmm1
5134 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5135 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
5136 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5137 ; AVX1-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]
5138 ; AVX1-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
5139 ; AVX1-NEXT:    vpsrlq $48, %xmm1, %xmm0
5140 ; AVX1-NEXT:    callq __extendhfsf2@PLT
5141 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5142 ; AVX1-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
5143 ; AVX1-NEXT:    callq __extendhfsf2@PLT
5144 ; AVX1-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
5145 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
5146 ; AVX1-NEXT:    vcvttps2dq %xmm0, %xmm1
5147 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
5148 ; AVX1-NEXT:    vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
5149 ; AVX1-NEXT:    vcvttps2dq %xmm0, %xmm0
5150 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
5151 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
5152 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
5153 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
5154 ; AVX1-NEXT:    callq __extendhfsf2@PLT
5155 ; AVX1-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5156 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
5157 ; AVX1-NEXT:    callq __extendhfsf2@PLT
5158 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
5159 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
5160 ; AVX1-NEXT:    vcvttps2dq %xmm0, %xmm1
5161 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
5162 ; AVX1-NEXT:    vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
5163 ; AVX1-NEXT:    vcvttps2dq %xmm0, %xmm0
5164 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
5165 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
5166 ; AVX1-NEXT:    vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
5167 ; AVX1-NEXT:    # xmm0 = xmm0[0],mem[0]
5168 ; AVX1-NEXT:    addq $72, %rsp
5169 ; AVX1-NEXT:    retq
5171 ; AVX2-LABEL: fptoui_4f16_to_4i32:
5172 ; AVX2:       # %bb.0:
5173 ; AVX2-NEXT:    subq $72, %rsp
5174 ; AVX2-NEXT:    vmovdqa %xmm0, %xmm1
5175 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5176 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
5177 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5178 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]
5179 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
5180 ; AVX2-NEXT:    vpsrlq $48, %xmm1, %xmm0
5181 ; AVX2-NEXT:    callq __extendhfsf2@PLT
5182 ; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5183 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
5184 ; AVX2-NEXT:    callq __extendhfsf2@PLT
5185 ; AVX2-NEXT:    vinsertps $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
5186 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]
5187 ; AVX2-NEXT:    vcvttps2dq %xmm0, %xmm1
5188 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm2
5189 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
5190 ; AVX2-NEXT:    vsubps %xmm3, %xmm0, %xmm0
5191 ; AVX2-NEXT:    vcvttps2dq %xmm0, %xmm0
5192 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
5193 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
5194 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
5195 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
5196 ; AVX2-NEXT:    callq __extendhfsf2@PLT
5197 ; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
5198 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
5199 ; AVX2-NEXT:    callq __extendhfsf2@PLT
5200 ; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
5201 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]
5202 ; AVX2-NEXT:    vcvttps2dq %xmm0, %xmm1
5203 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm2
5204 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
5205 ; AVX2-NEXT:    vsubps %xmm3, %xmm0, %xmm0
5206 ; AVX2-NEXT:    vcvttps2dq %xmm0, %xmm0
5207 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
5208 ; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
5209 ; AVX2-NEXT:    vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
5210 ; AVX2-NEXT:    # xmm0 = xmm0[0],mem[0]
5211 ; AVX2-NEXT:    addq $72, %rsp
5212 ; AVX2-NEXT:    retq
5214 ; F16C-LABEL: fptoui_4f16_to_4i32:
5215 ; F16C:       # %bb.0:
5216 ; F16C-NEXT:    vcvtph2ps %xmm0, %ymm0
5217 ; F16C-NEXT:    vcvttps2dq %ymm0, %ymm1
5218 ; F16C-NEXT:    vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
5219 ; F16C-NEXT:    vcvttps2dq %ymm0, %ymm0
5220 ; F16C-NEXT:    vorps %ymm0, %ymm1, %ymm0
5221 ; F16C-NEXT:    vblendvps %ymm1, %ymm0, %ymm1, %ymm0
5222 ; F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
5223 ; F16C-NEXT:    vzeroupper
5224 ; F16C-NEXT:    retq
5226 ; AVX512F-LABEL: fptoui_4f16_to_4i32:
5227 ; AVX512F:       # %bb.0:
5228 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %ymm0
5229 ; AVX512F-NEXT:    vcvttps2udq %zmm0, %zmm0
5230 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
5231 ; AVX512F-NEXT:    vzeroupper
5232 ; AVX512F-NEXT:    retq
5234 ; AVX512-FASTLANE-LABEL: fptoui_4f16_to_4i32:
5235 ; AVX512-FASTLANE:       # %bb.0:
5236 ; AVX512-FASTLANE-NEXT:    vcvtph2ps %xmm0, %ymm0
5237 ; AVX512-FASTLANE-NEXT:    vcvttps2udq %ymm0, %ymm0
5238 ; AVX512-FASTLANE-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
5239 ; AVX512-FASTLANE-NEXT:    vzeroupper
5240 ; AVX512-FASTLANE-NEXT:    retq
5241   %cvt = fptoui <4 x half> %a to <4 x i32>
5242   ret <4 x i32> %cvt