blob: 4a1672a16da007b66c189e8971681e4b4ec38be9 [file] [log] [blame]
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
Simon Pilgrim55006b42017-07-05 17:30:30 +00002; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+SSE2 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+SSSE3 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX12,AVX1
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX12,AVX2
Simon Pilgrimc1927f12017-10-31 18:41:48 +00006; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512BW
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +00008
9define i4 @v4i64(<4 x i64> %a, <4 x i64> %b, <4 x i64> %c, <4 x i64> %d) {
Zvi Rackover76937332017-06-01 11:27:57 +000010; SSE2-SSSE3-LABEL: v4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000011; SSE2-SSSE3: # %bb.0:
Zvi Rackover76937332017-06-01 11:27:57 +000012; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,0,2147483648,0]
13; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm3
14; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm1
15; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm9
16; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm9
17; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
18; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm1
19; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
20; SSE2-SSSE3-NEXT: pand %xmm10, %xmm1
21; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3]
22; SSE2-SSSE3-NEXT: por %xmm1, %xmm3
23; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm2
24; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm0
25; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
26; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm1
27; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm1[0,0,2,2]
28; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
29; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
30; SSE2-SSSE3-NEXT: pand %xmm9, %xmm2
31; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
32; SSE2-SSSE3-NEXT: por %xmm2, %xmm0
33; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
Zvi Rackover76937332017-06-01 11:27:57 +000034; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm7
35; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm5
36; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm1
37; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm1
38; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
39; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm5
40; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
41; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3
42; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
43; SSE2-SSSE3-NEXT: por %xmm3, %xmm1
44; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm6
45; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm4
46; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm2
47; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm2
48; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
49; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm4
50; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
51; SSE2-SSSE3-NEXT: pand %xmm3, %xmm4
52; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
53; SSE2-SSSE3-NEXT: por %xmm4, %xmm2
54; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm1[0,2]
Simon Pilgrim0b21ef12017-09-18 16:45:05 +000055; SSE2-SSSE3-NEXT: andps %xmm0, %xmm2
Zvi Rackover76937332017-06-01 11:27:57 +000056; SSE2-SSSE3-NEXT: movmskps %xmm2, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +000057; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrima5793822017-10-31 18:43:24 +000058; SSE2-SSSE3-NEXT: retq
Zvi Rackover76937332017-06-01 11:27:57 +000059;
60; AVX1-LABEL: v4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000061; AVX1: # %bb.0:
Zvi Rackover76937332017-06-01 11:27:57 +000062; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
63; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
64; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4
65; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
Simon Pilgrim0a12c232017-10-24 15:38:16 +000066; AVX1-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
Zvi Rackover76937332017-06-01 11:27:57 +000067; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1
68; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
69; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm1
70; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +000071; AVX1-NEXT: vpackssdw %xmm1, %xmm2, %xmm1
Zvi Rackover76937332017-06-01 11:27:57 +000072; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
73; AVX1-NEXT: vmovmskps %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +000074; AVX1-NEXT: # kill: def $al killed $al killed $eax
Zvi Rackover76937332017-06-01 11:27:57 +000075; AVX1-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +000076; AVX1-NEXT: retq
Zvi Rackover76937332017-06-01 11:27:57 +000077;
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +000078; AVX2-LABEL: v4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000079; AVX2: # %bb.0:
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +000080; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm0
81; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
Simon Pilgrim0a12c232017-10-24 15:38:16 +000082; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +000083; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm1
84; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +000085; AVX2-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +000086; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
Zvi Rackover76937332017-06-01 11:27:57 +000087; AVX2-NEXT: vmovmskps %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +000088; AVX2-NEXT: # kill: def $al killed $al killed $eax
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +000089; AVX2-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +000090; AVX2-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +000091;
Simon Pilgrimc1927f12017-10-31 18:41:48 +000092; AVX512F-LABEL: v4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000093; AVX512F: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +000094; AVX512F-NEXT: vpcmpgtq %ymm1, %ymm0, %k1
95; AVX512F-NEXT: vpcmpgtq %ymm3, %ymm2, %k0 {%k1}
96; AVX512F-NEXT: kmovw %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +000097; AVX512F-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrimc1927f12017-10-31 18:41:48 +000098; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +000099; AVX512F-NEXT: retq
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000100;
101; AVX512BW-LABEL: v4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000102; AVX512BW: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000103; AVX512BW-NEXT: vpcmpgtq %ymm1, %ymm0, %k1
104; AVX512BW-NEXT: vpcmpgtq %ymm3, %ymm2, %k0 {%k1}
105; AVX512BW-NEXT: kmovd %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000106; AVX512BW-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000107; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000108; AVX512BW-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000109 %x0 = icmp sgt <4 x i64> %a, %b
110 %x1 = icmp sgt <4 x i64> %c, %d
111 %y = and <4 x i1> %x0, %x1
112 %res = bitcast <4 x i1> %y to i4
113 ret i4 %res
114}
115
116define i4 @v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d) {
Zvi Rackover76937332017-06-01 11:27:57 +0000117; SSE2-SSSE3-LABEL: v4f64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000118; SSE2-SSSE3: # %bb.0:
Zvi Rackover76937332017-06-01 11:27:57 +0000119; SSE2-SSSE3-NEXT: cmpltpd %xmm1, %xmm3
120; SSE2-SSSE3-NEXT: cmpltpd %xmm0, %xmm2
121; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
Zvi Rackover76937332017-06-01 11:27:57 +0000122; SSE2-SSSE3-NEXT: cmpltpd %xmm5, %xmm7
123; SSE2-SSSE3-NEXT: cmpltpd %xmm4, %xmm6
124; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,2],xmm7[0,2]
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000125; SSE2-SSSE3-NEXT: andps %xmm2, %xmm6
Zvi Rackover76937332017-06-01 11:27:57 +0000126; SSE2-SSSE3-NEXT: movmskps %xmm6, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000127; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrima5793822017-10-31 18:43:24 +0000128; SSE2-SSSE3-NEXT: retq
Zvi Rackover76937332017-06-01 11:27:57 +0000129;
130; AVX12-LABEL: v4f64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000131; AVX12: # %bb.0:
Zvi Rackover76937332017-06-01 11:27:57 +0000132; AVX12-NEXT: vcmpltpd %ymm0, %ymm1, %ymm0
133; AVX12-NEXT: vextractf128 $1, %ymm0, %xmm1
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000134; AVX12-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
Zvi Rackover76937332017-06-01 11:27:57 +0000135; AVX12-NEXT: vcmpltpd %ymm2, %ymm3, %ymm1
136; AVX12-NEXT: vextractf128 $1, %ymm1, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000137; AVX12-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
Zvi Rackover76937332017-06-01 11:27:57 +0000138; AVX12-NEXT: vpand %xmm1, %xmm0, %xmm0
139; AVX12-NEXT: vmovmskps %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000140; AVX12-NEXT: # kill: def $al killed $al killed $eax
Zvi Rackover76937332017-06-01 11:27:57 +0000141; AVX12-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000142; AVX12-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000143;
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000144; AVX512F-LABEL: v4f64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000145; AVX512F: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000146; AVX512F-NEXT: vcmpltpd %ymm0, %ymm1, %k1
147; AVX512F-NEXT: vcmpltpd %ymm2, %ymm3, %k0 {%k1}
148; AVX512F-NEXT: kmovw %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000149; AVX512F-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000150; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000151; AVX512F-NEXT: retq
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000152;
153; AVX512BW-LABEL: v4f64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000154; AVX512BW: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000155; AVX512BW-NEXT: vcmpltpd %ymm0, %ymm1, %k1
156; AVX512BW-NEXT: vcmpltpd %ymm2, %ymm3, %k0 {%k1}
157; AVX512BW-NEXT: kmovd %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000158; AVX512BW-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000159; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000160; AVX512BW-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000161 %x0 = fcmp ogt <4 x double> %a, %b
162 %x1 = fcmp ogt <4 x double> %c, %d
163 %y = and <4 x i1> %x0, %x1
164 %res = bitcast <4 x i1> %y to i4
165 ret i4 %res
166}
167
168define i16 @v16i16(<16 x i16> %a, <16 x i16> %b, <16 x i16> %c, <16 x i16> %d) {
Simon Pilgrimf5f291d2017-10-03 12:01:31 +0000169; SSE2-SSSE3-LABEL: v16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000170; SSE2-SSSE3: # %bb.0:
Simon Pilgrimf5f291d2017-10-03 12:01:31 +0000171; SSE2-SSSE3-NEXT: pcmpgtw %xmm3, %xmm1
172; SSE2-SSSE3-NEXT: pcmpgtw %xmm2, %xmm0
173; SSE2-SSSE3-NEXT: packsswb %xmm1, %xmm0
174; SSE2-SSSE3-NEXT: pcmpgtw %xmm7, %xmm5
175; SSE2-SSSE3-NEXT: pcmpgtw %xmm6, %xmm4
176; SSE2-SSSE3-NEXT: packsswb %xmm5, %xmm4
177; SSE2-SSSE3-NEXT: pand %xmm0, %xmm4
178; SSE2-SSSE3-NEXT: pmovmskb %xmm4, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000179; SSE2-SSSE3-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrima5793822017-10-31 18:43:24 +0000180; SSE2-SSSE3-NEXT: retq
Zvi Rackover76937332017-06-01 11:27:57 +0000181;
182; AVX1-LABEL: v16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000183; AVX1: # %bb.0:
Zvi Rackover76937332017-06-01 11:27:57 +0000184; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
185; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
186; AVX1-NEXT: vpcmpgtw %xmm4, %xmm5, %xmm4
187; AVX1-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
188; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm0
189; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1
190; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
191; AVX1-NEXT: vpcmpgtw %xmm1, %xmm4, %xmm1
192; AVX1-NEXT: vpcmpgtw %xmm3, %xmm2, %xmm2
193; AVX1-NEXT: vpacksswb %xmm1, %xmm2, %xmm1
194; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
195; AVX1-NEXT: vpmovmskb %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000196; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
Zvi Rackover76937332017-06-01 11:27:57 +0000197; AVX1-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000198; AVX1-NEXT: retq
Zvi Rackover76937332017-06-01 11:27:57 +0000199;
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000200; AVX2-LABEL: v16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000201; AVX2: # %bb.0:
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000202; AVX2-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm0
203; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
204; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
205; AVX2-NEXT: vpcmpgtw %ymm3, %ymm2, %ymm1
206; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
207; AVX2-NEXT: vpacksswb %xmm2, %xmm1, %xmm1
208; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
Zvi Rackover76937332017-06-01 11:27:57 +0000209; AVX2-NEXT: vpmovmskb %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000210; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000211; AVX2-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000212; AVX2-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000213;
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000214; AVX512F-LABEL: v16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000215; AVX512F: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000216; AVX512F-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm0
217; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000218; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1
219; AVX512F-NEXT: vpcmpgtw %ymm3, %ymm2, %ymm0
220; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000221; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 {%k1}
222; AVX512F-NEXT: kmovw %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000223; AVX512F-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000224; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000225; AVX512F-NEXT: retq
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000226;
227; AVX512BW-LABEL: v16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000228; AVX512BW: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000229; AVX512BW-NEXT: vpcmpgtw %ymm1, %ymm0, %k1
230; AVX512BW-NEXT: vpcmpgtw %ymm3, %ymm2, %k0 {%k1}
231; AVX512BW-NEXT: kmovd %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000232; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000233; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000234; AVX512BW-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000235 %x0 = icmp sgt <16 x i16> %a, %b
236 %x1 = icmp sgt <16 x i16> %c, %d
237 %y = and <16 x i1> %x0, %x1
238 %res = bitcast <16 x i1> %y to i16
239 ret i16 %res
240}
241
242define i8 @v8i32(<8 x i32> %a, <8 x i32> %b, <8 x i32> %c, <8 x i32> %d) {
Simon Pilgrim321e54f2017-10-23 22:05:02 +0000243; SSE2-SSSE3-LABEL: v8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000244; SSE2-SSSE3: # %bb.0:
Simon Pilgrim321e54f2017-10-23 22:05:02 +0000245; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm1
246; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm0
247; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0
248; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm5
249; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm4
250; SSE2-SSSE3-NEXT: packssdw %xmm5, %xmm4
251; SSE2-SSSE3-NEXT: pand %xmm0, %xmm4
252; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm4
253; SSE2-SSSE3-NEXT: pmovmskb %xmm4, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000254; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrima5793822017-10-31 18:43:24 +0000255; SSE2-SSSE3-NEXT: retq
Zvi Rackover76937332017-06-01 11:27:57 +0000256;
257; AVX1-LABEL: v8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000258; AVX1: # %bb.0:
Zvi Rackover76937332017-06-01 11:27:57 +0000259; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
260; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
261; AVX1-NEXT: vpcmpgtd %xmm4, %xmm5, %xmm4
262; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000263; AVX1-NEXT: vpackssdw %xmm4, %xmm0, %xmm0
Zvi Rackover76937332017-06-01 11:27:57 +0000264; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1
265; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
266; AVX1-NEXT: vpcmpgtd %xmm1, %xmm4, %xmm1
267; AVX1-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000268; AVX1-NEXT: vpackssdw %xmm1, %xmm2, %xmm1
Zvi Rackover76937332017-06-01 11:27:57 +0000269; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
Simon Pilgrim321e54f2017-10-23 22:05:02 +0000270; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
Zvi Rackover76937332017-06-01 11:27:57 +0000271; AVX1-NEXT: vpmovmskb %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000272; AVX1-NEXT: # kill: def $al killed $al killed $eax
Zvi Rackover76937332017-06-01 11:27:57 +0000273; AVX1-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000274; AVX1-NEXT: retq
Zvi Rackover76937332017-06-01 11:27:57 +0000275;
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000276; AVX2-LABEL: v8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000277; AVX2: # %bb.0:
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000278; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0
279; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000280; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000281; AVX2-NEXT: vpcmpgtd %ymm3, %ymm2, %ymm1
282; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000283; AVX2-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000284; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
Simon Pilgrim321e54f2017-10-23 22:05:02 +0000285; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
Zvi Rackover76937332017-06-01 11:27:57 +0000286; AVX2-NEXT: vpmovmskb %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000287; AVX2-NEXT: # kill: def $al killed $al killed $eax
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000288; AVX2-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000289; AVX2-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000290;
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000291; AVX512F-LABEL: v8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000292; AVX512F: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000293; AVX512F-NEXT: vpcmpgtd %ymm1, %ymm0, %k1
294; AVX512F-NEXT: vpcmpgtd %ymm3, %ymm2, %k0 {%k1}
295; AVX512F-NEXT: kmovw %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000296; AVX512F-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000297; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000298; AVX512F-NEXT: retq
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000299;
300; AVX512BW-LABEL: v8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000301; AVX512BW: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000302; AVX512BW-NEXT: vpcmpgtd %ymm1, %ymm0, %k1
303; AVX512BW-NEXT: vpcmpgtd %ymm3, %ymm2, %k0 {%k1}
304; AVX512BW-NEXT: kmovd %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000305; AVX512BW-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000306; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000307; AVX512BW-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000308 %x0 = icmp sgt <8 x i32> %a, %b
309 %x1 = icmp sgt <8 x i32> %c, %d
310 %y = and <8 x i1> %x0, %x1
311 %res = bitcast <8 x i1> %y to i8
312 ret i8 %res
313}
314
315define i8 @v8f32(<8 x float> %a, <8 x float> %b, <8 x float> %c, <8 x float> %d) {
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000316; SSE2-SSSE3-LABEL: v8f32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000317; SSE2-SSSE3: # %bb.0:
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000318; SSE2-SSSE3-NEXT: cmpltps %xmm1, %xmm3
319; SSE2-SSSE3-NEXT: cmpltps %xmm0, %xmm2
320; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm2
321; SSE2-SSSE3-NEXT: cmpltps %xmm5, %xmm7
322; SSE2-SSSE3-NEXT: cmpltps %xmm4, %xmm6
323; SSE2-SSSE3-NEXT: packssdw %xmm7, %xmm6
324; SSE2-SSSE3-NEXT: pand %xmm2, %xmm6
325; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm6
326; SSE2-SSSE3-NEXT: pmovmskb %xmm6, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000327; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrima5793822017-10-31 18:43:24 +0000328; SSE2-SSSE3-NEXT: retq
Zvi Rackover76937332017-06-01 11:27:57 +0000329;
330; AVX12-LABEL: v8f32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000331; AVX12: # %bb.0:
Zvi Rackover76937332017-06-01 11:27:57 +0000332; AVX12-NEXT: vcmpltps %ymm0, %ymm1, %ymm0
333; AVX12-NEXT: vextractf128 $1, %ymm0, %xmm1
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000334; AVX12-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
Zvi Rackover76937332017-06-01 11:27:57 +0000335; AVX12-NEXT: vcmpltps %ymm2, %ymm3, %ymm1
336; AVX12-NEXT: vextractf128 $1, %ymm1, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000337; AVX12-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
Zvi Rackover76937332017-06-01 11:27:57 +0000338; AVX12-NEXT: vpand %xmm1, %xmm0, %xmm0
Simon Pilgrim321e54f2017-10-23 22:05:02 +0000339; AVX12-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
Zvi Rackover76937332017-06-01 11:27:57 +0000340; AVX12-NEXT: vpmovmskb %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000341; AVX12-NEXT: # kill: def $al killed $al killed $eax
Zvi Rackover76937332017-06-01 11:27:57 +0000342; AVX12-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000343; AVX12-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000344;
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000345; AVX512F-LABEL: v8f32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000346; AVX512F: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000347; AVX512F-NEXT: vcmpltps %ymm0, %ymm1, %k1
348; AVX512F-NEXT: vcmpltps %ymm2, %ymm3, %k0 {%k1}
349; AVX512F-NEXT: kmovw %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000350; AVX512F-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000351; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000352; AVX512F-NEXT: retq
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000353;
354; AVX512BW-LABEL: v8f32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000355; AVX512BW: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000356; AVX512BW-NEXT: vcmpltps %ymm0, %ymm1, %k1
357; AVX512BW-NEXT: vcmpltps %ymm2, %ymm3, %k0 {%k1}
358; AVX512BW-NEXT: kmovd %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000359; AVX512BW-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000360; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000361; AVX512BW-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000362 %x0 = fcmp ogt <8 x float> %a, %b
363 %x1 = fcmp ogt <8 x float> %c, %d
364 %y = and <8 x i1> %x0, %x1
365 %res = bitcast <8 x i1> %y to i8
366 ret i8 %res
367}
368
369define i32 @v32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8> %c, <32 x i8> %d) {
Zvi Rackover76937332017-06-01 11:27:57 +0000370; SSE2-SSSE3-LABEL: v32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000371; SSE2-SSSE3: # %bb.0:
Zvi Rackover76937332017-06-01 11:27:57 +0000372; SSE2-SSSE3-NEXT: pcmpgtb %xmm2, %xmm0
373; SSE2-SSSE3-NEXT: pcmpgtb %xmm3, %xmm1
374; SSE2-SSSE3-NEXT: pcmpgtb %xmm6, %xmm4
Michael Zuckermanf6684002017-06-28 11:23:31 +0000375; SSE2-SSSE3-NEXT: pand %xmm0, %xmm4
Zvi Rackover76937332017-06-01 11:27:57 +0000376; SSE2-SSSE3-NEXT: pcmpgtb %xmm7, %xmm5
377; SSE2-SSSE3-NEXT: pand %xmm1, %xmm5
Simon Pilgrim32c377a2017-07-21 09:58:50 +0000378; SSE2-SSSE3-NEXT: pmovmskb %xmm4, %ecx
379; SSE2-SSSE3-NEXT: pmovmskb %xmm5, %eax
380; SSE2-SSSE3-NEXT: shll $16, %eax
Zvi Rackover76937332017-06-01 11:27:57 +0000381; SSE2-SSSE3-NEXT: orl %ecx, %eax
Simon Pilgrima5793822017-10-31 18:43:24 +0000382; SSE2-SSSE3-NEXT: retq
Zvi Rackover76937332017-06-01 11:27:57 +0000383;
384; AVX1-LABEL: v32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000385; AVX1: # %bb.0:
Zvi Rackover76937332017-06-01 11:27:57 +0000386; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
387; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
388; AVX1-NEXT: vpcmpgtb %xmm4, %xmm5, %xmm4
389; AVX1-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
Zvi Rackover76937332017-06-01 11:27:57 +0000390; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1
Simon Pilgrim32c377a2017-07-21 09:58:50 +0000391; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
392; AVX1-NEXT: vpcmpgtb %xmm1, %xmm5, %xmm1
393; AVX1-NEXT: vpand %xmm1, %xmm4, %xmm1
Zvi Rackover76937332017-06-01 11:27:57 +0000394; AVX1-NEXT: vpcmpgtb %xmm3, %xmm2, %xmm2
Simon Pilgrim32c377a2017-07-21 09:58:50 +0000395; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
396; AVX1-NEXT: vpmovmskb %xmm0, %ecx
397; AVX1-NEXT: vpmovmskb %xmm1, %eax
398; AVX1-NEXT: shll $16, %eax
399; AVX1-NEXT: orl %ecx, %eax
Zvi Rackover76937332017-06-01 11:27:57 +0000400; AVX1-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000401; AVX1-NEXT: retq
Zvi Rackover76937332017-06-01 11:27:57 +0000402;
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000403; AVX2-LABEL: v32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000404; AVX2: # %bb.0:
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000405; AVX2-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm0
406; AVX2-NEXT: vpcmpgtb %ymm3, %ymm2, %ymm1
407; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
Zvi Rackover76937332017-06-01 11:27:57 +0000408; AVX2-NEXT: vpmovmskb %ymm0, %eax
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000409; AVX2-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000410; AVX2-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000411;
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000412; AVX512F-LABEL: v32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000413; AVX512F: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000414; AVX512F-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm0
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000415; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
416; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1
Craig Topper76adcc82018-01-23 14:25:39 +0000417; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k1
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000418; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0
Craig Topper76adcc82018-01-23 14:25:39 +0000419; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k2
420; AVX512F-NEXT: vpcmpgtb %ymm3, %ymm2, %ymm0
421; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
422; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1
423; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0
424; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 {%k2}
425; AVX512F-NEXT: kmovw %k0, %ecx
426; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 {%k1}
427; AVX512F-NEXT: kmovw %k0, %eax
428; AVX512F-NEXT: shll $16, %eax
429; AVX512F-NEXT: orl %ecx, %eax
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000430; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000431; AVX512F-NEXT: retq
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000432;
433; AVX512BW-LABEL: v32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000434; AVX512BW: # %bb.0:
Simon Pilgrimc1927f12017-10-31 18:41:48 +0000435; AVX512BW-NEXT: vpcmpgtb %ymm1, %ymm0, %k1
436; AVX512BW-NEXT: vpcmpgtb %ymm3, %ymm2, %k0 {%k1}
437; AVX512BW-NEXT: kmovd %k0, %eax
438; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000439; AVX512BW-NEXT: retq
Zvi Rackoverc7bf2a12017-05-29 19:00:57 +0000440 %x0 = icmp sgt <32 x i8> %a, %b
441 %x1 = icmp sgt <32 x i8> %c, %d
442 %y = and <32 x i1> %x0, %x1
443 %res = bitcast <32 x i1> %y to i32
444 ret i32 %res
445}