Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / fpclamptosat_vec.ll
blob78ccc983d1637a50e922a8e2a0905d0a4c804659
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=SSE
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v3| FileCheck %s --check-prefixes=AVX,AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX,AVX512
6 ; i32 saturate
8 define <2 x i32> @stest_f64i32(<2 x double> %x) nounwind {
9 ; SSE-LABEL: stest_f64i32:
10 ; SSE:       # %bb.0: # %entry
11 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
12 ; SSE-NEXT:    movq %rax, %xmm1
13 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]
14 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
15 ; SSE-NEXT:    movq %rax, %xmm0
16 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
17 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
18 ; SSE-NEXT:    movdqa %xmm1, %xmm2
19 ; SSE-NEXT:    pxor %xmm0, %xmm2
20 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
21 ; SSE-NEXT:    pxor %xmm4, %xmm4
22 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm4
23 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
24 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm3
25 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
26 ; SSE-NEXT:    pand %xmm4, %xmm2
27 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
28 ; SSE-NEXT:    por %xmm2, %xmm3
29 ; SSE-NEXT:    pand %xmm3, %xmm1
30 ; SSE-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
31 ; SSE-NEXT:    por %xmm1, %xmm3
32 ; SSE-NEXT:    pxor %xmm3, %xmm0
33 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
34 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
35 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm2
36 ; SSE-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
37 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,2,2]
38 ; SSE-NEXT:    pand %xmm2, %xmm1
39 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
40 ; SSE-NEXT:    por %xmm1, %xmm0
41 ; SSE-NEXT:    pand %xmm0, %xmm3
42 ; SSE-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
43 ; SSE-NEXT:    por %xmm3, %xmm0
44 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
45 ; SSE-NEXT:    retq
47 ; AVX2-LABEL: stest_f64i32:
48 ; AVX2:       # %bb.0: # %entry
49 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rax
50 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
51 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rcx
52 ; AVX2-NEXT:    vmovq %rax, %xmm0
53 ; AVX2-NEXT:    vmovq %rcx, %xmm1
54 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
55 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [2147483647,2147483647]
56 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
57 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
58 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
59 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
60 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
61 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
62 ; AVX2-NEXT:    retq
64 ; AVX512-LABEL: stest_f64i32:
65 ; AVX512:       # %bb.0: # %entry
66 ; AVX512-NEXT:    vcvttpd2qq %xmm0, %xmm0
67 ; AVX512-NEXT:    vpmovsqd %xmm0, %xmm0
68 ; AVX512-NEXT:    retq
69 entry:
70   %conv = fptosi <2 x double> %x to <2 x i64>
71   %0 = icmp slt <2 x i64> %conv, <i64 2147483647, i64 2147483647>
72   %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 2147483647, i64 2147483647>
73   %1 = icmp sgt <2 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648>
74   %spec.store.select7 = select <2 x i1> %1, <2 x i64> %spec.store.select, <2 x i64> <i64 -2147483648, i64 -2147483648>
75   %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
76   ret <2 x i32> %conv6
79 define <2 x i32> @utest_f64i32(<2 x double> %x) nounwind {
80 ; SSE-LABEL: utest_f64i32:
81 ; SSE:       # %bb.0: # %entry
82 ; SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
83 ; SSE-NEXT:    movapd %xmm0, %xmm2
84 ; SSE-NEXT:    subsd %xmm1, %xmm2
85 ; SSE-NEXT:    cvttsd2si %xmm2, %rax
86 ; SSE-NEXT:    cvttsd2si %xmm0, %rcx
87 ; SSE-NEXT:    movq %rcx, %rdx
88 ; SSE-NEXT:    sarq $63, %rdx
89 ; SSE-NEXT:    andq %rax, %rdx
90 ; SSE-NEXT:    orq %rcx, %rdx
91 ; SSE-NEXT:    movq %rdx, %xmm2
92 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]
93 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
94 ; SSE-NEXT:    subsd %xmm1, %xmm0
95 ; SSE-NEXT:    cvttsd2si %xmm0, %rcx
96 ; SSE-NEXT:    movq %rax, %rdx
97 ; SSE-NEXT:    sarq $63, %rdx
98 ; SSE-NEXT:    andq %rcx, %rdx
99 ; SSE-NEXT:    orq %rax, %rdx
100 ; SSE-NEXT:    movq %rdx, %xmm0
101 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
102 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
103 ; SSE-NEXT:    pxor %xmm2, %xmm0
104 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
105 ; SSE-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
106 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,2,2]
107 ; SSE-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
108 ; SSE-NEXT:    pandn %xmm1, %xmm0
109 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
110 ; SSE-NEXT:    pxor %xmm0, %xmm1
111 ; SSE-NEXT:    pand %xmm2, %xmm0
112 ; SSE-NEXT:    por %xmm1, %xmm0
113 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
114 ; SSE-NEXT:    retq
116 ; AVX2-LABEL: utest_f64i32:
117 ; AVX2:       # %bb.0: # %entry
118 ; AVX2-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
119 ; AVX2-NEXT:    vsubsd %xmm1, %xmm0, %xmm2
120 ; AVX2-NEXT:    vcvttsd2si %xmm2, %rax
121 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rcx
122 ; AVX2-NEXT:    movq %rcx, %rdx
123 ; AVX2-NEXT:    sarq $63, %rdx
124 ; AVX2-NEXT:    andq %rax, %rdx
125 ; AVX2-NEXT:    orq %rcx, %rdx
126 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
127 ; AVX2-NEXT:    vsubsd %xmm1, %xmm0, %xmm1
128 ; AVX2-NEXT:    vcvttsd2si %xmm1, %rax
129 ; AVX2-NEXT:    vmovq %rdx, %xmm1
130 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rcx
131 ; AVX2-NEXT:    movq %rcx, %rdx
132 ; AVX2-NEXT:    sarq $63, %rdx
133 ; AVX2-NEXT:    andq %rax, %rdx
134 ; AVX2-NEXT:    orq %rcx, %rdx
135 ; AVX2-NEXT:    vmovq %rdx, %xmm0
136 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
137 ; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
138 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
139 ; AVX2-NEXT:    vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
140 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
141 ; AVX2-NEXT:    retq
143 ; AVX512-LABEL: utest_f64i32:
144 ; AVX512:       # %bb.0: # %entry
145 ; AVX512-NEXT:    vcvttpd2uqq %xmm0, %xmm0
146 ; AVX512-NEXT:    vpmovusqd %xmm0, %xmm0
147 ; AVX512-NEXT:    retq
148 entry:
149   %conv = fptoui <2 x double> %x to <2 x i64>
150   %0 = icmp ult <2 x i64> %conv, <i64 4294967295, i64 4294967295>
151   %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>
152   %conv6 = trunc <2 x i64> %spec.store.select to <2 x i32>
153   ret <2 x i32> %conv6
156 define <2 x i32> @ustest_f64i32(<2 x double> %x) nounwind {
157 ; SSE-LABEL: ustest_f64i32:
158 ; SSE:       # %bb.0: # %entry
159 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
160 ; SSE-NEXT:    movq %rax, %xmm1
161 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]
162 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
163 ; SSE-NEXT:    movq %rax, %xmm0
164 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
165 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
166 ; SSE-NEXT:    movdqa %xmm1, %xmm2
167 ; SSE-NEXT:    pxor %xmm0, %xmm2
168 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
169 ; SSE-NEXT:    pxor %xmm4, %xmm4
170 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm4
171 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [2147483647,2147483647]
172 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm3
173 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
174 ; SSE-NEXT:    pand %xmm4, %xmm2
175 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
176 ; SSE-NEXT:    por %xmm2, %xmm3
177 ; SSE-NEXT:    pand %xmm3, %xmm1
178 ; SSE-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
179 ; SSE-NEXT:    por %xmm1, %xmm3
180 ; SSE-NEXT:    movdqa %xmm3, %xmm1
181 ; SSE-NEXT:    pxor %xmm0, %xmm1
182 ; SSE-NEXT:    movdqa %xmm1, %xmm2
183 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm2
184 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
185 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
186 ; SSE-NEXT:    pand %xmm2, %xmm0
187 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
188 ; SSE-NEXT:    por %xmm0, %xmm1
189 ; SSE-NEXT:    pand %xmm3, %xmm1
190 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
191 ; SSE-NEXT:    retq
193 ; AVX2-LABEL: ustest_f64i32:
194 ; AVX2:       # %bb.0: # %entry
195 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rax
196 ; AVX2-NEXT:    vmovq %rax, %xmm1
197 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
198 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rax
199 ; AVX2-NEXT:    vmovq %rax, %xmm0
200 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
201 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [4294967295,4294967295]
202 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
203 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
204 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
205 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm1
206 ; AVX2-NEXT:    vpand %xmm0, %xmm1, %xmm0
207 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
208 ; AVX2-NEXT:    retq
210 ; AVX512-LABEL: ustest_f64i32:
211 ; AVX512:       # %bb.0: # %entry
212 ; AVX512-NEXT:    vcvttpd2qq %xmm0, %xmm0
213 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
214 ; AVX512-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
215 ; AVX512-NEXT:    vpmovusqd %xmm0, %xmm0
216 ; AVX512-NEXT:    retq
217 entry:
218   %conv = fptosi <2 x double> %x to <2 x i64>
219   %0 = icmp slt <2 x i64> %conv, <i64 4294967295, i64 4294967295>
220   %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>
221   %1 = icmp sgt <2 x i64> %spec.store.select, zeroinitializer
222   %spec.store.select7 = select <2 x i1> %1, <2 x i64> %spec.store.select, <2 x i64> zeroinitializer
223   %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
224   ret <2 x i32> %conv6
227 define <4 x i32> @stest_f32i32(<4 x float> %x) nounwind {
228 ; SSE-LABEL: stest_f32i32:
229 ; SSE:       # %bb.0: # %entry
230 ; SSE-NEXT:    movaps %xmm0, %xmm1
231 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,3],xmm0[3,3]
232 ; SSE-NEXT:    cvttss2si %xmm1, %rax
233 ; SSE-NEXT:    movq %rax, %xmm1
234 ; SSE-NEXT:    movaps %xmm0, %xmm2
235 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]
236 ; SSE-NEXT:    cvttss2si %xmm2, %rax
237 ; SSE-NEXT:    movq %rax, %xmm2
238 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
239 ; SSE-NEXT:    cvttss2si %xmm0, %rax
240 ; SSE-NEXT:    movq %rax, %xmm4
241 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
242 ; SSE-NEXT:    cvttss2si %xmm0, %rax
243 ; SSE-NEXT:    movq %rax, %xmm0
244 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm0[0]
245 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [2147483647,2147483647]
246 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
247 ; SSE-NEXT:    movdqa %xmm4, %xmm1
248 ; SSE-NEXT:    pxor %xmm0, %xmm1
249 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
250 ; SSE-NEXT:    pxor %xmm6, %xmm6
251 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm5
252 ; SSE-NEXT:    movdqa {{.*#+}} xmm7 = [4294967295,4294967295]
253 ; SSE-NEXT:    movdqa %xmm7, %xmm8
254 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm8
255 ; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
256 ; SSE-NEXT:    pand %xmm5, %xmm9
257 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
258 ; SSE-NEXT:    por %xmm9, %xmm1
259 ; SSE-NEXT:    pand %xmm1, %xmm4
260 ; SSE-NEXT:    pandn %xmm3, %xmm1
261 ; SSE-NEXT:    por %xmm4, %xmm1
262 ; SSE-NEXT:    movdqa %xmm2, %xmm4
263 ; SSE-NEXT:    pxor %xmm0, %xmm4
264 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
265 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm5
266 ; SSE-NEXT:    pcmpgtd %xmm4, %xmm7
267 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
268 ; SSE-NEXT:    pand %xmm5, %xmm4
269 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
270 ; SSE-NEXT:    por %xmm4, %xmm5
271 ; SSE-NEXT:    pand %xmm5, %xmm2
272 ; SSE-NEXT:    pandn %xmm3, %xmm5
273 ; SSE-NEXT:    por %xmm2, %xmm5
274 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968]
275 ; SSE-NEXT:    movdqa %xmm5, %xmm3
276 ; SSE-NEXT:    pxor %xmm0, %xmm3
277 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
278 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm6
279 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm4
280 ; SSE-NEXT:    movdqa {{.*#+}} xmm7 = [18446744069414584320,18446744069414584320]
281 ; SSE-NEXT:    pcmpgtd %xmm7, %xmm3
282 ; SSE-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]
283 ; SSE-NEXT:    pand %xmm4, %xmm8
284 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
285 ; SSE-NEXT:    por %xmm8, %xmm3
286 ; SSE-NEXT:    pand %xmm3, %xmm5
287 ; SSE-NEXT:    pandn %xmm2, %xmm3
288 ; SSE-NEXT:    por %xmm5, %xmm3
289 ; SSE-NEXT:    pxor %xmm1, %xmm0
290 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
291 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm4
292 ; SSE-NEXT:    pcmpgtd %xmm7, %xmm0
293 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
294 ; SSE-NEXT:    pand %xmm4, %xmm5
295 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
296 ; SSE-NEXT:    por %xmm5, %xmm0
297 ; SSE-NEXT:    pand %xmm0, %xmm1
298 ; SSE-NEXT:    pandn %xmm2, %xmm0
299 ; SSE-NEXT:    por %xmm1, %xmm0
300 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
301 ; SSE-NEXT:    retq
303 ; AVX2-LABEL: stest_f32i32:
304 ; AVX2:       # %bb.0: # %entry
305 ; AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
306 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
307 ; AVX2-NEXT:    vmovq %rax, %xmm1
308 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
309 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
310 ; AVX2-NEXT:    vmovq %rax, %xmm2
311 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
312 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
313 ; AVX2-NEXT:    vmovq %rax, %xmm2
314 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
315 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
316 ; AVX2-NEXT:    vmovq %rax, %xmm0
317 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
318 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
319 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
320 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
321 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
322 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
323 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
324 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
325 ; AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
326 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
327 ; AVX2-NEXT:    vpermps %ymm0, %ymm1, %ymm0
328 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
329 ; AVX2-NEXT:    vzeroupper
330 ; AVX2-NEXT:    retq
332 ; AVX512-LABEL: stest_f32i32:
333 ; AVX512:       # %bb.0: # %entry
334 ; AVX512-NEXT:    vcvttps2qq %xmm0, %ymm0
335 ; AVX512-NEXT:    vpmovsqd %ymm0, %xmm0
336 ; AVX512-NEXT:    vzeroupper
337 ; AVX512-NEXT:    retq
338 entry:
339   %conv = fptosi <4 x float> %x to <4 x i64>
340   %0 = icmp slt <4 x i64> %conv, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
341   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
342   %1 = icmp sgt <4 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
343   %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
344   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
345   ret <4 x i32> %conv6
348 define <4 x i32> @utest_f32i32(<4 x float> %x) nounwind {
349 ; SSE-LABEL: utest_f32i32:
350 ; SSE:       # %bb.0: # %entry
351 ; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
352 ; SSE-NEXT:    movaps %xmm0, %xmm1
353 ; SSE-NEXT:    subss %xmm2, %xmm1
354 ; SSE-NEXT:    cvttss2si %xmm1, %rax
355 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
356 ; SSE-NEXT:    movq %rcx, %rdx
357 ; SSE-NEXT:    sarq $63, %rdx
358 ; SSE-NEXT:    andq %rax, %rdx
359 ; SSE-NEXT:    orq %rcx, %rdx
360 ; SSE-NEXT:    movq %rdx, %xmm1
361 ; SSE-NEXT:    movaps %xmm0, %xmm3
362 ; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[1,1]
363 ; SSE-NEXT:    cvttss2si %xmm3, %rax
364 ; SSE-NEXT:    subss %xmm2, %xmm3
365 ; SSE-NEXT:    cvttss2si %xmm3, %rcx
366 ; SSE-NEXT:    movq %rax, %rdx
367 ; SSE-NEXT:    sarq $63, %rdx
368 ; SSE-NEXT:    andq %rcx, %rdx
369 ; SSE-NEXT:    orq %rax, %rdx
370 ; SSE-NEXT:    movq %rdx, %xmm3
371 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
372 ; SSE-NEXT:    movaps %xmm0, %xmm3
373 ; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[3,3],xmm0[3,3]
374 ; SSE-NEXT:    cvttss2si %xmm3, %rax
375 ; SSE-NEXT:    subss %xmm2, %xmm3
376 ; SSE-NEXT:    cvttss2si %xmm3, %rcx
377 ; SSE-NEXT:    movq %rax, %rdx
378 ; SSE-NEXT:    sarq $63, %rdx
379 ; SSE-NEXT:    andq %rcx, %rdx
380 ; SSE-NEXT:    orq %rax, %rdx
381 ; SSE-NEXT:    movq %rdx, %xmm3
382 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
383 ; SSE-NEXT:    cvttss2si %xmm0, %rax
384 ; SSE-NEXT:    subss %xmm2, %xmm0
385 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
386 ; SSE-NEXT:    movq %rax, %rdx
387 ; SSE-NEXT:    sarq $63, %rdx
388 ; SSE-NEXT:    andq %rcx, %rdx
389 ; SSE-NEXT:    orq %rax, %rdx
390 ; SSE-NEXT:    movq %rdx, %xmm0
391 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
392 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
393 ; SSE-NEXT:    movdqa %xmm0, %xmm3
394 ; SSE-NEXT:    pxor %xmm2, %xmm3
395 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
396 ; SSE-NEXT:    movdqa {{.*#+}} xmm5 = [2147483647,2147483647,2147483647,2147483647]
397 ; SSE-NEXT:    movdqa %xmm5, %xmm6
398 ; SSE-NEXT:    pcmpgtd %xmm4, %xmm6
399 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
400 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm3
401 ; SSE-NEXT:    pand %xmm6, %xmm3
402 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm4
403 ; SSE-NEXT:    pand %xmm3, %xmm0
404 ; SSE-NEXT:    pxor %xmm4, %xmm3
405 ; SSE-NEXT:    por %xmm0, %xmm3
406 ; SSE-NEXT:    movdqa %xmm1, %xmm0
407 ; SSE-NEXT:    pxor %xmm2, %xmm0
408 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
409 ; SSE-NEXT:    pcmpgtd %xmm6, %xmm5
410 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
411 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm0
412 ; SSE-NEXT:    pand %xmm5, %xmm0
413 ; SSE-NEXT:    pxor %xmm0, %xmm4
414 ; SSE-NEXT:    pand %xmm1, %xmm0
415 ; SSE-NEXT:    por %xmm4, %xmm0
416 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
417 ; SSE-NEXT:    retq
419 ; AVX2-LABEL: utest_f32i32:
420 ; AVX2:       # %bb.0: # %entry
421 ; AVX2-NEXT:    vshufps {{.*#+}} xmm2 = xmm0[3,3,3,3]
422 ; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
423 ; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
424 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
425 ; AVX2-NEXT:    vcvttss2si %xmm2, %rcx
426 ; AVX2-NEXT:    movq %rcx, %rdx
427 ; AVX2-NEXT:    sarq $63, %rdx
428 ; AVX2-NEXT:    andq %rax, %rdx
429 ; AVX2-NEXT:    orq %rcx, %rdx
430 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
431 ; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
432 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
433 ; AVX2-NEXT:    vcvttss2si %xmm2, %rcx
434 ; AVX2-NEXT:    vmovq %rdx, %xmm2
435 ; AVX2-NEXT:    movq %rcx, %rdx
436 ; AVX2-NEXT:    sarq $63, %rdx
437 ; AVX2-NEXT:    andq %rax, %rdx
438 ; AVX2-NEXT:    orq %rcx, %rdx
439 ; AVX2-NEXT:    vmovq %rdx, %xmm3
440 ; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm4
441 ; AVX2-NEXT:    vcvttss2si %xmm4, %rax
442 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
443 ; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
444 ; AVX2-NEXT:    movq %rcx, %rdx
445 ; AVX2-NEXT:    sarq $63, %rdx
446 ; AVX2-NEXT:    andq %rax, %rdx
447 ; AVX2-NEXT:    orq %rcx, %rdx
448 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
449 ; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm1
450 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
451 ; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
452 ; AVX2-NEXT:    vmovq %rdx, %xmm0
453 ; AVX2-NEXT:    movq %rcx, %rdx
454 ; AVX2-NEXT:    sarq $63, %rdx
455 ; AVX2-NEXT:    andq %rax, %rdx
456 ; AVX2-NEXT:    orq %rcx, %rdx
457 ; AVX2-NEXT:    vmovq %rdx, %xmm1
458 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
459 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
460 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
461 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
462 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
463 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372041149743102,9223372041149743102,9223372041149743102,9223372041149743102]
464 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
465 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
466 ; AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
467 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
468 ; AVX2-NEXT:    vpermps %ymm0, %ymm1, %ymm0
469 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
470 ; AVX2-NEXT:    vzeroupper
471 ; AVX2-NEXT:    retq
473 ; AVX512-LABEL: utest_f32i32:
474 ; AVX512:       # %bb.0: # %entry
475 ; AVX512-NEXT:    vcvttps2uqq %xmm0, %ymm0
476 ; AVX512-NEXT:    vpmovusqd %ymm0, %xmm0
477 ; AVX512-NEXT:    vzeroupper
478 ; AVX512-NEXT:    retq
479 entry:
480   %conv = fptoui <4 x float> %x to <4 x i64>
481   %0 = icmp ult <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
482   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
483   %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
484   ret <4 x i32> %conv6
487 define <4 x i32> @ustest_f32i32(<4 x float> %x) nounwind {
488 ; SSE-LABEL: ustest_f32i32:
489 ; SSE:       # %bb.0: # %entry
490 ; SSE-NEXT:    movaps %xmm0, %xmm1
491 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,3],xmm0[3,3]
492 ; SSE-NEXT:    cvttss2si %xmm1, %rax
493 ; SSE-NEXT:    movq %rax, %xmm1
494 ; SSE-NEXT:    movaps %xmm0, %xmm2
495 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]
496 ; SSE-NEXT:    cvttss2si %xmm2, %rax
497 ; SSE-NEXT:    movq %rax, %xmm2
498 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
499 ; SSE-NEXT:    cvttss2si %xmm0, %rax
500 ; SSE-NEXT:    movq %rax, %xmm4
501 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
502 ; SSE-NEXT:    cvttss2si %xmm0, %rax
503 ; SSE-NEXT:    movq %rax, %xmm0
504 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm0[0]
505 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
506 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
507 ; SSE-NEXT:    movdqa %xmm4, %xmm1
508 ; SSE-NEXT:    pxor %xmm0, %xmm1
509 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
510 ; SSE-NEXT:    pxor %xmm6, %xmm6
511 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm5
512 ; SSE-NEXT:    movdqa {{.*#+}} xmm7 = [2147483647,2147483647]
513 ; SSE-NEXT:    movdqa %xmm7, %xmm8
514 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm8
515 ; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
516 ; SSE-NEXT:    pand %xmm5, %xmm9
517 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
518 ; SSE-NEXT:    por %xmm9, %xmm1
519 ; SSE-NEXT:    pand %xmm1, %xmm4
520 ; SSE-NEXT:    pandn %xmm3, %xmm1
521 ; SSE-NEXT:    por %xmm4, %xmm1
522 ; SSE-NEXT:    movdqa %xmm2, %xmm4
523 ; SSE-NEXT:    pxor %xmm0, %xmm4
524 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
525 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm5
526 ; SSE-NEXT:    pcmpgtd %xmm4, %xmm7
527 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
528 ; SSE-NEXT:    pand %xmm5, %xmm4
529 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
530 ; SSE-NEXT:    por %xmm4, %xmm5
531 ; SSE-NEXT:    pand %xmm5, %xmm2
532 ; SSE-NEXT:    pandn %xmm3, %xmm5
533 ; SSE-NEXT:    por %xmm2, %xmm5
534 ; SSE-NEXT:    movdqa %xmm5, %xmm2
535 ; SSE-NEXT:    pxor %xmm0, %xmm2
536 ; SSE-NEXT:    movdqa %xmm2, %xmm3
537 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm3
538 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
539 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
540 ; SSE-NEXT:    pand %xmm3, %xmm2
541 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
542 ; SSE-NEXT:    por %xmm2, %xmm3
543 ; SSE-NEXT:    pand %xmm5, %xmm3
544 ; SSE-NEXT:    movdqa %xmm1, %xmm2
545 ; SSE-NEXT:    pxor %xmm0, %xmm2
546 ; SSE-NEXT:    movdqa %xmm2, %xmm4
547 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm4
548 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
549 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
550 ; SSE-NEXT:    pand %xmm4, %xmm2
551 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
552 ; SSE-NEXT:    por %xmm2, %xmm0
553 ; SSE-NEXT:    pand %xmm1, %xmm0
554 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
555 ; SSE-NEXT:    retq
557 ; AVX2-LABEL: ustest_f32i32:
558 ; AVX2:       # %bb.0: # %entry
559 ; AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
560 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
561 ; AVX2-NEXT:    vmovq %rax, %xmm1
562 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
563 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
564 ; AVX2-NEXT:    vmovq %rax, %xmm2
565 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
566 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
567 ; AVX2-NEXT:    vmovq %rax, %xmm2
568 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
569 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
570 ; AVX2-NEXT:    vmovq %rax, %xmm0
571 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
572 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
573 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
574 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
575 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
576 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
577 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm1
578 ; AVX2-NEXT:    vpand %ymm0, %ymm1, %ymm0
579 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
580 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
581 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
582 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
583 ; AVX2-NEXT:    vzeroupper
584 ; AVX2-NEXT:    retq
586 ; AVX512-LABEL: ustest_f32i32:
587 ; AVX512:       # %bb.0: # %entry
588 ; AVX512-NEXT:    vcvttps2qq %xmm0, %ymm0
589 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
590 ; AVX512-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
591 ; AVX512-NEXT:    vpmovusqd %ymm0, %xmm0
592 ; AVX512-NEXT:    vzeroupper
593 ; AVX512-NEXT:    retq
594 entry:
595   %conv = fptosi <4 x float> %x to <4 x i64>
596   %0 = icmp slt <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
597   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
598   %1 = icmp sgt <4 x i64> %spec.store.select, zeroinitializer
599   %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> zeroinitializer
600   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
601   ret <4 x i32> %conv6
604 define <4 x i32> @stest_f16i32(<4 x half> %x) nounwind {
605 ; SSE-LABEL: stest_f16i32:
606 ; SSE:       # %bb.0: # %entry
607 ; SSE-NEXT:    subq $72, %rsp
608 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
609 ; SSE-NEXT:    movdqa %xmm0, %xmm1
610 ; SSE-NEXT:    psrld $16, %xmm1
611 ; SSE-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
612 ; SSE-NEXT:    movdqa %xmm0, %xmm1
613 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]
614 ; SSE-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
615 ; SSE-NEXT:    psrlq $48, %xmm0
616 ; SSE-NEXT:    callq __extendhfsf2@PLT
617 ; SSE-NEXT:    cvttss2si %xmm0, %rax
618 ; SSE-NEXT:    movq %rax, %xmm0
619 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
620 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
621 ; SSE-NEXT:    callq __extendhfsf2@PLT
622 ; SSE-NEXT:    cvttss2si %xmm0, %rax
623 ; SSE-NEXT:    movq %rax, %xmm0
624 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
625 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
626 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
627 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
628 ; SSE-NEXT:    callq __extendhfsf2@PLT
629 ; SSE-NEXT:    cvttss2si %xmm0, %rax
630 ; SSE-NEXT:    movq %rax, %xmm0
631 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
632 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
633 ; SSE-NEXT:    callq __extendhfsf2@PLT
634 ; SSE-NEXT:    cvttss2si %xmm0, %rax
635 ; SSE-NEXT:    movq %rax, %xmm0
636 ; SSE-NEXT:    movdqa (%rsp), %xmm3 # 16-byte Reload
637 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
638 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2147483647,2147483647]
639 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
640 ; SSE-NEXT:    movdqa %xmm3, %xmm1
641 ; SSE-NEXT:    movdqa %xmm3, %xmm8
642 ; SSE-NEXT:    pxor %xmm0, %xmm1
643 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
644 ; SSE-NEXT:    pxor %xmm4, %xmm4
645 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm3
646 ; SSE-NEXT:    movdqa {{.*#+}} xmm5 = [4294967295,4294967295]
647 ; SSE-NEXT:    movdqa %xmm5, %xmm6
648 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm6
649 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
650 ; SSE-NEXT:    pand %xmm3, %xmm7
651 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
652 ; SSE-NEXT:    por %xmm7, %xmm1
653 ; SSE-NEXT:    pand %xmm1, %xmm8
654 ; SSE-NEXT:    pandn %xmm2, %xmm1
655 ; SSE-NEXT:    por %xmm8, %xmm1
656 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
657 ; SSE-NEXT:    movdqa %xmm7, %xmm3
658 ; SSE-NEXT:    pxor %xmm0, %xmm3
659 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]
660 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm6
661 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm5
662 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[0,0,2,2]
663 ; SSE-NEXT:    pand %xmm6, %xmm3
664 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
665 ; SSE-NEXT:    por %xmm3, %xmm4
666 ; SSE-NEXT:    movdqa %xmm7, %xmm3
667 ; SSE-NEXT:    pand %xmm4, %xmm3
668 ; SSE-NEXT:    pandn %xmm2, %xmm4
669 ; SSE-NEXT:    por %xmm3, %xmm4
670 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968]
671 ; SSE-NEXT:    movdqa %xmm4, %xmm3
672 ; SSE-NEXT:    pxor %xmm0, %xmm3
673 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
674 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm6
675 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm5
676 ; SSE-NEXT:    movdqa {{.*#+}} xmm7 = [18446744069414584320,18446744069414584320]
677 ; SSE-NEXT:    pcmpgtd %xmm7, %xmm3
678 ; SSE-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]
679 ; SSE-NEXT:    pand %xmm5, %xmm8
680 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
681 ; SSE-NEXT:    por %xmm8, %xmm3
682 ; SSE-NEXT:    pand %xmm3, %xmm4
683 ; SSE-NEXT:    pandn %xmm2, %xmm3
684 ; SSE-NEXT:    por %xmm4, %xmm3
685 ; SSE-NEXT:    pxor %xmm1, %xmm0
686 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
687 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm4
688 ; SSE-NEXT:    pcmpgtd %xmm7, %xmm0
689 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
690 ; SSE-NEXT:    pand %xmm4, %xmm5
691 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
692 ; SSE-NEXT:    por %xmm5, %xmm0
693 ; SSE-NEXT:    pand %xmm0, %xmm1
694 ; SSE-NEXT:    pandn %xmm2, %xmm0
695 ; SSE-NEXT:    por %xmm1, %xmm0
696 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
697 ; SSE-NEXT:    addq $72, %rsp
698 ; SSE-NEXT:    retq
700 ; AVX2-LABEL: stest_f16i32:
701 ; AVX2:       # %bb.0: # %entry
702 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm1
703 ; AVX2-NEXT:    vpextrw $0, %xmm1, %eax
704 ; AVX2-NEXT:    movzwl %ax, %eax
705 ; AVX2-NEXT:    vmovd %eax, %xmm1
706 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
707 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
708 ; AVX2-NEXT:    vpextrw $0, %xmm2, %eax
709 ; AVX2-NEXT:    movzwl %ax, %eax
710 ; AVX2-NEXT:    vmovd %eax, %xmm2
711 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
712 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm1
713 ; AVX2-NEXT:    vmovq %rax, %xmm2
714 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
715 ; AVX2-NEXT:    vmovq %rax, %xmm1
716 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
717 ; AVX2-NEXT:    vpextrw $0, %xmm0, %eax
718 ; AVX2-NEXT:    movzwl %ax, %eax
719 ; AVX2-NEXT:    vmovd %eax, %xmm2
720 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
721 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
722 ; AVX2-NEXT:    vpextrw $0, %xmm0, %eax
723 ; AVX2-NEXT:    movzwl %ax, %eax
724 ; AVX2-NEXT:    vmovd %eax, %xmm0
725 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
726 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
727 ; AVX2-NEXT:    vmovq %rax, %xmm2
728 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
729 ; AVX2-NEXT:    vmovq %rax, %xmm0
730 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
731 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
732 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
733 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
734 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
735 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
736 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
737 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
738 ; AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
739 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
740 ; AVX2-NEXT:    vpermps %ymm0, %ymm1, %ymm0
741 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
742 ; AVX2-NEXT:    vzeroupper
743 ; AVX2-NEXT:    retq
745 ; AVX512-LABEL: stest_f16i32:
746 ; AVX512:       # %bb.0: # %entry
747 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
748 ; AVX512-NEXT:    vcvttps2qq %ymm0, %zmm0
749 ; AVX512-NEXT:    vpmovsqd %ymm0, %xmm0
750 ; AVX512-NEXT:    vzeroupper
751 ; AVX512-NEXT:    retq
752 entry:
753   %conv = fptosi <4 x half> %x to <4 x i64>
754   %0 = icmp slt <4 x i64> %conv, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
755   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
756   %1 = icmp sgt <4 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
757   %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
758   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
759   ret <4 x i32> %conv6
762 define <4 x i32> @utesth_f16i32(<4 x half> %x) nounwind {
763 ; SSE-LABEL: utesth_f16i32:
764 ; SSE:       # %bb.0: # %entry
765 ; SSE-NEXT:    subq $72, %rsp
766 ; SSE-NEXT:    movaps %xmm0, %xmm1
767 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]
768 ; SSE-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
769 ; SSE-NEXT:    movaps %xmm0, %xmm1
770 ; SSE-NEXT:    psrlq $48, %xmm1
771 ; SSE-NEXT:    movdqa %xmm1, (%rsp) # 16-byte Spill
772 ; SSE-NEXT:    movaps %xmm0, %xmm1
773 ; SSE-NEXT:    psrld $16, %xmm1
774 ; SSE-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
775 ; SSE-NEXT:    callq __extendhfsf2@PLT
776 ; SSE-NEXT:    cvttss2si %xmm0, %rax
777 ; SSE-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
778 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
779 ; SSE-NEXT:    movq %rax, %rdx
780 ; SSE-NEXT:    sarq $63, %rdx
781 ; SSE-NEXT:    andq %rcx, %rdx
782 ; SSE-NEXT:    orq %rax, %rdx
783 ; SSE-NEXT:    movq %rdx, %xmm0
784 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
785 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
786 ; SSE-NEXT:    callq __extendhfsf2@PLT
787 ; SSE-NEXT:    cvttss2si %xmm0, %rax
788 ; SSE-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
789 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
790 ; SSE-NEXT:    movq %rax, %rdx
791 ; SSE-NEXT:    sarq $63, %rdx
792 ; SSE-NEXT:    andq %rcx, %rdx
793 ; SSE-NEXT:    orq %rax, %rdx
794 ; SSE-NEXT:    movq %rdx, %xmm0
795 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
796 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
797 ; SSE-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
798 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
799 ; SSE-NEXT:    callq __extendhfsf2@PLT
800 ; SSE-NEXT:    cvttss2si %xmm0, %rax
801 ; SSE-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
802 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
803 ; SSE-NEXT:    movq %rax, %rdx
804 ; SSE-NEXT:    sarq $63, %rdx
805 ; SSE-NEXT:    andq %rcx, %rdx
806 ; SSE-NEXT:    orq %rax, %rdx
807 ; SSE-NEXT:    movq %rdx, %xmm0
808 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
809 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
810 ; SSE-NEXT:    callq __extendhfsf2@PLT
811 ; SSE-NEXT:    cvttss2si %xmm0, %rax
812 ; SSE-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
813 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
814 ; SSE-NEXT:    movq %rax, %rdx
815 ; SSE-NEXT:    sarq $63, %rdx
816 ; SSE-NEXT:    andq %rcx, %rdx
817 ; SSE-NEXT:    orq %rax, %rdx
818 ; SSE-NEXT:    movq %rdx, %xmm0
819 ; SSE-NEXT:    punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload
820 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
821 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
822 ; SSE-NEXT:    movdqa %xmm0, %xmm2
823 ; SSE-NEXT:    pxor %xmm1, %xmm2
824 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
825 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [2147483647,2147483647,2147483647,2147483647]
826 ; SSE-NEXT:    movdqa %xmm4, %xmm5
827 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm5
828 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
829 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm2
830 ; SSE-NEXT:    pand %xmm5, %xmm2
831 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm3
832 ; SSE-NEXT:    pand %xmm2, %xmm0
833 ; SSE-NEXT:    pxor %xmm3, %xmm2
834 ; SSE-NEXT:    por %xmm0, %xmm2
835 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload
836 ; SSE-NEXT:    movdqa %xmm6, %xmm0
837 ; SSE-NEXT:    pxor %xmm1, %xmm0
838 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
839 ; SSE-NEXT:    pcmpgtd %xmm5, %xmm4
840 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
841 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm0
842 ; SSE-NEXT:    pand %xmm4, %xmm0
843 ; SSE-NEXT:    pxor %xmm0, %xmm3
844 ; SSE-NEXT:    pand %xmm6, %xmm0
845 ; SSE-NEXT:    por %xmm3, %xmm0
846 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
847 ; SSE-NEXT:    addq $72, %rsp
848 ; SSE-NEXT:    retq
850 ; AVX2-LABEL: utesth_f16i32:
851 ; AVX2:       # %bb.0: # %entry
852 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm1
853 ; AVX2-NEXT:    vpextrw $0, %xmm1, %eax
854 ; AVX2-NEXT:    movzwl %ax, %eax
855 ; AVX2-NEXT:    vmovd %eax, %xmm1
856 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm2
857 ; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
858 ; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
859 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
860 ; AVX2-NEXT:    vcvttss2si %xmm2, %rcx
861 ; AVX2-NEXT:    movq %rcx, %rdx
862 ; AVX2-NEXT:    sarq $63, %rdx
863 ; AVX2-NEXT:    andq %rax, %rdx
864 ; AVX2-NEXT:    orq %rcx, %rdx
865 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
866 ; AVX2-NEXT:    vpextrw $0, %xmm2, %eax
867 ; AVX2-NEXT:    movzwl %ax, %eax
868 ; AVX2-NEXT:    vmovd %eax, %xmm2
869 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
870 ; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
871 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
872 ; AVX2-NEXT:    vcvttss2si %xmm2, %rcx
873 ; AVX2-NEXT:    vmovq %rdx, %xmm2
874 ; AVX2-NEXT:    vpextrw $0, %xmm0, %edx
875 ; AVX2-NEXT:    movzwl %dx, %edx
876 ; AVX2-NEXT:    vmovd %edx, %xmm3
877 ; AVX2-NEXT:    movq %rcx, %rdx
878 ; AVX2-NEXT:    sarq $63, %rdx
879 ; AVX2-NEXT:    vcvtph2ps %xmm3, %xmm3
880 ; AVX2-NEXT:    andq %rax, %rdx
881 ; AVX2-NEXT:    vsubss %xmm1, %xmm3, %xmm4
882 ; AVX2-NEXT:    vcvttss2si %xmm4, %rax
883 ; AVX2-NEXT:    orq %rcx, %rdx
884 ; AVX2-NEXT:    vmovq %rdx, %xmm4
885 ; AVX2-NEXT:    vcvttss2si %xmm3, %rcx
886 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm4[0],xmm2[0]
887 ; AVX2-NEXT:    movq %rcx, %rdx
888 ; AVX2-NEXT:    sarq $63, %rdx
889 ; AVX2-NEXT:    andq %rax, %rdx
890 ; AVX2-NEXT:    orq %rcx, %rdx
891 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
892 ; AVX2-NEXT:    vpextrw $0, %xmm0, %eax
893 ; AVX2-NEXT:    movzwl %ax, %eax
894 ; AVX2-NEXT:    vmovd %eax, %xmm0
895 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
896 ; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm1
897 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
898 ; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
899 ; AVX2-NEXT:    vmovq %rdx, %xmm0
900 ; AVX2-NEXT:    movq %rcx, %rdx
901 ; AVX2-NEXT:    sarq $63, %rdx
902 ; AVX2-NEXT:    andq %rax, %rdx
903 ; AVX2-NEXT:    orq %rcx, %rdx
904 ; AVX2-NEXT:    vmovq %rdx, %xmm1
905 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
906 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
907 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
908 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
909 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
910 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372041149743102,9223372041149743102,9223372041149743102,9223372041149743102]
911 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
912 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
913 ; AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
914 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
915 ; AVX2-NEXT:    vpermps %ymm0, %ymm1, %ymm0
916 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
917 ; AVX2-NEXT:    vzeroupper
918 ; AVX2-NEXT:    retq
920 ; AVX512-LABEL: utesth_f16i32:
921 ; AVX512:       # %bb.0: # %entry
922 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
923 ; AVX512-NEXT:    vcvttps2uqq %ymm0, %zmm0
924 ; AVX512-NEXT:    vpmovusqd %ymm0, %xmm0
925 ; AVX512-NEXT:    vzeroupper
926 ; AVX512-NEXT:    retq
927 entry:
928   %conv = fptoui <4 x half> %x to <4 x i64>
929   %0 = icmp ult <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
930   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
931   %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
932   ret <4 x i32> %conv6
935 define <4 x i32> @ustest_f16i32(<4 x half> %x) nounwind {
936 ; SSE-LABEL: ustest_f16i32:
937 ; SSE:       # %bb.0: # %entry
938 ; SSE-NEXT:    subq $72, %rsp
939 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
940 ; SSE-NEXT:    movdqa %xmm0, %xmm1
941 ; SSE-NEXT:    psrld $16, %xmm1
942 ; SSE-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
943 ; SSE-NEXT:    movdqa %xmm0, %xmm1
944 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]
945 ; SSE-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
946 ; SSE-NEXT:    psrlq $48, %xmm0
947 ; SSE-NEXT:    callq __extendhfsf2@PLT
948 ; SSE-NEXT:    cvttss2si %xmm0, %rax
949 ; SSE-NEXT:    movq %rax, %xmm0
950 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
951 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
952 ; SSE-NEXT:    callq __extendhfsf2@PLT
953 ; SSE-NEXT:    cvttss2si %xmm0, %rax
954 ; SSE-NEXT:    movq %rax, %xmm0
955 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
956 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
957 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
958 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
959 ; SSE-NEXT:    callq __extendhfsf2@PLT
960 ; SSE-NEXT:    cvttss2si %xmm0, %rax
961 ; SSE-NEXT:    movq %rax, %xmm0
962 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
963 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
964 ; SSE-NEXT:    callq __extendhfsf2@PLT
965 ; SSE-NEXT:    cvttss2si %xmm0, %rax
966 ; SSE-NEXT:    movq %rax, %xmm0
967 ; SSE-NEXT:    movdqa (%rsp), %xmm3 # 16-byte Reload
968 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
969 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,4294967295]
970 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
971 ; SSE-NEXT:    movdqa %xmm3, %xmm1
972 ; SSE-NEXT:    movdqa %xmm3, %xmm8
973 ; SSE-NEXT:    pxor %xmm0, %xmm1
974 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
975 ; SSE-NEXT:    pxor %xmm4, %xmm4
976 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm3
977 ; SSE-NEXT:    movdqa {{.*#+}} xmm5 = [2147483647,2147483647]
978 ; SSE-NEXT:    movdqa %xmm5, %xmm6
979 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm6
980 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
981 ; SSE-NEXT:    pand %xmm3, %xmm7
982 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
983 ; SSE-NEXT:    por %xmm7, %xmm1
984 ; SSE-NEXT:    pand %xmm1, %xmm8
985 ; SSE-NEXT:    pandn %xmm2, %xmm1
986 ; SSE-NEXT:    por %xmm8, %xmm1
987 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
988 ; SSE-NEXT:    movdqa %xmm7, %xmm3
989 ; SSE-NEXT:    pxor %xmm0, %xmm3
990 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]
991 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm6
992 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm5
993 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[0,0,2,2]
994 ; SSE-NEXT:    pand %xmm6, %xmm3
995 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
996 ; SSE-NEXT:    por %xmm3, %xmm4
997 ; SSE-NEXT:    movdqa %xmm7, %xmm3
998 ; SSE-NEXT:    pand %xmm4, %xmm3
999 ; SSE-NEXT:    pandn %xmm2, %xmm4
1000 ; SSE-NEXT:    por %xmm3, %xmm4
1001 ; SSE-NEXT:    movdqa %xmm4, %xmm2
1002 ; SSE-NEXT:    pxor %xmm0, %xmm2
1003 ; SSE-NEXT:    movdqa %xmm2, %xmm3
1004 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm3
1005 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
1006 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1007 ; SSE-NEXT:    pand %xmm3, %xmm2
1008 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1009 ; SSE-NEXT:    por %xmm2, %xmm3
1010 ; SSE-NEXT:    pand %xmm4, %xmm3
1011 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1012 ; SSE-NEXT:    pxor %xmm0, %xmm2
1013 ; SSE-NEXT:    movdqa %xmm2, %xmm4
1014 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm4
1015 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
1016 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1017 ; SSE-NEXT:    pand %xmm4, %xmm2
1018 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1019 ; SSE-NEXT:    por %xmm2, %xmm0
1020 ; SSE-NEXT:    pand %xmm1, %xmm0
1021 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
1022 ; SSE-NEXT:    addq $72, %rsp
1023 ; SSE-NEXT:    retq
1025 ; AVX2-LABEL: ustest_f16i32:
1026 ; AVX2:       # %bb.0: # %entry
1027 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm1
1028 ; AVX2-NEXT:    vpextrw $0, %xmm1, %eax
1029 ; AVX2-NEXT:    movzwl %ax, %eax
1030 ; AVX2-NEXT:    vmovd %eax, %xmm1
1031 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
1032 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
1033 ; AVX2-NEXT:    vmovq %rax, %xmm1
1034 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
1035 ; AVX2-NEXT:    vpextrw $0, %xmm2, %eax
1036 ; AVX2-NEXT:    movzwl %ax, %eax
1037 ; AVX2-NEXT:    vmovd %eax, %xmm2
1038 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
1039 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1040 ; AVX2-NEXT:    vmovq %rax, %xmm2
1041 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
1042 ; AVX2-NEXT:    vpextrw $0, %xmm0, %eax
1043 ; AVX2-NEXT:    movzwl %ax, %eax
1044 ; AVX2-NEXT:    vmovd %eax, %xmm2
1045 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
1046 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
1047 ; AVX2-NEXT:    vmovq %rax, %xmm2
1048 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
1049 ; AVX2-NEXT:    vpextrw $0, %xmm0, %eax
1050 ; AVX2-NEXT:    movzwl %ax, %eax
1051 ; AVX2-NEXT:    vmovd %eax, %xmm0
1052 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
1053 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
1054 ; AVX2-NEXT:    vmovq %rax, %xmm0
1055 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
1056 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1057 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
1058 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
1059 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1060 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1061 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm1
1062 ; AVX2-NEXT:    vpand %ymm0, %ymm1, %ymm0
1063 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
1064 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
1065 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1066 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1067 ; AVX2-NEXT:    vzeroupper
1068 ; AVX2-NEXT:    retq
1070 ; AVX512-LABEL: ustest_f16i32:
1071 ; AVX512:       # %bb.0: # %entry
1072 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
1073 ; AVX512-NEXT:    vcvttps2qq %ymm0, %zmm0
1074 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1075 ; AVX512-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
1076 ; AVX512-NEXT:    vpmovusqd %ymm0, %xmm0
1077 ; AVX512-NEXT:    vzeroupper
1078 ; AVX512-NEXT:    retq
1079 entry:
1080   %conv = fptosi <4 x half> %x to <4 x i64>
1081   %0 = icmp slt <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
1082   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
1083   %1 = icmp sgt <4 x i64> %spec.store.select, zeroinitializer
1084   %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> zeroinitializer
1085   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
1086   ret <4 x i32> %conv6
1089 ; i16 saturate
1091 define <2 x i16> @stest_f64i16(<2 x double> %x) nounwind {
1092 ; SSE-LABEL: stest_f64i16:
1093 ; SSE:       # %bb.0: # %entry
1094 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
1095 ; SSE-NEXT:    packssdw %xmm0, %xmm0
1096 ; SSE-NEXT:    retq
1098 ; AVX-LABEL: stest_f64i16:
1099 ; AVX:       # %bb.0: # %entry
1100 ; AVX-NEXT:    vcvttpd2dq %xmm0, %xmm0
1101 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1102 ; AVX-NEXT:    retq
1103 entry:
1104   %conv = fptosi <2 x double> %x to <2 x i32>
1105   %0 = icmp slt <2 x i32> %conv, <i32 32767, i32 32767>
1106   %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 32767, i32 32767>
1107   %1 = icmp sgt <2 x i32> %spec.store.select, <i32 -32768, i32 -32768>
1108   %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> <i32 -32768, i32 -32768>
1109   %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
1110   ret <2 x i16> %conv6
1113 define <2 x i16> @utest_f64i16(<2 x double> %x) nounwind {
1114 ; SSE-LABEL: utest_f64i16:
1115 ; SSE:       # %bb.0: # %entry
1116 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm1
1117 ; SSE-NEXT:    movapd %xmm1, %xmm2
1118 ; SSE-NEXT:    psrad $31, %xmm2
1119 ; SSE-NEXT:    addpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1120 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
1121 ; SSE-NEXT:    andpd %xmm2, %xmm0
1122 ; SSE-NEXT:    orpd %xmm1, %xmm0
1123 ; SSE-NEXT:    movapd {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1124 ; SSE-NEXT:    xorpd %xmm0, %xmm1
1125 ; SSE-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1126 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1127 ; SSE-NEXT:    pandn %xmm0, %xmm2
1128 ; SSE-NEXT:    psrld $16, %xmm1
1129 ; SSE-NEXT:    por %xmm2, %xmm1
1130 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
1131 ; SSE-NEXT:    retq
1133 ; AVX2-LABEL: utest_f64i16:
1134 ; AVX2:       # %bb.0: # %entry
1135 ; AVX2-NEXT:    vcvttpd2dq %xmm0, %xmm1
1136 ; AVX2-NEXT:    vaddpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1137 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm2
1138 ; AVX2-NEXT:    vcvttpd2dq %xmm0, %xmm0
1139 ; AVX2-NEXT:    vandpd %xmm2, %xmm0, %xmm0
1140 ; AVX2-NEXT:    vorpd %xmm0, %xmm1, %xmm0
1141 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
1142 ; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1143 ; AVX2-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1144 ; AVX2-NEXT:    retq
1146 ; AVX512-LABEL: utest_f64i16:
1147 ; AVX512:       # %bb.0: # %entry
1148 ; AVX512-NEXT:    vcvttpd2udq %xmm0, %xmm0
1149 ; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
1150 ; AVX512-NEXT:    vpmovdw %xmm0, %xmm0
1151 ; AVX512-NEXT:    retq
1152 entry:
1153   %conv = fptoui <2 x double> %x to <2 x i32>
1154   %0 = icmp ult <2 x i32> %conv, <i32 65535, i32 65535>
1155   %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>
1156   %conv6 = trunc <2 x i32> %spec.store.select to <2 x i16>
1157   ret <2 x i16> %conv6
1160 define <2 x i16> @ustest_f64i16(<2 x double> %x) nounwind {
1161 ; SSE-LABEL: ustest_f64i16:
1162 ; SSE:       # %bb.0: # %entry
1163 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
1164 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = <65535,65535,u,u>
1165 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1166 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm2
1167 ; SSE-NEXT:    pand %xmm2, %xmm0
1168 ; SSE-NEXT:    pandn %xmm1, %xmm2
1169 ; SSE-NEXT:    por %xmm0, %xmm2
1170 ; SSE-NEXT:    pxor %xmm0, %xmm0
1171 ; SSE-NEXT:    movdqa %xmm2, %xmm1
1172 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
1173 ; SSE-NEXT:    pand %xmm2, %xmm1
1174 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
1175 ; SSE-NEXT:    retq
1177 ; AVX-LABEL: ustest_f64i16:
1178 ; AVX:       # %bb.0: # %entry
1179 ; AVX-NEXT:    vcvttpd2dq %xmm0, %xmm0
1180 ; AVX-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1181 ; AVX-NEXT:    retq
1182 entry:
1183   %conv = fptosi <2 x double> %x to <2 x i32>
1184   %0 = icmp slt <2 x i32> %conv, <i32 65535, i32 65535>
1185   %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>
1186   %1 = icmp sgt <2 x i32> %spec.store.select, zeroinitializer
1187   %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> zeroinitializer
1188   %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
1189   ret <2 x i16> %conv6
1192 define <4 x i16> @stest_f32i16(<4 x float> %x) nounwind {
1193 ; SSE-LABEL: stest_f32i16:
1194 ; SSE:       # %bb.0: # %entry
1195 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1196 ; SSE-NEXT:    packssdw %xmm0, %xmm0
1197 ; SSE-NEXT:    retq
1199 ; AVX-LABEL: stest_f32i16:
1200 ; AVX:       # %bb.0: # %entry
1201 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
1202 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1203 ; AVX-NEXT:    retq
1204 entry:
1205   %conv = fptosi <4 x float> %x to <4 x i32>
1206   %0 = icmp slt <4 x i32> %conv, <i32 32767, i32 32767, i32 32767, i32 32767>
1207   %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
1208   %1 = icmp sgt <4 x i32> %spec.store.select, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1209   %spec.store.select7 = select <4 x i1> %1, <4 x i32> %spec.store.select, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1210   %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
1211   ret <4 x i16> %conv6
1214 define <4 x i16> @utest_f32i16(<4 x float> %x) nounwind {
1215 ; SSE-LABEL: utest_f32i16:
1216 ; SSE:       # %bb.0: # %entry
1217 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm1
1218 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1219 ; SSE-NEXT:    psrad $31, %xmm2
1220 ; SSE-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1221 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1222 ; SSE-NEXT:    pand %xmm2, %xmm0
1223 ; SSE-NEXT:    por %xmm1, %xmm0
1224 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1225 ; SSE-NEXT:    pxor %xmm0, %xmm1
1226 ; SSE-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1227 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1228 ; SSE-NEXT:    pandn %xmm0, %xmm2
1229 ; SSE-NEXT:    psrld $16, %xmm1
1230 ; SSE-NEXT:    por %xmm2, %xmm1
1231 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
1232 ; SSE-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1233 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1234 ; SSE-NEXT:    retq
1236 ; AVX2-LABEL: utest_f32i16:
1237 ; AVX2:       # %bb.0: # %entry
1238 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
1239 ; AVX2-NEXT:    vsubps %xmm1, %xmm0, %xmm1
1240 ; AVX2-NEXT:    vcvttps2dq %xmm1, %xmm1
1241 ; AVX2-NEXT:    vcvttps2dq %xmm0, %xmm0
1242 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm2
1243 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
1244 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1245 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
1246 ; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1247 ; AVX2-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1248 ; AVX2-NEXT:    retq
1250 ; AVX512-LABEL: utest_f32i16:
1251 ; AVX512:       # %bb.0: # %entry
1252 ; AVX512-NEXT:    vcvttps2udq %xmm0, %xmm0
1253 ; AVX512-NEXT:    vpmovusdw %xmm0, %xmm0
1254 ; AVX512-NEXT:    retq
1255 entry:
1256   %conv = fptoui <4 x float> %x to <4 x i32>
1257   %0 = icmp ult <4 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535>
1258   %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1259   %conv6 = trunc <4 x i32> %spec.store.select to <4 x i16>
1260   ret <4 x i16> %conv6
1263 define <4 x i16> @ustest_f32i16(<4 x float> %x) nounwind {
1264 ; SSE-LABEL: ustest_f32i16:
1265 ; SSE:       # %bb.0: # %entry
1266 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1267 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
1268 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1269 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm2
1270 ; SSE-NEXT:    pand %xmm2, %xmm0
1271 ; SSE-NEXT:    pandn %xmm1, %xmm2
1272 ; SSE-NEXT:    por %xmm0, %xmm2
1273 ; SSE-NEXT:    pxor %xmm0, %xmm0
1274 ; SSE-NEXT:    movdqa %xmm2, %xmm1
1275 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
1276 ; SSE-NEXT:    pand %xmm2, %xmm1
1277 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
1278 ; SSE-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1279 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1280 ; SSE-NEXT:    retq
1282 ; AVX-LABEL: ustest_f32i16:
1283 ; AVX:       # %bb.0: # %entry
1284 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
1285 ; AVX-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1286 ; AVX-NEXT:    retq
1287 entry:
1288   %conv = fptosi <4 x float> %x to <4 x i32>
1289   %0 = icmp slt <4 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535>
1290   %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1291   %1 = icmp sgt <4 x i32> %spec.store.select, zeroinitializer
1292   %spec.store.select7 = select <4 x i1> %1, <4 x i32> %spec.store.select, <4 x i32> zeroinitializer
1293   %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
1294   ret <4 x i16> %conv6
1297 define <8 x i16> @stest_f16i16(<8 x half> %x) nounwind {
1298 ; SSE-LABEL: stest_f16i16:
1299 ; SSE:       # %bb.0: # %entry
1300 ; SSE-NEXT:    subq $72, %rsp
1301 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
1302 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1303 ; SSE-NEXT:    callq __extendhfsf2@PLT
1304 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1305 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1306 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
1307 ; SSE-NEXT:    callq __extendhfsf2@PLT
1308 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1309 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
1310 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1311 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1312 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
1313 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1314 ; SSE-NEXT:    callq __extendhfsf2@PLT
1315 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1316 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1317 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1318 ; SSE-NEXT:    callq __extendhfsf2@PLT
1319 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1320 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
1321 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1322 ; SSE-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1323 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
1324 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1325 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
1326 ; SSE-NEXT:    psrlq $48, %xmm0
1327 ; SSE-NEXT:    callq __extendhfsf2@PLT
1328 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1329 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1330 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
1331 ; SSE-NEXT:    callq __extendhfsf2@PLT
1332 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1333 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
1334 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1335 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1336 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1337 ; SSE-NEXT:    callq __extendhfsf2@PLT
1338 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1339 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
1340 ; SSE-NEXT:    psrld $16, %xmm0
1341 ; SSE-NEXT:    callq __extendhfsf2@PLT
1342 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1343 ; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1344 ; SSE-NEXT:    cvttps2dq %xmm1, %xmm0
1345 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1346 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
1347 ; SSE-NEXT:    packssdw {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1348 ; SSE-NEXT:    addq $72, %rsp
1349 ; SSE-NEXT:    retq
1351 ; AVX2-LABEL: stest_f16i16:
1352 ; AVX2:       # %bb.0: # %entry
1353 ; AVX2-NEXT:    vcvtph2ps %xmm0, %ymm0
1354 ; AVX2-NEXT:    vcvttps2dq %ymm0, %ymm0
1355 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1356 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1357 ; AVX2-NEXT:    vzeroupper
1358 ; AVX2-NEXT:    retq
1360 ; AVX512-LABEL: stest_f16i16:
1361 ; AVX512:       # %bb.0: # %entry
1362 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
1363 ; AVX512-NEXT:    vcvttps2dq %ymm0, %ymm0
1364 ; AVX512-NEXT:    vpmovsdw %ymm0, %xmm0
1365 ; AVX512-NEXT:    vzeroupper
1366 ; AVX512-NEXT:    retq
1367 entry:
1368   %conv = fptosi <8 x half> %x to <8 x i32>
1369   %0 = icmp slt <8 x i32> %conv, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
1370   %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
1371   %1 = icmp sgt <8 x i32> %spec.store.select, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1372   %spec.store.select7 = select <8 x i1> %1, <8 x i32> %spec.store.select, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1373   %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
1374   ret <8 x i16> %conv6
1377 define <8 x i16> @utesth_f16i16(<8 x half> %x) nounwind {
1378 ; SSE-LABEL: utesth_f16i16:
1379 ; SSE:       # %bb.0: # %entry
1380 ; SSE-NEXT:    subq $72, %rsp
1381 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
1382 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1383 ; SSE-NEXT:    callq __extendhfsf2@PLT
1384 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1385 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1386 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
1387 ; SSE-NEXT:    callq __extendhfsf2@PLT
1388 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1389 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
1390 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm1
1391 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1392 ; SSE-NEXT:    psrad $31, %xmm2
1393 ; SSE-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1394 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1395 ; SSE-NEXT:    pand %xmm2, %xmm0
1396 ; SSE-NEXT:    por %xmm1, %xmm0
1397 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1398 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
1399 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1400 ; SSE-NEXT:    callq __extendhfsf2@PLT
1401 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1402 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1403 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1404 ; SSE-NEXT:    callq __extendhfsf2@PLT
1405 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1406 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
1407 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm1
1408 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1409 ; SSE-NEXT:    psrad $31, %xmm2
1410 ; SSE-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1411 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1412 ; SSE-NEXT:    pand %xmm2, %xmm0
1413 ; SSE-NEXT:    por %xmm1, %xmm0
1414 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1415 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
1416 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1417 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
1418 ; SSE-NEXT:    psrlq $48, %xmm0
1419 ; SSE-NEXT:    callq __extendhfsf2@PLT
1420 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1421 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1422 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
1423 ; SSE-NEXT:    callq __extendhfsf2@PLT
1424 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1425 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
1426 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm1
1427 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1428 ; SSE-NEXT:    psrad $31, %xmm2
1429 ; SSE-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1430 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1431 ; SSE-NEXT:    pand %xmm2, %xmm0
1432 ; SSE-NEXT:    por %xmm1, %xmm0
1433 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1434 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1435 ; SSE-NEXT:    callq __extendhfsf2@PLT
1436 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1437 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
1438 ; SSE-NEXT:    psrld $16, %xmm0
1439 ; SSE-NEXT:    callq __extendhfsf2@PLT
1440 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
1441 ; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
1442 ; SSE-NEXT:    cvttps2dq %xmm2, %xmm0
1443 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1444 ; SSE-NEXT:    psrad $31, %xmm1
1445 ; SSE-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1446 ; SSE-NEXT:    cvttps2dq %xmm2, %xmm2
1447 ; SSE-NEXT:    pand %xmm1, %xmm2
1448 ; SSE-NEXT:    por %xmm0, %xmm2
1449 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload
1450 ; SSE-NEXT:    # xmm2 = xmm2[0],mem[0]
1451 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1452 ; SSE-NEXT:    movdqa %xmm2, %xmm3
1453 ; SSE-NEXT:    pxor %xmm1, %xmm3
1454 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183]
1455 ; SSE-NEXT:    movdqa %xmm4, %xmm0
1456 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm0
1457 ; SSE-NEXT:    pand %xmm0, %xmm2
1458 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm3
1459 ; SSE-NEXT:    pxor %xmm3, %xmm0
1460 ; SSE-NEXT:    por %xmm2, %xmm0
1461 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
1462 ; SSE-NEXT:    pxor %xmm2, %xmm1
1463 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm4
1464 ; SSE-NEXT:    pand %xmm4, %xmm2
1465 ; SSE-NEXT:    pxor %xmm3, %xmm4
1466 ; SSE-NEXT:    por %xmm2, %xmm4
1467 ; SSE-NEXT:    pslld $16, %xmm4
1468 ; SSE-NEXT:    psrad $16, %xmm4
1469 ; SSE-NEXT:    pslld $16, %xmm0
1470 ; SSE-NEXT:    psrad $16, %xmm0
1471 ; SSE-NEXT:    packssdw %xmm4, %xmm0
1472 ; SSE-NEXT:    addq $72, %rsp
1473 ; SSE-NEXT:    retq
1475 ; AVX2-LABEL: utesth_f16i16:
1476 ; AVX2:       # %bb.0: # %entry
1477 ; AVX2-NEXT:    vcvtph2ps %xmm0, %ymm0
1478 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
1479 ; AVX2-NEXT:    vsubps %ymm1, %ymm0, %ymm1
1480 ; AVX2-NEXT:    vcvttps2dq %ymm1, %ymm1
1481 ; AVX2-NEXT:    vcvttps2dq %ymm0, %ymm0
1482 ; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm2
1483 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
1484 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1485 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
1486 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1487 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1488 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1489 ; AVX2-NEXT:    vzeroupper
1490 ; AVX2-NEXT:    retq
1492 ; AVX512-LABEL: utesth_f16i16:
1493 ; AVX512:       # %bb.0: # %entry
1494 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
1495 ; AVX512-NEXT:    vcvttps2udq %ymm0, %ymm0
1496 ; AVX512-NEXT:    vpmovusdw %ymm0, %xmm0
1497 ; AVX512-NEXT:    vzeroupper
1498 ; AVX512-NEXT:    retq
1499 entry:
1500   %conv = fptoui <8 x half> %x to <8 x i32>
1501   %0 = icmp ult <8 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
1502   %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
1503   %conv6 = trunc <8 x i32> %spec.store.select to <8 x i16>
1504   ret <8 x i16> %conv6
1507 define <8 x i16> @ustest_f16i16(<8 x half> %x) nounwind {
1508 ; SSE-LABEL: ustest_f16i16:
1509 ; SSE:       # %bb.0: # %entry
1510 ; SSE-NEXT:    subq $72, %rsp
1511 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
1512 ; SSE-NEXT:    psrlq $48, %xmm0
1513 ; SSE-NEXT:    callq __extendhfsf2@PLT
1514 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1515 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1516 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
1517 ; SSE-NEXT:    callq __extendhfsf2@PLT
1518 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1519 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
1520 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1521 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1522 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1523 ; SSE-NEXT:    callq __extendhfsf2@PLT
1524 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1525 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
1526 ; SSE-NEXT:    psrld $16, %xmm0
1527 ; SSE-NEXT:    callq __extendhfsf2@PLT
1528 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1529 ; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1530 ; SSE-NEXT:    cvttps2dq %xmm1, %xmm0
1531 ; SSE-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1532 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
1533 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1534 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
1535 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1536 ; SSE-NEXT:    callq __extendhfsf2@PLT
1537 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1538 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1539 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
1540 ; SSE-NEXT:    callq __extendhfsf2@PLT
1541 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1542 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
1543 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1544 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1545 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
1546 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1547 ; SSE-NEXT:    callq __extendhfsf2@PLT
1548 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1549 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1550 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1551 ; SSE-NEXT:    callq __extendhfsf2@PLT
1552 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1553 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
1554 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1555 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1556 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
1557 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
1558 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1559 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm2
1560 ; SSE-NEXT:    pand %xmm2, %xmm0
1561 ; SSE-NEXT:    pandn %xmm1, %xmm2
1562 ; SSE-NEXT:    por %xmm0, %xmm2
1563 ; SSE-NEXT:    movdqa %xmm1, %xmm3
1564 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1565 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm3
1566 ; SSE-NEXT:    pand %xmm3, %xmm0
1567 ; SSE-NEXT:    pandn %xmm1, %xmm3
1568 ; SSE-NEXT:    por %xmm0, %xmm3
1569 ; SSE-NEXT:    pxor %xmm1, %xmm1
1570 ; SSE-NEXT:    movdqa %xmm3, %xmm0
1571 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
1572 ; SSE-NEXT:    pand %xmm3, %xmm0
1573 ; SSE-NEXT:    movdqa %xmm2, %xmm3
1574 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm3
1575 ; SSE-NEXT:    pand %xmm2, %xmm3
1576 ; SSE-NEXT:    pslld $16, %xmm3
1577 ; SSE-NEXT:    psrad $16, %xmm3
1578 ; SSE-NEXT:    pslld $16, %xmm0
1579 ; SSE-NEXT:    psrad $16, %xmm0
1580 ; SSE-NEXT:    packssdw %xmm3, %xmm0
1581 ; SSE-NEXT:    addq $72, %rsp
1582 ; SSE-NEXT:    retq
1584 ; AVX2-LABEL: ustest_f16i16:
1585 ; AVX2:       # %bb.0: # %entry
1586 ; AVX2-NEXT:    vcvtph2ps %xmm0, %ymm0
1587 ; AVX2-NEXT:    vcvttps2dq %ymm0, %ymm0
1588 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1589 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1590 ; AVX2-NEXT:    vzeroupper
1591 ; AVX2-NEXT:    retq
1593 ; AVX512-LABEL: ustest_f16i16:
1594 ; AVX512:       # %bb.0: # %entry
1595 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
1596 ; AVX512-NEXT:    vcvttps2dq %ymm0, %ymm0
1597 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1598 ; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1599 ; AVX512-NEXT:    vpmovusdw %ymm0, %xmm0
1600 ; AVX512-NEXT:    vzeroupper
1601 ; AVX512-NEXT:    retq
1602 entry:
1603   %conv = fptosi <8 x half> %x to <8 x i32>
1604   %0 = icmp slt <8 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
1605   %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
1606   %1 = icmp sgt <8 x i32> %spec.store.select, zeroinitializer
1607   %spec.store.select7 = select <8 x i1> %1, <8 x i32> %spec.store.select, <8 x i32> zeroinitializer
1608   %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
1609   ret <8 x i16> %conv6
1612 ; i8 saturate
1614 define <2 x i8> @stest_f64i8(<2 x double> %x) nounwind {
1615 ; SSE-LABEL: stest_f64i8:
1616 ; SSE:       # %bb.0: # %entry
1617 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
1618 ; SSE-NEXT:    packssdw %xmm0, %xmm0
1619 ; SSE-NEXT:    packsswb %xmm0, %xmm0
1620 ; SSE-NEXT:    retq
1622 ; AVX-LABEL: stest_f64i8:
1623 ; AVX:       # %bb.0: # %entry
1624 ; AVX-NEXT:    vcvttpd2dq %xmm0, %xmm0
1625 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1626 ; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
1627 ; AVX-NEXT:    retq
1628 entry:
1629   %conv = fptosi <2 x double> %x to <2 x i32>
1630   %0 = icmp slt <2 x i32> %conv, <i32 127, i32 127>
1631   %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 127, i32 127>
1632   %1 = icmp sgt <2 x i32> %spec.store.select, <i32 -128, i32 -128>
1633   %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> <i32 -128, i32 -128>
1634   %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i8>
1635   ret <2 x i8> %conv6
1638 define <2 x i8> @utest_f64i8(<2 x double> %x) nounwind {
1639 ; SSE-LABEL: utest_f64i8:
1640 ; SSE:       # %bb.0: # %entry
1641 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm1
1642 ; SSE-NEXT:    movapd %xmm1, %xmm2
1643 ; SSE-NEXT:    psrad $31, %xmm2
1644 ; SSE-NEXT:    addpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1645 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm3
1646 ; SSE-NEXT:    andpd %xmm2, %xmm3
1647 ; SSE-NEXT:    orpd %xmm1, %xmm3
1648 ; SSE-NEXT:    movapd {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
1649 ; SSE-NEXT:    xorpd %xmm3, %xmm0
1650 ; SSE-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1651 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1652 ; SSE-NEXT:    pandn %xmm3, %xmm1
1653 ; SSE-NEXT:    psrld $24, %xmm0
1654 ; SSE-NEXT:    por %xmm1, %xmm0
1655 ; SSE-NEXT:    packuswb %xmm0, %xmm0
1656 ; SSE-NEXT:    packuswb %xmm0, %xmm0
1657 ; SSE-NEXT:    retq
1659 ; AVX2-LABEL: utest_f64i8:
1660 ; AVX2:       # %bb.0: # %entry
1661 ; AVX2-NEXT:    vcvttpd2dq %xmm0, %xmm1
1662 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm2
1663 ; AVX2-NEXT:    vaddpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1664 ; AVX2-NEXT:    vcvttpd2dq %xmm0, %xmm0
1665 ; AVX2-NEXT:    vandpd %xmm2, %xmm0, %xmm0
1666 ; AVX2-NEXT:    vorpd %xmm0, %xmm1, %xmm0
1667 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
1668 ; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1669 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12]
1670 ; AVX2-NEXT:    retq
1672 ; AVX512-LABEL: utest_f64i8:
1673 ; AVX512:       # %bb.0: # %entry
1674 ; AVX512-NEXT:    vcvttpd2udq %xmm0, %xmm0
1675 ; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
1676 ; AVX512-NEXT:    vpmovdb %xmm0, %xmm0
1677 ; AVX512-NEXT:    retq
1678 entry:
1679   %conv = fptoui <2 x double> %x to <2 x i32>
1680   %0 = icmp ult <2 x i32> %conv, <i32 255, i32 255>
1681   %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 255, i32 255>
1682   %conv6 = trunc <2 x i32> %spec.store.select to <2 x i8>
1683   ret <2 x i8> %conv6
1686 define <2 x i8> @ustest_f64i8(<2 x double> %x) nounwind {
1687 ; SSE-LABEL: ustest_f64i8:
1688 ; SSE:       # %bb.0: # %entry
1689 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
1690 ; SSE-NEXT:    packssdw %xmm0, %xmm0
1691 ; SSE-NEXT:    packuswb %xmm0, %xmm0
1692 ; SSE-NEXT:    retq
1694 ; AVX-LABEL: ustest_f64i8:
1695 ; AVX:       # %bb.0: # %entry
1696 ; AVX-NEXT:    vcvttpd2dq %xmm0, %xmm0
1697 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1698 ; AVX-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
1699 ; AVX-NEXT:    retq
1700 entry:
1701   %conv = fptosi <2 x double> %x to <2 x i32>
1702   %0 = icmp slt <2 x i32> %conv, <i32 255, i32 255>
1703   %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 255, i32 255>
1704   %1 = icmp sgt <2 x i32> %spec.store.select, zeroinitializer
1705   %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> zeroinitializer
1706   %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i8>
1707   ret <2 x i8> %conv6
1710 define <4 x i8> @stest_f32i8(<4 x float> %x) nounwind {
1711 ; SSE-LABEL: stest_f32i8:
1712 ; SSE:       # %bb.0: # %entry
1713 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1714 ; SSE-NEXT:    packssdw %xmm0, %xmm0
1715 ; SSE-NEXT:    packsswb %xmm0, %xmm0
1716 ; SSE-NEXT:    retq
1718 ; AVX-LABEL: stest_f32i8:
1719 ; AVX:       # %bb.0: # %entry
1720 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
1721 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1722 ; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
1723 ; AVX-NEXT:    retq
1724 entry:
1725   %conv = fptosi <4 x float> %x to <4 x i32>
1726   %0 = icmp slt <4 x i32> %conv, <i32 127, i32 127, i32 127, i32 127>
1727   %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 127, i32 127, i32 127, i32 127>
1728   %1 = icmp sgt <4 x i32> %spec.store.select, <i32 -128, i32 -128, i32 -128, i32 -128>
1729   %spec.store.select7 = select <4 x i1> %1, <4 x i32> %spec.store.select, <4 x i32> <i32 -128, i32 -128, i32 -128, i32 -128>
1730   %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i8>
1731   ret <4 x i8> %conv6
1734 define <4 x i8> @utest_f32i8(<4 x float> %x) nounwind {
1735 ; SSE-LABEL: utest_f32i8:
1736 ; SSE:       # %bb.0: # %entry
1737 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm1
1738 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1739 ; SSE-NEXT:    psrad $31, %xmm2
1740 ; SSE-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1741 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm3
1742 ; SSE-NEXT:    pand %xmm2, %xmm3
1743 ; SSE-NEXT:    por %xmm1, %xmm3
1744 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
1745 ; SSE-NEXT:    pxor %xmm3, %xmm0
1746 ; SSE-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1747 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1748 ; SSE-NEXT:    pandn %xmm3, %xmm1
1749 ; SSE-NEXT:    psrld $24, %xmm0
1750 ; SSE-NEXT:    por %xmm1, %xmm0
1751 ; SSE-NEXT:    packuswb %xmm0, %xmm0
1752 ; SSE-NEXT:    packuswb %xmm0, %xmm0
1753 ; SSE-NEXT:    retq
1755 ; AVX2-LABEL: utest_f32i8:
1756 ; AVX2:       # %bb.0: # %entry
1757 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
1758 ; AVX2-NEXT:    vsubps %xmm1, %xmm0, %xmm1
1759 ; AVX2-NEXT:    vcvttps2dq %xmm1, %xmm1
1760 ; AVX2-NEXT:    vcvttps2dq %xmm0, %xmm0
1761 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm2
1762 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
1763 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1764 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
1765 ; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1766 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12]
1767 ; AVX2-NEXT:    retq
1769 ; AVX512-LABEL: utest_f32i8:
1770 ; AVX512:       # %bb.0: # %entry
1771 ; AVX512-NEXT:    vcvttps2udq %xmm0, %xmm0
1772 ; AVX512-NEXT:    vpmovusdb %xmm0, %xmm0
1773 ; AVX512-NEXT:    retq
1774 entry:
1775   %conv = fptoui <4 x float> %x to <4 x i32>
1776   %0 = icmp ult <4 x i32> %conv, <i32 255, i32 255, i32 255, i32 255>
1777   %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
1778   %conv6 = trunc <4 x i32> %spec.store.select to <4 x i8>
1779   ret <4 x i8> %conv6
1782 define <4 x i8> @ustest_f32i8(<4 x float> %x) nounwind {
1783 ; SSE-LABEL: ustest_f32i8:
1784 ; SSE:       # %bb.0: # %entry
1785 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
1786 ; SSE-NEXT:    packssdw %xmm0, %xmm0
1787 ; SSE-NEXT:    packuswb %xmm0, %xmm0
1788 ; SSE-NEXT:    retq
1790 ; AVX-LABEL: ustest_f32i8:
1791 ; AVX:       # %bb.0: # %entry
1792 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
1793 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1794 ; AVX-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
1795 ; AVX-NEXT:    retq
1796 entry:
1797   %conv = fptosi <4 x float> %x to <4 x i32>
1798   %0 = icmp slt <4 x i32> %conv, <i32 255, i32 255, i32 255, i32 255>
1799   %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
1800   %1 = icmp sgt <4 x i32> %spec.store.select, zeroinitializer
1801   %spec.store.select7 = select <4 x i1> %1, <4 x i32> %spec.store.select, <4 x i32> zeroinitializer
1802   %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i8>
1803   ret <4 x i8> %conv6
1806 ; i64 saturate
1808 define <2 x i64> @stest_f64i64(<2 x double> %x) nounwind {
1809 ; SSE-LABEL: stest_f64i64:
1810 ; SSE:       # %bb.0: # %entry
1811 ; SSE-NEXT:    pushq %r14
1812 ; SSE-NEXT:    pushq %rbx
1813 ; SSE-NEXT:    subq $24, %rsp
1814 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
1815 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1816 ; SSE-NEXT:    callq __fixdfti@PLT
1817 ; SSE-NEXT:    movq %rax, %rbx
1818 ; SSE-NEXT:    movq %rdx, %r14
1819 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1820 ; SSE-NEXT:    callq __fixdfti@PLT
1821 ; SSE-NEXT:    xorl %ecx, %ecx
1822 ; SSE-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
1823 ; SSE-NEXT:    cmpq %rsi, %rax
1824 ; SSE-NEXT:    movq %rdx, %rdi
1825 ; SSE-NEXT:    sbbq $0, %rdi
1826 ; SSE-NEXT:    cmovgeq %rcx, %rdx
1827 ; SSE-NEXT:    cmovgeq %rsi, %rax
1828 ; SSE-NEXT:    cmpq %rsi, %rbx
1829 ; SSE-NEXT:    movq %r14, %rdi
1830 ; SSE-NEXT:    sbbq $0, %rdi
1831 ; SSE-NEXT:    cmovlq %r14, %rcx
1832 ; SSE-NEXT:    cmovlq %rbx, %rsi
1833 ; SSE-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
1834 ; SSE-NEXT:    cmpq %rsi, %rdi
1835 ; SSE-NEXT:    movq $-1, %r8
1836 ; SSE-NEXT:    movq $-1, %r9
1837 ; SSE-NEXT:    sbbq %rcx, %r9
1838 ; SSE-NEXT:    cmovgeq %rdi, %rsi
1839 ; SSE-NEXT:    cmpq %rax, %rdi
1840 ; SSE-NEXT:    sbbq %rdx, %r8
1841 ; SSE-NEXT:    cmovgeq %rdi, %rax
1842 ; SSE-NEXT:    movq %rax, %xmm0
1843 ; SSE-NEXT:    movq %rsi, %xmm1
1844 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1845 ; SSE-NEXT:    addq $24, %rsp
1846 ; SSE-NEXT:    popq %rbx
1847 ; SSE-NEXT:    popq %r14
1848 ; SSE-NEXT:    retq
1850 ; AVX2-LABEL: stest_f64i64:
1851 ; AVX2:       # %bb.0: # %entry
1852 ; AVX2-NEXT:    pushq %r14
1853 ; AVX2-NEXT:    pushq %rbx
1854 ; AVX2-NEXT:    subq $24, %rsp
1855 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
1856 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
1857 ; AVX2-NEXT:    callq __fixdfti@PLT
1858 ; AVX2-NEXT:    movq %rax, %rbx
1859 ; AVX2-NEXT:    movq %rdx, %r14
1860 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1861 ; AVX2-NEXT:    callq __fixdfti@PLT
1862 ; AVX2-NEXT:    xorl %ecx, %ecx
1863 ; AVX2-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
1864 ; AVX2-NEXT:    cmpq %rsi, %rax
1865 ; AVX2-NEXT:    movq %rdx, %rdi
1866 ; AVX2-NEXT:    sbbq $0, %rdi
1867 ; AVX2-NEXT:    cmovgeq %rcx, %rdx
1868 ; AVX2-NEXT:    cmovgeq %rsi, %rax
1869 ; AVX2-NEXT:    cmpq %rsi, %rbx
1870 ; AVX2-NEXT:    movq %r14, %rdi
1871 ; AVX2-NEXT:    sbbq $0, %rdi
1872 ; AVX2-NEXT:    cmovlq %r14, %rcx
1873 ; AVX2-NEXT:    cmovlq %rbx, %rsi
1874 ; AVX2-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
1875 ; AVX2-NEXT:    cmpq %rsi, %rdi
1876 ; AVX2-NEXT:    movq $-1, %r8
1877 ; AVX2-NEXT:    sbbq %rcx, %r8
1878 ; AVX2-NEXT:    movq $-1, %rcx
1879 ; AVX2-NEXT:    cmovgeq %rdi, %rsi
1880 ; AVX2-NEXT:    cmpq %rax, %rdi
1881 ; AVX2-NEXT:    sbbq %rdx, %rcx
1882 ; AVX2-NEXT:    cmovgeq %rdi, %rax
1883 ; AVX2-NEXT:    vmovq %rax, %xmm0
1884 ; AVX2-NEXT:    vmovq %rsi, %xmm1
1885 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1886 ; AVX2-NEXT:    addq $24, %rsp
1887 ; AVX2-NEXT:    popq %rbx
1888 ; AVX2-NEXT:    popq %r14
1889 ; AVX2-NEXT:    retq
1891 ; AVX512-LABEL: stest_f64i64:
1892 ; AVX512:       # %bb.0: # %entry
1893 ; AVX512-NEXT:    pushq %r14
1894 ; AVX512-NEXT:    pushq %rbx
1895 ; AVX512-NEXT:    subq $24, %rsp
1896 ; AVX512-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
1897 ; AVX512-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
1898 ; AVX512-NEXT:    callq __fixdfti@PLT
1899 ; AVX512-NEXT:    movq %rax, %rbx
1900 ; AVX512-NEXT:    movq %rdx, %r14
1901 ; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
1902 ; AVX512-NEXT:    callq __fixdfti@PLT
1903 ; AVX512-NEXT:    xorl %ecx, %ecx
1904 ; AVX512-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
1905 ; AVX512-NEXT:    cmpq %rsi, %rax
1906 ; AVX512-NEXT:    movq %rdx, %rdi
1907 ; AVX512-NEXT:    sbbq $0, %rdi
1908 ; AVX512-NEXT:    cmovgeq %rcx, %rdx
1909 ; AVX512-NEXT:    cmovgeq %rsi, %rax
1910 ; AVX512-NEXT:    cmpq %rsi, %rbx
1911 ; AVX512-NEXT:    movq %r14, %rdi
1912 ; AVX512-NEXT:    sbbq $0, %rdi
1913 ; AVX512-NEXT:    cmovlq %r14, %rcx
1914 ; AVX512-NEXT:    cmovlq %rbx, %rsi
1915 ; AVX512-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
1916 ; AVX512-NEXT:    cmpq %rsi, %rdi
1917 ; AVX512-NEXT:    movq $-1, %r8
1918 ; AVX512-NEXT:    movq $-1, %r9
1919 ; AVX512-NEXT:    sbbq %rcx, %r9
1920 ; AVX512-NEXT:    cmovgeq %rdi, %rsi
1921 ; AVX512-NEXT:    cmpq %rax, %rdi
1922 ; AVX512-NEXT:    sbbq %rdx, %r8
1923 ; AVX512-NEXT:    cmovgeq %rdi, %rax
1924 ; AVX512-NEXT:    vmovq %rax, %xmm0
1925 ; AVX512-NEXT:    vmovq %rsi, %xmm1
1926 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1927 ; AVX512-NEXT:    addq $24, %rsp
1928 ; AVX512-NEXT:    popq %rbx
1929 ; AVX512-NEXT:    popq %r14
1930 ; AVX512-NEXT:    retq
1931 entry:
1932   %conv = fptosi <2 x double> %x to <2 x i128>
1933   %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>
1934   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>
1935   %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>
1936   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>
1937   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1938   ret <2 x i64> %conv6
1941 define <2 x i64> @utest_f64i64(<2 x double> %x) nounwind {
1942 ; SSE-LABEL: utest_f64i64:
1943 ; SSE:       # %bb.0: # %entry
1944 ; SSE-NEXT:    pushq %r14
1945 ; SSE-NEXT:    pushq %rbx
1946 ; SSE-NEXT:    subq $24, %rsp
1947 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
1948 ; SSE-NEXT:    callq __fixunsdfti@PLT
1949 ; SSE-NEXT:    movq %rax, %rbx
1950 ; SSE-NEXT:    movq %rdx, %r14
1951 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1952 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1953 ; SSE-NEXT:    callq __fixunsdfti@PLT
1954 ; SSE-NEXT:    xorl %ecx, %ecx
1955 ; SSE-NEXT:    testq %rdx, %rdx
1956 ; SSE-NEXT:    cmovneq %rcx, %rax
1957 ; SSE-NEXT:    testq %r14, %r14
1958 ; SSE-NEXT:    cmovneq %rcx, %rbx
1959 ; SSE-NEXT:    movq %rbx, %xmm0
1960 ; SSE-NEXT:    movq %rax, %xmm1
1961 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1962 ; SSE-NEXT:    addq $24, %rsp
1963 ; SSE-NEXT:    popq %rbx
1964 ; SSE-NEXT:    popq %r14
1965 ; SSE-NEXT:    retq
1967 ; AVX-LABEL: utest_f64i64:
1968 ; AVX:       # %bb.0: # %entry
1969 ; AVX-NEXT:    pushq %r14
1970 ; AVX-NEXT:    pushq %rbx
1971 ; AVX-NEXT:    subq $24, %rsp
1972 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
1973 ; AVX-NEXT:    callq __fixunsdfti@PLT
1974 ; AVX-NEXT:    movq %rax, %rbx
1975 ; AVX-NEXT:    movq %rdx, %r14
1976 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
1977 ; AVX-NEXT:    # xmm0 = mem[1,0]
1978 ; AVX-NEXT:    callq __fixunsdfti@PLT
1979 ; AVX-NEXT:    xorl %ecx, %ecx
1980 ; AVX-NEXT:    testq %rdx, %rdx
1981 ; AVX-NEXT:    cmovneq %rcx, %rax
1982 ; AVX-NEXT:    testq %r14, %r14
1983 ; AVX-NEXT:    cmovneq %rcx, %rbx
1984 ; AVX-NEXT:    vmovq %rbx, %xmm0
1985 ; AVX-NEXT:    vmovq %rax, %xmm1
1986 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1987 ; AVX-NEXT:    addq $24, %rsp
1988 ; AVX-NEXT:    popq %rbx
1989 ; AVX-NEXT:    popq %r14
1990 ; AVX-NEXT:    retq
1991 entry:
1992   %conv = fptoui <2 x double> %x to <2 x i128>
1993   %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
1994   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
1995   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
1996   ret <2 x i64> %conv6
1999 define <2 x i64> @ustest_f64i64(<2 x double> %x) nounwind {
2000 ; SSE-LABEL: ustest_f64i64:
2001 ; SSE:       # %bb.0: # %entry
2002 ; SSE-NEXT:    pushq %r14
2003 ; SSE-NEXT:    pushq %rbx
2004 ; SSE-NEXT:    subq $24, %rsp
2005 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
2006 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
2007 ; SSE-NEXT:    callq __fixdfti@PLT
2008 ; SSE-NEXT:    movq %rax, %rbx
2009 ; SSE-NEXT:    movq %rdx, %r14
2010 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
2011 ; SSE-NEXT:    callq __fixdfti@PLT
2012 ; SSE-NEXT:    xorl %ecx, %ecx
2013 ; SSE-NEXT:    testq %rdx, %rdx
2014 ; SSE-NEXT:    movl $1, %esi
2015 ; SSE-NEXT:    cmovgq %rsi, %rdx
2016 ; SSE-NEXT:    cmovgq %rcx, %rax
2017 ; SSE-NEXT:    testq %r14, %r14
2018 ; SSE-NEXT:    cmovleq %r14, %rsi
2019 ; SSE-NEXT:    cmovgq %rcx, %rbx
2020 ; SSE-NEXT:    movq %rbx, %rdi
2021 ; SSE-NEXT:    negq %rdi
2022 ; SSE-NEXT:    movl $0, %edi
2023 ; SSE-NEXT:    sbbq %rsi, %rdi
2024 ; SSE-NEXT:    cmovgeq %rcx, %rbx
2025 ; SSE-NEXT:    movq %rax, %rsi
2026 ; SSE-NEXT:    negq %rsi
2027 ; SSE-NEXT:    movl $0, %esi
2028 ; SSE-NEXT:    sbbq %rdx, %rsi
2029 ; SSE-NEXT:    cmovgeq %rcx, %rax
2030 ; SSE-NEXT:    movq %rax, %xmm0
2031 ; SSE-NEXT:    movq %rbx, %xmm1
2032 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2033 ; SSE-NEXT:    addq $24, %rsp
2034 ; SSE-NEXT:    popq %rbx
2035 ; SSE-NEXT:    popq %r14
2036 ; SSE-NEXT:    retq
2038 ; AVX-LABEL: ustest_f64i64:
2039 ; AVX:       # %bb.0: # %entry
2040 ; AVX-NEXT:    pushq %r14
2041 ; AVX-NEXT:    pushq %rbx
2042 ; AVX-NEXT:    subq $24, %rsp
2043 ; AVX-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
2044 ; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
2045 ; AVX-NEXT:    callq __fixdfti@PLT
2046 ; AVX-NEXT:    movq %rax, %rbx
2047 ; AVX-NEXT:    movq %rdx, %r14
2048 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2049 ; AVX-NEXT:    callq __fixdfti@PLT
2050 ; AVX-NEXT:    xorl %ecx, %ecx
2051 ; AVX-NEXT:    testq %rdx, %rdx
2052 ; AVX-NEXT:    movl $1, %esi
2053 ; AVX-NEXT:    cmovgq %rsi, %rdx
2054 ; AVX-NEXT:    cmovgq %rcx, %rax
2055 ; AVX-NEXT:    testq %r14, %r14
2056 ; AVX-NEXT:    cmovleq %r14, %rsi
2057 ; AVX-NEXT:    cmovgq %rcx, %rbx
2058 ; AVX-NEXT:    movq %rbx, %rdi
2059 ; AVX-NEXT:    negq %rdi
2060 ; AVX-NEXT:    movl $0, %edi
2061 ; AVX-NEXT:    sbbq %rsi, %rdi
2062 ; AVX-NEXT:    cmovgeq %rcx, %rbx
2063 ; AVX-NEXT:    movq %rax, %rsi
2064 ; AVX-NEXT:    negq %rsi
2065 ; AVX-NEXT:    movl $0, %esi
2066 ; AVX-NEXT:    sbbq %rdx, %rsi
2067 ; AVX-NEXT:    cmovgeq %rcx, %rax
2068 ; AVX-NEXT:    vmovq %rax, %xmm0
2069 ; AVX-NEXT:    vmovq %rbx, %xmm1
2070 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2071 ; AVX-NEXT:    addq $24, %rsp
2072 ; AVX-NEXT:    popq %rbx
2073 ; AVX-NEXT:    popq %r14
2074 ; AVX-NEXT:    retq
2075 entry:
2076   %conv = fptosi <2 x double> %x to <2 x i128>
2077   %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
2078   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
2079   %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer
2080   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer
2081   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2082   ret <2 x i64> %conv6
2085 define <2 x i64> @stest_f32i64(<2 x float> %x) nounwind {
2086 ; SSE-LABEL: stest_f32i64:
2087 ; SSE:       # %bb.0: # %entry
2088 ; SSE-NEXT:    pushq %r14
2089 ; SSE-NEXT:    pushq %rbx
2090 ; SSE-NEXT:    subq $24, %rsp
2091 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
2092 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
2093 ; SSE-NEXT:    callq __fixsfti@PLT
2094 ; SSE-NEXT:    movq %rax, %rbx
2095 ; SSE-NEXT:    movq %rdx, %r14
2096 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
2097 ; SSE-NEXT:    callq __fixsfti@PLT
2098 ; SSE-NEXT:    xorl %ecx, %ecx
2099 ; SSE-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
2100 ; SSE-NEXT:    cmpq %rsi, %rax
2101 ; SSE-NEXT:    movq %rdx, %rdi
2102 ; SSE-NEXT:    sbbq $0, %rdi
2103 ; SSE-NEXT:    cmovgeq %rcx, %rdx
2104 ; SSE-NEXT:    cmovgeq %rsi, %rax
2105 ; SSE-NEXT:    cmpq %rsi, %rbx
2106 ; SSE-NEXT:    movq %r14, %rdi
2107 ; SSE-NEXT:    sbbq $0, %rdi
2108 ; SSE-NEXT:    cmovlq %r14, %rcx
2109 ; SSE-NEXT:    cmovlq %rbx, %rsi
2110 ; SSE-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
2111 ; SSE-NEXT:    cmpq %rsi, %rdi
2112 ; SSE-NEXT:    movq $-1, %r8
2113 ; SSE-NEXT:    movq $-1, %r9
2114 ; SSE-NEXT:    sbbq %rcx, %r9
2115 ; SSE-NEXT:    cmovgeq %rdi, %rsi
2116 ; SSE-NEXT:    cmpq %rax, %rdi
2117 ; SSE-NEXT:    sbbq %rdx, %r8
2118 ; SSE-NEXT:    cmovgeq %rdi, %rax
2119 ; SSE-NEXT:    movq %rax, %xmm0
2120 ; SSE-NEXT:    movq %rsi, %xmm1
2121 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2122 ; SSE-NEXT:    addq $24, %rsp
2123 ; SSE-NEXT:    popq %rbx
2124 ; SSE-NEXT:    popq %r14
2125 ; SSE-NEXT:    retq
2127 ; AVX2-LABEL: stest_f32i64:
2128 ; AVX2:       # %bb.0: # %entry
2129 ; AVX2-NEXT:    pushq %r14
2130 ; AVX2-NEXT:    pushq %rbx
2131 ; AVX2-NEXT:    subq $24, %rsp
2132 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2133 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2134 ; AVX2-NEXT:    callq __fixsfti@PLT
2135 ; AVX2-NEXT:    movq %rax, %rbx
2136 ; AVX2-NEXT:    movq %rdx, %r14
2137 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2138 ; AVX2-NEXT:    callq __fixsfti@PLT
2139 ; AVX2-NEXT:    xorl %ecx, %ecx
2140 ; AVX2-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
2141 ; AVX2-NEXT:    cmpq %rsi, %rax
2142 ; AVX2-NEXT:    movq %rdx, %rdi
2143 ; AVX2-NEXT:    sbbq $0, %rdi
2144 ; AVX2-NEXT:    cmovgeq %rcx, %rdx
2145 ; AVX2-NEXT:    cmovgeq %rsi, %rax
2146 ; AVX2-NEXT:    cmpq %rsi, %rbx
2147 ; AVX2-NEXT:    movq %r14, %rdi
2148 ; AVX2-NEXT:    sbbq $0, %rdi
2149 ; AVX2-NEXT:    cmovlq %r14, %rcx
2150 ; AVX2-NEXT:    cmovlq %rbx, %rsi
2151 ; AVX2-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
2152 ; AVX2-NEXT:    cmpq %rsi, %rdi
2153 ; AVX2-NEXT:    movq $-1, %r8
2154 ; AVX2-NEXT:    sbbq %rcx, %r8
2155 ; AVX2-NEXT:    movq $-1, %rcx
2156 ; AVX2-NEXT:    cmovgeq %rdi, %rsi
2157 ; AVX2-NEXT:    cmpq %rax, %rdi
2158 ; AVX2-NEXT:    sbbq %rdx, %rcx
2159 ; AVX2-NEXT:    cmovgeq %rdi, %rax
2160 ; AVX2-NEXT:    vmovq %rax, %xmm0
2161 ; AVX2-NEXT:    vmovq %rsi, %xmm1
2162 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2163 ; AVX2-NEXT:    addq $24, %rsp
2164 ; AVX2-NEXT:    popq %rbx
2165 ; AVX2-NEXT:    popq %r14
2166 ; AVX2-NEXT:    retq
2168 ; AVX512-LABEL: stest_f32i64:
2169 ; AVX512:       # %bb.0: # %entry
2170 ; AVX512-NEXT:    pushq %r14
2171 ; AVX512-NEXT:    pushq %rbx
2172 ; AVX512-NEXT:    subq $24, %rsp
2173 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2174 ; AVX512-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2175 ; AVX512-NEXT:    callq __fixsfti@PLT
2176 ; AVX512-NEXT:    movq %rax, %rbx
2177 ; AVX512-NEXT:    movq %rdx, %r14
2178 ; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2179 ; AVX512-NEXT:    callq __fixsfti@PLT
2180 ; AVX512-NEXT:    xorl %ecx, %ecx
2181 ; AVX512-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
2182 ; AVX512-NEXT:    cmpq %rsi, %rax
2183 ; AVX512-NEXT:    movq %rdx, %rdi
2184 ; AVX512-NEXT:    sbbq $0, %rdi
2185 ; AVX512-NEXT:    cmovgeq %rcx, %rdx
2186 ; AVX512-NEXT:    cmovgeq %rsi, %rax
2187 ; AVX512-NEXT:    cmpq %rsi, %rbx
2188 ; AVX512-NEXT:    movq %r14, %rdi
2189 ; AVX512-NEXT:    sbbq $0, %rdi
2190 ; AVX512-NEXT:    cmovlq %r14, %rcx
2191 ; AVX512-NEXT:    cmovlq %rbx, %rsi
2192 ; AVX512-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
2193 ; AVX512-NEXT:    cmpq %rsi, %rdi
2194 ; AVX512-NEXT:    movq $-1, %r8
2195 ; AVX512-NEXT:    movq $-1, %r9
2196 ; AVX512-NEXT:    sbbq %rcx, %r9
2197 ; AVX512-NEXT:    cmovgeq %rdi, %rsi
2198 ; AVX512-NEXT:    cmpq %rax, %rdi
2199 ; AVX512-NEXT:    sbbq %rdx, %r8
2200 ; AVX512-NEXT:    cmovgeq %rdi, %rax
2201 ; AVX512-NEXT:    vmovq %rax, %xmm0
2202 ; AVX512-NEXT:    vmovq %rsi, %xmm1
2203 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2204 ; AVX512-NEXT:    addq $24, %rsp
2205 ; AVX512-NEXT:    popq %rbx
2206 ; AVX512-NEXT:    popq %r14
2207 ; AVX512-NEXT:    retq
2208 entry:
2209   %conv = fptosi <2 x float> %x to <2 x i128>
2210   %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>
2211   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>
2212   %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>
2213   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>
2214   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2215   ret <2 x i64> %conv6
2218 define <2 x i64> @utest_f32i64(<2 x float> %x) nounwind {
2219 ; SSE-LABEL: utest_f32i64:
2220 ; SSE:       # %bb.0: # %entry
2221 ; SSE-NEXT:    pushq %r14
2222 ; SSE-NEXT:    pushq %rbx
2223 ; SSE-NEXT:    subq $24, %rsp
2224 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
2225 ; SSE-NEXT:    callq __fixunssfti@PLT
2226 ; SSE-NEXT:    movq %rax, %rbx
2227 ; SSE-NEXT:    movq %rdx, %r14
2228 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
2229 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
2230 ; SSE-NEXT:    callq __fixunssfti@PLT
2231 ; SSE-NEXT:    xorl %ecx, %ecx
2232 ; SSE-NEXT:    testq %rdx, %rdx
2233 ; SSE-NEXT:    cmovneq %rcx, %rax
2234 ; SSE-NEXT:    testq %r14, %r14
2235 ; SSE-NEXT:    cmovneq %rcx, %rbx
2236 ; SSE-NEXT:    movq %rbx, %xmm0
2237 ; SSE-NEXT:    movq %rax, %xmm1
2238 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2239 ; SSE-NEXT:    addq $24, %rsp
2240 ; SSE-NEXT:    popq %rbx
2241 ; SSE-NEXT:    popq %r14
2242 ; SSE-NEXT:    retq
2244 ; AVX-LABEL: utest_f32i64:
2245 ; AVX:       # %bb.0: # %entry
2246 ; AVX-NEXT:    pushq %r14
2247 ; AVX-NEXT:    pushq %rbx
2248 ; AVX-NEXT:    subq $24, %rsp
2249 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2250 ; AVX-NEXT:    callq __fixunssfti@PLT
2251 ; AVX-NEXT:    movq %rax, %rbx
2252 ; AVX-NEXT:    movq %rdx, %r14
2253 ; AVX-NEXT:    vmovshdup (%rsp), %xmm0 # 16-byte Folded Reload
2254 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
2255 ; AVX-NEXT:    callq __fixunssfti@PLT
2256 ; AVX-NEXT:    xorl %ecx, %ecx
2257 ; AVX-NEXT:    testq %rdx, %rdx
2258 ; AVX-NEXT:    cmovneq %rcx, %rax
2259 ; AVX-NEXT:    testq %r14, %r14
2260 ; AVX-NEXT:    cmovneq %rcx, %rbx
2261 ; AVX-NEXT:    vmovq %rbx, %xmm0
2262 ; AVX-NEXT:    vmovq %rax, %xmm1
2263 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2264 ; AVX-NEXT:    addq $24, %rsp
2265 ; AVX-NEXT:    popq %rbx
2266 ; AVX-NEXT:    popq %r14
2267 ; AVX-NEXT:    retq
2268 entry:
2269   %conv = fptoui <2 x float> %x to <2 x i128>
2270   %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
2271   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
2272   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
2273   ret <2 x i64> %conv6
2276 define <2 x i64> @ustest_f32i64(<2 x float> %x) nounwind {
2277 ; SSE-LABEL: ustest_f32i64:
2278 ; SSE:       # %bb.0: # %entry
2279 ; SSE-NEXT:    pushq %r14
2280 ; SSE-NEXT:    pushq %rbx
2281 ; SSE-NEXT:    subq $24, %rsp
2282 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
2283 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
2284 ; SSE-NEXT:    callq __fixsfti@PLT
2285 ; SSE-NEXT:    movq %rax, %rbx
2286 ; SSE-NEXT:    movq %rdx, %r14
2287 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
2288 ; SSE-NEXT:    callq __fixsfti@PLT
2289 ; SSE-NEXT:    xorl %ecx, %ecx
2290 ; SSE-NEXT:    testq %rdx, %rdx
2291 ; SSE-NEXT:    movl $1, %esi
2292 ; SSE-NEXT:    cmovgq %rsi, %rdx
2293 ; SSE-NEXT:    cmovgq %rcx, %rax
2294 ; SSE-NEXT:    testq %r14, %r14
2295 ; SSE-NEXT:    cmovleq %r14, %rsi
2296 ; SSE-NEXT:    cmovgq %rcx, %rbx
2297 ; SSE-NEXT:    movq %rbx, %rdi
2298 ; SSE-NEXT:    negq %rdi
2299 ; SSE-NEXT:    movl $0, %edi
2300 ; SSE-NEXT:    sbbq %rsi, %rdi
2301 ; SSE-NEXT:    cmovgeq %rcx, %rbx
2302 ; SSE-NEXT:    movq %rax, %rsi
2303 ; SSE-NEXT:    negq %rsi
2304 ; SSE-NEXT:    movl $0, %esi
2305 ; SSE-NEXT:    sbbq %rdx, %rsi
2306 ; SSE-NEXT:    cmovgeq %rcx, %rax
2307 ; SSE-NEXT:    movq %rax, %xmm0
2308 ; SSE-NEXT:    movq %rbx, %xmm1
2309 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2310 ; SSE-NEXT:    addq $24, %rsp
2311 ; SSE-NEXT:    popq %rbx
2312 ; SSE-NEXT:    popq %r14
2313 ; SSE-NEXT:    retq
2315 ; AVX-LABEL: ustest_f32i64:
2316 ; AVX:       # %bb.0: # %entry
2317 ; AVX-NEXT:    pushq %r14
2318 ; AVX-NEXT:    pushq %rbx
2319 ; AVX-NEXT:    subq $24, %rsp
2320 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2321 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2322 ; AVX-NEXT:    callq __fixsfti@PLT
2323 ; AVX-NEXT:    movq %rax, %rbx
2324 ; AVX-NEXT:    movq %rdx, %r14
2325 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2326 ; AVX-NEXT:    callq __fixsfti@PLT
2327 ; AVX-NEXT:    xorl %ecx, %ecx
2328 ; AVX-NEXT:    testq %rdx, %rdx
2329 ; AVX-NEXT:    movl $1, %esi
2330 ; AVX-NEXT:    cmovgq %rsi, %rdx
2331 ; AVX-NEXT:    cmovgq %rcx, %rax
2332 ; AVX-NEXT:    testq %r14, %r14
2333 ; AVX-NEXT:    cmovleq %r14, %rsi
2334 ; AVX-NEXT:    cmovgq %rcx, %rbx
2335 ; AVX-NEXT:    movq %rbx, %rdi
2336 ; AVX-NEXT:    negq %rdi
2337 ; AVX-NEXT:    movl $0, %edi
2338 ; AVX-NEXT:    sbbq %rsi, %rdi
2339 ; AVX-NEXT:    cmovgeq %rcx, %rbx
2340 ; AVX-NEXT:    movq %rax, %rsi
2341 ; AVX-NEXT:    negq %rsi
2342 ; AVX-NEXT:    movl $0, %esi
2343 ; AVX-NEXT:    sbbq %rdx, %rsi
2344 ; AVX-NEXT:    cmovgeq %rcx, %rax
2345 ; AVX-NEXT:    vmovq %rax, %xmm0
2346 ; AVX-NEXT:    vmovq %rbx, %xmm1
2347 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2348 ; AVX-NEXT:    addq $24, %rsp
2349 ; AVX-NEXT:    popq %rbx
2350 ; AVX-NEXT:    popq %r14
2351 ; AVX-NEXT:    retq
2352 entry:
2353   %conv = fptosi <2 x float> %x to <2 x i128>
2354   %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
2355   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
2356   %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer
2357   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer
2358   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2359   ret <2 x i64> %conv6
2362 define <2 x i64> @stest_f16i64(<2 x half> %x) nounwind {
2363 ; SSE-LABEL: stest_f16i64:
2364 ; SSE:       # %bb.0: # %entry
2365 ; SSE-NEXT:    pushq %r14
2366 ; SSE-NEXT:    pushq %rbx
2367 ; SSE-NEXT:    subq $24, %rsp
2368 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
2369 ; SSE-NEXT:    psrld $16, %xmm0
2370 ; SSE-NEXT:    callq __fixhfti@PLT
2371 ; SSE-NEXT:    movq %rax, %rbx
2372 ; SSE-NEXT:    movq %rdx, %r14
2373 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
2374 ; SSE-NEXT:    callq __fixhfti@PLT
2375 ; SSE-NEXT:    xorl %ecx, %ecx
2376 ; SSE-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
2377 ; SSE-NEXT:    cmpq %rsi, %rax
2378 ; SSE-NEXT:    movq %rdx, %rdi
2379 ; SSE-NEXT:    sbbq $0, %rdi
2380 ; SSE-NEXT:    cmovgeq %rcx, %rdx
2381 ; SSE-NEXT:    cmovgeq %rsi, %rax
2382 ; SSE-NEXT:    cmpq %rsi, %rbx
2383 ; SSE-NEXT:    movq %r14, %rdi
2384 ; SSE-NEXT:    sbbq $0, %rdi
2385 ; SSE-NEXT:    cmovlq %r14, %rcx
2386 ; SSE-NEXT:    cmovlq %rbx, %rsi
2387 ; SSE-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
2388 ; SSE-NEXT:    cmpq %rsi, %rdi
2389 ; SSE-NEXT:    movq $-1, %r8
2390 ; SSE-NEXT:    movq $-1, %r9
2391 ; SSE-NEXT:    sbbq %rcx, %r9
2392 ; SSE-NEXT:    cmovgeq %rdi, %rsi
2393 ; SSE-NEXT:    cmpq %rax, %rdi
2394 ; SSE-NEXT:    sbbq %rdx, %r8
2395 ; SSE-NEXT:    cmovgeq %rdi, %rax
2396 ; SSE-NEXT:    movq %rax, %xmm0
2397 ; SSE-NEXT:    movq %rsi, %xmm1
2398 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2399 ; SSE-NEXT:    addq $24, %rsp
2400 ; SSE-NEXT:    popq %rbx
2401 ; SSE-NEXT:    popq %r14
2402 ; SSE-NEXT:    retq
2404 ; AVX2-LABEL: stest_f16i64:
2405 ; AVX2:       # %bb.0: # %entry
2406 ; AVX2-NEXT:    pushq %r14
2407 ; AVX2-NEXT:    pushq %rbx
2408 ; AVX2-NEXT:    subq $24, %rsp
2409 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2410 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
2411 ; AVX2-NEXT:    callq __fixhfti@PLT
2412 ; AVX2-NEXT:    movq %rax, %rbx
2413 ; AVX2-NEXT:    movq %rdx, %r14
2414 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2415 ; AVX2-NEXT:    callq __fixhfti@PLT
2416 ; AVX2-NEXT:    xorl %ecx, %ecx
2417 ; AVX2-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
2418 ; AVX2-NEXT:    cmpq %rsi, %rax
2419 ; AVX2-NEXT:    movq %rdx, %rdi
2420 ; AVX2-NEXT:    sbbq $0, %rdi
2421 ; AVX2-NEXT:    cmovgeq %rcx, %rdx
2422 ; AVX2-NEXT:    cmovgeq %rsi, %rax
2423 ; AVX2-NEXT:    cmpq %rsi, %rbx
2424 ; AVX2-NEXT:    movq %r14, %rdi
2425 ; AVX2-NEXT:    sbbq $0, %rdi
2426 ; AVX2-NEXT:    cmovlq %r14, %rcx
2427 ; AVX2-NEXT:    cmovlq %rbx, %rsi
2428 ; AVX2-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
2429 ; AVX2-NEXT:    cmpq %rsi, %rdi
2430 ; AVX2-NEXT:    movq $-1, %r8
2431 ; AVX2-NEXT:    sbbq %rcx, %r8
2432 ; AVX2-NEXT:    movq $-1, %rcx
2433 ; AVX2-NEXT:    cmovgeq %rdi, %rsi
2434 ; AVX2-NEXT:    cmpq %rax, %rdi
2435 ; AVX2-NEXT:    sbbq %rdx, %rcx
2436 ; AVX2-NEXT:    cmovgeq %rdi, %rax
2437 ; AVX2-NEXT:    vmovq %rax, %xmm0
2438 ; AVX2-NEXT:    vmovq %rsi, %xmm1
2439 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2440 ; AVX2-NEXT:    addq $24, %rsp
2441 ; AVX2-NEXT:    popq %rbx
2442 ; AVX2-NEXT:    popq %r14
2443 ; AVX2-NEXT:    retq
2445 ; AVX512-LABEL: stest_f16i64:
2446 ; AVX512:       # %bb.0: # %entry
2447 ; AVX512-NEXT:    pushq %r14
2448 ; AVX512-NEXT:    pushq %rbx
2449 ; AVX512-NEXT:    subq $24, %rsp
2450 ; AVX512-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2451 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm0
2452 ; AVX512-NEXT:    callq __fixhfti@PLT
2453 ; AVX512-NEXT:    movq %rax, %rbx
2454 ; AVX512-NEXT:    movq %rdx, %r14
2455 ; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2456 ; AVX512-NEXT:    callq __fixhfti@PLT
2457 ; AVX512-NEXT:    xorl %ecx, %ecx
2458 ; AVX512-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
2459 ; AVX512-NEXT:    cmpq %rsi, %rax
2460 ; AVX512-NEXT:    movq %rdx, %rdi
2461 ; AVX512-NEXT:    sbbq $0, %rdi
2462 ; AVX512-NEXT:    cmovgeq %rcx, %rdx
2463 ; AVX512-NEXT:    cmovgeq %rsi, %rax
2464 ; AVX512-NEXT:    cmpq %rsi, %rbx
2465 ; AVX512-NEXT:    movq %r14, %rdi
2466 ; AVX512-NEXT:    sbbq $0, %rdi
2467 ; AVX512-NEXT:    cmovlq %r14, %rcx
2468 ; AVX512-NEXT:    cmovlq %rbx, %rsi
2469 ; AVX512-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
2470 ; AVX512-NEXT:    cmpq %rsi, %rdi
2471 ; AVX512-NEXT:    movq $-1, %r8
2472 ; AVX512-NEXT:    movq $-1, %r9
2473 ; AVX512-NEXT:    sbbq %rcx, %r9
2474 ; AVX512-NEXT:    cmovgeq %rdi, %rsi
2475 ; AVX512-NEXT:    cmpq %rax, %rdi
2476 ; AVX512-NEXT:    sbbq %rdx, %r8
2477 ; AVX512-NEXT:    cmovgeq %rdi, %rax
2478 ; AVX512-NEXT:    vmovq %rax, %xmm0
2479 ; AVX512-NEXT:    vmovq %rsi, %xmm1
2480 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2481 ; AVX512-NEXT:    addq $24, %rsp
2482 ; AVX512-NEXT:    popq %rbx
2483 ; AVX512-NEXT:    popq %r14
2484 ; AVX512-NEXT:    retq
2485 entry:
2486   %conv = fptosi <2 x half> %x to <2 x i128>
2487   %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>
2488   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>
2489   %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>
2490   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>
2491   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2492   ret <2 x i64> %conv6
2495 define <2 x i64> @utesth_f16i64(<2 x half> %x) nounwind {
2496 ; SSE-LABEL: utesth_f16i64:
2497 ; SSE:       # %bb.0: # %entry
2498 ; SSE-NEXT:    pushq %r14
2499 ; SSE-NEXT:    pushq %rbx
2500 ; SSE-NEXT:    subq $24, %rsp
2501 ; SSE-NEXT:    movdqa %xmm0, %xmm1
2502 ; SSE-NEXT:    psrld $16, %xmm1
2503 ; SSE-NEXT:    movdqa %xmm1, (%rsp) # 16-byte Spill
2504 ; SSE-NEXT:    callq __fixunshfti@PLT
2505 ; SSE-NEXT:    movq %rax, %rbx
2506 ; SSE-NEXT:    movq %rdx, %r14
2507 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
2508 ; SSE-NEXT:    callq __fixunshfti@PLT
2509 ; SSE-NEXT:    xorl %ecx, %ecx
2510 ; SSE-NEXT:    testq %rdx, %rdx
2511 ; SSE-NEXT:    cmovneq %rcx, %rax
2512 ; SSE-NEXT:    testq %r14, %r14
2513 ; SSE-NEXT:    cmovneq %rcx, %rbx
2514 ; SSE-NEXT:    movq %rbx, %xmm0
2515 ; SSE-NEXT:    movq %rax, %xmm1
2516 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2517 ; SSE-NEXT:    addq $24, %rsp
2518 ; SSE-NEXT:    popq %rbx
2519 ; SSE-NEXT:    popq %r14
2520 ; SSE-NEXT:    retq
2522 ; AVX2-LABEL: utesth_f16i64:
2523 ; AVX2:       # %bb.0: # %entry
2524 ; AVX2-NEXT:    pushq %r14
2525 ; AVX2-NEXT:    pushq %rbx
2526 ; AVX2-NEXT:    subq $24, %rsp
2527 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2528 ; AVX2-NEXT:    callq __fixunshfti@PLT
2529 ; AVX2-NEXT:    movq %rax, %rbx
2530 ; AVX2-NEXT:    movq %rdx, %r14
2531 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
2532 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
2533 ; AVX2-NEXT:    callq __fixunshfti@PLT
2534 ; AVX2-NEXT:    xorl %ecx, %ecx
2535 ; AVX2-NEXT:    testq %rdx, %rdx
2536 ; AVX2-NEXT:    cmovneq %rcx, %rax
2537 ; AVX2-NEXT:    testq %r14, %r14
2538 ; AVX2-NEXT:    cmovneq %rcx, %rbx
2539 ; AVX2-NEXT:    vmovq %rbx, %xmm0
2540 ; AVX2-NEXT:    vmovq %rax, %xmm1
2541 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2542 ; AVX2-NEXT:    addq $24, %rsp
2543 ; AVX2-NEXT:    popq %rbx
2544 ; AVX2-NEXT:    popq %r14
2545 ; AVX2-NEXT:    retq
2547 ; AVX512-LABEL: utesth_f16i64:
2548 ; AVX512:       # %bb.0: # %entry
2549 ; AVX512-NEXT:    pushq %r14
2550 ; AVX512-NEXT:    pushq %rbx
2551 ; AVX512-NEXT:    subq $24, %rsp
2552 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
2553 ; AVX512-NEXT:    callq __fixunshfti@PLT
2554 ; AVX512-NEXT:    movq %rax, %rbx
2555 ; AVX512-NEXT:    movq %rdx, %r14
2556 ; AVX512-NEXT:    vpsrld $16, (%rsp), %xmm0 # 16-byte Folded Reload
2557 ; AVX512-NEXT:    callq __fixunshfti@PLT
2558 ; AVX512-NEXT:    xorl %ecx, %ecx
2559 ; AVX512-NEXT:    testq %rdx, %rdx
2560 ; AVX512-NEXT:    cmovneq %rcx, %rax
2561 ; AVX512-NEXT:    testq %r14, %r14
2562 ; AVX512-NEXT:    cmovneq %rcx, %rbx
2563 ; AVX512-NEXT:    vmovq %rbx, %xmm0
2564 ; AVX512-NEXT:    vmovq %rax, %xmm1
2565 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2566 ; AVX512-NEXT:    addq $24, %rsp
2567 ; AVX512-NEXT:    popq %rbx
2568 ; AVX512-NEXT:    popq %r14
2569 ; AVX512-NEXT:    retq
2570 entry:
2571   %conv = fptoui <2 x half> %x to <2 x i128>
2572   %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
2573   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
2574   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
2575   ret <2 x i64> %conv6
2578 define <2 x i64> @ustest_f16i64(<2 x half> %x) nounwind {
2579 ; SSE-LABEL: ustest_f16i64:
2580 ; SSE:       # %bb.0: # %entry
2581 ; SSE-NEXT:    pushq %r14
2582 ; SSE-NEXT:    pushq %rbx
2583 ; SSE-NEXT:    subq $24, %rsp
2584 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
2585 ; SSE-NEXT:    psrld $16, %xmm0
2586 ; SSE-NEXT:    callq __fixhfti@PLT
2587 ; SSE-NEXT:    movq %rax, %rbx
2588 ; SSE-NEXT:    movq %rdx, %r14
2589 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
2590 ; SSE-NEXT:    callq __fixhfti@PLT
2591 ; SSE-NEXT:    xorl %ecx, %ecx
2592 ; SSE-NEXT:    testq %rdx, %rdx
2593 ; SSE-NEXT:    movl $1, %esi
2594 ; SSE-NEXT:    cmovgq %rsi, %rdx
2595 ; SSE-NEXT:    cmovgq %rcx, %rax
2596 ; SSE-NEXT:    testq %r14, %r14
2597 ; SSE-NEXT:    cmovleq %r14, %rsi
2598 ; SSE-NEXT:    cmovgq %rcx, %rbx
2599 ; SSE-NEXT:    movq %rbx, %rdi
2600 ; SSE-NEXT:    negq %rdi
2601 ; SSE-NEXT:    movl $0, %edi
2602 ; SSE-NEXT:    sbbq %rsi, %rdi
2603 ; SSE-NEXT:    cmovgeq %rcx, %rbx
2604 ; SSE-NEXT:    movq %rax, %rsi
2605 ; SSE-NEXT:    negq %rsi
2606 ; SSE-NEXT:    movl $0, %esi
2607 ; SSE-NEXT:    sbbq %rdx, %rsi
2608 ; SSE-NEXT:    cmovgeq %rcx, %rax
2609 ; SSE-NEXT:    movq %rax, %xmm0
2610 ; SSE-NEXT:    movq %rbx, %xmm1
2611 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2612 ; SSE-NEXT:    addq $24, %rsp
2613 ; SSE-NEXT:    popq %rbx
2614 ; SSE-NEXT:    popq %r14
2615 ; SSE-NEXT:    retq
2617 ; AVX-LABEL: ustest_f16i64:
2618 ; AVX:       # %bb.0: # %entry
2619 ; AVX-NEXT:    pushq %r14
2620 ; AVX-NEXT:    pushq %rbx
2621 ; AVX-NEXT:    subq $24, %rsp
2622 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
2623 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
2624 ; AVX-NEXT:    callq __fixhfti@PLT
2625 ; AVX-NEXT:    movq %rax, %rbx
2626 ; AVX-NEXT:    movq %rdx, %r14
2627 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
2628 ; AVX-NEXT:    callq __fixhfti@PLT
2629 ; AVX-NEXT:    xorl %ecx, %ecx
2630 ; AVX-NEXT:    testq %rdx, %rdx
2631 ; AVX-NEXT:    movl $1, %esi
2632 ; AVX-NEXT:    cmovgq %rsi, %rdx
2633 ; AVX-NEXT:    cmovgq %rcx, %rax
2634 ; AVX-NEXT:    testq %r14, %r14
2635 ; AVX-NEXT:    cmovleq %r14, %rsi
2636 ; AVX-NEXT:    cmovgq %rcx, %rbx
2637 ; AVX-NEXT:    movq %rbx, %rdi
2638 ; AVX-NEXT:    negq %rdi
2639 ; AVX-NEXT:    movl $0, %edi
2640 ; AVX-NEXT:    sbbq %rsi, %rdi
2641 ; AVX-NEXT:    cmovgeq %rcx, %rbx
2642 ; AVX-NEXT:    movq %rax, %rsi
2643 ; AVX-NEXT:    negq %rsi
2644 ; AVX-NEXT:    movl $0, %esi
2645 ; AVX-NEXT:    sbbq %rdx, %rsi
2646 ; AVX-NEXT:    cmovgeq %rcx, %rax
2647 ; AVX-NEXT:    vmovq %rax, %xmm0
2648 ; AVX-NEXT:    vmovq %rbx, %xmm1
2649 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2650 ; AVX-NEXT:    addq $24, %rsp
2651 ; AVX-NEXT:    popq %rbx
2652 ; AVX-NEXT:    popq %r14
2653 ; AVX-NEXT:    retq
2654 entry:
2655   %conv = fptosi <2 x half> %x to <2 x i128>
2656   %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
2657   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
2658   %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer
2659   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer
2660   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2661   ret <2 x i64> %conv6
2666 ; i32 saturate
2668 define <2 x i32> @stest_f64i32_mm(<2 x double> %x) nounwind {
2669 ; SSE-LABEL: stest_f64i32_mm:
2670 ; SSE:       # %bb.0: # %entry
2671 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
2672 ; SSE-NEXT:    movq %rax, %xmm1
2673 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]
2674 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
2675 ; SSE-NEXT:    movq %rax, %xmm0
2676 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2677 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
2678 ; SSE-NEXT:    movdqa %xmm1, %xmm2
2679 ; SSE-NEXT:    pxor %xmm0, %xmm2
2680 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
2681 ; SSE-NEXT:    pxor %xmm4, %xmm4
2682 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm4
2683 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
2684 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm3
2685 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
2686 ; SSE-NEXT:    pand %xmm4, %xmm2
2687 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2688 ; SSE-NEXT:    por %xmm2, %xmm3
2689 ; SSE-NEXT:    pand %xmm3, %xmm1
2690 ; SSE-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2691 ; SSE-NEXT:    por %xmm1, %xmm3
2692 ; SSE-NEXT:    pxor %xmm3, %xmm0
2693 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
2694 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
2695 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm2
2696 ; SSE-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2697 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,2,2]
2698 ; SSE-NEXT:    pand %xmm2, %xmm1
2699 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2700 ; SSE-NEXT:    por %xmm1, %xmm0
2701 ; SSE-NEXT:    pand %xmm0, %xmm3
2702 ; SSE-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2703 ; SSE-NEXT:    por %xmm3, %xmm0
2704 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2705 ; SSE-NEXT:    retq
2707 ; AVX2-LABEL: stest_f64i32_mm:
2708 ; AVX2:       # %bb.0: # %entry
2709 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rax
2710 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
2711 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rcx
2712 ; AVX2-NEXT:    vmovq %rax, %xmm0
2713 ; AVX2-NEXT:    vmovq %rcx, %xmm1
2714 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2715 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [2147483647,2147483647]
2716 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
2717 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2718 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
2719 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
2720 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2721 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
2722 ; AVX2-NEXT:    retq
2724 ; AVX512-LABEL: stest_f64i32_mm:
2725 ; AVX512:       # %bb.0: # %entry
2726 ; AVX512-NEXT:    vcvttpd2qq %xmm0, %xmm0
2727 ; AVX512-NEXT:    vpmovsqd %xmm0, %xmm0
2728 ; AVX512-NEXT:    retq
2729 entry:
2730   %conv = fptosi <2 x double> %x to <2 x i64>
2731   %spec.store.select = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %conv, <2 x i64> <i64 2147483647, i64 2147483647>)
2732   %spec.store.select7 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %spec.store.select, <2 x i64> <i64 -2147483648, i64 -2147483648>)
2733   %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
2734   ret <2 x i32> %conv6
2737 define <2 x i32> @utest_f64i32_mm(<2 x double> %x) nounwind {
2738 ; SSE-LABEL: utest_f64i32_mm:
2739 ; SSE:       # %bb.0: # %entry
2740 ; SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
2741 ; SSE-NEXT:    movapd %xmm0, %xmm2
2742 ; SSE-NEXT:    subsd %xmm1, %xmm2
2743 ; SSE-NEXT:    cvttsd2si %xmm2, %rax
2744 ; SSE-NEXT:    cvttsd2si %xmm0, %rcx
2745 ; SSE-NEXT:    movq %rcx, %rdx
2746 ; SSE-NEXT:    sarq $63, %rdx
2747 ; SSE-NEXT:    andq %rax, %rdx
2748 ; SSE-NEXT:    orq %rcx, %rdx
2749 ; SSE-NEXT:    movq %rdx, %xmm2
2750 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]
2751 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
2752 ; SSE-NEXT:    subsd %xmm1, %xmm0
2753 ; SSE-NEXT:    cvttsd2si %xmm0, %rcx
2754 ; SSE-NEXT:    movq %rax, %rdx
2755 ; SSE-NEXT:    sarq $63, %rdx
2756 ; SSE-NEXT:    andq %rcx, %rdx
2757 ; SSE-NEXT:    orq %rax, %rdx
2758 ; SSE-NEXT:    movq %rdx, %xmm0
2759 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
2760 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
2761 ; SSE-NEXT:    pxor %xmm2, %xmm0
2762 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
2763 ; SSE-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2764 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,2,2]
2765 ; SSE-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2766 ; SSE-NEXT:    pandn %xmm1, %xmm0
2767 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
2768 ; SSE-NEXT:    pxor %xmm0, %xmm1
2769 ; SSE-NEXT:    pand %xmm2, %xmm0
2770 ; SSE-NEXT:    por %xmm1, %xmm0
2771 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2772 ; SSE-NEXT:    retq
2774 ; AVX2-LABEL: utest_f64i32_mm:
2775 ; AVX2:       # %bb.0: # %entry
2776 ; AVX2-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
2777 ; AVX2-NEXT:    vsubsd %xmm1, %xmm0, %xmm2
2778 ; AVX2-NEXT:    vcvttsd2si %xmm2, %rax
2779 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rcx
2780 ; AVX2-NEXT:    movq %rcx, %rdx
2781 ; AVX2-NEXT:    sarq $63, %rdx
2782 ; AVX2-NEXT:    andq %rax, %rdx
2783 ; AVX2-NEXT:    orq %rcx, %rdx
2784 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
2785 ; AVX2-NEXT:    vsubsd %xmm1, %xmm0, %xmm1
2786 ; AVX2-NEXT:    vcvttsd2si %xmm1, %rax
2787 ; AVX2-NEXT:    vmovq %rdx, %xmm1
2788 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rcx
2789 ; AVX2-NEXT:    movq %rcx, %rdx
2790 ; AVX2-NEXT:    sarq $63, %rdx
2791 ; AVX2-NEXT:    andq %rax, %rdx
2792 ; AVX2-NEXT:    orq %rcx, %rdx
2793 ; AVX2-NEXT:    vmovq %rdx, %xmm0
2794 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2795 ; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
2796 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2797 ; AVX2-NEXT:    vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2798 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
2799 ; AVX2-NEXT:    retq
2801 ; AVX512-LABEL: utest_f64i32_mm:
2802 ; AVX512:       # %bb.0: # %entry
2803 ; AVX512-NEXT:    vcvttpd2uqq %xmm0, %xmm0
2804 ; AVX512-NEXT:    vpmovusqd %xmm0, %xmm0
2805 ; AVX512-NEXT:    retq
2806 entry:
2807   %conv = fptoui <2 x double> %x to <2 x i64>
2808   %spec.store.select = call <2 x i64> @llvm.umin.v2i64(<2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>)
2809   %conv6 = trunc <2 x i64> %spec.store.select to <2 x i32>
2810   ret <2 x i32> %conv6
2813 define <2 x i32> @ustest_f64i32_mm(<2 x double> %x) nounwind {
2814 ; SSE-LABEL: ustest_f64i32_mm:
2815 ; SSE:       # %bb.0: # %entry
2816 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
2817 ; SSE-NEXT:    movq %rax, %xmm1
2818 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]
2819 ; SSE-NEXT:    cvttsd2si %xmm0, %rax
2820 ; SSE-NEXT:    movq %rax, %xmm0
2821 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2822 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
2823 ; SSE-NEXT:    movdqa %xmm1, %xmm2
2824 ; SSE-NEXT:    pxor %xmm0, %xmm2
2825 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
2826 ; SSE-NEXT:    pxor %xmm4, %xmm4
2827 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm4
2828 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [2147483647,2147483647]
2829 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm3
2830 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
2831 ; SSE-NEXT:    pand %xmm4, %xmm2
2832 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2833 ; SSE-NEXT:    por %xmm2, %xmm3
2834 ; SSE-NEXT:    pand %xmm3, %xmm1
2835 ; SSE-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2836 ; SSE-NEXT:    por %xmm1, %xmm3
2837 ; SSE-NEXT:    movdqa %xmm3, %xmm1
2838 ; SSE-NEXT:    pxor %xmm0, %xmm1
2839 ; SSE-NEXT:    movdqa %xmm1, %xmm2
2840 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm2
2841 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm1
2842 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
2843 ; SSE-NEXT:    pand %xmm2, %xmm0
2844 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2845 ; SSE-NEXT:    por %xmm0, %xmm1
2846 ; SSE-NEXT:    pand %xmm3, %xmm1
2847 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
2848 ; SSE-NEXT:    retq
2850 ; AVX2-LABEL: ustest_f64i32_mm:
2851 ; AVX2:       # %bb.0: # %entry
2852 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rax
2853 ; AVX2-NEXT:    vmovq %rax, %xmm1
2854 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
2855 ; AVX2-NEXT:    vcvttsd2si %xmm0, %rax
2856 ; AVX2-NEXT:    vmovq %rax, %xmm0
2857 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
2858 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [4294967295,4294967295]
2859 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
2860 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2861 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2862 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm1
2863 ; AVX2-NEXT:    vpand %xmm0, %xmm1, %xmm0
2864 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2865 ; AVX2-NEXT:    retq
2867 ; AVX512-LABEL: ustest_f64i32_mm:
2868 ; AVX512:       # %bb.0: # %entry
2869 ; AVX512-NEXT:    vcvttpd2qq %xmm0, %xmm0
2870 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2871 ; AVX512-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
2872 ; AVX512-NEXT:    vpmovusqd %xmm0, %xmm0
2873 ; AVX512-NEXT:    retq
2874 entry:
2875   %conv = fptosi <2 x double> %x to <2 x i64>
2876   %spec.store.select = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>)
2877   %spec.store.select7 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %spec.store.select, <2 x i64> zeroinitializer)
2878   %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
2879   ret <2 x i32> %conv6
2882 define <4 x i32> @stest_f32i32_mm(<4 x float> %x) nounwind {
2883 ; SSE-LABEL: stest_f32i32_mm:
2884 ; SSE:       # %bb.0: # %entry
2885 ; SSE-NEXT:    movaps %xmm0, %xmm1
2886 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,3],xmm0[3,3]
2887 ; SSE-NEXT:    cvttss2si %xmm1, %rax
2888 ; SSE-NEXT:    movq %rax, %xmm1
2889 ; SSE-NEXT:    movaps %xmm0, %xmm2
2890 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]
2891 ; SSE-NEXT:    cvttss2si %xmm2, %rax
2892 ; SSE-NEXT:    movq %rax, %xmm2
2893 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
2894 ; SSE-NEXT:    cvttss2si %xmm0, %rax
2895 ; SSE-NEXT:    movq %rax, %xmm3
2896 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
2897 ; SSE-NEXT:    cvttss2si %xmm0, %rax
2898 ; SSE-NEXT:    movq %rax, %xmm0
2899 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
2900 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
2901 ; SSE-NEXT:    movdqa %xmm3, %xmm1
2902 ; SSE-NEXT:    pxor %xmm0, %xmm1
2903 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
2904 ; SSE-NEXT:    pxor %xmm5, %xmm5
2905 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm4
2906 ; SSE-NEXT:    movdqa {{.*#+}} xmm6 = [4294967295,4294967295]
2907 ; SSE-NEXT:    movdqa %xmm6, %xmm7
2908 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm7
2909 ; SSE-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
2910 ; SSE-NEXT:    pand %xmm4, %xmm8
2911 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]
2912 ; SSE-NEXT:    por %xmm8, %xmm1
2913 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [2147483647,2147483647]
2914 ; SSE-NEXT:    pand %xmm1, %xmm3
2915 ; SSE-NEXT:    pandn %xmm4, %xmm1
2916 ; SSE-NEXT:    por %xmm3, %xmm1
2917 ; SSE-NEXT:    movdqa %xmm2, %xmm3
2918 ; SSE-NEXT:    pxor %xmm0, %xmm3
2919 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
2920 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm7
2921 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm6
2922 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2]
2923 ; SSE-NEXT:    pand %xmm7, %xmm3
2924 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
2925 ; SSE-NEXT:    por %xmm3, %xmm5
2926 ; SSE-NEXT:    pand %xmm5, %xmm2
2927 ; SSE-NEXT:    pandn %xmm4, %xmm5
2928 ; SSE-NEXT:    por %xmm2, %xmm5
2929 ; SSE-NEXT:    movdqa %xmm5, %xmm2
2930 ; SSE-NEXT:    pxor %xmm0, %xmm2
2931 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
2932 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm4
2933 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm3
2934 ; SSE-NEXT:    movdqa {{.*#+}} xmm6 = [18446744069414584320,18446744069414584320]
2935 ; SSE-NEXT:    pcmpgtd %xmm6, %xmm2
2936 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2]
2937 ; SSE-NEXT:    pand %xmm3, %xmm7
2938 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2939 ; SSE-NEXT:    por %xmm7, %xmm2
2940 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [18446744071562067968,18446744071562067968]
2941 ; SSE-NEXT:    pand %xmm2, %xmm5
2942 ; SSE-NEXT:    pandn %xmm3, %xmm2
2943 ; SSE-NEXT:    por %xmm5, %xmm2
2944 ; SSE-NEXT:    pxor %xmm1, %xmm0
2945 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
2946 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm5
2947 ; SSE-NEXT:    pcmpgtd %xmm6, %xmm0
2948 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
2949 ; SSE-NEXT:    pand %xmm5, %xmm4
2950 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2951 ; SSE-NEXT:    por %xmm4, %xmm0
2952 ; SSE-NEXT:    pand %xmm0, %xmm1
2953 ; SSE-NEXT:    pandn %xmm3, %xmm0
2954 ; SSE-NEXT:    por %xmm1, %xmm0
2955 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
2956 ; SSE-NEXT:    retq
2958 ; AVX2-LABEL: stest_f32i32_mm:
2959 ; AVX2:       # %bb.0: # %entry
2960 ; AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
2961 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
2962 ; AVX2-NEXT:    vmovq %rax, %xmm1
2963 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
2964 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
2965 ; AVX2-NEXT:    vmovq %rax, %xmm2
2966 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
2967 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
2968 ; AVX2-NEXT:    vmovq %rax, %xmm2
2969 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
2970 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
2971 ; AVX2-NEXT:    vmovq %rax, %xmm0
2972 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
2973 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2974 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
2975 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
2976 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2977 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
2978 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
2979 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2980 ; AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
2981 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
2982 ; AVX2-NEXT:    vpermps %ymm0, %ymm1, %ymm0
2983 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2984 ; AVX2-NEXT:    vzeroupper
2985 ; AVX2-NEXT:    retq
2987 ; AVX512-LABEL: stest_f32i32_mm:
2988 ; AVX512:       # %bb.0: # %entry
2989 ; AVX512-NEXT:    vcvttps2qq %xmm0, %ymm0
2990 ; AVX512-NEXT:    vpmovsqd %ymm0, %xmm0
2991 ; AVX512-NEXT:    vzeroupper
2992 ; AVX512-NEXT:    retq
2993 entry:
2994   %conv = fptosi <4 x float> %x to <4 x i64>
2995   %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>)
2996   %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>)
2997   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
2998   ret <4 x i32> %conv6
3001 define <4 x i32> @utest_f32i32_mm(<4 x float> %x) nounwind {
3002 ; SSE-LABEL: utest_f32i32_mm:
3003 ; SSE:       # %bb.0: # %entry
3004 ; SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
3005 ; SSE-NEXT:    movaps %xmm0, %xmm1
3006 ; SSE-NEXT:    subss %xmm2, %xmm1
3007 ; SSE-NEXT:    cvttss2si %xmm1, %rax
3008 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
3009 ; SSE-NEXT:    movq %rcx, %rdx
3010 ; SSE-NEXT:    sarq $63, %rdx
3011 ; SSE-NEXT:    andq %rax, %rdx
3012 ; SSE-NEXT:    orq %rcx, %rdx
3013 ; SSE-NEXT:    movq %rdx, %xmm1
3014 ; SSE-NEXT:    movaps %xmm0, %xmm3
3015 ; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[1,1]
3016 ; SSE-NEXT:    cvttss2si %xmm3, %rax
3017 ; SSE-NEXT:    subss %xmm2, %xmm3
3018 ; SSE-NEXT:    cvttss2si %xmm3, %rcx
3019 ; SSE-NEXT:    movq %rax, %rdx
3020 ; SSE-NEXT:    sarq $63, %rdx
3021 ; SSE-NEXT:    andq %rcx, %rdx
3022 ; SSE-NEXT:    orq %rax, %rdx
3023 ; SSE-NEXT:    movq %rdx, %xmm3
3024 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
3025 ; SSE-NEXT:    movaps %xmm0, %xmm3
3026 ; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[3,3],xmm0[3,3]
3027 ; SSE-NEXT:    cvttss2si %xmm3, %rax
3028 ; SSE-NEXT:    subss %xmm2, %xmm3
3029 ; SSE-NEXT:    cvttss2si %xmm3, %rcx
3030 ; SSE-NEXT:    movq %rax, %rdx
3031 ; SSE-NEXT:    sarq $63, %rdx
3032 ; SSE-NEXT:    andq %rcx, %rdx
3033 ; SSE-NEXT:    orq %rax, %rdx
3034 ; SSE-NEXT:    movq %rdx, %xmm3
3035 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
3036 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3037 ; SSE-NEXT:    subss %xmm2, %xmm0
3038 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
3039 ; SSE-NEXT:    movq %rax, %rdx
3040 ; SSE-NEXT:    sarq $63, %rdx
3041 ; SSE-NEXT:    andq %rcx, %rdx
3042 ; SSE-NEXT:    orq %rax, %rdx
3043 ; SSE-NEXT:    movq %rdx, %xmm0
3044 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
3045 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
3046 ; SSE-NEXT:    movdqa %xmm0, %xmm3
3047 ; SSE-NEXT:    pxor %xmm2, %xmm3
3048 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3049 ; SSE-NEXT:    movdqa {{.*#+}} xmm5 = [2147483647,2147483647,2147483647,2147483647]
3050 ; SSE-NEXT:    movdqa %xmm5, %xmm6
3051 ; SSE-NEXT:    pcmpgtd %xmm4, %xmm6
3052 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3053 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm3
3054 ; SSE-NEXT:    pand %xmm6, %xmm3
3055 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm4
3056 ; SSE-NEXT:    pand %xmm3, %xmm0
3057 ; SSE-NEXT:    pxor %xmm4, %xmm3
3058 ; SSE-NEXT:    por %xmm0, %xmm3
3059 ; SSE-NEXT:    movdqa %xmm1, %xmm0
3060 ; SSE-NEXT:    pxor %xmm2, %xmm0
3061 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
3062 ; SSE-NEXT:    pcmpgtd %xmm6, %xmm5
3063 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3064 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm0
3065 ; SSE-NEXT:    pand %xmm5, %xmm0
3066 ; SSE-NEXT:    pxor %xmm0, %xmm4
3067 ; SSE-NEXT:    pand %xmm1, %xmm0
3068 ; SSE-NEXT:    por %xmm4, %xmm0
3069 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
3070 ; SSE-NEXT:    retq
3072 ; AVX2-LABEL: utest_f32i32_mm:
3073 ; AVX2:       # %bb.0: # %entry
3074 ; AVX2-NEXT:    vshufps {{.*#+}} xmm2 = xmm0[3,3,3,3]
3075 ; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
3076 ; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
3077 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
3078 ; AVX2-NEXT:    vcvttss2si %xmm2, %rcx
3079 ; AVX2-NEXT:    movq %rcx, %rdx
3080 ; AVX2-NEXT:    sarq $63, %rdx
3081 ; AVX2-NEXT:    andq %rax, %rdx
3082 ; AVX2-NEXT:    orq %rcx, %rdx
3083 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
3084 ; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
3085 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
3086 ; AVX2-NEXT:    vcvttss2si %xmm2, %rcx
3087 ; AVX2-NEXT:    vmovq %rdx, %xmm2
3088 ; AVX2-NEXT:    movq %rcx, %rdx
3089 ; AVX2-NEXT:    sarq $63, %rdx
3090 ; AVX2-NEXT:    andq %rax, %rdx
3091 ; AVX2-NEXT:    orq %rcx, %rdx
3092 ; AVX2-NEXT:    vmovq %rdx, %xmm3
3093 ; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm4
3094 ; AVX2-NEXT:    vcvttss2si %xmm4, %rax
3095 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
3096 ; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
3097 ; AVX2-NEXT:    movq %rcx, %rdx
3098 ; AVX2-NEXT:    sarq $63, %rdx
3099 ; AVX2-NEXT:    andq %rax, %rdx
3100 ; AVX2-NEXT:    orq %rcx, %rdx
3101 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
3102 ; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm1
3103 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
3104 ; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
3105 ; AVX2-NEXT:    vmovq %rdx, %xmm0
3106 ; AVX2-NEXT:    movq %rcx, %rdx
3107 ; AVX2-NEXT:    sarq $63, %rdx
3108 ; AVX2-NEXT:    andq %rax, %rdx
3109 ; AVX2-NEXT:    orq %rcx, %rdx
3110 ; AVX2-NEXT:    vmovq %rdx, %xmm1
3111 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3112 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
3113 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
3114 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm1
3115 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372041149743102,9223372041149743102,9223372041149743102,9223372041149743102]
3116 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm1
3117 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
3118 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm2, %ymm0, %ymm0
3119 ; AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
3120 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
3121 ; AVX2-NEXT:    vpermps %ymm0, %ymm1, %ymm0
3122 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3123 ; AVX2-NEXT:    vzeroupper
3124 ; AVX2-NEXT:    retq
3126 ; AVX512-LABEL: utest_f32i32_mm:
3127 ; AVX512:       # %bb.0: # %entry
3128 ; AVX512-NEXT:    vcvttps2uqq %xmm0, %ymm0
3129 ; AVX512-NEXT:    vpmovusqd %ymm0, %xmm0
3130 ; AVX512-NEXT:    vzeroupper
3131 ; AVX512-NEXT:    retq
3132 entry:
3133   %conv = fptoui <4 x float> %x to <4 x i64>
3134   %spec.store.select = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
3135   %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
3136   ret <4 x i32> %conv6
3139 define <4 x i32> @ustest_f32i32_mm(<4 x float> %x) nounwind {
3140 ; SSE-LABEL: ustest_f32i32_mm:
3141 ; SSE:       # %bb.0: # %entry
3142 ; SSE-NEXT:    movaps %xmm0, %xmm1
3143 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,3],xmm0[3,3]
3144 ; SSE-NEXT:    cvttss2si %xmm1, %rax
3145 ; SSE-NEXT:    movq %rax, %xmm1
3146 ; SSE-NEXT:    movaps %xmm0, %xmm2
3147 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]
3148 ; SSE-NEXT:    cvttss2si %xmm2, %rax
3149 ; SSE-NEXT:    movq %rax, %xmm2
3150 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
3151 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3152 ; SSE-NEXT:    movq %rax, %xmm3
3153 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
3154 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3155 ; SSE-NEXT:    movq %rax, %xmm0
3156 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
3157 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
3158 ; SSE-NEXT:    movdqa %xmm3, %xmm1
3159 ; SSE-NEXT:    pxor %xmm0, %xmm1
3160 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
3161 ; SSE-NEXT:    pxor %xmm5, %xmm5
3162 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm4
3163 ; SSE-NEXT:    movdqa {{.*#+}} xmm6 = [2147483647,2147483647]
3164 ; SSE-NEXT:    movdqa %xmm6, %xmm7
3165 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm7
3166 ; SSE-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
3167 ; SSE-NEXT:    pand %xmm4, %xmm8
3168 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]
3169 ; SSE-NEXT:    por %xmm8, %xmm1
3170 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [4294967295,4294967295]
3171 ; SSE-NEXT:    pand %xmm1, %xmm3
3172 ; SSE-NEXT:    pandn %xmm4, %xmm1
3173 ; SSE-NEXT:    por %xmm3, %xmm1
3174 ; SSE-NEXT:    movdqa %xmm2, %xmm3
3175 ; SSE-NEXT:    pxor %xmm0, %xmm3
3176 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
3177 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm7
3178 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm6
3179 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2]
3180 ; SSE-NEXT:    pand %xmm7, %xmm3
3181 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
3182 ; SSE-NEXT:    por %xmm3, %xmm5
3183 ; SSE-NEXT:    pand %xmm5, %xmm2
3184 ; SSE-NEXT:    pandn %xmm4, %xmm5
3185 ; SSE-NEXT:    por %xmm2, %xmm5
3186 ; SSE-NEXT:    movdqa %xmm5, %xmm2
3187 ; SSE-NEXT:    pxor %xmm0, %xmm2
3188 ; SSE-NEXT:    movdqa %xmm2, %xmm3
3189 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm3
3190 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
3191 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3192 ; SSE-NEXT:    pand %xmm3, %xmm2
3193 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3194 ; SSE-NEXT:    por %xmm2, %xmm3
3195 ; SSE-NEXT:    pand %xmm5, %xmm3
3196 ; SSE-NEXT:    movdqa %xmm1, %xmm2
3197 ; SSE-NEXT:    pxor %xmm0, %xmm2
3198 ; SSE-NEXT:    movdqa %xmm2, %xmm4
3199 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm4
3200 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
3201 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3202 ; SSE-NEXT:    pand %xmm4, %xmm2
3203 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
3204 ; SSE-NEXT:    por %xmm2, %xmm0
3205 ; SSE-NEXT:    pand %xmm1, %xmm0
3206 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
3207 ; SSE-NEXT:    retq
3209 ; AVX2-LABEL: ustest_f32i32_mm:
3210 ; AVX2:       # %bb.0: # %entry
3211 ; AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
3212 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
3213 ; AVX2-NEXT:    vmovq %rax, %xmm1
3214 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
3215 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
3216 ; AVX2-NEXT:    vmovq %rax, %xmm2
3217 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
3218 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
3219 ; AVX2-NEXT:    vmovq %rax, %xmm2
3220 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
3221 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
3222 ; AVX2-NEXT:    vmovq %rax, %xmm0
3223 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
3224 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3225 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
3226 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
3227 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
3228 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3229 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm1
3230 ; AVX2-NEXT:    vpand %ymm0, %ymm1, %ymm0
3231 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
3232 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
3233 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
3234 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3235 ; AVX2-NEXT:    vzeroupper
3236 ; AVX2-NEXT:    retq
3238 ; AVX512-LABEL: ustest_f32i32_mm:
3239 ; AVX512:       # %bb.0: # %entry
3240 ; AVX512-NEXT:    vcvttps2qq %xmm0, %ymm0
3241 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3242 ; AVX512-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
3243 ; AVX512-NEXT:    vpmovusqd %ymm0, %xmm0
3244 ; AVX512-NEXT:    vzeroupper
3245 ; AVX512-NEXT:    retq
3246 entry:
3247   %conv = fptosi <4 x float> %x to <4 x i64>
3248   %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
3249   %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> zeroinitializer)
3250   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
3251   ret <4 x i32> %conv6
3254 define <4 x i32> @stest_f16i32_mm(<4 x half> %x) nounwind {
3255 ; SSE-LABEL: stest_f16i32_mm:
3256 ; SSE:       # %bb.0: # %entry
3257 ; SSE-NEXT:    subq $72, %rsp
3258 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
3259 ; SSE-NEXT:    movdqa %xmm0, %xmm1
3260 ; SSE-NEXT:    psrld $16, %xmm1
3261 ; SSE-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3262 ; SSE-NEXT:    movdqa %xmm0, %xmm1
3263 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]
3264 ; SSE-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3265 ; SSE-NEXT:    psrlq $48, %xmm0
3266 ; SSE-NEXT:    callq __extendhfsf2@PLT
3267 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3268 ; SSE-NEXT:    movq %rax, %xmm0
3269 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3270 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3271 ; SSE-NEXT:    callq __extendhfsf2@PLT
3272 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3273 ; SSE-NEXT:    movq %rax, %xmm0
3274 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3275 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
3276 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3277 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
3278 ; SSE-NEXT:    callq __extendhfsf2@PLT
3279 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3280 ; SSE-NEXT:    movq %rax, %xmm0
3281 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
3282 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3283 ; SSE-NEXT:    callq __extendhfsf2@PLT
3284 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3285 ; SSE-NEXT:    movq %rax, %xmm0
3286 ; SSE-NEXT:    movdqa (%rsp), %xmm2 # 16-byte Reload
3287 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
3288 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
3289 ; SSE-NEXT:    movdqa %xmm2, %xmm1
3290 ; SSE-NEXT:    movdqa %xmm2, %xmm7
3291 ; SSE-NEXT:    pxor %xmm0, %xmm1
3292 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
3293 ; SSE-NEXT:    pxor %xmm3, %xmm3
3294 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm2
3295 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [4294967295,4294967295]
3296 ; SSE-NEXT:    movdqa %xmm4, %xmm5
3297 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm5
3298 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3299 ; SSE-NEXT:    pand %xmm2, %xmm6
3300 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
3301 ; SSE-NEXT:    por %xmm6, %xmm1
3302 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2147483647,2147483647]
3303 ; SSE-NEXT:    pand %xmm1, %xmm7
3304 ; SSE-NEXT:    pandn %xmm2, %xmm1
3305 ; SSE-NEXT:    por %xmm7, %xmm1
3306 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
3307 ; SSE-NEXT:    movdqa %xmm7, %xmm5
3308 ; SSE-NEXT:    pxor %xmm0, %xmm5
3309 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
3310 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm6
3311 ; SSE-NEXT:    pcmpgtd %xmm5, %xmm4
3312 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,0,2,2]
3313 ; SSE-NEXT:    pand %xmm6, %xmm3
3314 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3315 ; SSE-NEXT:    por %xmm3, %xmm4
3316 ; SSE-NEXT:    movdqa %xmm7, %xmm3
3317 ; SSE-NEXT:    pand %xmm4, %xmm3
3318 ; SSE-NEXT:    pandn %xmm2, %xmm4
3319 ; SSE-NEXT:    por %xmm3, %xmm4
3320 ; SSE-NEXT:    movdqa %xmm4, %xmm2
3321 ; SSE-NEXT:    pxor %xmm0, %xmm2
3322 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
3323 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm5
3324 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm3
3325 ; SSE-NEXT:    movdqa {{.*#+}} xmm6 = [18446744069414584320,18446744069414584320]
3326 ; SSE-NEXT:    pcmpgtd %xmm6, %xmm2
3327 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2]
3328 ; SSE-NEXT:    pand %xmm3, %xmm7
3329 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3330 ; SSE-NEXT:    por %xmm7, %xmm2
3331 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [18446744071562067968,18446744071562067968]
3332 ; SSE-NEXT:    pand %xmm2, %xmm4
3333 ; SSE-NEXT:    pandn %xmm3, %xmm2
3334 ; SSE-NEXT:    por %xmm4, %xmm2
3335 ; SSE-NEXT:    pxor %xmm1, %xmm0
3336 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
3337 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm4
3338 ; SSE-NEXT:    pcmpgtd %xmm6, %xmm0
3339 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
3340 ; SSE-NEXT:    pand %xmm4, %xmm5
3341 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3342 ; SSE-NEXT:    por %xmm5, %xmm0
3343 ; SSE-NEXT:    pand %xmm0, %xmm1
3344 ; SSE-NEXT:    pandn %xmm3, %xmm0
3345 ; SSE-NEXT:    por %xmm1, %xmm0
3346 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
3347 ; SSE-NEXT:    addq $72, %rsp
3348 ; SSE-NEXT:    retq
3350 ; AVX2-LABEL: stest_f16i32_mm:
3351 ; AVX2:       # %bb.0: # %entry
3352 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm1
3353 ; AVX2-NEXT:    vpextrw $0, %xmm1, %eax
3354 ; AVX2-NEXT:    movzwl %ax, %eax
3355 ; AVX2-NEXT:    vmovd %eax, %xmm1
3356 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
3357 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
3358 ; AVX2-NEXT:    vpextrw $0, %xmm2, %eax
3359 ; AVX2-NEXT:    movzwl %ax, %eax
3360 ; AVX2-NEXT:    vmovd %eax, %xmm2
3361 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
3362 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm1
3363 ; AVX2-NEXT:    vmovq %rax, %xmm2
3364 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
3365 ; AVX2-NEXT:    vmovq %rax, %xmm1
3366 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
3367 ; AVX2-NEXT:    vpextrw $0, %xmm0, %eax
3368 ; AVX2-NEXT:    movzwl %ax, %eax
3369 ; AVX2-NEXT:    vmovd %eax, %xmm2
3370 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
3371 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
3372 ; AVX2-NEXT:    vpextrw $0, %xmm0, %eax
3373 ; AVX2-NEXT:    movzwl %ax, %eax
3374 ; AVX2-NEXT:    vmovd %eax, %xmm0
3375 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
3376 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
3377 ; AVX2-NEXT:    vmovq %rax, %xmm2
3378 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
3379 ; AVX2-NEXT:    vmovq %rax, %xmm0
3380 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
3381 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3382 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
3383 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
3384 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
3385 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
3386 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
3387 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
3388 ; AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
3389 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
3390 ; AVX2-NEXT:    vpermps %ymm0, %ymm1, %ymm0
3391 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3392 ; AVX2-NEXT:    vzeroupper
3393 ; AVX2-NEXT:    retq
3395 ; AVX512-LABEL: stest_f16i32_mm:
3396 ; AVX512:       # %bb.0: # %entry
3397 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
3398 ; AVX512-NEXT:    vcvttps2qq %ymm0, %zmm0
3399 ; AVX512-NEXT:    vpmovsqd %ymm0, %xmm0
3400 ; AVX512-NEXT:    vzeroupper
3401 ; AVX512-NEXT:    retq
3402 entry:
3403   %conv = fptosi <4 x half> %x to <4 x i64>
3404   %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>)
3405   %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>)
3406   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
3407   ret <4 x i32> %conv6
3410 define <4 x i32> @utesth_f16i32_mm(<4 x half> %x) nounwind {
3411 ; SSE-LABEL: utesth_f16i32_mm:
3412 ; SSE:       # %bb.0: # %entry
3413 ; SSE-NEXT:    subq $72, %rsp
3414 ; SSE-NEXT:    movaps %xmm0, %xmm1
3415 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]
3416 ; SSE-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3417 ; SSE-NEXT:    movaps %xmm0, %xmm1
3418 ; SSE-NEXT:    psrlq $48, %xmm1
3419 ; SSE-NEXT:    movdqa %xmm1, (%rsp) # 16-byte Spill
3420 ; SSE-NEXT:    movaps %xmm0, %xmm1
3421 ; SSE-NEXT:    psrld $16, %xmm1
3422 ; SSE-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3423 ; SSE-NEXT:    callq __extendhfsf2@PLT
3424 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3425 ; SSE-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3426 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
3427 ; SSE-NEXT:    movq %rax, %rdx
3428 ; SSE-NEXT:    sarq $63, %rdx
3429 ; SSE-NEXT:    andq %rcx, %rdx
3430 ; SSE-NEXT:    orq %rax, %rdx
3431 ; SSE-NEXT:    movq %rdx, %xmm0
3432 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3433 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3434 ; SSE-NEXT:    callq __extendhfsf2@PLT
3435 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3436 ; SSE-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3437 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
3438 ; SSE-NEXT:    movq %rax, %rdx
3439 ; SSE-NEXT:    sarq $63, %rdx
3440 ; SSE-NEXT:    andq %rcx, %rdx
3441 ; SSE-NEXT:    orq %rax, %rdx
3442 ; SSE-NEXT:    movq %rdx, %xmm0
3443 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3444 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
3445 ; SSE-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3446 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
3447 ; SSE-NEXT:    callq __extendhfsf2@PLT
3448 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3449 ; SSE-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3450 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
3451 ; SSE-NEXT:    movq %rax, %rdx
3452 ; SSE-NEXT:    sarq $63, %rdx
3453 ; SSE-NEXT:    andq %rcx, %rdx
3454 ; SSE-NEXT:    orq %rax, %rdx
3455 ; SSE-NEXT:    movq %rdx, %xmm0
3456 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
3457 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3458 ; SSE-NEXT:    callq __extendhfsf2@PLT
3459 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3460 ; SSE-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3461 ; SSE-NEXT:    cvttss2si %xmm0, %rcx
3462 ; SSE-NEXT:    movq %rax, %rdx
3463 ; SSE-NEXT:    sarq $63, %rdx
3464 ; SSE-NEXT:    andq %rcx, %rdx
3465 ; SSE-NEXT:    orq %rax, %rdx
3466 ; SSE-NEXT:    movq %rdx, %xmm0
3467 ; SSE-NEXT:    punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload
3468 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
3469 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
3470 ; SSE-NEXT:    movdqa %xmm0, %xmm2
3471 ; SSE-NEXT:    pxor %xmm1, %xmm2
3472 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
3473 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [2147483647,2147483647,2147483647,2147483647]
3474 ; SSE-NEXT:    movdqa %xmm4, %xmm5
3475 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm5
3476 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3477 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm2
3478 ; SSE-NEXT:    pand %xmm5, %xmm2
3479 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm3
3480 ; SSE-NEXT:    pand %xmm2, %xmm0
3481 ; SSE-NEXT:    pxor %xmm3, %xmm2
3482 ; SSE-NEXT:    por %xmm0, %xmm2
3483 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload
3484 ; SSE-NEXT:    movdqa %xmm6, %xmm0
3485 ; SSE-NEXT:    pxor %xmm1, %xmm0
3486 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
3487 ; SSE-NEXT:    pcmpgtd %xmm5, %xmm4
3488 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3489 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm0
3490 ; SSE-NEXT:    pand %xmm4, %xmm0
3491 ; SSE-NEXT:    pxor %xmm0, %xmm3
3492 ; SSE-NEXT:    pand %xmm6, %xmm0
3493 ; SSE-NEXT:    por %xmm3, %xmm0
3494 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
3495 ; SSE-NEXT:    addq $72, %rsp
3496 ; SSE-NEXT:    retq
3498 ; AVX2-LABEL: utesth_f16i32_mm:
3499 ; AVX2:       # %bb.0: # %entry
3500 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm1
3501 ; AVX2-NEXT:    vpextrw $0, %xmm1, %eax
3502 ; AVX2-NEXT:    movzwl %ax, %eax
3503 ; AVX2-NEXT:    vmovd %eax, %xmm1
3504 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm2
3505 ; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
3506 ; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
3507 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
3508 ; AVX2-NEXT:    vcvttss2si %xmm2, %rcx
3509 ; AVX2-NEXT:    movq %rcx, %rdx
3510 ; AVX2-NEXT:    sarq $63, %rdx
3511 ; AVX2-NEXT:    andq %rax, %rdx
3512 ; AVX2-NEXT:    orq %rcx, %rdx
3513 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
3514 ; AVX2-NEXT:    vpextrw $0, %xmm2, %eax
3515 ; AVX2-NEXT:    movzwl %ax, %eax
3516 ; AVX2-NEXT:    vmovd %eax, %xmm2
3517 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
3518 ; AVX2-NEXT:    vsubss %xmm1, %xmm2, %xmm3
3519 ; AVX2-NEXT:    vcvttss2si %xmm3, %rax
3520 ; AVX2-NEXT:    vcvttss2si %xmm2, %rcx
3521 ; AVX2-NEXT:    vmovq %rdx, %xmm2
3522 ; AVX2-NEXT:    vpextrw $0, %xmm0, %edx
3523 ; AVX2-NEXT:    movzwl %dx, %edx
3524 ; AVX2-NEXT:    vmovd %edx, %xmm3
3525 ; AVX2-NEXT:    movq %rcx, %rdx
3526 ; AVX2-NEXT:    sarq $63, %rdx
3527 ; AVX2-NEXT:    vcvtph2ps %xmm3, %xmm3
3528 ; AVX2-NEXT:    andq %rax, %rdx
3529 ; AVX2-NEXT:    vsubss %xmm1, %xmm3, %xmm4
3530 ; AVX2-NEXT:    vcvttss2si %xmm4, %rax
3531 ; AVX2-NEXT:    orq %rcx, %rdx
3532 ; AVX2-NEXT:    vmovq %rdx, %xmm4
3533 ; AVX2-NEXT:    vcvttss2si %xmm3, %rcx
3534 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm4[0],xmm2[0]
3535 ; AVX2-NEXT:    movq %rcx, %rdx
3536 ; AVX2-NEXT:    sarq $63, %rdx
3537 ; AVX2-NEXT:    andq %rax, %rdx
3538 ; AVX2-NEXT:    orq %rcx, %rdx
3539 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
3540 ; AVX2-NEXT:    vpextrw $0, %xmm0, %eax
3541 ; AVX2-NEXT:    movzwl %ax, %eax
3542 ; AVX2-NEXT:    vmovd %eax, %xmm0
3543 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
3544 ; AVX2-NEXT:    vsubss %xmm1, %xmm0, %xmm1
3545 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
3546 ; AVX2-NEXT:    vcvttss2si %xmm0, %rcx
3547 ; AVX2-NEXT:    vmovq %rdx, %xmm0
3548 ; AVX2-NEXT:    movq %rcx, %rdx
3549 ; AVX2-NEXT:    sarq $63, %rdx
3550 ; AVX2-NEXT:    andq %rax, %rdx
3551 ; AVX2-NEXT:    orq %rcx, %rdx
3552 ; AVX2-NEXT:    vmovq %rdx, %xmm1
3553 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3554 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
3555 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
3556 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm1
3557 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372041149743102,9223372041149743102,9223372041149743102,9223372041149743102]
3558 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm1
3559 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
3560 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm2, %ymm0, %ymm0
3561 ; AVX2-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
3562 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
3563 ; AVX2-NEXT:    vpermps %ymm0, %ymm1, %ymm0
3564 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3565 ; AVX2-NEXT:    vzeroupper
3566 ; AVX2-NEXT:    retq
3568 ; AVX512-LABEL: utesth_f16i32_mm:
3569 ; AVX512:       # %bb.0: # %entry
3570 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
3571 ; AVX512-NEXT:    vcvttps2uqq %ymm0, %zmm0
3572 ; AVX512-NEXT:    vpmovusqd %ymm0, %xmm0
3573 ; AVX512-NEXT:    vzeroupper
3574 ; AVX512-NEXT:    retq
3575 entry:
3576   %conv = fptoui <4 x half> %x to <4 x i64>
3577   %spec.store.select = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
3578   %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
3579   ret <4 x i32> %conv6
3582 define <4 x i32> @ustest_f16i32_mm(<4 x half> %x) nounwind {
3583 ; SSE-LABEL: ustest_f16i32_mm:
3584 ; SSE:       # %bb.0: # %entry
3585 ; SSE-NEXT:    subq $72, %rsp
3586 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
3587 ; SSE-NEXT:    movdqa %xmm0, %xmm1
3588 ; SSE-NEXT:    psrld $16, %xmm1
3589 ; SSE-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3590 ; SSE-NEXT:    movdqa %xmm0, %xmm1
3591 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]
3592 ; SSE-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3593 ; SSE-NEXT:    psrlq $48, %xmm0
3594 ; SSE-NEXT:    callq __extendhfsf2@PLT
3595 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3596 ; SSE-NEXT:    movq %rax, %xmm0
3597 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3598 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3599 ; SSE-NEXT:    callq __extendhfsf2@PLT
3600 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3601 ; SSE-NEXT:    movq %rax, %xmm0
3602 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3603 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
3604 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3605 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
3606 ; SSE-NEXT:    callq __extendhfsf2@PLT
3607 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3608 ; SSE-NEXT:    movq %rax, %xmm0
3609 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
3610 ; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3611 ; SSE-NEXT:    callq __extendhfsf2@PLT
3612 ; SSE-NEXT:    cvttss2si %xmm0, %rax
3613 ; SSE-NEXT:    movq %rax, %xmm0
3614 ; SSE-NEXT:    movdqa (%rsp), %xmm2 # 16-byte Reload
3615 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
3616 ; SSE-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
3617 ; SSE-NEXT:    movdqa %xmm2, %xmm1
3618 ; SSE-NEXT:    movdqa %xmm2, %xmm7
3619 ; SSE-NEXT:    pxor %xmm0, %xmm1
3620 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
3621 ; SSE-NEXT:    pxor %xmm3, %xmm3
3622 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm2
3623 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [2147483647,2147483647]
3624 ; SSE-NEXT:    movdqa %xmm4, %xmm5
3625 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm5
3626 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3627 ; SSE-NEXT:    pand %xmm2, %xmm6
3628 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
3629 ; SSE-NEXT:    por %xmm6, %xmm1
3630 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,4294967295]
3631 ; SSE-NEXT:    pand %xmm1, %xmm7
3632 ; SSE-NEXT:    pandn %xmm2, %xmm1
3633 ; SSE-NEXT:    por %xmm7, %xmm1
3634 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload
3635 ; SSE-NEXT:    movdqa %xmm7, %xmm5
3636 ; SSE-NEXT:    pxor %xmm0, %xmm5
3637 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
3638 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm6
3639 ; SSE-NEXT:    pcmpgtd %xmm5, %xmm4
3640 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,0,2,2]
3641 ; SSE-NEXT:    pand %xmm6, %xmm3
3642 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3643 ; SSE-NEXT:    por %xmm3, %xmm4
3644 ; SSE-NEXT:    movdqa %xmm7, %xmm3
3645 ; SSE-NEXT:    pand %xmm4, %xmm3
3646 ; SSE-NEXT:    pandn %xmm2, %xmm4
3647 ; SSE-NEXT:    por %xmm3, %xmm4
3648 ; SSE-NEXT:    movdqa %xmm4, %xmm2
3649 ; SSE-NEXT:    pxor %xmm0, %xmm2
3650 ; SSE-NEXT:    movdqa %xmm2, %xmm3
3651 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm3
3652 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
3653 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3654 ; SSE-NEXT:    pand %xmm3, %xmm2
3655 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3656 ; SSE-NEXT:    por %xmm2, %xmm3
3657 ; SSE-NEXT:    pand %xmm4, %xmm3
3658 ; SSE-NEXT:    movdqa %xmm1, %xmm2
3659 ; SSE-NEXT:    pxor %xmm0, %xmm2
3660 ; SSE-NEXT:    movdqa %xmm2, %xmm4
3661 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm4
3662 ; SSE-NEXT:    pcmpeqd %xmm0, %xmm2
3663 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3664 ; SSE-NEXT:    pand %xmm4, %xmm2
3665 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
3666 ; SSE-NEXT:    por %xmm2, %xmm0
3667 ; SSE-NEXT:    pand %xmm1, %xmm0
3668 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
3669 ; SSE-NEXT:    addq $72, %rsp
3670 ; SSE-NEXT:    retq
3672 ; AVX2-LABEL: ustest_f16i32_mm:
3673 ; AVX2:       # %bb.0: # %entry
3674 ; AVX2-NEXT:    vpsrlq $48, %xmm0, %xmm1
3675 ; AVX2-NEXT:    vpextrw $0, %xmm1, %eax
3676 ; AVX2-NEXT:    movzwl %ax, %eax
3677 ; AVX2-NEXT:    vmovd %eax, %xmm1
3678 ; AVX2-NEXT:    vcvtph2ps %xmm1, %xmm1
3679 ; AVX2-NEXT:    vcvttss2si %xmm1, %rax
3680 ; AVX2-NEXT:    vmovq %rax, %xmm1
3681 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
3682 ; AVX2-NEXT:    vpextrw $0, %xmm2, %eax
3683 ; AVX2-NEXT:    movzwl %ax, %eax
3684 ; AVX2-NEXT:    vmovd %eax, %xmm2
3685 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
3686 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
3687 ; AVX2-NEXT:    vmovq %rax, %xmm2
3688 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
3689 ; AVX2-NEXT:    vpextrw $0, %xmm0, %eax
3690 ; AVX2-NEXT:    movzwl %ax, %eax
3691 ; AVX2-NEXT:    vmovd %eax, %xmm2
3692 ; AVX2-NEXT:    vcvtph2ps %xmm2, %xmm2
3693 ; AVX2-NEXT:    vcvttss2si %xmm2, %rax
3694 ; AVX2-NEXT:    vmovq %rax, %xmm2
3695 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
3696 ; AVX2-NEXT:    vpextrw $0, %xmm0, %eax
3697 ; AVX2-NEXT:    movzwl %ax, %eax
3698 ; AVX2-NEXT:    vmovd %eax, %xmm0
3699 ; AVX2-NEXT:    vcvtph2ps %xmm0, %xmm0
3700 ; AVX2-NEXT:    vcvttss2si %xmm0, %rax
3701 ; AVX2-NEXT:    vmovq %rax, %xmm0
3702 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
3703 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3704 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
3705 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
3706 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
3707 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3708 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm1
3709 ; AVX2-NEXT:    vpand %ymm0, %ymm1, %ymm0
3710 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
3711 ; AVX2-NEXT:    # ymm1 = mem[0,1,0,1]
3712 ; AVX2-NEXT:    vpermd %ymm0, %ymm1, %ymm0
3713 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3714 ; AVX2-NEXT:    vzeroupper
3715 ; AVX2-NEXT:    retq
3717 ; AVX512-LABEL: ustest_f16i32_mm:
3718 ; AVX512:       # %bb.0: # %entry
3719 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
3720 ; AVX512-NEXT:    vcvttps2qq %ymm0, %zmm0
3721 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3722 ; AVX512-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
3723 ; AVX512-NEXT:    vpmovusqd %ymm0, %xmm0
3724 ; AVX512-NEXT:    vzeroupper
3725 ; AVX512-NEXT:    retq
3726 entry:
3727   %conv = fptosi <4 x half> %x to <4 x i64>
3728   %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
3729   %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> zeroinitializer)
3730   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
3731   ret <4 x i32> %conv6
3734 ; i16 saturate
3736 define <2 x i16> @stest_f64i16_mm(<2 x double> %x) nounwind {
3737 ; SSE-LABEL: stest_f64i16_mm:
3738 ; SSE:       # %bb.0: # %entry
3739 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
3740 ; SSE-NEXT:    packssdw %xmm0, %xmm0
3741 ; SSE-NEXT:    retq
3743 ; AVX-LABEL: stest_f64i16_mm:
3744 ; AVX:       # %bb.0: # %entry
3745 ; AVX-NEXT:    vcvttpd2dq %xmm0, %xmm0
3746 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
3747 ; AVX-NEXT:    retq
3748 entry:
3749   %conv = fptosi <2 x double> %x to <2 x i32>
3750   %spec.store.select = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %conv, <2 x i32> <i32 32767, i32 32767>)
3751   %spec.store.select7 = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %spec.store.select, <2 x i32> <i32 -32768, i32 -32768>)
3752   %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
3753   ret <2 x i16> %conv6
3756 define <2 x i16> @utest_f64i16_mm(<2 x double> %x) nounwind {
3757 ; SSE-LABEL: utest_f64i16_mm:
3758 ; SSE:       # %bb.0: # %entry
3759 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm1
3760 ; SSE-NEXT:    movapd %xmm1, %xmm2
3761 ; SSE-NEXT:    psrad $31, %xmm2
3762 ; SSE-NEXT:    addpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3763 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
3764 ; SSE-NEXT:    andpd %xmm2, %xmm0
3765 ; SSE-NEXT:    orpd %xmm1, %xmm0
3766 ; SSE-NEXT:    movapd {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
3767 ; SSE-NEXT:    xorpd %xmm0, %xmm1
3768 ; SSE-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3769 ; SSE-NEXT:    movdqa %xmm1, %xmm2
3770 ; SSE-NEXT:    pandn %xmm0, %xmm2
3771 ; SSE-NEXT:    psrld $16, %xmm1
3772 ; SSE-NEXT:    por %xmm2, %xmm1
3773 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
3774 ; SSE-NEXT:    retq
3776 ; AVX2-LABEL: utest_f64i16_mm:
3777 ; AVX2:       # %bb.0: # %entry
3778 ; AVX2-NEXT:    vcvttpd2dq %xmm0, %xmm1
3779 ; AVX2-NEXT:    vaddpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3780 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm2
3781 ; AVX2-NEXT:    vcvttpd2dq %xmm0, %xmm0
3782 ; AVX2-NEXT:    vandpd %xmm2, %xmm0, %xmm0
3783 ; AVX2-NEXT:    vorpd %xmm0, %xmm1, %xmm0
3784 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
3785 ; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
3786 ; AVX2-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
3787 ; AVX2-NEXT:    retq
3789 ; AVX512-LABEL: utest_f64i16_mm:
3790 ; AVX512:       # %bb.0: # %entry
3791 ; AVX512-NEXT:    vcvttpd2udq %xmm0, %xmm0
3792 ; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
3793 ; AVX512-NEXT:    vpmovdw %xmm0, %xmm0
3794 ; AVX512-NEXT:    retq
3795 entry:
3796   %conv = fptoui <2 x double> %x to <2 x i32>
3797   %spec.store.select = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>)
3798   %conv6 = trunc <2 x i32> %spec.store.select to <2 x i16>
3799   ret <2 x i16> %conv6
3802 define <2 x i16> @ustest_f64i16_mm(<2 x double> %x) nounwind {
3803 ; SSE-LABEL: ustest_f64i16_mm:
3804 ; SSE:       # %bb.0: # %entry
3805 ; SSE-NEXT:    cvttpd2dq %xmm0, %xmm0
3806 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = <65535,65535,u,u>
3807 ; SSE-NEXT:    movdqa %xmm1, %xmm2
3808 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm2
3809 ; SSE-NEXT:    pand %xmm2, %xmm0
3810 ; SSE-NEXT:    pandn %xmm1, %xmm2
3811 ; SSE-NEXT:    por %xmm0, %xmm2
3812 ; SSE-NEXT:    pxor %xmm0, %xmm0
3813 ; SSE-NEXT:    movdqa %xmm2, %xmm1
3814 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
3815 ; SSE-NEXT:    pand %xmm2, %xmm1
3816 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
3817 ; SSE-NEXT:    retq
3819 ; AVX-LABEL: ustest_f64i16_mm:
3820 ; AVX:       # %bb.0: # %entry
3821 ; AVX-NEXT:    vcvttpd2dq %xmm0, %xmm0
3822 ; AVX-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
3823 ; AVX-NEXT:    retq
3824 entry:
3825   %conv = fptosi <2 x double> %x to <2 x i32>
3826   %spec.store.select = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>)
3827   %spec.store.select7 = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %spec.store.select, <2 x i32> zeroinitializer)
3828   %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
3829   ret <2 x i16> %conv6
3832 define <4 x i16> @stest_f32i16_mm(<4 x float> %x) nounwind {
3833 ; SSE-LABEL: stest_f32i16_mm:
3834 ; SSE:       # %bb.0: # %entry
3835 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
3836 ; SSE-NEXT:    packssdw %xmm0, %xmm0
3837 ; SSE-NEXT:    retq
3839 ; AVX-LABEL: stest_f32i16_mm:
3840 ; AVX:       # %bb.0: # %entry
3841 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
3842 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
3843 ; AVX-NEXT:    retq
3844 entry:
3845   %conv = fptosi <4 x float> %x to <4 x i32>
3846   %spec.store.select = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %conv, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>)
3847   %spec.store.select7 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %spec.store.select, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>)
3848   %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
3849   ret <4 x i16> %conv6
3852 define <4 x i16> @utest_f32i16_mm(<4 x float> %x) nounwind {
3853 ; SSE-LABEL: utest_f32i16_mm:
3854 ; SSE:       # %bb.0: # %entry
3855 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm1
3856 ; SSE-NEXT:    movdqa %xmm1, %xmm2
3857 ; SSE-NEXT:    psrad $31, %xmm2
3858 ; SSE-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3859 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
3860 ; SSE-NEXT:    pand %xmm2, %xmm0
3861 ; SSE-NEXT:    por %xmm1, %xmm0
3862 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
3863 ; SSE-NEXT:    pxor %xmm0, %xmm1
3864 ; SSE-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3865 ; SSE-NEXT:    movdqa %xmm1, %xmm2
3866 ; SSE-NEXT:    pandn %xmm0, %xmm2
3867 ; SSE-NEXT:    psrld $16, %xmm1
3868 ; SSE-NEXT:    por %xmm2, %xmm1
3869 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
3870 ; SSE-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
3871 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3872 ; SSE-NEXT:    retq
3874 ; AVX2-LABEL: utest_f32i16_mm:
3875 ; AVX2:       # %bb.0: # %entry
3876 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
3877 ; AVX2-NEXT:    vsubps %xmm1, %xmm0, %xmm1
3878 ; AVX2-NEXT:    vcvttps2dq %xmm1, %xmm1
3879 ; AVX2-NEXT:    vcvttps2dq %xmm0, %xmm0
3880 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm2
3881 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
3882 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
3883 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
3884 ; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
3885 ; AVX2-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
3886 ; AVX2-NEXT:    retq
3888 ; AVX512-LABEL: utest_f32i16_mm:
3889 ; AVX512:       # %bb.0: # %entry
3890 ; AVX512-NEXT:    vcvttps2udq %xmm0, %xmm0
3891 ; AVX512-NEXT:    vpmovusdw %xmm0, %xmm0
3892 ; AVX512-NEXT:    retq
3893 entry:
3894   %conv = fptoui <4 x float> %x to <4 x i32>
3895   %spec.store.select = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>)
3896   %conv6 = trunc <4 x i32> %spec.store.select to <4 x i16>
3897   ret <4 x i16> %conv6
3900 define <4 x i16> @ustest_f32i16_mm(<4 x float> %x) nounwind {
3901 ; SSE-LABEL: ustest_f32i16_mm:
3902 ; SSE:       # %bb.0: # %entry
3903 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
3904 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
3905 ; SSE-NEXT:    movdqa %xmm1, %xmm2
3906 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm2
3907 ; SSE-NEXT:    pand %xmm2, %xmm0
3908 ; SSE-NEXT:    pandn %xmm1, %xmm2
3909 ; SSE-NEXT:    por %xmm0, %xmm2
3910 ; SSE-NEXT:    pxor %xmm0, %xmm0
3911 ; SSE-NEXT:    movdqa %xmm2, %xmm1
3912 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm1
3913 ; SSE-NEXT:    pand %xmm2, %xmm1
3914 ; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
3915 ; SSE-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
3916 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3917 ; SSE-NEXT:    retq
3919 ; AVX-LABEL: ustest_f32i16_mm:
3920 ; AVX:       # %bb.0: # %entry
3921 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
3922 ; AVX-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
3923 ; AVX-NEXT:    retq
3924 entry:
3925   %conv = fptosi <4 x float> %x to <4 x i32>
3926   %spec.store.select = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>)
3927   %spec.store.select7 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %spec.store.select, <4 x i32> zeroinitializer)
3928   %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
3929   ret <4 x i16> %conv6
3932 define <8 x i16> @stest_f16i16_mm(<8 x half> %x) nounwind {
3933 ; SSE-LABEL: stest_f16i16_mm:
3934 ; SSE:       # %bb.0: # %entry
3935 ; SSE-NEXT:    subq $72, %rsp
3936 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
3937 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
3938 ; SSE-NEXT:    callq __extendhfsf2@PLT
3939 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3940 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
3941 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
3942 ; SSE-NEXT:    callq __extendhfsf2@PLT
3943 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3944 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3945 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
3946 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3947 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
3948 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
3949 ; SSE-NEXT:    callq __extendhfsf2@PLT
3950 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3951 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
3952 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
3953 ; SSE-NEXT:    callq __extendhfsf2@PLT
3954 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3955 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3956 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
3957 ; SSE-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3958 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
3959 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3960 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
3961 ; SSE-NEXT:    psrlq $48, %xmm0
3962 ; SSE-NEXT:    callq __extendhfsf2@PLT
3963 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3964 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
3965 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
3966 ; SSE-NEXT:    callq __extendhfsf2@PLT
3967 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3968 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
3969 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
3970 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3971 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
3972 ; SSE-NEXT:    callq __extendhfsf2@PLT
3973 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3974 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
3975 ; SSE-NEXT:    psrld $16, %xmm0
3976 ; SSE-NEXT:    callq __extendhfsf2@PLT
3977 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
3978 ; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
3979 ; SSE-NEXT:    cvttps2dq %xmm1, %xmm0
3980 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3981 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
3982 ; SSE-NEXT:    packssdw {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
3983 ; SSE-NEXT:    addq $72, %rsp
3984 ; SSE-NEXT:    retq
3986 ; AVX2-LABEL: stest_f16i16_mm:
3987 ; AVX2:       # %bb.0: # %entry
3988 ; AVX2-NEXT:    vcvtph2ps %xmm0, %ymm0
3989 ; AVX2-NEXT:    vcvttps2dq %ymm0, %ymm0
3990 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3991 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3992 ; AVX2-NEXT:    vzeroupper
3993 ; AVX2-NEXT:    retq
3995 ; AVX512-LABEL: stest_f16i16_mm:
3996 ; AVX512:       # %bb.0: # %entry
3997 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
3998 ; AVX512-NEXT:    vcvttps2dq %ymm0, %ymm0
3999 ; AVX512-NEXT:    vpmovsdw %ymm0, %xmm0
4000 ; AVX512-NEXT:    vzeroupper
4001 ; AVX512-NEXT:    retq
4002 entry:
4003   %conv = fptosi <8 x half> %x to <8 x i32>
4004   %spec.store.select = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %conv, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>)
4005   %spec.store.select7 = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %spec.store.select, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>)
4006   %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
4007   ret <8 x i16> %conv6
4010 define <8 x i16> @utesth_f16i16_mm(<8 x half> %x) nounwind {
4011 ; SSE-LABEL: utesth_f16i16_mm:
4012 ; SSE:       # %bb.0: # %entry
4013 ; SSE-NEXT:    subq $72, %rsp
4014 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
4015 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
4016 ; SSE-NEXT:    callq __extendhfsf2@PLT
4017 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4018 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4019 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4020 ; SSE-NEXT:    callq __extendhfsf2@PLT
4021 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4022 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4023 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm1
4024 ; SSE-NEXT:    movdqa %xmm1, %xmm2
4025 ; SSE-NEXT:    psrad $31, %xmm2
4026 ; SSE-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4027 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
4028 ; SSE-NEXT:    pand %xmm2, %xmm0
4029 ; SSE-NEXT:    por %xmm1, %xmm0
4030 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4031 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
4032 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
4033 ; SSE-NEXT:    callq __extendhfsf2@PLT
4034 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4035 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4036 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
4037 ; SSE-NEXT:    callq __extendhfsf2@PLT
4038 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4039 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4040 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm1
4041 ; SSE-NEXT:    movdqa %xmm1, %xmm2
4042 ; SSE-NEXT:    psrad $31, %xmm2
4043 ; SSE-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4044 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
4045 ; SSE-NEXT:    pand %xmm2, %xmm0
4046 ; SSE-NEXT:    por %xmm1, %xmm0
4047 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4048 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
4049 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4050 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
4051 ; SSE-NEXT:    psrlq $48, %xmm0
4052 ; SSE-NEXT:    callq __extendhfsf2@PLT
4053 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4054 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4055 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
4056 ; SSE-NEXT:    callq __extendhfsf2@PLT
4057 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4058 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4059 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm1
4060 ; SSE-NEXT:    movdqa %xmm1, %xmm2
4061 ; SSE-NEXT:    psrad $31, %xmm2
4062 ; SSE-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4063 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
4064 ; SSE-NEXT:    pand %xmm2, %xmm0
4065 ; SSE-NEXT:    por %xmm1, %xmm0
4066 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4067 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4068 ; SSE-NEXT:    callq __extendhfsf2@PLT
4069 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4070 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
4071 ; SSE-NEXT:    psrld $16, %xmm0
4072 ; SSE-NEXT:    callq __extendhfsf2@PLT
4073 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
4074 ; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
4075 ; SSE-NEXT:    cvttps2dq %xmm2, %xmm0
4076 ; SSE-NEXT:    movdqa %xmm0, %xmm1
4077 ; SSE-NEXT:    psrad $31, %xmm1
4078 ; SSE-NEXT:    subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
4079 ; SSE-NEXT:    cvttps2dq %xmm2, %xmm2
4080 ; SSE-NEXT:    pand %xmm1, %xmm2
4081 ; SSE-NEXT:    por %xmm0, %xmm2
4082 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload
4083 ; SSE-NEXT:    # xmm2 = xmm2[0],mem[0]
4084 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
4085 ; SSE-NEXT:    movdqa %xmm2, %xmm3
4086 ; SSE-NEXT:    pxor %xmm1, %xmm3
4087 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183]
4088 ; SSE-NEXT:    movdqa %xmm4, %xmm0
4089 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm0
4090 ; SSE-NEXT:    pand %xmm0, %xmm2
4091 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm3
4092 ; SSE-NEXT:    pxor %xmm3, %xmm0
4093 ; SSE-NEXT:    por %xmm2, %xmm0
4094 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
4095 ; SSE-NEXT:    pxor %xmm2, %xmm1
4096 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm4
4097 ; SSE-NEXT:    pand %xmm4, %xmm2
4098 ; SSE-NEXT:    pxor %xmm3, %xmm4
4099 ; SSE-NEXT:    por %xmm2, %xmm4
4100 ; SSE-NEXT:    pslld $16, %xmm4
4101 ; SSE-NEXT:    psrad $16, %xmm4
4102 ; SSE-NEXT:    pslld $16, %xmm0
4103 ; SSE-NEXT:    psrad $16, %xmm0
4104 ; SSE-NEXT:    packssdw %xmm4, %xmm0
4105 ; SSE-NEXT:    addq $72, %rsp
4106 ; SSE-NEXT:    retq
4108 ; AVX2-LABEL: utesth_f16i16_mm:
4109 ; AVX2:       # %bb.0: # %entry
4110 ; AVX2-NEXT:    vcvtph2ps %xmm0, %ymm0
4111 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]
4112 ; AVX2-NEXT:    vsubps %ymm1, %ymm0, %ymm1
4113 ; AVX2-NEXT:    vcvttps2dq %ymm1, %ymm1
4114 ; AVX2-NEXT:    vcvttps2dq %ymm0, %ymm0
4115 ; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm2
4116 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
4117 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
4118 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
4119 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
4120 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4121 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
4122 ; AVX2-NEXT:    vzeroupper
4123 ; AVX2-NEXT:    retq
4125 ; AVX512-LABEL: utesth_f16i16_mm:
4126 ; AVX512:       # %bb.0: # %entry
4127 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
4128 ; AVX512-NEXT:    vcvttps2udq %ymm0, %ymm0
4129 ; AVX512-NEXT:    vpmovusdw %ymm0, %xmm0
4130 ; AVX512-NEXT:    vzeroupper
4131 ; AVX512-NEXT:    retq
4132 entry:
4133   %conv = fptoui <8 x half> %x to <8 x i32>
4134   %spec.store.select = call <8 x i32> @llvm.umin.v8i32(<8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>)
4135   %conv6 = trunc <8 x i32> %spec.store.select to <8 x i16>
4136   ret <8 x i16> %conv6
4139 define <8 x i16> @ustest_f16i16_mm(<8 x half> %x) nounwind {
4140 ; SSE-LABEL: ustest_f16i16_mm:
4141 ; SSE:       # %bb.0: # %entry
4142 ; SSE-NEXT:    subq $72, %rsp
4143 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
4144 ; SSE-NEXT:    psrlq $48, %xmm0
4145 ; SSE-NEXT:    callq __extendhfsf2@PLT
4146 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4147 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4148 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
4149 ; SSE-NEXT:    callq __extendhfsf2@PLT
4150 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4151 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4152 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
4153 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4154 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4155 ; SSE-NEXT:    callq __extendhfsf2@PLT
4156 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4157 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
4158 ; SSE-NEXT:    psrld $16, %xmm0
4159 ; SSE-NEXT:    callq __extendhfsf2@PLT
4160 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
4161 ; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
4162 ; SSE-NEXT:    cvttps2dq %xmm1, %xmm0
4163 ; SSE-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4164 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
4165 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4166 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
4167 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
4168 ; SSE-NEXT:    callq __extendhfsf2@PLT
4169 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4170 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4171 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
4172 ; SSE-NEXT:    callq __extendhfsf2@PLT
4173 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4174 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4175 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
4176 ; SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4177 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
4178 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
4179 ; SSE-NEXT:    callq __extendhfsf2@PLT
4180 ; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
4181 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4182 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
4183 ; SSE-NEXT:    callq __extendhfsf2@PLT
4184 ; SSE-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4185 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
4186 ; SSE-NEXT:    cvttps2dq %xmm0, %xmm0
4187 ; SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
4188 ; SSE-NEXT:    # xmm0 = xmm0[0],mem[0]
4189 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
4190 ; SSE-NEXT:    movdqa %xmm1, %xmm2
4191 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm2
4192 ; SSE-NEXT:    pand %xmm2, %xmm0
4193 ; SSE-NEXT:    pandn %xmm1, %xmm2
4194 ; SSE-NEXT:    por %xmm0, %xmm2
4195 ; SSE-NEXT:    movdqa %xmm1, %xmm3
4196 ; SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
4197 ; SSE-NEXT:    pcmpgtd %xmm0, %xmm3
4198 ; SSE-NEXT:    pand %xmm3, %xmm0
4199 ; SSE-NEXT:    pandn %xmm1, %xmm3
4200 ; SSE-NEXT:    por %xmm0, %xmm3
4201 ; SSE-NEXT:    pxor %xmm1, %xmm1
4202 ; SSE-NEXT:    movdqa %xmm3, %xmm0
4203 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
4204 ; SSE-NEXT:    pand %xmm3, %xmm0
4205 ; SSE-NEXT:    movdqa %xmm2, %xmm3
4206 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm3
4207 ; SSE-NEXT:    pand %xmm2, %xmm3
4208 ; SSE-NEXT:    pslld $16, %xmm3
4209 ; SSE-NEXT:    psrad $16, %xmm3
4210 ; SSE-NEXT:    pslld $16, %xmm0
4211 ; SSE-NEXT:    psrad $16, %xmm0
4212 ; SSE-NEXT:    packssdw %xmm3, %xmm0
4213 ; SSE-NEXT:    addq $72, %rsp
4214 ; SSE-NEXT:    retq
4216 ; AVX2-LABEL: ustest_f16i16_mm:
4217 ; AVX2:       # %bb.0: # %entry
4218 ; AVX2-NEXT:    vcvtph2ps %xmm0, %ymm0
4219 ; AVX2-NEXT:    vcvttps2dq %ymm0, %ymm0
4220 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4221 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
4222 ; AVX2-NEXT:    vzeroupper
4223 ; AVX2-NEXT:    retq
4225 ; AVX512-LABEL: ustest_f16i16_mm:
4226 ; AVX512:       # %bb.0: # %entry
4227 ; AVX512-NEXT:    vcvtph2ps %xmm0, %ymm0
4228 ; AVX512-NEXT:    vcvttps2dq %ymm0, %ymm0
4229 ; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
4230 ; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
4231 ; AVX512-NEXT:    vpmovusdw %ymm0, %xmm0
4232 ; AVX512-NEXT:    vzeroupper
4233 ; AVX512-NEXT:    retq
4234 entry:
4235   %conv = fptosi <8 x half> %x to <8 x i32>
4236   %spec.store.select = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>)
4237   %spec.store.select7 = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %spec.store.select, <8 x i32> zeroinitializer)
4238   %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
4239   ret <8 x i16> %conv6
4242 ; i64 saturate
4244 define <2 x i64> @stest_f64i64_mm(<2 x double> %x) nounwind {
4245 ; SSE-LABEL: stest_f64i64_mm:
4246 ; SSE:       # %bb.0: # %entry
4247 ; SSE-NEXT:    pushq %r14
4248 ; SSE-NEXT:    pushq %rbx
4249 ; SSE-NEXT:    subq $24, %rsp
4250 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
4251 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
4252 ; SSE-NEXT:    callq __fixdfti@PLT
4253 ; SSE-NEXT:    movq %rax, %rbx
4254 ; SSE-NEXT:    movq %rdx, %r14
4255 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4256 ; SSE-NEXT:    callq __fixdfti@PLT
4257 ; SSE-NEXT:    xorl %ecx, %ecx
4258 ; SSE-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
4259 ; SSE-NEXT:    cmpq %rsi, %rax
4260 ; SSE-NEXT:    movq %rdx, %rdi
4261 ; SSE-NEXT:    sbbq $0, %rdi
4262 ; SSE-NEXT:    cmovgeq %rcx, %rdx
4263 ; SSE-NEXT:    cmovgeq %rsi, %rax
4264 ; SSE-NEXT:    cmpq %rsi, %rbx
4265 ; SSE-NEXT:    movq %r14, %rdi
4266 ; SSE-NEXT:    sbbq $0, %rdi
4267 ; SSE-NEXT:    cmovlq %r14, %rcx
4268 ; SSE-NEXT:    cmovlq %rbx, %rsi
4269 ; SSE-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
4270 ; SSE-NEXT:    cmpq %rsi, %rdi
4271 ; SSE-NEXT:    movq $-1, %r8
4272 ; SSE-NEXT:    movq $-1, %r9
4273 ; SSE-NEXT:    sbbq %rcx, %r9
4274 ; SSE-NEXT:    cmovgeq %rdi, %rsi
4275 ; SSE-NEXT:    cmpq %rax, %rdi
4276 ; SSE-NEXT:    sbbq %rdx, %r8
4277 ; SSE-NEXT:    cmovgeq %rdi, %rax
4278 ; SSE-NEXT:    movq %rax, %xmm0
4279 ; SSE-NEXT:    movq %rsi, %xmm1
4280 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4281 ; SSE-NEXT:    addq $24, %rsp
4282 ; SSE-NEXT:    popq %rbx
4283 ; SSE-NEXT:    popq %r14
4284 ; SSE-NEXT:    retq
4286 ; AVX2-LABEL: stest_f64i64_mm:
4287 ; AVX2:       # %bb.0: # %entry
4288 ; AVX2-NEXT:    pushq %r14
4289 ; AVX2-NEXT:    pushq %rbx
4290 ; AVX2-NEXT:    subq $24, %rsp
4291 ; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4292 ; AVX2-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4293 ; AVX2-NEXT:    callq __fixdfti@PLT
4294 ; AVX2-NEXT:    movq %rax, %rbx
4295 ; AVX2-NEXT:    movq %rdx, %r14
4296 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
4297 ; AVX2-NEXT:    callq __fixdfti@PLT
4298 ; AVX2-NEXT:    xorl %ecx, %ecx
4299 ; AVX2-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
4300 ; AVX2-NEXT:    cmpq %rsi, %rax
4301 ; AVX2-NEXT:    movq %rdx, %rdi
4302 ; AVX2-NEXT:    sbbq $0, %rdi
4303 ; AVX2-NEXT:    cmovgeq %rcx, %rdx
4304 ; AVX2-NEXT:    cmovgeq %rsi, %rax
4305 ; AVX2-NEXT:    cmpq %rsi, %rbx
4306 ; AVX2-NEXT:    movq %r14, %rdi
4307 ; AVX2-NEXT:    sbbq $0, %rdi
4308 ; AVX2-NEXT:    cmovlq %r14, %rcx
4309 ; AVX2-NEXT:    cmovlq %rbx, %rsi
4310 ; AVX2-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
4311 ; AVX2-NEXT:    cmpq %rsi, %rdi
4312 ; AVX2-NEXT:    movq $-1, %r8
4313 ; AVX2-NEXT:    sbbq %rcx, %r8
4314 ; AVX2-NEXT:    movq $-1, %rcx
4315 ; AVX2-NEXT:    cmovgeq %rdi, %rsi
4316 ; AVX2-NEXT:    cmpq %rax, %rdi
4317 ; AVX2-NEXT:    sbbq %rdx, %rcx
4318 ; AVX2-NEXT:    cmovgeq %rdi, %rax
4319 ; AVX2-NEXT:    vmovq %rax, %xmm0
4320 ; AVX2-NEXT:    vmovq %rsi, %xmm1
4321 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4322 ; AVX2-NEXT:    addq $24, %rsp
4323 ; AVX2-NEXT:    popq %rbx
4324 ; AVX2-NEXT:    popq %r14
4325 ; AVX2-NEXT:    retq
4327 ; AVX512-LABEL: stest_f64i64_mm:
4328 ; AVX512:       # %bb.0: # %entry
4329 ; AVX512-NEXT:    pushq %r14
4330 ; AVX512-NEXT:    pushq %rbx
4331 ; AVX512-NEXT:    subq $24, %rsp
4332 ; AVX512-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4333 ; AVX512-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4334 ; AVX512-NEXT:    callq __fixdfti@PLT
4335 ; AVX512-NEXT:    movq %rax, %rbx
4336 ; AVX512-NEXT:    movq %rdx, %r14
4337 ; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
4338 ; AVX512-NEXT:    callq __fixdfti@PLT
4339 ; AVX512-NEXT:    xorl %ecx, %ecx
4340 ; AVX512-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
4341 ; AVX512-NEXT:    cmpq %rsi, %rax
4342 ; AVX512-NEXT:    movq %rdx, %rdi
4343 ; AVX512-NEXT:    sbbq $0, %rdi
4344 ; AVX512-NEXT:    cmovgeq %rcx, %rdx
4345 ; AVX512-NEXT:    cmovgeq %rsi, %rax
4346 ; AVX512-NEXT:    cmpq %rsi, %rbx
4347 ; AVX512-NEXT:    movq %r14, %rdi
4348 ; AVX512-NEXT:    sbbq $0, %rdi
4349 ; AVX512-NEXT:    cmovlq %r14, %rcx
4350 ; AVX512-NEXT:    cmovlq %rbx, %rsi
4351 ; AVX512-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
4352 ; AVX512-NEXT:    cmpq %rsi, %rdi
4353 ; AVX512-NEXT:    movq $-1, %r8
4354 ; AVX512-NEXT:    movq $-1, %r9
4355 ; AVX512-NEXT:    sbbq %rcx, %r9
4356 ; AVX512-NEXT:    cmovgeq %rdi, %rsi
4357 ; AVX512-NEXT:    cmpq %rax, %rdi
4358 ; AVX512-NEXT:    sbbq %rdx, %r8
4359 ; AVX512-NEXT:    cmovgeq %rdi, %rax
4360 ; AVX512-NEXT:    vmovq %rax, %xmm0
4361 ; AVX512-NEXT:    vmovq %rsi, %xmm1
4362 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4363 ; AVX512-NEXT:    addq $24, %rsp
4364 ; AVX512-NEXT:    popq %rbx
4365 ; AVX512-NEXT:    popq %r14
4366 ; AVX512-NEXT:    retq
4367 entry:
4368   %conv = fptosi <2 x double> %x to <2 x i128>
4369   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)
4370   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)
4371   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
4372   ret <2 x i64> %conv6
4375 define <2 x i64> @utest_f64i64_mm(<2 x double> %x) nounwind {
4376 ; SSE-LABEL: utest_f64i64_mm:
4377 ; SSE:       # %bb.0: # %entry
4378 ; SSE-NEXT:    pushq %r14
4379 ; SSE-NEXT:    pushq %rbx
4380 ; SSE-NEXT:    subq $24, %rsp
4381 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
4382 ; SSE-NEXT:    callq __fixunsdfti@PLT
4383 ; SSE-NEXT:    movq %rax, %rbx
4384 ; SSE-NEXT:    movq %rdx, %r14
4385 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4386 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
4387 ; SSE-NEXT:    callq __fixunsdfti@PLT
4388 ; SSE-NEXT:    xorl %ecx, %ecx
4389 ; SSE-NEXT:    testq %rdx, %rdx
4390 ; SSE-NEXT:    cmovneq %rcx, %rax
4391 ; SSE-NEXT:    testq %r14, %r14
4392 ; SSE-NEXT:    cmovneq %rcx, %rbx
4393 ; SSE-NEXT:    movq %rbx, %xmm0
4394 ; SSE-NEXT:    movq %rax, %xmm1
4395 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4396 ; SSE-NEXT:    addq $24, %rsp
4397 ; SSE-NEXT:    popq %rbx
4398 ; SSE-NEXT:    popq %r14
4399 ; SSE-NEXT:    retq
4401 ; AVX-LABEL: utest_f64i64_mm:
4402 ; AVX:       # %bb.0: # %entry
4403 ; AVX-NEXT:    pushq %r14
4404 ; AVX-NEXT:    pushq %rbx
4405 ; AVX-NEXT:    subq $24, %rsp
4406 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4407 ; AVX-NEXT:    callq __fixunsdfti@PLT
4408 ; AVX-NEXT:    movq %rax, %rbx
4409 ; AVX-NEXT:    movq %rdx, %r14
4410 ; AVX-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
4411 ; AVX-NEXT:    # xmm0 = mem[1,0]
4412 ; AVX-NEXT:    callq __fixunsdfti@PLT
4413 ; AVX-NEXT:    xorl %ecx, %ecx
4414 ; AVX-NEXT:    testq %rdx, %rdx
4415 ; AVX-NEXT:    cmovneq %rcx, %rax
4416 ; AVX-NEXT:    testq %r14, %r14
4417 ; AVX-NEXT:    cmovneq %rcx, %rbx
4418 ; AVX-NEXT:    vmovq %rbx, %xmm0
4419 ; AVX-NEXT:    vmovq %rax, %xmm1
4420 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4421 ; AVX-NEXT:    addq $24, %rsp
4422 ; AVX-NEXT:    popq %rbx
4423 ; AVX-NEXT:    popq %r14
4424 ; AVX-NEXT:    retq
4425 entry:
4426   %conv = fptoui <2 x double> %x to <2 x i128>
4427   %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
4428   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
4429   ret <2 x i64> %conv6
4432 define <2 x i64> @ustest_f64i64_mm(<2 x double> %x) nounwind {
4433 ; SSE-LABEL: ustest_f64i64_mm:
4434 ; SSE:       # %bb.0: # %entry
4435 ; SSE-NEXT:    pushq %r14
4436 ; SSE-NEXT:    pushq %rbx
4437 ; SSE-NEXT:    subq $24, %rsp
4438 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
4439 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
4440 ; SSE-NEXT:    callq __fixdfti@PLT
4441 ; SSE-NEXT:    movq %rax, %rbx
4442 ; SSE-NEXT:    movq %rdx, %r14
4443 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4444 ; SSE-NEXT:    callq __fixdfti@PLT
4445 ; SSE-NEXT:    xorl %ecx, %ecx
4446 ; SSE-NEXT:    testq %rdx, %rdx
4447 ; SSE-NEXT:    cmovgq %rcx, %rax
4448 ; SSE-NEXT:    movl $1, %esi
4449 ; SSE-NEXT:    cmovgq %rsi, %rdx
4450 ; SSE-NEXT:    testq %r14, %r14
4451 ; SSE-NEXT:    cmovgq %rcx, %rbx
4452 ; SSE-NEXT:    cmovleq %r14, %rsi
4453 ; SSE-NEXT:    testq %rsi, %rsi
4454 ; SSE-NEXT:    cmovsq %rcx, %rbx
4455 ; SSE-NEXT:    testq %rdx, %rdx
4456 ; SSE-NEXT:    cmovsq %rcx, %rax
4457 ; SSE-NEXT:    movq %rax, %xmm0
4458 ; SSE-NEXT:    movq %rbx, %xmm1
4459 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4460 ; SSE-NEXT:    addq $24, %rsp
4461 ; SSE-NEXT:    popq %rbx
4462 ; SSE-NEXT:    popq %r14
4463 ; SSE-NEXT:    retq
4465 ; AVX-LABEL: ustest_f64i64_mm:
4466 ; AVX:       # %bb.0: # %entry
4467 ; AVX-NEXT:    pushq %r14
4468 ; AVX-NEXT:    pushq %rbx
4469 ; AVX-NEXT:    subq $24, %rsp
4470 ; AVX-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
4471 ; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
4472 ; AVX-NEXT:    callq __fixdfti@PLT
4473 ; AVX-NEXT:    movq %rax, %rbx
4474 ; AVX-NEXT:    movq %rdx, %r14
4475 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
4476 ; AVX-NEXT:    callq __fixdfti@PLT
4477 ; AVX-NEXT:    xorl %ecx, %ecx
4478 ; AVX-NEXT:    testq %rdx, %rdx
4479 ; AVX-NEXT:    cmovgq %rcx, %rax
4480 ; AVX-NEXT:    movl $1, %esi
4481 ; AVX-NEXT:    cmovgq %rsi, %rdx
4482 ; AVX-NEXT:    testq %r14, %r14
4483 ; AVX-NEXT:    cmovgq %rcx, %rbx
4484 ; AVX-NEXT:    cmovleq %r14, %rsi
4485 ; AVX-NEXT:    testq %rsi, %rsi
4486 ; AVX-NEXT:    cmovsq %rcx, %rbx
4487 ; AVX-NEXT:    testq %rdx, %rdx
4488 ; AVX-NEXT:    cmovsq %rcx, %rax
4489 ; AVX-NEXT:    vmovq %rax, %xmm0
4490 ; AVX-NEXT:    vmovq %rbx, %xmm1
4491 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4492 ; AVX-NEXT:    addq $24, %rsp
4493 ; AVX-NEXT:    popq %rbx
4494 ; AVX-NEXT:    popq %r14
4495 ; AVX-NEXT:    retq
4496 entry:
4497   %conv = fptosi <2 x double> %x to <2 x i128>
4498   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
4499   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)
4500   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
4501   ret <2 x i64> %conv6
4504 define <2 x i64> @stest_f32i64_mm(<2 x float> %x) nounwind {
4505 ; SSE-LABEL: stest_f32i64_mm:
4506 ; SSE:       # %bb.0: # %entry
4507 ; SSE-NEXT:    pushq %r14
4508 ; SSE-NEXT:    pushq %rbx
4509 ; SSE-NEXT:    subq $24, %rsp
4510 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
4511 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
4512 ; SSE-NEXT:    callq __fixsfti@PLT
4513 ; SSE-NEXT:    movq %rax, %rbx
4514 ; SSE-NEXT:    movq %rdx, %r14
4515 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4516 ; SSE-NEXT:    callq __fixsfti@PLT
4517 ; SSE-NEXT:    xorl %ecx, %ecx
4518 ; SSE-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
4519 ; SSE-NEXT:    cmpq %rsi, %rax
4520 ; SSE-NEXT:    movq %rdx, %rdi
4521 ; SSE-NEXT:    sbbq $0, %rdi
4522 ; SSE-NEXT:    cmovgeq %rcx, %rdx
4523 ; SSE-NEXT:    cmovgeq %rsi, %rax
4524 ; SSE-NEXT:    cmpq %rsi, %rbx
4525 ; SSE-NEXT:    movq %r14, %rdi
4526 ; SSE-NEXT:    sbbq $0, %rdi
4527 ; SSE-NEXT:    cmovlq %r14, %rcx
4528 ; SSE-NEXT:    cmovlq %rbx, %rsi
4529 ; SSE-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
4530 ; SSE-NEXT:    cmpq %rsi, %rdi
4531 ; SSE-NEXT:    movq $-1, %r8
4532 ; SSE-NEXT:    movq $-1, %r9
4533 ; SSE-NEXT:    sbbq %rcx, %r9
4534 ; SSE-NEXT:    cmovgeq %rdi, %rsi
4535 ; SSE-NEXT:    cmpq %rax, %rdi
4536 ; SSE-NEXT:    sbbq %rdx, %r8
4537 ; SSE-NEXT:    cmovgeq %rdi, %rax
4538 ; SSE-NEXT:    movq %rax, %xmm0
4539 ; SSE-NEXT:    movq %rsi, %xmm1
4540 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4541 ; SSE-NEXT:    addq $24, %rsp
4542 ; SSE-NEXT:    popq %rbx
4543 ; SSE-NEXT:    popq %r14
4544 ; SSE-NEXT:    retq
4546 ; AVX2-LABEL: stest_f32i64_mm:
4547 ; AVX2:       # %bb.0: # %entry
4548 ; AVX2-NEXT:    pushq %r14
4549 ; AVX2-NEXT:    pushq %rbx
4550 ; AVX2-NEXT:    subq $24, %rsp
4551 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4552 ; AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
4553 ; AVX2-NEXT:    callq __fixsfti@PLT
4554 ; AVX2-NEXT:    movq %rax, %rbx
4555 ; AVX2-NEXT:    movq %rdx, %r14
4556 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
4557 ; AVX2-NEXT:    callq __fixsfti@PLT
4558 ; AVX2-NEXT:    xorl %ecx, %ecx
4559 ; AVX2-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
4560 ; AVX2-NEXT:    cmpq %rsi, %rax
4561 ; AVX2-NEXT:    movq %rdx, %rdi
4562 ; AVX2-NEXT:    sbbq $0, %rdi
4563 ; AVX2-NEXT:    cmovgeq %rcx, %rdx
4564 ; AVX2-NEXT:    cmovgeq %rsi, %rax
4565 ; AVX2-NEXT:    cmpq %rsi, %rbx
4566 ; AVX2-NEXT:    movq %r14, %rdi
4567 ; AVX2-NEXT:    sbbq $0, %rdi
4568 ; AVX2-NEXT:    cmovlq %r14, %rcx
4569 ; AVX2-NEXT:    cmovlq %rbx, %rsi
4570 ; AVX2-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
4571 ; AVX2-NEXT:    cmpq %rsi, %rdi
4572 ; AVX2-NEXT:    movq $-1, %r8
4573 ; AVX2-NEXT:    sbbq %rcx, %r8
4574 ; AVX2-NEXT:    movq $-1, %rcx
4575 ; AVX2-NEXT:    cmovgeq %rdi, %rsi
4576 ; AVX2-NEXT:    cmpq %rax, %rdi
4577 ; AVX2-NEXT:    sbbq %rdx, %rcx
4578 ; AVX2-NEXT:    cmovgeq %rdi, %rax
4579 ; AVX2-NEXT:    vmovq %rax, %xmm0
4580 ; AVX2-NEXT:    vmovq %rsi, %xmm1
4581 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4582 ; AVX2-NEXT:    addq $24, %rsp
4583 ; AVX2-NEXT:    popq %rbx
4584 ; AVX2-NEXT:    popq %r14
4585 ; AVX2-NEXT:    retq
4587 ; AVX512-LABEL: stest_f32i64_mm:
4588 ; AVX512:       # %bb.0: # %entry
4589 ; AVX512-NEXT:    pushq %r14
4590 ; AVX512-NEXT:    pushq %rbx
4591 ; AVX512-NEXT:    subq $24, %rsp
4592 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4593 ; AVX512-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
4594 ; AVX512-NEXT:    callq __fixsfti@PLT
4595 ; AVX512-NEXT:    movq %rax, %rbx
4596 ; AVX512-NEXT:    movq %rdx, %r14
4597 ; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
4598 ; AVX512-NEXT:    callq __fixsfti@PLT
4599 ; AVX512-NEXT:    xorl %ecx, %ecx
4600 ; AVX512-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
4601 ; AVX512-NEXT:    cmpq %rsi, %rax
4602 ; AVX512-NEXT:    movq %rdx, %rdi
4603 ; AVX512-NEXT:    sbbq $0, %rdi
4604 ; AVX512-NEXT:    cmovgeq %rcx, %rdx
4605 ; AVX512-NEXT:    cmovgeq %rsi, %rax
4606 ; AVX512-NEXT:    cmpq %rsi, %rbx
4607 ; AVX512-NEXT:    movq %r14, %rdi
4608 ; AVX512-NEXT:    sbbq $0, %rdi
4609 ; AVX512-NEXT:    cmovlq %r14, %rcx
4610 ; AVX512-NEXT:    cmovlq %rbx, %rsi
4611 ; AVX512-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
4612 ; AVX512-NEXT:    cmpq %rsi, %rdi
4613 ; AVX512-NEXT:    movq $-1, %r8
4614 ; AVX512-NEXT:    movq $-1, %r9
4615 ; AVX512-NEXT:    sbbq %rcx, %r9
4616 ; AVX512-NEXT:    cmovgeq %rdi, %rsi
4617 ; AVX512-NEXT:    cmpq %rax, %rdi
4618 ; AVX512-NEXT:    sbbq %rdx, %r8
4619 ; AVX512-NEXT:    cmovgeq %rdi, %rax
4620 ; AVX512-NEXT:    vmovq %rax, %xmm0
4621 ; AVX512-NEXT:    vmovq %rsi, %xmm1
4622 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4623 ; AVX512-NEXT:    addq $24, %rsp
4624 ; AVX512-NEXT:    popq %rbx
4625 ; AVX512-NEXT:    popq %r14
4626 ; AVX512-NEXT:    retq
4627 entry:
4628   %conv = fptosi <2 x float> %x to <2 x i128>
4629   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)
4630   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)
4631   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
4632   ret <2 x i64> %conv6
4635 define <2 x i64> @utest_f32i64_mm(<2 x float> %x) nounwind {
4636 ; SSE-LABEL: utest_f32i64_mm:
4637 ; SSE:       # %bb.0: # %entry
4638 ; SSE-NEXT:    pushq %r14
4639 ; SSE-NEXT:    pushq %rbx
4640 ; SSE-NEXT:    subq $24, %rsp
4641 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
4642 ; SSE-NEXT:    callq __fixunssfti@PLT
4643 ; SSE-NEXT:    movq %rax, %rbx
4644 ; SSE-NEXT:    movq %rdx, %r14
4645 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4646 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
4647 ; SSE-NEXT:    callq __fixunssfti@PLT
4648 ; SSE-NEXT:    xorl %ecx, %ecx
4649 ; SSE-NEXT:    testq %rdx, %rdx
4650 ; SSE-NEXT:    cmovneq %rcx, %rax
4651 ; SSE-NEXT:    testq %r14, %r14
4652 ; SSE-NEXT:    cmovneq %rcx, %rbx
4653 ; SSE-NEXT:    movq %rbx, %xmm0
4654 ; SSE-NEXT:    movq %rax, %xmm1
4655 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4656 ; SSE-NEXT:    addq $24, %rsp
4657 ; SSE-NEXT:    popq %rbx
4658 ; SSE-NEXT:    popq %r14
4659 ; SSE-NEXT:    retq
4661 ; AVX-LABEL: utest_f32i64_mm:
4662 ; AVX:       # %bb.0: # %entry
4663 ; AVX-NEXT:    pushq %r14
4664 ; AVX-NEXT:    pushq %rbx
4665 ; AVX-NEXT:    subq $24, %rsp
4666 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4667 ; AVX-NEXT:    callq __fixunssfti@PLT
4668 ; AVX-NEXT:    movq %rax, %rbx
4669 ; AVX-NEXT:    movq %rdx, %r14
4670 ; AVX-NEXT:    vmovshdup (%rsp), %xmm0 # 16-byte Folded Reload
4671 ; AVX-NEXT:    # xmm0 = mem[1,1,3,3]
4672 ; AVX-NEXT:    callq __fixunssfti@PLT
4673 ; AVX-NEXT:    xorl %ecx, %ecx
4674 ; AVX-NEXT:    testq %rdx, %rdx
4675 ; AVX-NEXT:    cmovneq %rcx, %rax
4676 ; AVX-NEXT:    testq %r14, %r14
4677 ; AVX-NEXT:    cmovneq %rcx, %rbx
4678 ; AVX-NEXT:    vmovq %rbx, %xmm0
4679 ; AVX-NEXT:    vmovq %rax, %xmm1
4680 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4681 ; AVX-NEXT:    addq $24, %rsp
4682 ; AVX-NEXT:    popq %rbx
4683 ; AVX-NEXT:    popq %r14
4684 ; AVX-NEXT:    retq
4685 entry:
4686   %conv = fptoui <2 x float> %x to <2 x i128>
4687   %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
4688   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
4689   ret <2 x i64> %conv6
4692 define <2 x i64> @ustest_f32i64_mm(<2 x float> %x) nounwind {
4693 ; SSE-LABEL: ustest_f32i64_mm:
4694 ; SSE:       # %bb.0: # %entry
4695 ; SSE-NEXT:    pushq %r14
4696 ; SSE-NEXT:    pushq %rbx
4697 ; SSE-NEXT:    subq $24, %rsp
4698 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
4699 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
4700 ; SSE-NEXT:    callq __fixsfti@PLT
4701 ; SSE-NEXT:    movq %rax, %rbx
4702 ; SSE-NEXT:    movq %rdx, %r14
4703 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4704 ; SSE-NEXT:    callq __fixsfti@PLT
4705 ; SSE-NEXT:    xorl %ecx, %ecx
4706 ; SSE-NEXT:    testq %rdx, %rdx
4707 ; SSE-NEXT:    cmovgq %rcx, %rax
4708 ; SSE-NEXT:    movl $1, %esi
4709 ; SSE-NEXT:    cmovgq %rsi, %rdx
4710 ; SSE-NEXT:    testq %r14, %r14
4711 ; SSE-NEXT:    cmovgq %rcx, %rbx
4712 ; SSE-NEXT:    cmovleq %r14, %rsi
4713 ; SSE-NEXT:    testq %rsi, %rsi
4714 ; SSE-NEXT:    cmovsq %rcx, %rbx
4715 ; SSE-NEXT:    testq %rdx, %rdx
4716 ; SSE-NEXT:    cmovsq %rcx, %rax
4717 ; SSE-NEXT:    movq %rax, %xmm0
4718 ; SSE-NEXT:    movq %rbx, %xmm1
4719 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4720 ; SSE-NEXT:    addq $24, %rsp
4721 ; SSE-NEXT:    popq %rbx
4722 ; SSE-NEXT:    popq %r14
4723 ; SSE-NEXT:    retq
4725 ; AVX-LABEL: ustest_f32i64_mm:
4726 ; AVX:       # %bb.0: # %entry
4727 ; AVX-NEXT:    pushq %r14
4728 ; AVX-NEXT:    pushq %rbx
4729 ; AVX-NEXT:    subq $24, %rsp
4730 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4731 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
4732 ; AVX-NEXT:    callq __fixsfti@PLT
4733 ; AVX-NEXT:    movq %rax, %rbx
4734 ; AVX-NEXT:    movq %rdx, %r14
4735 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
4736 ; AVX-NEXT:    callq __fixsfti@PLT
4737 ; AVX-NEXT:    xorl %ecx, %ecx
4738 ; AVX-NEXT:    testq %rdx, %rdx
4739 ; AVX-NEXT:    cmovgq %rcx, %rax
4740 ; AVX-NEXT:    movl $1, %esi
4741 ; AVX-NEXT:    cmovgq %rsi, %rdx
4742 ; AVX-NEXT:    testq %r14, %r14
4743 ; AVX-NEXT:    cmovgq %rcx, %rbx
4744 ; AVX-NEXT:    cmovleq %r14, %rsi
4745 ; AVX-NEXT:    testq %rsi, %rsi
4746 ; AVX-NEXT:    cmovsq %rcx, %rbx
4747 ; AVX-NEXT:    testq %rdx, %rdx
4748 ; AVX-NEXT:    cmovsq %rcx, %rax
4749 ; AVX-NEXT:    vmovq %rax, %xmm0
4750 ; AVX-NEXT:    vmovq %rbx, %xmm1
4751 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4752 ; AVX-NEXT:    addq $24, %rsp
4753 ; AVX-NEXT:    popq %rbx
4754 ; AVX-NEXT:    popq %r14
4755 ; AVX-NEXT:    retq
4756 entry:
4757   %conv = fptosi <2 x float> %x to <2 x i128>
4758   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
4759   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)
4760   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
4761   ret <2 x i64> %conv6
4764 define <2 x i64> @stest_f16i64_mm(<2 x half> %x) nounwind {
4765 ; SSE-LABEL: stest_f16i64_mm:
4766 ; SSE:       # %bb.0: # %entry
4767 ; SSE-NEXT:    pushq %r14
4768 ; SSE-NEXT:    pushq %rbx
4769 ; SSE-NEXT:    subq $24, %rsp
4770 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
4771 ; SSE-NEXT:    psrld $16, %xmm0
4772 ; SSE-NEXT:    callq __fixhfti@PLT
4773 ; SSE-NEXT:    movq %rax, %rbx
4774 ; SSE-NEXT:    movq %rdx, %r14
4775 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4776 ; SSE-NEXT:    callq __fixhfti@PLT
4777 ; SSE-NEXT:    xorl %ecx, %ecx
4778 ; SSE-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
4779 ; SSE-NEXT:    cmpq %rsi, %rax
4780 ; SSE-NEXT:    movq %rdx, %rdi
4781 ; SSE-NEXT:    sbbq $0, %rdi
4782 ; SSE-NEXT:    cmovgeq %rcx, %rdx
4783 ; SSE-NEXT:    cmovgeq %rsi, %rax
4784 ; SSE-NEXT:    cmpq %rsi, %rbx
4785 ; SSE-NEXT:    movq %r14, %rdi
4786 ; SSE-NEXT:    sbbq $0, %rdi
4787 ; SSE-NEXT:    cmovlq %r14, %rcx
4788 ; SSE-NEXT:    cmovlq %rbx, %rsi
4789 ; SSE-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
4790 ; SSE-NEXT:    cmpq %rsi, %rdi
4791 ; SSE-NEXT:    movq $-1, %r8
4792 ; SSE-NEXT:    movq $-1, %r9
4793 ; SSE-NEXT:    sbbq %rcx, %r9
4794 ; SSE-NEXT:    cmovgeq %rdi, %rsi
4795 ; SSE-NEXT:    cmpq %rax, %rdi
4796 ; SSE-NEXT:    sbbq %rdx, %r8
4797 ; SSE-NEXT:    cmovgeq %rdi, %rax
4798 ; SSE-NEXT:    movq %rax, %xmm0
4799 ; SSE-NEXT:    movq %rsi, %xmm1
4800 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4801 ; SSE-NEXT:    addq $24, %rsp
4802 ; SSE-NEXT:    popq %rbx
4803 ; SSE-NEXT:    popq %r14
4804 ; SSE-NEXT:    retq
4806 ; AVX2-LABEL: stest_f16i64_mm:
4807 ; AVX2:       # %bb.0: # %entry
4808 ; AVX2-NEXT:    pushq %r14
4809 ; AVX2-NEXT:    pushq %rbx
4810 ; AVX2-NEXT:    subq $24, %rsp
4811 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4812 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
4813 ; AVX2-NEXT:    callq __fixhfti@PLT
4814 ; AVX2-NEXT:    movq %rax, %rbx
4815 ; AVX2-NEXT:    movq %rdx, %r14
4816 ; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
4817 ; AVX2-NEXT:    callq __fixhfti@PLT
4818 ; AVX2-NEXT:    xorl %ecx, %ecx
4819 ; AVX2-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
4820 ; AVX2-NEXT:    cmpq %rsi, %rax
4821 ; AVX2-NEXT:    movq %rdx, %rdi
4822 ; AVX2-NEXT:    sbbq $0, %rdi
4823 ; AVX2-NEXT:    cmovgeq %rcx, %rdx
4824 ; AVX2-NEXT:    cmovgeq %rsi, %rax
4825 ; AVX2-NEXT:    cmpq %rsi, %rbx
4826 ; AVX2-NEXT:    movq %r14, %rdi
4827 ; AVX2-NEXT:    sbbq $0, %rdi
4828 ; AVX2-NEXT:    cmovlq %r14, %rcx
4829 ; AVX2-NEXT:    cmovlq %rbx, %rsi
4830 ; AVX2-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
4831 ; AVX2-NEXT:    cmpq %rsi, %rdi
4832 ; AVX2-NEXT:    movq $-1, %r8
4833 ; AVX2-NEXT:    sbbq %rcx, %r8
4834 ; AVX2-NEXT:    movq $-1, %rcx
4835 ; AVX2-NEXT:    cmovgeq %rdi, %rsi
4836 ; AVX2-NEXT:    cmpq %rax, %rdi
4837 ; AVX2-NEXT:    sbbq %rdx, %rcx
4838 ; AVX2-NEXT:    cmovgeq %rdi, %rax
4839 ; AVX2-NEXT:    vmovq %rax, %xmm0
4840 ; AVX2-NEXT:    vmovq %rsi, %xmm1
4841 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4842 ; AVX2-NEXT:    addq $24, %rsp
4843 ; AVX2-NEXT:    popq %rbx
4844 ; AVX2-NEXT:    popq %r14
4845 ; AVX2-NEXT:    retq
4847 ; AVX512-LABEL: stest_f16i64_mm:
4848 ; AVX512:       # %bb.0: # %entry
4849 ; AVX512-NEXT:    pushq %r14
4850 ; AVX512-NEXT:    pushq %rbx
4851 ; AVX512-NEXT:    subq $24, %rsp
4852 ; AVX512-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
4853 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm0
4854 ; AVX512-NEXT:    callq __fixhfti@PLT
4855 ; AVX512-NEXT:    movq %rax, %rbx
4856 ; AVX512-NEXT:    movq %rdx, %r14
4857 ; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
4858 ; AVX512-NEXT:    callq __fixhfti@PLT
4859 ; AVX512-NEXT:    xorl %ecx, %ecx
4860 ; AVX512-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
4861 ; AVX512-NEXT:    cmpq %rsi, %rax
4862 ; AVX512-NEXT:    movq %rdx, %rdi
4863 ; AVX512-NEXT:    sbbq $0, %rdi
4864 ; AVX512-NEXT:    cmovgeq %rcx, %rdx
4865 ; AVX512-NEXT:    cmovgeq %rsi, %rax
4866 ; AVX512-NEXT:    cmpq %rsi, %rbx
4867 ; AVX512-NEXT:    movq %r14, %rdi
4868 ; AVX512-NEXT:    sbbq $0, %rdi
4869 ; AVX512-NEXT:    cmovlq %r14, %rcx
4870 ; AVX512-NEXT:    cmovlq %rbx, %rsi
4871 ; AVX512-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000
4872 ; AVX512-NEXT:    cmpq %rsi, %rdi
4873 ; AVX512-NEXT:    movq $-1, %r8
4874 ; AVX512-NEXT:    movq $-1, %r9
4875 ; AVX512-NEXT:    sbbq %rcx, %r9
4876 ; AVX512-NEXT:    cmovgeq %rdi, %rsi
4877 ; AVX512-NEXT:    cmpq %rax, %rdi
4878 ; AVX512-NEXT:    sbbq %rdx, %r8
4879 ; AVX512-NEXT:    cmovgeq %rdi, %rax
4880 ; AVX512-NEXT:    vmovq %rax, %xmm0
4881 ; AVX512-NEXT:    vmovq %rsi, %xmm1
4882 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4883 ; AVX512-NEXT:    addq $24, %rsp
4884 ; AVX512-NEXT:    popq %rbx
4885 ; AVX512-NEXT:    popq %r14
4886 ; AVX512-NEXT:    retq
4887 entry:
4888   %conv = fptosi <2 x half> %x to <2 x i128>
4889   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)
4890   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)
4891   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
4892   ret <2 x i64> %conv6
4895 define <2 x i64> @utesth_f16i64_mm(<2 x half> %x) nounwind {
4896 ; SSE-LABEL: utesth_f16i64_mm:
4897 ; SSE:       # %bb.0: # %entry
4898 ; SSE-NEXT:    pushq %r14
4899 ; SSE-NEXT:    pushq %rbx
4900 ; SSE-NEXT:    subq $24, %rsp
4901 ; SSE-NEXT:    movdqa %xmm0, %xmm1
4902 ; SSE-NEXT:    psrld $16, %xmm1
4903 ; SSE-NEXT:    movdqa %xmm1, (%rsp) # 16-byte Spill
4904 ; SSE-NEXT:    callq __fixunshfti@PLT
4905 ; SSE-NEXT:    movq %rax, %rbx
4906 ; SSE-NEXT:    movq %rdx, %r14
4907 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4908 ; SSE-NEXT:    callq __fixunshfti@PLT
4909 ; SSE-NEXT:    xorl %ecx, %ecx
4910 ; SSE-NEXT:    testq %rdx, %rdx
4911 ; SSE-NEXT:    cmovneq %rcx, %rax
4912 ; SSE-NEXT:    testq %r14, %r14
4913 ; SSE-NEXT:    cmovneq %rcx, %rbx
4914 ; SSE-NEXT:    movq %rbx, %xmm0
4915 ; SSE-NEXT:    movq %rax, %xmm1
4916 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4917 ; SSE-NEXT:    addq $24, %rsp
4918 ; SSE-NEXT:    popq %rbx
4919 ; SSE-NEXT:    popq %r14
4920 ; SSE-NEXT:    retq
4922 ; AVX2-LABEL: utesth_f16i64_mm:
4923 ; AVX2:       # %bb.0: # %entry
4924 ; AVX2-NEXT:    pushq %r14
4925 ; AVX2-NEXT:    pushq %rbx
4926 ; AVX2-NEXT:    subq $24, %rsp
4927 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4928 ; AVX2-NEXT:    callq __fixunshfti@PLT
4929 ; AVX2-NEXT:    movq %rax, %rbx
4930 ; AVX2-NEXT:    movq %rdx, %r14
4931 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
4932 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
4933 ; AVX2-NEXT:    callq __fixunshfti@PLT
4934 ; AVX2-NEXT:    xorl %ecx, %ecx
4935 ; AVX2-NEXT:    testq %rdx, %rdx
4936 ; AVX2-NEXT:    cmovneq %rcx, %rax
4937 ; AVX2-NEXT:    testq %r14, %r14
4938 ; AVX2-NEXT:    cmovneq %rcx, %rbx
4939 ; AVX2-NEXT:    vmovq %rbx, %xmm0
4940 ; AVX2-NEXT:    vmovq %rax, %xmm1
4941 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4942 ; AVX2-NEXT:    addq $24, %rsp
4943 ; AVX2-NEXT:    popq %rbx
4944 ; AVX2-NEXT:    popq %r14
4945 ; AVX2-NEXT:    retq
4947 ; AVX512-LABEL: utesth_f16i64_mm:
4948 ; AVX512:       # %bb.0: # %entry
4949 ; AVX512-NEXT:    pushq %r14
4950 ; AVX512-NEXT:    pushq %rbx
4951 ; AVX512-NEXT:    subq $24, %rsp
4952 ; AVX512-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
4953 ; AVX512-NEXT:    callq __fixunshfti@PLT
4954 ; AVX512-NEXT:    movq %rax, %rbx
4955 ; AVX512-NEXT:    movq %rdx, %r14
4956 ; AVX512-NEXT:    vpsrld $16, (%rsp), %xmm0 # 16-byte Folded Reload
4957 ; AVX512-NEXT:    callq __fixunshfti@PLT
4958 ; AVX512-NEXT:    xorl %ecx, %ecx
4959 ; AVX512-NEXT:    testq %rdx, %rdx
4960 ; AVX512-NEXT:    cmovneq %rcx, %rax
4961 ; AVX512-NEXT:    testq %r14, %r14
4962 ; AVX512-NEXT:    cmovneq %rcx, %rbx
4963 ; AVX512-NEXT:    vmovq %rbx, %xmm0
4964 ; AVX512-NEXT:    vmovq %rax, %xmm1
4965 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4966 ; AVX512-NEXT:    addq $24, %rsp
4967 ; AVX512-NEXT:    popq %rbx
4968 ; AVX512-NEXT:    popq %r14
4969 ; AVX512-NEXT:    retq
4970 entry:
4971   %conv = fptoui <2 x half> %x to <2 x i128>
4972   %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
4973   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
4974   ret <2 x i64> %conv6
4977 define <2 x i64> @ustest_f16i64_mm(<2 x half> %x) nounwind {
4978 ; SSE-LABEL: ustest_f16i64_mm:
4979 ; SSE:       # %bb.0: # %entry
4980 ; SSE-NEXT:    pushq %r14
4981 ; SSE-NEXT:    pushq %rbx
4982 ; SSE-NEXT:    subq $24, %rsp
4983 ; SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
4984 ; SSE-NEXT:    psrld $16, %xmm0
4985 ; SSE-NEXT:    callq __fixhfti@PLT
4986 ; SSE-NEXT:    movq %rax, %rbx
4987 ; SSE-NEXT:    movq %rdx, %r14
4988 ; SSE-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
4989 ; SSE-NEXT:    callq __fixhfti@PLT
4990 ; SSE-NEXT:    xorl %ecx, %ecx
4991 ; SSE-NEXT:    testq %rdx, %rdx
4992 ; SSE-NEXT:    cmovgq %rcx, %rax
4993 ; SSE-NEXT:    movl $1, %esi
4994 ; SSE-NEXT:    cmovgq %rsi, %rdx
4995 ; SSE-NEXT:    testq %r14, %r14
4996 ; SSE-NEXT:    cmovgq %rcx, %rbx
4997 ; SSE-NEXT:    cmovleq %r14, %rsi
4998 ; SSE-NEXT:    testq %rsi, %rsi
4999 ; SSE-NEXT:    cmovsq %rcx, %rbx
5000 ; SSE-NEXT:    testq %rdx, %rdx
5001 ; SSE-NEXT:    cmovsq %rcx, %rax
5002 ; SSE-NEXT:    movq %rax, %xmm0
5003 ; SSE-NEXT:    movq %rbx, %xmm1
5004 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
5005 ; SSE-NEXT:    addq $24, %rsp
5006 ; SSE-NEXT:    popq %rbx
5007 ; SSE-NEXT:    popq %r14
5008 ; SSE-NEXT:    retq
5010 ; AVX-LABEL: ustest_f16i64_mm:
5011 ; AVX:       # %bb.0: # %entry
5012 ; AVX-NEXT:    pushq %r14
5013 ; AVX-NEXT:    pushq %rbx
5014 ; AVX-NEXT:    subq $24, %rsp
5015 ; AVX-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill
5016 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm0
5017 ; AVX-NEXT:    callq __fixhfti@PLT
5018 ; AVX-NEXT:    movq %rax, %rbx
5019 ; AVX-NEXT:    movq %rdx, %r14
5020 ; AVX-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
5021 ; AVX-NEXT:    callq __fixhfti@PLT
5022 ; AVX-NEXT:    xorl %ecx, %ecx
5023 ; AVX-NEXT:    testq %rdx, %rdx
5024 ; AVX-NEXT:    cmovgq %rcx, %rax
5025 ; AVX-NEXT:    movl $1, %esi
5026 ; AVX-NEXT:    cmovgq %rsi, %rdx
5027 ; AVX-NEXT:    testq %r14, %r14
5028 ; AVX-NEXT:    cmovgq %rcx, %rbx
5029 ; AVX-NEXT:    cmovleq %r14, %rsi
5030 ; AVX-NEXT:    testq %rsi, %rsi
5031 ; AVX-NEXT:    cmovsq %rcx, %rbx
5032 ; AVX-NEXT:    testq %rdx, %rdx
5033 ; AVX-NEXT:    cmovsq %rcx, %rax
5034 ; AVX-NEXT:    vmovq %rax, %xmm0
5035 ; AVX-NEXT:    vmovq %rbx, %xmm1
5036 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
5037 ; AVX-NEXT:    addq $24, %rsp
5038 ; AVX-NEXT:    popq %rbx
5039 ; AVX-NEXT:    popq %r14
5040 ; AVX-NEXT:    retq
5041 entry:
5042   %conv = fptosi <2 x half> %x to <2 x i128>
5043   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
5044   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)
5045   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
5046   ret <2 x i64> %conv6
5049 declare <2 x i32> @llvm.smin.v2i32(<2 x i32>, <2 x i32>)
5050 declare <2 x i32> @llvm.smax.v2i32(<2 x i32>, <2 x i32>)
5051 declare <2 x i32> @llvm.umin.v2i32(<2 x i32>, <2 x i32>)
5052 declare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>)
5053 declare <4 x i32> @llvm.smax.v4i32(<4 x i32>, <4 x i32>)
5054 declare <4 x i32> @llvm.umin.v4i32(<4 x i32>, <4 x i32>)
5055 declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>)
5056 declare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>)
5057 declare <8 x i32> @llvm.umin.v8i32(<8 x i32>, <8 x i32>)
5058 declare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>)
5059 declare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>)
5060 declare <2 x i64> @llvm.umin.v2i64(<2 x i64>, <2 x i64>)
5061 declare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>)
5062 declare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>)
5063 declare <4 x i64> @llvm.umin.v4i64(<4 x i64>, <4 x i64>)
5064 declare <2 x i128> @llvm.smin.v2i128(<2 x i128>, <2 x i128>)
5065 declare <2 x i128> @llvm.smax.v2i128(<2 x i128>, <2 x i128>)
5066 declare <2 x i128> @llvm.umin.v2i128(<2 x i128>, <2 x i128>)