]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/vector-pcmp.ll
Vendor import of llvm trunk r321017:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / vector-pcmp.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE42
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
6
7 ; Lower common integer comparisons such as 'isPositive' efficiently:
8 ; https://llvm.org/bugs/show_bug.cgi?id=26701
9
10 define <16 x i8> @test_pcmpgtb(<16 x i8> %x) {
11 ; SSE-LABEL: test_pcmpgtb:
12 ; SSE:       # %bb.0:
13 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
14 ; SSE-NEXT:    pcmpgtb %xmm1, %xmm0
15 ; SSE-NEXT:    retq
16 ;
17 ; AVX-LABEL: test_pcmpgtb:
18 ; AVX:       # %bb.0:
19 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
20 ; AVX-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
21 ; AVX-NEXT:    retq
22   %sign = ashr <16 x i8> %x, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
23   %not = xor <16 x i8> %sign, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
24   ret <16 x i8> %not
25 }
26
27 define <8 x i16> @test_pcmpgtw(<8 x i16> %x) {
28 ; SSE-LABEL: test_pcmpgtw:
29 ; SSE:       # %bb.0:
30 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
31 ; SSE-NEXT:    pcmpgtw %xmm1, %xmm0
32 ; SSE-NEXT:    retq
33 ;
34 ; AVX-LABEL: test_pcmpgtw:
35 ; AVX:       # %bb.0:
36 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
37 ; AVX-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
38 ; AVX-NEXT:    retq
39   %sign = ashr <8 x i16> %x, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
40   %not = xor <8 x i16> %sign, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
41   ret <8 x i16> %not
42 }
43
44 define <4 x i32> @test_pcmpgtd(<4 x i32> %x) {
45 ; SSE-LABEL: test_pcmpgtd:
46 ; SSE:       # %bb.0:
47 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
48 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
49 ; SSE-NEXT:    retq
50 ;
51 ; AVX-LABEL: test_pcmpgtd:
52 ; AVX:       # %bb.0:
53 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
54 ; AVX-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
55 ; AVX-NEXT:    retq
56   %sign = ashr <4 x i32> %x, <i32 31, i32 31, i32 31, i32 31>
57   %not = xor <4 x i32> %sign, <i32 -1, i32 -1, i32 -1, i32 -1>
58   ret <4 x i32> %not
59 }
60
61 define <2 x i64> @test_pcmpgtq(<2 x i64> %x) {
62 ; SSE2-LABEL: test_pcmpgtq:
63 ; SSE2:       # %bb.0:
64 ; SSE2-NEXT:    psrad $31, %xmm0
65 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
66 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
67 ; SSE2-NEXT:    pxor %xmm1, %xmm0
68 ; SSE2-NEXT:    retq
69 ;
70 ; SSE42-LABEL: test_pcmpgtq:
71 ; SSE42:       # %bb.0:
72 ; SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
73 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
74 ; SSE42-NEXT:    retq
75 ;
76 ; AVX-LABEL: test_pcmpgtq:
77 ; AVX:       # %bb.0:
78 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
79 ; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
80 ; AVX-NEXT:    retq
81   %sign = ashr <2 x i64> %x, <i64 63, i64 63>
82   %not = xor <2 x i64> %sign, <i64 -1, i64 -1>
83   ret <2 x i64> %not
84 }
85
86 define <1 x i128> @test_strange_type(<1 x i128> %x) {
87 ; SSE2-LABEL: test_strange_type:
88 ; SSE2:       # %bb.0:
89 ; SSE2-NEXT:    sarq $63, %rsi
90 ; SSE2-NEXT:    movq %rsi, %xmm0
91 ; SSE2-NEXT:    notq %rsi
92 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
93 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
94 ; SSE2-NEXT:    pxor %xmm0, %xmm1
95 ; SSE2-NEXT:    movq %xmm1, %rax
96 ; SSE2-NEXT:    movq %rsi, %rdx
97 ; SSE2-NEXT:    retq
98 ;
99 ; SSE42-LABEL: test_strange_type:
100 ; SSE42:       # %bb.0:
101 ; SSE42-NEXT:    sarq $63, %rsi
102 ; SSE42-NEXT:    movq %rsi, %xmm0
103 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
104 ; SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
105 ; SSE42-NEXT:    pxor %xmm0, %xmm1
106 ; SSE42-NEXT:    movq %xmm1, %rax
107 ; SSE42-NEXT:    pextrq $1, %xmm1, %rdx
108 ; SSE42-NEXT:    retq
109 ;
110 ; AVX1-LABEL: test_strange_type:
111 ; AVX1:       # %bb.0:
112 ; AVX1-NEXT:    sarq $63, %rsi
113 ; AVX1-NEXT:    vmovq %rsi, %xmm0
114 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
115 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
116 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
117 ; AVX1-NEXT:    vmovq %xmm0, %rax
118 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rdx
119 ; AVX1-NEXT:    retq
120 ;
121 ; AVX2-LABEL: test_strange_type:
122 ; AVX2:       # %bb.0:
123 ; AVX2-NEXT:    sarq $63, %rsi
124 ; AVX2-NEXT:    vmovq %rsi, %xmm0
125 ; AVX2-NEXT:    vpbroadcastq %xmm0, %xmm0
126 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
127 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
128 ; AVX2-NEXT:    vmovq %xmm0, %rax
129 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rdx
130 ; AVX2-NEXT:    retq
131   %sign = ashr <1 x i128> %x, <i128 127>
132   %not = xor <1 x i128> %sign, <i128 -1>
133   ret <1 x i128> %not
134 }
135
136 define <32 x i8> @test_pcmpgtb_256(<32 x i8> %x) {
137 ; SSE-LABEL: test_pcmpgtb_256:
138 ; SSE:       # %bb.0:
139 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
140 ; SSE-NEXT:    pcmpgtb %xmm2, %xmm0
141 ; SSE-NEXT:    pcmpgtb %xmm2, %xmm1
142 ; SSE-NEXT:    retq
143 ;
144 ; AVX1-LABEL: test_pcmpgtb_256:
145 ; AVX1:       # %bb.0:
146 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
147 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
148 ; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm2, %xmm1
149 ; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm2, %xmm0
150 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
151 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
152 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
153 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
154 ; AVX1-NEXT:    retq
155 ;
156 ; AVX2-LABEL: test_pcmpgtb_256:
157 ; AVX2:       # %bb.0:
158 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
159 ; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm0
160 ; AVX2-NEXT:    retq
161   %sign = ashr <32 x i8> %x, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
162   %not = xor <32 x i8> %sign, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
163   ret <32 x i8> %not
164 }
165
166 define <16 x i16> @test_pcmpgtw_256(<16 x i16> %x) {
167 ; SSE-LABEL: test_pcmpgtw_256:
168 ; SSE:       # %bb.0:
169 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
170 ; SSE-NEXT:    pcmpgtw %xmm2, %xmm0
171 ; SSE-NEXT:    pcmpgtw %xmm2, %xmm1
172 ; SSE-NEXT:    retq
173 ;
174 ; AVX1-LABEL: test_pcmpgtw_256:
175 ; AVX1:       # %bb.0:
176 ; AVX1-NEXT:    vpsraw $15, %xmm0, %xmm1
177 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
178 ; AVX1-NEXT:    vpsraw $15, %xmm0, %xmm0
179 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
180 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
181 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
182 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
183 ; AVX1-NEXT:    retq
184 ;
185 ; AVX2-LABEL: test_pcmpgtw_256:
186 ; AVX2:       # %bb.0:
187 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
188 ; AVX2-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm0
189 ; AVX2-NEXT:    retq
190   %sign = ashr <16 x i16> %x, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
191   %not = xor <16 x i16> %sign, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
192   ret <16 x i16> %not
193 }
194
195 define <8 x i32> @test_pcmpgtd_256(<8 x i32> %x) {
196 ; SSE-LABEL: test_pcmpgtd_256:
197 ; SSE:       # %bb.0:
198 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
199 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm0
200 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm1
201 ; SSE-NEXT:    retq
202 ;
203 ; AVX1-LABEL: test_pcmpgtd_256:
204 ; AVX1:       # %bb.0:
205 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm1
206 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
207 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
208 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
209 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
210 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
211 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
212 ; AVX1-NEXT:    retq
213 ;
214 ; AVX2-LABEL: test_pcmpgtd_256:
215 ; AVX2:       # %bb.0:
216 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
217 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
218 ; AVX2-NEXT:    retq
219   %sign = ashr <8 x i32> %x, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
220   %not = xor <8 x i32> %sign, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
221   ret <8 x i32> %not
222 }
223
224 define <4 x i64> @test_pcmpgtq_256(<4 x i64> %x) {
225 ; SSE2-LABEL: test_pcmpgtq_256:
226 ; SSE2:       # %bb.0:
227 ; SSE2-NEXT:    psrad $31, %xmm1
228 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
229 ; SSE2-NEXT:    psrad $31, %xmm0
230 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
231 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
232 ; SSE2-NEXT:    pxor %xmm2, %xmm0
233 ; SSE2-NEXT:    pxor %xmm2, %xmm1
234 ; SSE2-NEXT:    retq
235 ;
236 ; SSE42-LABEL: test_pcmpgtq_256:
237 ; SSE42:       # %bb.0:
238 ; SSE42-NEXT:    pcmpeqd %xmm2, %xmm2
239 ; SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
240 ; SSE42-NEXT:    pcmpgtq %xmm2, %xmm1
241 ; SSE42-NEXT:    retq
242 ;
243 ; AVX1-LABEL: test_pcmpgtq_256:
244 ; AVX1:       # %bb.0:
245 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
246 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
247 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1
248 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm0
249 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
250 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
251 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
252 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
253 ; AVX1-NEXT:    retq
254 ;
255 ; AVX2-LABEL: test_pcmpgtq_256:
256 ; AVX2:       # %bb.0:
257 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
258 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm0
259 ; AVX2-NEXT:    retq
260   %sign = ashr <4 x i64> %x, <i64 63, i64 63, i64 63, i64 63>
261   %not = xor <4 x i64> %sign, <i64 -1, i64 -1, i64 -1, i64 -1>
262   ret <4 x i64> %not
263 }
264
265 define <16 x i8> @cmpeq_zext_v16i8(<16 x i8> %a, <16 x i8> %b) {
266 ; SSE-LABEL: cmpeq_zext_v16i8:
267 ; SSE:       # %bb.0:
268 ; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
269 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
270 ; SSE-NEXT:    retq
271 ;
272 ; AVX-LABEL: cmpeq_zext_v16i8:
273 ; AVX:       # %bb.0:
274 ; AVX-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
275 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
276 ; AVX-NEXT:    retq
277   %cmp = icmp eq <16 x i8> %a, %b
278   %zext = zext <16 x i1> %cmp to <16 x i8>
279   ret <16 x i8> %zext
280 }
281
282 define <16 x i16> @cmpeq_zext_v16i16(<16 x i16> %a, <16 x i16> %b) {
283 ; SSE-LABEL: cmpeq_zext_v16i16:
284 ; SSE:       # %bb.0:
285 ; SSE-NEXT:    pcmpeqw %xmm2, %xmm0
286 ; SSE-NEXT:    psrlw $15, %xmm0
287 ; SSE-NEXT:    pcmpeqw %xmm3, %xmm1
288 ; SSE-NEXT:    psrlw $15, %xmm1
289 ; SSE-NEXT:    retq
290 ;
291 ; AVX1-LABEL: cmpeq_zext_v16i16:
292 ; AVX1:       # %bb.0:
293 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
294 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
295 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm3, %xmm2
296 ; AVX1-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
297 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
298 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
299 ; AVX1-NEXT:    retq
300 ;
301 ; AVX2-LABEL: cmpeq_zext_v16i16:
302 ; AVX2:       # %bb.0:
303 ; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
304 ; AVX2-NEXT:    vpsrlw $15, %ymm0, %ymm0
305 ; AVX2-NEXT:    retq
306   %cmp = icmp eq <16 x i16> %a, %b
307   %zext = zext <16 x i1> %cmp to <16 x i16>
308   ret <16 x i16> %zext
309 }
310
311 define <4 x i32> @cmpeq_zext_v4i32(<4 x i32> %a, <4 x i32> %b) {
312 ; SSE-LABEL: cmpeq_zext_v4i32:
313 ; SSE:       # %bb.0:
314 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm0
315 ; SSE-NEXT:    psrld $31, %xmm0
316 ; SSE-NEXT:    retq
317 ;
318 ; AVX-LABEL: cmpeq_zext_v4i32:
319 ; AVX:       # %bb.0:
320 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
321 ; AVX-NEXT:    vpsrld $31, %xmm0, %xmm0
322 ; AVX-NEXT:    retq
323   %cmp = icmp eq <4 x i32> %a, %b
324   %zext = zext <4 x i1> %cmp to <4 x i32>
325   ret <4 x i32> %zext
326 }
327
328 define <4 x i64> @cmpeq_zext_v4i64(<4 x i64> %a, <4 x i64> %b) {
329 ; SSE2-LABEL: cmpeq_zext_v4i64:
330 ; SSE2:       # %bb.0:
331 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
332 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,0,3,2]
333 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1,1]
334 ; SSE2-NEXT:    pand %xmm4, %xmm2
335 ; SSE2-NEXT:    pand %xmm2, %xmm0
336 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm1
337 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
338 ; SSE2-NEXT:    pand %xmm4, %xmm2
339 ; SSE2-NEXT:    pand %xmm2, %xmm1
340 ; SSE2-NEXT:    retq
341 ;
342 ; SSE42-LABEL: cmpeq_zext_v4i64:
343 ; SSE42:       # %bb.0:
344 ; SSE42-NEXT:    pcmpeqq %xmm2, %xmm0
345 ; SSE42-NEXT:    psrlq $63, %xmm0
346 ; SSE42-NEXT:    pcmpeqq %xmm3, %xmm1
347 ; SSE42-NEXT:    psrlq $63, %xmm1
348 ; SSE42-NEXT:    retq
349 ;
350 ; AVX1-LABEL: cmpeq_zext_v4i64:
351 ; AVX1:       # %bb.0:
352 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
353 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
354 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm3, %xmm2
355 ; AVX1-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
356 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
357 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
358 ; AVX1-NEXT:    retq
359 ;
360 ; AVX2-LABEL: cmpeq_zext_v4i64:
361 ; AVX2:       # %bb.0:
362 ; AVX2-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
363 ; AVX2-NEXT:    vpsrlq $63, %ymm0, %ymm0
364 ; AVX2-NEXT:    retq
365   %cmp = icmp eq <4 x i64> %a, %b
366   %zext = zext <4 x i1> %cmp to <4 x i64>
367   ret <4 x i64> %zext
368 }
369
370 define <32 x i8> @cmpgt_zext_v32i8(<32 x i8> %a, <32 x i8> %b) {
371 ; SSE-LABEL: cmpgt_zext_v32i8:
372 ; SSE:       # %bb.0:
373 ; SSE-NEXT:    pcmpgtb %xmm2, %xmm0
374 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
375 ; SSE-NEXT:    pand %xmm2, %xmm0
376 ; SSE-NEXT:    pcmpgtb %xmm3, %xmm1
377 ; SSE-NEXT:    pand %xmm2, %xmm1
378 ; SSE-NEXT:    retq
379 ;
380 ; AVX1-LABEL: cmpgt_zext_v32i8:
381 ; AVX1:       # %bb.0:
382 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
383 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
384 ; AVX1-NEXT:    vpcmpgtb %xmm2, %xmm3, %xmm2
385 ; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
386 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
387 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
388 ; AVX1-NEXT:    retq
389 ;
390 ; AVX2-LABEL: cmpgt_zext_v32i8:
391 ; AVX2:       # %bb.0:
392 ; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm0
393 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
394 ; AVX2-NEXT:    retq
395   %cmp = icmp sgt <32 x i8> %a, %b
396   %zext = zext <32 x i1> %cmp to <32 x i8>
397   ret <32 x i8> %zext
398 }
399
400 define <8 x i16> @cmpgt_zext_v8i16(<8 x i16> %a, <8 x i16> %b) {
401 ; SSE-LABEL: cmpgt_zext_v8i16:
402 ; SSE:       # %bb.0:
403 ; SSE-NEXT:    pcmpgtw %xmm1, %xmm0
404 ; SSE-NEXT:    psrlw $15, %xmm0
405 ; SSE-NEXT:    retq
406 ;
407 ; AVX-LABEL: cmpgt_zext_v8i16:
408 ; AVX:       # %bb.0:
409 ; AVX-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
410 ; AVX-NEXT:    vpsrlw $15, %xmm0, %xmm0
411 ; AVX-NEXT:    retq
412   %cmp = icmp sgt <8 x i16> %a, %b
413   %zext = zext <8 x i1> %cmp to <8 x i16>
414   ret <8 x i16> %zext
415 }
416
417 define <8 x i32> @cmpgt_zext_v8i32(<8 x i32> %a, <8 x i32> %b) {
418 ; SSE-LABEL: cmpgt_zext_v8i32:
419 ; SSE:       # %bb.0:
420 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm0
421 ; SSE-NEXT:    psrld $31, %xmm0
422 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm1
423 ; SSE-NEXT:    psrld $31, %xmm1
424 ; SSE-NEXT:    retq
425 ;
426 ; AVX1-LABEL: cmpgt_zext_v8i32:
427 ; AVX1:       # %bb.0:
428 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
429 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
430 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm3, %xmm2
431 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
432 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
433 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
434 ; AVX1-NEXT:    retq
435 ;
436 ; AVX2-LABEL: cmpgt_zext_v8i32:
437 ; AVX2:       # %bb.0:
438 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
439 ; AVX2-NEXT:    vpsrld $31, %ymm0, %ymm0
440 ; AVX2-NEXT:    retq
441   %cmp = icmp sgt <8 x i32> %a, %b
442   %zext = zext <8 x i1> %cmp to <8 x i32>
443   ret <8 x i32> %zext
444 }
445
446 define <2 x i64> @cmpgt_zext_v2i64(<2 x i64> %a, <2 x i64> %b) {
447 ; SSE2-LABEL: cmpgt_zext_v2i64:
448 ; SSE2:       # %bb.0:
449 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
450 ; SSE2-NEXT:    pxor %xmm2, %xmm1
451 ; SSE2-NEXT:    pxor %xmm2, %xmm0
452 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
453 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
454 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
455 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
456 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
457 ; SSE2-NEXT:    pand %xmm3, %xmm1
458 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
459 ; SSE2-NEXT:    por %xmm1, %xmm0
460 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
461 ; SSE2-NEXT:    retq
462 ;
463 ; SSE42-LABEL: cmpgt_zext_v2i64:
464 ; SSE42:       # %bb.0:
465 ; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
466 ; SSE42-NEXT:    psrlq $63, %xmm0
467 ; SSE42-NEXT:    retq
468 ;
469 ; AVX-LABEL: cmpgt_zext_v2i64:
470 ; AVX:       # %bb.0:
471 ; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
472 ; AVX-NEXT:    vpsrlq $63, %xmm0, %xmm0
473 ; AVX-NEXT:    retq
474   %cmp = icmp sgt <2 x i64> %a, %b
475   %zext = zext <2 x i1> %cmp to <2 x i64>
476   ret <2 x i64> %zext
477 }