make reciprocal estimate code generation more flexible by adding command-line options...
[oota-llvm.git] / test / CodeGen / X86 / vec_fp_to_int.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL  --check-prefix=AVX
3
4 ;
5 ; Double to Signed Integer
6 ;
7
8 define <2 x i64> @fptosi_2vf64(<2 x double> %a) {
9 ; SSE2-LABEL: fptosi_2vf64:
10 ; SSE2:       # BB#0:
11 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
12 ; SSE2-NEXT:    movd %rax, %xmm1
13 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
14 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
15 ; SSE2-NEXT:    movd %rax, %xmm0
16 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
17 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
18 ; SSE2-NEXT:    retq
19 ;
20 ; AVX-LABEL: fptosi_2vf64:
21 ; AVX:       # BB#0:
22 ; AVX-NEXT:    vcvttsd2si %xmm0, %rax
23 ; AVX-NEXT:    vmovq %rax, %xmm1
24 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
25 ; AVX-NEXT:    vcvttsd2si %xmm0, %rax
26 ; AVX-NEXT:    vmovq %rax, %xmm0
27 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
28 ; AVX-NEXT:    retq
29   %cvt = fptosi <2 x double> %a to <2 x i64>
30   ret <2 x i64> %cvt
31 }
32
33 define <4 x i32> @fptosi_2vf64_i32(<2 x double> %a) {
34 ; SSE2-LABEL: fptosi_2vf64_i32:
35 ; SSE2:       # BB#0:
36 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
37 ; SSE2-NEXT:    movd %rax, %xmm1
38 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
39 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
40 ; SSE2-NEXT:    movd %rax, %xmm0
41 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
42 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
43 ; SSE2-NEXT:    retq
44 ;
45 ; AVX-LABEL: fptosi_2vf64_i32:
46 ; AVX:       # BB#0:
47 ; AVX-NEXT:    vcvttsd2si %xmm0, %rax
48 ; AVX-NEXT:    vmovq %rax, %xmm1
49 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
50 ; AVX-NEXT:    vcvttsd2si %xmm0, %rax
51 ; AVX-NEXT:    vmovq %rax, %xmm0
52 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
53 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
54 ; AVX-NEXT:    retq
55   %cvt = fptosi <2 x double> %a to <2 x i32>
56   %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
57   ret <4 x i32> %ext
58 }
59
60 define <4 x i64> @fptosi_4vf64(<4 x double> %a) {
61 ; SSE2-LABEL: fptosi_4vf64:
62 ; SSE2:       # BB#0:
63 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
64 ; SSE2-NEXT:    movd %rax, %xmm2
65 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
66 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
67 ; SSE2-NEXT:    movd %rax, %xmm0
68 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
69 ; SSE2-NEXT:    cvttsd2si %xmm1, %rax
70 ; SSE2-NEXT:    movd %rax, %xmm3
71 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1,0]
72 ; SSE2-NEXT:    cvttsd2si %xmm1, %rax
73 ; SSE2-NEXT:    movd %rax, %xmm0
74 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
75 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
76 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
77 ; SSE2-NEXT:    retq
78 ;
79 ; AVX-LABEL: fptosi_4vf64:
80 ; AVX:       # BB#0:
81 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
82 ; AVX-NEXT:    vcvttsd2si %xmm1, %rax
83 ; AVX-NEXT:    vmovq %rax, %xmm2
84 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
85 ; AVX-NEXT:    vcvttsd2si %xmm1, %rax
86 ; AVX-NEXT:    vmovq %rax, %xmm1
87 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
88 ; AVX-NEXT:    vcvttsd2si %xmm0, %rax
89 ; AVX-NEXT:    vmovq %rax, %xmm2
90 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
91 ; AVX-NEXT:    vcvttsd2si %xmm0, %rax
92 ; AVX-NEXT:    vmovq %rax, %xmm0
93 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
94 ; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
95 ; AVX-NEXT:    retq
96   %cvt = fptosi <4 x double> %a to <4 x i64>
97   ret <4 x i64> %cvt
98 }
99
100 define <4 x i32> @fptosi_4vf64_i32(<4 x double> %a) {
101 ; SSE2-LABEL: fptosi_4vf64_i32:
102 ; SSE2:       # BB#0:
103 ; SSE2-NEXT:    cvttsd2si %xmm1, %rax
104 ; SSE2-NEXT:    movd %rax, %xmm2
105 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1,0]
106 ; SSE2-NEXT:    cvttsd2si %xmm1, %rax
107 ; SSE2-NEXT:    movd %rax, %xmm1
108 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
109 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
110 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
111 ; SSE2-NEXT:    movd %rax, %xmm2
112 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
113 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
114 ; SSE2-NEXT:    movd %rax, %xmm0
115 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
116 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
117 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
118 ; SSE2-NEXT:    retq
119 ;
120 ; AVX-LABEL: fptosi_4vf64_i32:
121 ; AVX:       # BB#0:
122 ; AVX-NEXT:    vcvttpd2dqy %ymm0, %xmm0
123 ; AVX-NEXT:    vzeroupper
124 ; AVX-NEXT:    retq
125   %cvt = fptosi <4 x double> %a to <4 x i32>
126   ret <4 x i32> %cvt
127 }
128
129 ;
130 ; Double to Unsigned Integer
131 ;
132
133 define <2 x i64> @fptoui_2vf64(<2 x double> %a) {
134 ; SSE2-LABEL: fptoui_2vf64:
135 ; SSE2:       # BB#0:
136 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
137 ; SSE2-NEXT:    movapd %xmm0, %xmm1
138 ; SSE2-NEXT:    subsd %xmm2, %xmm1
139 ; SSE2-NEXT:    cvttsd2si %xmm1, %rax
140 ; SSE2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
141 ; SSE2-NEXT:    xorq %rcx, %rax
142 ; SSE2-NEXT:    cvttsd2si %xmm0, %rdx
143 ; SSE2-NEXT:    ucomisd %xmm2, %xmm0
144 ; SSE2-NEXT:    cmovaeq %rax, %rdx
145 ; SSE2-NEXT:    movd %rdx, %xmm1
146 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
147 ; SSE2-NEXT:    movapd %xmm0, %xmm3
148 ; SSE2-NEXT:    subsd %xmm2, %xmm3
149 ; SSE2-NEXT:    cvttsd2si %xmm3, %rax
150 ; SSE2-NEXT:    xorq %rcx, %rax
151 ; SSE2-NEXT:    cvttsd2si %xmm0, %rcx
152 ; SSE2-NEXT:    ucomisd %xmm2, %xmm0
153 ; SSE2-NEXT:    cmovaeq %rax, %rcx
154 ; SSE2-NEXT:    movd %rcx, %xmm0
155 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
156 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
157 ; SSE2-NEXT:    retq
158 ;
159 ; AVX-LABEL: fptoui_2vf64:
160 ; AVX:       # BB#0:
161 ; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
162 ; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm2
163 ; AVX-NEXT:    vcvttsd2si %xmm2, %rax
164 ; AVX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
165 ; AVX-NEXT:    xorq %rcx, %rax
166 ; AVX-NEXT:    vcvttsd2si %xmm0, %rdx
167 ; AVX-NEXT:    vucomisd %xmm1, %xmm0
168 ; AVX-NEXT:    cmovaeq %rax, %rdx
169 ; AVX-NEXT:    vmovq %rdx, %xmm2
170 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
171 ; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
172 ; AVX-NEXT:    vcvttsd2si %xmm3, %rax
173 ; AVX-NEXT:    xorq %rcx, %rax
174 ; AVX-NEXT:    vcvttsd2si %xmm0, %rcx
175 ; AVX-NEXT:    vucomisd %xmm1, %xmm0
176 ; AVX-NEXT:    cmovaeq %rax, %rcx
177 ; AVX-NEXT:    vmovq %rcx, %xmm0
178 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
179 ; AVX-NEXT:    retq
180   %cvt = fptoui <2 x double> %a to <2 x i64>
181   ret <2 x i64> %cvt
182 }
183
184 define <4 x i32> @fptoui_2vf64_i32(<2 x double> %a) {
185 ; SSE2-LABEL: fptoui_2vf64_i32:
186 ; SSE2:       # BB#0:
187 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
188 ; SSE2-NEXT:    movapd %xmm0, %xmm2
189 ; SSE2-NEXT:    subsd %xmm1, %xmm2
190 ; SSE2-NEXT:    cvttsd2si %xmm2, %rax
191 ; SSE2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
192 ; SSE2-NEXT:    xorq %rcx, %rax
193 ; SSE2-NEXT:    cvttsd2si %xmm0, %rdx
194 ; SSE2-NEXT:    ucomisd %xmm1, %xmm0
195 ; SSE2-NEXT:    cmovaeq %rax, %rdx
196 ; SSE2-NEXT:    movd %rdx, %xmm2
197 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
198 ; SSE2-NEXT:    movapd %xmm0, %xmm3
199 ; SSE2-NEXT:    subsd %xmm1, %xmm3
200 ; SSE2-NEXT:    cvttsd2si %xmm3, %rax
201 ; SSE2-NEXT:    xorq %rcx, %rax
202 ; SSE2-NEXT:    cvttsd2si %xmm0, %rcx
203 ; SSE2-NEXT:    ucomisd %xmm1, %xmm0
204 ; SSE2-NEXT:    cmovaeq %rax, %rcx
205 ; SSE2-NEXT:    movd %rcx, %xmm0
206 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
207 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
208 ; SSE2-NEXT:    retq
209 ;
210 ; AVX-LABEL: fptoui_2vf64_i32:
211 ; AVX:       # BB#0:
212 ; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
213 ; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm2
214 ; AVX-NEXT:    vcvttsd2si %xmm2, %rax
215 ; AVX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
216 ; AVX-NEXT:    xorq %rcx, %rax
217 ; AVX-NEXT:    vcvttsd2si %xmm0, %rdx
218 ; AVX-NEXT:    vucomisd %xmm1, %xmm0
219 ; AVX-NEXT:    cmovaeq %rax, %rdx
220 ; AVX-NEXT:    vmovq %rdx, %xmm2
221 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
222 ; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
223 ; AVX-NEXT:    vcvttsd2si %xmm3, %rax
224 ; AVX-NEXT:    xorq %rcx, %rax
225 ; AVX-NEXT:    vcvttsd2si %xmm0, %rcx
226 ; AVX-NEXT:    vucomisd %xmm1, %xmm0
227 ; AVX-NEXT:    cmovaeq %rax, %rcx
228 ; AVX-NEXT:    vmovq %rcx, %xmm0
229 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
230 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
231 ; AVX-NEXT:    retq
232   %cvt = fptoui <2 x double> %a to <2 x i32>
233   %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
234   ret <4 x i32> %ext
235 }
236
237 define <4 x i64> @fptoui_4vf64(<4 x double> %a) {
238 ; SSE2-LABEL: fptoui_4vf64:
239 ; SSE2:       # BB#0:
240 ; SSE2-NEXT:    movapd %xmm0, %xmm2
241 ; SSE2-NEXT:    movsd {{.*#+}} xmm3 = mem[0],zero
242 ; SSE2-NEXT:    subsd %xmm3, %xmm0
243 ; SSE2-NEXT:    cvttsd2si %xmm0, %rcx
244 ; SSE2-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
245 ; SSE2-NEXT:    xorq %rax, %rcx
246 ; SSE2-NEXT:    cvttsd2si %xmm2, %rdx
247 ; SSE2-NEXT:    ucomisd %xmm3, %xmm2
248 ; SSE2-NEXT:    cmovaeq %rcx, %rdx
249 ; SSE2-NEXT:    movd %rdx, %xmm0
250 ; SSE2-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[1,0]
251 ; SSE2-NEXT:    movapd %xmm2, %xmm4
252 ; SSE2-NEXT:    subsd %xmm3, %xmm4
253 ; SSE2-NEXT:    cvttsd2si %xmm4, %rcx
254 ; SSE2-NEXT:    xorq %rax, %rcx
255 ; SSE2-NEXT:    cvttsd2si %xmm2, %rdx
256 ; SSE2-NEXT:    ucomisd %xmm3, %xmm2
257 ; SSE2-NEXT:    cmovaeq %rcx, %rdx
258 ; SSE2-NEXT:    movd %rdx, %xmm2
259 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
260 ; SSE2-NEXT:    movapd %xmm1, %xmm2
261 ; SSE2-NEXT:    subsd %xmm3, %xmm2
262 ; SSE2-NEXT:    cvttsd2si %xmm2, %rcx
263 ; SSE2-NEXT:    xorq %rax, %rcx
264 ; SSE2-NEXT:    cvttsd2si %xmm1, %rdx
265 ; SSE2-NEXT:    ucomisd %xmm3, %xmm1
266 ; SSE2-NEXT:    cmovaeq %rcx, %rdx
267 ; SSE2-NEXT:    movd %rdx, %xmm2
268 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1,0]
269 ; SSE2-NEXT:    movapd %xmm1, %xmm4
270 ; SSE2-NEXT:    subsd %xmm3, %xmm4
271 ; SSE2-NEXT:    cvttsd2si %xmm4, %rcx
272 ; SSE2-NEXT:    xorq %rax, %rcx
273 ; SSE2-NEXT:    cvttsd2si %xmm1, %rax
274 ; SSE2-NEXT:    ucomisd %xmm3, %xmm1
275 ; SSE2-NEXT:    cmovaeq %rcx, %rax
276 ; SSE2-NEXT:    movd %rax, %xmm1
277 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
278 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
279 ; SSE2-NEXT:    retq
280 ;
281 ; AVX-LABEL: fptoui_4vf64:
282 ; AVX:       # BB#0:
283 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm2
284 ; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
285 ; AVX-NEXT:    vsubsd %xmm1, %xmm2, %xmm3
286 ; AVX-NEXT:    vcvttsd2si %xmm3, %rax
287 ; AVX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
288 ; AVX-NEXT:    xorq %rcx, %rax
289 ; AVX-NEXT:    vcvttsd2si %xmm2, %rdx
290 ; AVX-NEXT:    vucomisd %xmm1, %xmm2
291 ; AVX-NEXT:    cmovaeq %rax, %rdx
292 ; AVX-NEXT:    vmovq %rdx, %xmm3
293 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm2[1,0]
294 ; AVX-NEXT:    vsubsd %xmm1, %xmm2, %xmm4
295 ; AVX-NEXT:    vcvttsd2si %xmm4, %rax
296 ; AVX-NEXT:    xorq %rcx, %rax
297 ; AVX-NEXT:    vcvttsd2si %xmm2, %rdx
298 ; AVX-NEXT:    vucomisd %xmm1, %xmm2
299 ; AVX-NEXT:    cmovaeq %rax, %rdx
300 ; AVX-NEXT:    vmovq %rdx, %xmm2
301 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
302 ; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm3
303 ; AVX-NEXT:    vcvttsd2si %xmm3, %rax
304 ; AVX-NEXT:    xorq %rcx, %rax
305 ; AVX-NEXT:    vcvttsd2si %xmm0, %rdx
306 ; AVX-NEXT:    vucomisd %xmm1, %xmm0
307 ; AVX-NEXT:    cmovaeq %rax, %rdx
308 ; AVX-NEXT:    vmovq %rdx, %xmm3
309 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
310 ; AVX-NEXT:    vsubsd %xmm1, %xmm0, %xmm4
311 ; AVX-NEXT:    vcvttsd2si %xmm4, %rax
312 ; AVX-NEXT:    xorq %rcx, %rax
313 ; AVX-NEXT:    vcvttsd2si %xmm0, %rcx
314 ; AVX-NEXT:    vucomisd %xmm1, %xmm0
315 ; AVX-NEXT:    cmovaeq %rax, %rcx
316 ; AVX-NEXT:    vmovq %rcx, %xmm0
317 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
318 ; AVX-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
319 ; AVX-NEXT:    retq
320   %cvt = fptoui <4 x double> %a to <4 x i64>
321   ret <4 x i64> %cvt
322 }
323
324 define <4 x i32> @fptoui_4vf64_i32(<4 x double> %a) {
325 ; SSE2-LABEL: fptoui_4vf64_i32:
326 ; SSE2:       # BB#0:
327 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
328 ; SSE2-NEXT:    movapd %xmm1, %xmm3
329 ; SSE2-NEXT:    subsd %xmm2, %xmm3
330 ; SSE2-NEXT:    cvttsd2si %xmm3, %rcx
331 ; SSE2-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
332 ; SSE2-NEXT:    xorq %rax, %rcx
333 ; SSE2-NEXT:    cvttsd2si %xmm1, %rdx
334 ; SSE2-NEXT:    ucomisd %xmm2, %xmm1
335 ; SSE2-NEXT:    cmovaeq %rcx, %rdx
336 ; SSE2-NEXT:    movd %rdx, %xmm3
337 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1,0]
338 ; SSE2-NEXT:    movapd %xmm1, %xmm4
339 ; SSE2-NEXT:    subsd %xmm2, %xmm4
340 ; SSE2-NEXT:    cvttsd2si %xmm4, %rcx
341 ; SSE2-NEXT:    xorq %rax, %rcx
342 ; SSE2-NEXT:    cvttsd2si %xmm1, %rdx
343 ; SSE2-NEXT:    ucomisd %xmm2, %xmm1
344 ; SSE2-NEXT:    cmovaeq %rcx, %rdx
345 ; SSE2-NEXT:    movd %rdx, %xmm1
346 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm1[0]
347 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
348 ; SSE2-NEXT:    movapd %xmm0, %xmm3
349 ; SSE2-NEXT:    subsd %xmm2, %xmm3
350 ; SSE2-NEXT:    cvttsd2si %xmm3, %rcx
351 ; SSE2-NEXT:    xorq %rax, %rcx
352 ; SSE2-NEXT:    cvttsd2si %xmm0, %rdx
353 ; SSE2-NEXT:    ucomisd %xmm2, %xmm0
354 ; SSE2-NEXT:    cmovaeq %rcx, %rdx
355 ; SSE2-NEXT:    movd %rdx, %xmm3
356 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
357 ; SSE2-NEXT:    movapd %xmm0, %xmm4
358 ; SSE2-NEXT:    subsd %xmm2, %xmm4
359 ; SSE2-NEXT:    cvttsd2si %xmm4, %rcx
360 ; SSE2-NEXT:    xorq %rax, %rcx
361 ; SSE2-NEXT:    cvttsd2si %xmm0, %rax
362 ; SSE2-NEXT:    ucomisd %xmm2, %xmm0
363 ; SSE2-NEXT:    cmovaeq %rcx, %rax
364 ; SSE2-NEXT:    movd %rax, %xmm0
365 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
366 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
367 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
368 ; SSE2-NEXT:    retq
369 ;
370 ; AVX-LABEL: fptoui_4vf64_i32:
371 ; AVX:       # BB#0:
372 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
373 ; AVX-NEXT:    vcvttsd2si %xmm1, %rax
374 ; AVX-NEXT:    vcvttsd2si %xmm0, %rcx
375 ; AVX-NEXT:    vmovd %ecx, %xmm1
376 ; AVX-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1
377 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
378 ; AVX-NEXT:    vcvttsd2si %xmm0, %rax
379 ; AVX-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1
380 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
381 ; AVX-NEXT:    vcvttsd2si %xmm0, %rax
382 ; AVX-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0
383 ; AVX-NEXT:    vzeroupper
384 ; AVX-NEXT:    retq
385   %cvt = fptoui <4 x double> %a to <4 x i32>
386   ret <4 x i32> %cvt
387 }
388
389 ;
390 ; Float to Signed Integer
391 ;
392
393 define <4 x i32> @fptosi_4vf32(<4 x float> %a) {
394 ; SSE2-LABEL: fptosi_4vf32:
395 ; SSE2:       # BB#0:
396 ; SSE2-NEXT:    cvttps2dq %xmm0, %xmm0
397 ; SSE2-NEXT:    retq
398 ;
399 ; AVX-LABEL: fptosi_4vf32:
400 ; AVX:       # BB#0:
401 ; AVX-NEXT:    vcvttps2dq %xmm0, %xmm0
402 ; AVX-NEXT:    retq
403   %cvt = fptosi <4 x float> %a to <4 x i32>
404   ret <4 x i32> %cvt
405 }
406
407 define <2 x i64> @fptosi_4vf32_i64(<4 x float> %a) {
408 ; SSE2-LABEL: fptosi_4vf32_i64:
409 ; SSE2:       # BB#0:
410 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
411 ; SSE2-NEXT:    movd %rax, %xmm1
412 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
413 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
414 ; SSE2-NEXT:    movd %rax, %xmm0
415 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
416 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
417 ; SSE2-NEXT:    retq
418 ;
419 ; AVX-LABEL: fptosi_4vf32_i64:
420 ; AVX:       # BB#0:
421 ; AVX-NEXT:    vcvttss2si %xmm0, %rax
422 ; AVX-NEXT:    vmovq %rax, %xmm1
423 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
424 ; AVX-NEXT:    vcvttss2si %xmm0, %rax
425 ; AVX-NEXT:    vmovq %rax, %xmm0
426 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
427 ; AVX-NEXT:    retq
428   %shuf = shufflevector <4 x float> %a, <4 x float> %a, <2 x i32> <i32 0, i32 1>
429   %cvt = fptosi <2 x float> %shuf to <2 x i64>
430   ret <2 x i64> %cvt
431 }
432
433 define <8 x i32> @fptosi_8vf32(<8 x float> %a) {
434 ; SSE2-LABEL: fptosi_8vf32:
435 ; SSE2:       # BB#0:
436 ; SSE2-NEXT:    cvttps2dq %xmm0, %xmm0
437 ; SSE2-NEXT:    cvttps2dq %xmm1, %xmm1
438 ; SSE2-NEXT:    retq
439 ;
440 ; AVX-LABEL: fptosi_8vf32:
441 ; AVX:       # BB#0:
442 ; AVX-NEXT:    vcvttps2dq %ymm0, %ymm0
443 ; AVX-NEXT:    retq
444   %cvt = fptosi <8 x float> %a to <8 x i32>
445   ret <8 x i32> %cvt
446 }
447
448 define <4 x i64> @fptosi_8vf32_i64(<8 x float> %a) {
449 ; SSE2-LABEL: fptosi_8vf32_i64:
450 ; SSE2:       # BB#0:
451 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
452 ; SSE2-NEXT:    movd %rax, %xmm2
453 ; SSE2-NEXT:    movaps %xmm0, %xmm1
454 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,2,3]
455 ; SSE2-NEXT:    cvttss2si %xmm1, %rax
456 ; SSE2-NEXT:    movd %rax, %xmm1
457 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
458 ; SSE2-NEXT:    movaps %xmm0, %xmm1
459 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1,2,3]
460 ; SSE2-NEXT:    cvttss2si %xmm1, %rax
461 ; SSE2-NEXT:    movd %rax, %xmm3
462 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
463 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
464 ; SSE2-NEXT:    movd %rax, %xmm1
465 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
466 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
467 ; SSE2-NEXT:    retq
468 ;
469 ; AVX-LABEL: fptosi_8vf32_i64:
470 ; AVX:       # BB#0:
471 ; AVX-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3]
472 ; AVX-NEXT:    vcvttss2si %xmm1, %rax
473 ; AVX-NEXT:    vmovq %rax, %xmm1
474 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
475 ; AVX-NEXT:    vcvttss2si %xmm2, %rax
476 ; AVX-NEXT:    vmovq %rax, %xmm2
477 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
478 ; AVX-NEXT:    vcvttss2si %xmm0, %rax
479 ; AVX-NEXT:    vmovq %rax, %xmm2
480 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
481 ; AVX-NEXT:    vcvttss2si %xmm0, %rax
482 ; AVX-NEXT:    vmovq %rax, %xmm0
483 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
484 ; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
485 ; AVX-NEXT:    retq
486   %shuf = shufflevector <8 x float> %a, <8 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
487   %cvt = fptosi <4 x float> %shuf to <4 x i64>
488   ret <4 x i64> %cvt
489 }
490
491 ;
492 ; Float to Unsigned Integer
493 ;
494
495 define <4 x i32> @fptoui_4vf32(<4 x float> %a) {
496 ; SSE2-LABEL: fptoui_4vf32:
497 ; SSE2:       # BB#0:
498 ; SSE2-NEXT:    movaps %xmm0, %xmm1
499 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,1,2,3]
500 ; SSE2-NEXT:    cvttss2si %xmm1, %rax
501 ; SSE2-NEXT:    movd %eax, %xmm1
502 ; SSE2-NEXT:    movaps %xmm0, %xmm2
503 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,1,2,3]
504 ; SSE2-NEXT:    cvttss2si %xmm2, %rax
505 ; SSE2-NEXT:    movd %eax, %xmm2
506 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
507 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
508 ; SSE2-NEXT:    movd %eax, %xmm1
509 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
510 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
511 ; SSE2-NEXT:    movd %eax, %xmm0
512 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
513 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
514 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
515 ; SSE2-NEXT:    retq
516 ;
517 ; AVX-LABEL: fptoui_4vf32:
518 ; AVX:       # BB#0:
519 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
520 ; AVX-NEXT:    vcvttss2si %xmm1, %rax
521 ; AVX-NEXT:    vcvttss2si %xmm0, %rcx
522 ; AVX-NEXT:    vmovd %ecx, %xmm1
523 ; AVX-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1
524 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
525 ; AVX-NEXT:    vcvttss2si %xmm2, %rax
526 ; AVX-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1
527 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
528 ; AVX-NEXT:    vcvttss2si %xmm0, %rax
529 ; AVX-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0
530 ; AVX-NEXT:    retq
531   %cvt = fptoui <4 x float> %a to <4 x i32>
532   ret <4 x i32> %cvt
533 }
534
535 define <2 x i64> @fptoui_4vf32_i64(<4 x float> %a) {
536 ; SSE2-LABEL: fptoui_4vf32_i64:
537 ; SSE2:       # BB#0:
538 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
539 ; SSE2-NEXT:    movaps %xmm0, %xmm1
540 ; SSE2-NEXT:    subss %xmm2, %xmm1
541 ; SSE2-NEXT:    cvttss2si %xmm1, %rax
542 ; SSE2-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
543 ; SSE2-NEXT:    xorq %rcx, %rax
544 ; SSE2-NEXT:    cvttss2si %xmm0, %rdx
545 ; SSE2-NEXT:    ucomiss %xmm2, %xmm0
546 ; SSE2-NEXT:    cmovaeq %rax, %rdx
547 ; SSE2-NEXT:    movd %rdx, %xmm1
548 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,2,3]
549 ; SSE2-NEXT:    movaps %xmm0, %xmm3
550 ; SSE2-NEXT:    subss %xmm2, %xmm3
551 ; SSE2-NEXT:    cvttss2si %xmm3, %rax
552 ; SSE2-NEXT:    xorq %rcx, %rax
553 ; SSE2-NEXT:    cvttss2si %xmm0, %rcx
554 ; SSE2-NEXT:    ucomiss %xmm2, %xmm0
555 ; SSE2-NEXT:    cmovaeq %rax, %rcx
556 ; SSE2-NEXT:    movd %rcx, %xmm0
557 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
558 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
559 ; SSE2-NEXT:    retq
560 ;
561 ; AVX-LABEL: fptoui_4vf32_i64:
562 ; AVX:       # BB#0:
563 ; AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
564 ; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm2
565 ; AVX-NEXT:    vcvttss2si %xmm2, %rax
566 ; AVX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
567 ; AVX-NEXT:    xorq %rcx, %rax
568 ; AVX-NEXT:    vcvttss2si %xmm0, %rdx
569 ; AVX-NEXT:    vucomiss %xmm1, %xmm0
570 ; AVX-NEXT:    cmovaeq %rax, %rdx
571 ; AVX-NEXT:    vmovq %rdx, %xmm2
572 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
573 ; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm3
574 ; AVX-NEXT:    vcvttss2si %xmm3, %rax
575 ; AVX-NEXT:    xorq %rcx, %rax
576 ; AVX-NEXT:    vcvttss2si %xmm0, %rcx
577 ; AVX-NEXT:    vucomiss %xmm1, %xmm0
578 ; AVX-NEXT:    cmovaeq %rax, %rcx
579 ; AVX-NEXT:    vmovq %rcx, %xmm0
580 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
581 ; AVX-NEXT:    retq
582   %shuf = shufflevector <4 x float> %a, <4 x float> %a, <2 x i32> <i32 0, i32 1>
583   %cvt = fptoui <2 x float> %shuf to <2 x i64>
584   ret <2 x i64> %cvt
585 }
586
587 define <8 x i32> @fptoui_8vf32(<8 x float> %a) {
588 ; SSE2-LABEL: fptoui_8vf32:
589 ; SSE2:       # BB#0:
590 ; SSE2-NEXT:    movaps %xmm0, %xmm2
591 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1,2,3]
592 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
593 ; SSE2-NEXT:    movd %eax, %xmm0
594 ; SSE2-NEXT:    movaps %xmm2, %xmm3
595 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1,2,3]
596 ; SSE2-NEXT:    cvttss2si %xmm3, %rax
597 ; SSE2-NEXT:    movd %eax, %xmm3
598 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]
599 ; SSE2-NEXT:    cvttss2si %xmm2, %rax
600 ; SSE2-NEXT:    movd %eax, %xmm0
601 ; SSE2-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[1,0]
602 ; SSE2-NEXT:    cvttss2si %xmm2, %rax
603 ; SSE2-NEXT:    movd %eax, %xmm2
604 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
605 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
606 ; SSE2-NEXT:    movaps %xmm1, %xmm2
607 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[3,1,2,3]
608 ; SSE2-NEXT:    cvttss2si %xmm2, %rax
609 ; SSE2-NEXT:    movd %eax, %xmm2
610 ; SSE2-NEXT:    movaps %xmm1, %xmm3
611 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1,2,3]
612 ; SSE2-NEXT:    cvttss2si %xmm3, %rax
613 ; SSE2-NEXT:    movd %eax, %xmm3
614 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
615 ; SSE2-NEXT:    cvttss2si %xmm1, %rax
616 ; SSE2-NEXT:    movd %eax, %xmm2
617 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1,0]
618 ; SSE2-NEXT:    cvttss2si %xmm1, %rax
619 ; SSE2-NEXT:    movd %eax, %xmm1
620 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
621 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
622 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
623 ; SSE2-NEXT:    retq
624 ;
625 ; AVX-LABEL: fptoui_8vf32:
626 ; AVX:       # BB#0:
627 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
628 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
629 ; AVX-NEXT:    vcvttss2si %xmm2, %rax
630 ; AVX-NEXT:    vcvttss2si %xmm1, %rcx
631 ; AVX-NEXT:    vmovd %ecx, %xmm2
632 ; AVX-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
633 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm1[1,0]
634 ; AVX-NEXT:    vcvttss2si %xmm3, %rax
635 ; AVX-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
636 ; AVX-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3]
637 ; AVX-NEXT:    vcvttss2si %xmm1, %rax
638 ; AVX-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
639 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
640 ; AVX-NEXT:    vcvttss2si %xmm2, %rax
641 ; AVX-NEXT:    vcvttss2si %xmm0, %rcx
642 ; AVX-NEXT:    vmovd %ecx, %xmm2
643 ; AVX-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
644 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
645 ; AVX-NEXT:    vcvttss2si %xmm3, %rax
646 ; AVX-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
647 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
648 ; AVX-NEXT:    vcvttss2si %xmm0, %rax
649 ; AVX-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm0
650 ; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
651 ; AVX-NEXT:    retq
652   %cvt = fptoui <8 x float> %a to <8 x i32>
653   ret <8 x i32> %cvt
654 }
655
656 define <4 x i64> @fptoui_8vf32_i64(<8 x float> %a) {
657 ; SSE2-LABEL: fptoui_8vf32_i64:
658 ; SSE2:       # BB#0:
659 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
660 ; SSE2-NEXT:    movaps %xmm0, %xmm2
661 ; SSE2-NEXT:    subss %xmm1, %xmm2
662 ; SSE2-NEXT:    cvttss2si %xmm2, %rcx
663 ; SSE2-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
664 ; SSE2-NEXT:    xorq %rax, %rcx
665 ; SSE2-NEXT:    cvttss2si %xmm0, %rdx
666 ; SSE2-NEXT:    ucomiss %xmm1, %xmm0
667 ; SSE2-NEXT:    cmovaeq %rcx, %rdx
668 ; SSE2-NEXT:    movd %rdx, %xmm2
669 ; SSE2-NEXT:    movaps %xmm0, %xmm3
670 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1,2,3]
671 ; SSE2-NEXT:    movaps %xmm3, %xmm4
672 ; SSE2-NEXT:    subss %xmm1, %xmm4
673 ; SSE2-NEXT:    cvttss2si %xmm4, %rcx
674 ; SSE2-NEXT:    xorq %rax, %rcx
675 ; SSE2-NEXT:    cvttss2si %xmm3, %rdx
676 ; SSE2-NEXT:    ucomiss %xmm1, %xmm3
677 ; SSE2-NEXT:    cmovaeq %rcx, %rdx
678 ; SSE2-NEXT:    movd %rdx, %xmm3
679 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
680 ; SSE2-NEXT:    movaps %xmm0, %xmm3
681 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[3,1,2,3]
682 ; SSE2-NEXT:    movaps %xmm3, %xmm4
683 ; SSE2-NEXT:    subss %xmm1, %xmm4
684 ; SSE2-NEXT:    cvttss2si %xmm4, %rcx
685 ; SSE2-NEXT:    xorq %rax, %rcx
686 ; SSE2-NEXT:    cvttss2si %xmm3, %rdx
687 ; SSE2-NEXT:    ucomiss %xmm1, %xmm3
688 ; SSE2-NEXT:    cmovaeq %rcx, %rdx
689 ; SSE2-NEXT:    movd %rdx, %xmm3
690 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
691 ; SSE2-NEXT:    movapd %xmm0, %xmm4
692 ; SSE2-NEXT:    subss %xmm1, %xmm4
693 ; SSE2-NEXT:    cvttss2si %xmm4, %rcx
694 ; SSE2-NEXT:    xorq %rax, %rcx
695 ; SSE2-NEXT:    cvttss2si %xmm0, %rax
696 ; SSE2-NEXT:    ucomiss %xmm1, %xmm0
697 ; SSE2-NEXT:    cmovaeq %rcx, %rax
698 ; SSE2-NEXT:    movd %rax, %xmm1
699 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
700 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
701 ; SSE2-NEXT:    retq
702 ;
703 ; AVX-LABEL: fptoui_8vf32_i64:
704 ; AVX:       # BB#0:
705 ; AVX-NEXT:    vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3]
706 ; AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
707 ; AVX-NEXT:    vsubss %xmm1, %xmm2, %xmm3
708 ; AVX-NEXT:    vcvttss2si %xmm3, %rax
709 ; AVX-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
710 ; AVX-NEXT:    xorq %rcx, %rax
711 ; AVX-NEXT:    vcvttss2si %xmm2, %rdx
712 ; AVX-NEXT:    vucomiss %xmm1, %xmm2
713 ; AVX-NEXT:    cmovaeq %rax, %rdx
714 ; AVX-NEXT:    vmovq %rdx, %xmm2
715 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm0[1,0]
716 ; AVX-NEXT:    vsubss %xmm1, %xmm3, %xmm4
717 ; AVX-NEXT:    vcvttss2si %xmm4, %rax
718 ; AVX-NEXT:    xorq %rcx, %rax
719 ; AVX-NEXT:    vcvttss2si %xmm3, %rdx
720 ; AVX-NEXT:    vucomiss %xmm1, %xmm3
721 ; AVX-NEXT:    cmovaeq %rax, %rdx
722 ; AVX-NEXT:    vmovq %rdx, %xmm3
723 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]
724 ; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm3
725 ; AVX-NEXT:    vcvttss2si %xmm3, %rax
726 ; AVX-NEXT:    xorq %rcx, %rax
727 ; AVX-NEXT:    vcvttss2si %xmm0, %rdx
728 ; AVX-NEXT:    vucomiss %xmm1, %xmm0
729 ; AVX-NEXT:    cmovaeq %rax, %rdx
730 ; AVX-NEXT:    vmovq %rdx, %xmm3
731 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
732 ; AVX-NEXT:    vsubss %xmm1, %xmm0, %xmm4
733 ; AVX-NEXT:    vcvttss2si %xmm4, %rax
734 ; AVX-NEXT:    xorq %rcx, %rax
735 ; AVX-NEXT:    vcvttss2si %xmm0, %rcx
736 ; AVX-NEXT:    vucomiss %xmm1, %xmm0
737 ; AVX-NEXT:    cmovaeq %rax, %rcx
738 ; AVX-NEXT:    vmovq %rcx, %xmm0
739 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]
740 ; AVX-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
741 ; AVX-NEXT:    retq
742   %shuf = shufflevector <8 x float> %a, <8 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
743   %cvt = fptoui <4 x float> %shuf to <4 x i64>
744   ret <4 x i64> %cvt
745 }
746
747 ;
748 ; Constant Folding
749 ;
750
751 define <2 x i64> @fptosi_2vf64c() {
752 ; SSE2-LABEL: fptosi_2vf64c:
753 ; SSE2:       # BB#0:
754 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
755 ; SSE2-NEXT:    retq
756 ;
757 ; AVX-LABEL: fptosi_2vf64c:
758 ; AVX:       # BB#0:
759 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,18446744073709551615]
760 ; AVX-NEXT:    retq
761   %cvt = fptosi <2 x double> <double 1.0, double -1.0> to <2 x i64>
762   ret <2 x i64> %cvt
763 }
764
765 define <4 x i32> @fptosi_2vf64c_i32() {
766 ; SSE2-LABEL: fptosi_2vf64c_i32:
767 ; SSE2:       # BB#0:
768 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = <4294967295,1,u,u>
769 ; SSE2-NEXT:    retq
770 ;
771 ; AVX-LABEL: fptosi_2vf64c_i32:
772 ; AVX:       # BB#0:
773 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = <4294967295,1,u,u>
774 ; AVX-NEXT:    retq
775   %cvt = fptosi <2 x double> <double -1.0, double 1.0> to <2 x i32>
776   %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
777   ret <4 x i32> %ext
778 }
779
780 define <4 x i64> @fptosi_4vf64c() {
781 ; SSE2-LABEL: fptosi_4vf64c:
782 ; SSE2:       # BB#0:
783 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
784 ; SSE2-NEXT:    movaps {{.*#+}} xmm1 = [2,18446744073709551613]
785 ; SSE2-NEXT:    retq
786 ;
787 ; AVX-LABEL: fptosi_4vf64c:
788 ; AVX:       # BB#0:
789 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,18446744073709551613]
790 ; AVX-NEXT:    retq
791   %cvt = fptosi <4 x double> <double 1.0, double -1.0, double 2.0, double -3.0> to <4 x i64>
792   ret <4 x i64> %cvt
793 }
794
795 define <4 x i32> @fptosi_4vf64c_i32() {
796 ; SSE2-LABEL: fptosi_4vf64c_i32:
797 ; SSE2:       # BB#0:
798 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3]
799 ; SSE2-NEXT:    retq
800 ;
801 ; AVX-LABEL: fptosi_4vf64c_i32:
802 ; AVX:       # BB#0:
803 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3]
804 ; AVX-NEXT:    retq
805   %cvt = fptosi <4 x double> <double -1.0, double 1.0, double -2.0, double 3.0> to <4 x i32>
806   ret <4 x i32> %cvt
807 }
808
809 define <2 x i64> @fptoui_2vf64c() {
810 ; SSE2-LABEL: fptoui_2vf64c:
811 ; SSE2:       # BB#0:
812 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [2,4]
813 ; SSE2-NEXT:    retq
814 ;
815 ; AVX-LABEL: fptoui_2vf64c:
816 ; AVX:       # BB#0:
817 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [2,4]
818 ; AVX-NEXT:    retq
819   %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i64>
820   ret <2 x i64> %cvt
821 }
822
823 define <4 x i32> @fptoui_2vf64c_i32(<2 x double> %a) {
824 ; SSE2-LABEL: fptoui_2vf64c_i32:
825 ; SSE2:       # BB#0:
826 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = <2,4,u,u>
827 ; SSE2-NEXT:    retq
828 ;
829 ; AVX-LABEL: fptoui_2vf64c_i32:
830 ; AVX:       # BB#0:
831 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = <2,4,u,u>
832 ; AVX-NEXT:    retq
833   %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i32>
834   %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
835   ret <4 x i32> %ext
836 }
837
838 define <4 x i64> @fptoui_4vf64c(<4 x double> %a) {
839 ; SSE2-LABEL: fptoui_4vf64c:
840 ; SSE2:       # BB#0:
841 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [2,4]
842 ; SSE2-NEXT:    movaps {{.*#+}} xmm1 = [6,8]
843 ; SSE2-NEXT:    retq
844 ;
845 ; AVX-LABEL: fptoui_4vf64c:
846 ; AVX:       # BB#0:
847 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [2,4,6,8]
848 ; AVX-NEXT:    retq
849   %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i64>
850   ret <4 x i64> %cvt
851 }
852
853 define <4 x i32> @fptoui_4vf64c_i32(<4 x double> %a) {
854 ; SSE2-LABEL: fptoui_4vf64c_i32:
855 ; SSE2:       # BB#0:
856 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [2,4,6,8]
857 ; SSE2-NEXT:    retq
858 ;
859 ; AVX-LABEL: fptoui_4vf64c_i32:
860 ; AVX:       # BB#0:
861 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [2,4,6,8]
862 ; AVX-NEXT:    retq
863   %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i32>
864   ret <4 x i32> %cvt
865 }
866
867 define <4 x i32> @fptosi_4vf32c() {
868 ; SSE2-LABEL: fptosi_4vf32c:
869 ; SSE2:       # BB#0:
870 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [1,4294967295,2,3]
871 ; SSE2-NEXT:    retq
872 ;
873 ; AVX-LABEL: fptosi_4vf32c:
874 ; AVX:       # BB#0:
875 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,4294967295,2,3]
876 ; AVX-NEXT:    retq
877   %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i32>
878   ret <4 x i32> %cvt
879 }
880
881 define <4 x i64> @fptosi_4vf32c_i64() {
882 ; SSE2-LABEL: fptosi_4vf32c_i64:
883 ; SSE2:       # BB#0:
884 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [1,18446744073709551615]
885 ; SSE2-NEXT:    movaps {{.*#+}} xmm1 = [2,3]
886 ; SSE2-NEXT:    retq
887 ;
888 ; AVX-LABEL: fptosi_4vf32c_i64:
889 ; AVX:       # BB#0:
890 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,3]
891 ; AVX-NEXT:    retq
892   %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i64>
893   ret <4 x i64> %cvt
894 }
895
896 define <8 x i32> @fptosi_8vf32c(<8 x float> %a) {
897 ; SSE2-LABEL: fptosi_8vf32c:
898 ; SSE2:       # BB#0:
899 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [1,4294967295,2,3]
900 ; SSE2-NEXT:    movaps {{.*#+}} xmm1 = [6,4294967288,2,4294967295]
901 ; SSE2-NEXT:    retq
902 ;
903 ; AVX-LABEL: fptosi_8vf32c:
904 ; AVX:       # BB#0:
905 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,4294967295,2,3,6,4294967288,2,4294967295]
906 ; AVX-NEXT:    retq
907   %cvt = fptosi <8 x float> <float 1.0, float -1.0, float 2.0, float 3.0, float 6.0, float -8.0, float 2.0, float -1.0> to <8 x i32>
908   ret <8 x i32> %cvt
909 }
910
911 define <4 x i32> @fptoui_4vf32c(<4 x float> %a) {
912 ; SSE2-LABEL: fptoui_4vf32c:
913 ; SSE2:       # BB#0:
914 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [1,2,4,6]
915 ; SSE2-NEXT:    retq
916 ;
917 ; AVX-LABEL: fptoui_4vf32c:
918 ; AVX:       # BB#0:
919 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,2,4,6]
920 ; AVX-NEXT:    retq
921   %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 6.0> to <4 x i32>
922   ret <4 x i32> %cvt
923 }
924
925 define <4 x i64> @fptoui_4vf32c_i64() {
926 ; SSE2-LABEL: fptoui_4vf32c_i64:
927 ; SSE2:       # BB#0:
928 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [1,2]
929 ; SSE2-NEXT:    movaps {{.*#+}} xmm1 = [4,8]
930 ; SSE2-NEXT:    retq
931 ;
932 ; AVX-LABEL: fptoui_4vf32c_i64:
933 ; AVX:       # BB#0:
934 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,2,4,8]
935 ; AVX-NEXT:    retq
936   %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 8.0> to <4 x i64>
937   ret <4 x i64> %cvt
938 }
939
940 define <8 x i32> @fptoui_8vf32c(<8 x float> %a) {
941 ; SSE2-LABEL: fptoui_8vf32c:
942 ; SSE2:       # BB#0:
943 ; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [1,2,4,6]
944 ; SSE2-NEXT:    movaps {{.*#+}} xmm1 = [8,6,4,1]
945 ; SSE2-NEXT:    retq
946 ;
947 ; AVX-LABEL: fptoui_8vf32c:
948 ; AVX:       # BB#0:
949 ; AVX-NEXT:    vmovaps {{.*#+}} ymm0 = [1,2,4,6,8,6,4,1]
950 ; AVX-NEXT:    retq
951   %cvt = fptoui <8 x float> <float 1.0, float 2.0, float 4.0, float 6.0, float 8.0, float 6.0, float 4.0, float 1.0> to <8 x i32>
952   ret <8 x i32> %cvt
953 }