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