blob: a63fe5ab4663795d8261134cf9e0e8ff808cce5c [file] [log] [blame]
Simon Pilgrim11e29692017-09-14 10:30:22 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX12,AVX1
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX12,AVX2
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512BW
7
8define i8 @v8i64(<8 x i64> %a, <8 x i64> %b, <8 x i64> %c, <8 x i64> %d) {
9; SSE-LABEL: v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000010; SSE: # %bb.0:
Simon Pilgrimbd5d2f02017-10-04 13:12:08 +000011; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8
Simon Pilgrim11e29692017-09-14 10:30:22 +000012; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9
Simon Pilgrim0b21ef12017-09-18 16:45:05 +000013; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10
Simon Pilgrim11e29692017-09-14 10:30:22 +000014; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11
Simon Pilgrimbd5d2f02017-10-04 13:12:08 +000015; SSE-NEXT: pcmpgtq %xmm7, %xmm3
16; SSE-NEXT: pcmpgtq %xmm6, %xmm2
17; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
Craig Toppercf772032017-12-14 06:49:07 +000018; SSE-NEXT: pcmpgtq %xmm5, %xmm1
19; SSE-NEXT: pcmpgtq %xmm4, %xmm0
20; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
21; SSE-NEXT: packssdw %xmm2, %xmm0
Simon Pilgrim11e29692017-09-14 10:30:22 +000022; SSE-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm11
Simon Pilgrim0b21ef12017-09-18 16:45:05 +000023; SSE-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm10
Craig Toppercf772032017-12-14 06:49:07 +000024; SSE-NEXT: shufps {{.*#+}} xmm10 = xmm10[0,2],xmm11[0,2]
Simon Pilgrim0b21ef12017-09-18 16:45:05 +000025; SSE-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm9
Simon Pilgrimbd5d2f02017-10-04 13:12:08 +000026; SSE-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm8
27; SSE-NEXT: shufps {{.*#+}} xmm8 = xmm8[0,2],xmm9[0,2]
Craig Toppercf772032017-12-14 06:49:07 +000028; SSE-NEXT: packssdw %xmm10, %xmm8
29; SSE-NEXT: pand %xmm0, %xmm8
Simon Pilgrimbd5d2f02017-10-04 13:12:08 +000030; SSE-NEXT: packsswb %xmm0, %xmm8
31; SSE-NEXT: pmovmskb %xmm8, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +000032; SSE-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrima5793822017-10-31 18:43:24 +000033; SSE-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +000034;
35; AVX1-LABEL: v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000036; AVX1: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +000037; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm8
38; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm9
39; AVX1-NEXT: vpcmpgtq %xmm8, %xmm9, %xmm8
40; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm1
Simon Pilgrim0a12c232017-10-24 15:38:16 +000041; AVX1-NEXT: vpackssdw %xmm8, %xmm1, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +000042; AVX1-NEXT: vmovdqa {{.*#+}} xmm8 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
43; AVX1-NEXT: vpshufb %xmm8, %xmm1, %xmm9
44; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
45; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
46; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm1
47; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0
Simon Pilgrim0a12c232017-10-24 15:38:16 +000048; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
Simon Pilgrim11e29692017-09-14 10:30:22 +000049; AVX1-NEXT: vpshufb %xmm8, %xmm0, %xmm0
50; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm9[0]
Simon Pilgrim11e29692017-09-14 10:30:22 +000051; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm1
52; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm2
53; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1
54; AVX1-NEXT: vpcmpgtq %xmm7, %xmm5, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +000055; AVX1-NEXT: vpackssdw %xmm1, %xmm2, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +000056; AVX1-NEXT: vpshufb %xmm8, %xmm1, %xmm1
57; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm2
58; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm3
59; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
60; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm3
Simon Pilgrim0a12c232017-10-24 15:38:16 +000061; AVX1-NEXT: vpackssdw %xmm2, %xmm3, %xmm2
Simon Pilgrim11e29692017-09-14 10:30:22 +000062; AVX1-NEXT: vpshufb %xmm8, %xmm2, %xmm2
63; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
Simon Pilgrim11e29692017-09-14 10:30:22 +000064; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
Simon Pilgrimf5f291d2017-10-03 12:01:31 +000065; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
Simon Pilgrim11e29692017-09-14 10:30:22 +000066; AVX1-NEXT: vpmovmskb %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +000067; AVX1-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +000068; AVX1-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +000069; AVX1-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +000070;
71; AVX2-LABEL: v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000072; AVX2: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +000073; AVX2-NEXT: vpcmpgtq %ymm3, %ymm1, %ymm1
74; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3
Simon Pilgrim0a12c232017-10-24 15:38:16 +000075; AVX2-NEXT: vpackssdw %xmm3, %xmm1, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +000076; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
77; AVX2-NEXT: vpshufb %xmm3, %xmm1, %xmm1
78; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm0
79; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +000080; AVX2-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
Simon Pilgrim11e29692017-09-14 10:30:22 +000081; AVX2-NEXT: vpshufb %xmm3, %xmm0, %xmm0
82; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
Simon Pilgrim11e29692017-09-14 10:30:22 +000083; AVX2-NEXT: vpcmpgtq %ymm7, %ymm5, %ymm1
84; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +000085; AVX2-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +000086; AVX2-NEXT: vpshufb %xmm3, %xmm1, %xmm1
87; AVX2-NEXT: vpcmpgtq %ymm6, %ymm4, %ymm2
88; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm4
Simon Pilgrim0a12c232017-10-24 15:38:16 +000089; AVX2-NEXT: vpackssdw %xmm4, %xmm2, %xmm2
Simon Pilgrim11e29692017-09-14 10:30:22 +000090; AVX2-NEXT: vpshufb %xmm3, %xmm2, %xmm2
91; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
Simon Pilgrim11e29692017-09-14 10:30:22 +000092; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
Simon Pilgrimf5f291d2017-10-03 12:01:31 +000093; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
Simon Pilgrim11e29692017-09-14 10:30:22 +000094; AVX2-NEXT: vpmovmskb %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +000095; AVX2-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +000096; AVX2-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +000097; AVX2-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +000098;
99; AVX512F-LABEL: v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000100; AVX512F: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000101; AVX512F-NEXT: vpcmpgtq %zmm1, %zmm0, %k1
102; AVX512F-NEXT: vpcmpgtq %zmm3, %zmm2, %k0 {%k1}
103; AVX512F-NEXT: kmovw %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000104; AVX512F-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000105; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000106; AVX512F-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000107;
108; AVX512BW-LABEL: v8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000109; AVX512BW: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000110; AVX512BW-NEXT: vpcmpgtq %zmm1, %zmm0, %k1
111; AVX512BW-NEXT: vpcmpgtq %zmm3, %zmm2, %k0 {%k1}
112; AVX512BW-NEXT: kmovd %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000113; AVX512BW-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000114; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000115; AVX512BW-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000116 %x0 = icmp sgt <8 x i64> %a, %b
117 %x1 = icmp sgt <8 x i64> %c, %d
118 %y = and <8 x i1> %x0, %x1
119 %res = bitcast <8 x i1> %y to i8
120 ret i8 %res
121}
122
123define i8 @v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %c, <8 x double> %d) {
124; SSE-LABEL: v8f64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000125; SSE: # %bb.0:
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000126; SSE-NEXT: movapd {{[0-9]+}}(%rsp), %xmm8
Simon Pilgrim11e29692017-09-14 10:30:22 +0000127; SSE-NEXT: movapd {{[0-9]+}}(%rsp), %xmm9
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000128; SSE-NEXT: movapd {{[0-9]+}}(%rsp), %xmm10
Simon Pilgrim11e29692017-09-14 10:30:22 +0000129; SSE-NEXT: movapd {{[0-9]+}}(%rsp), %xmm11
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000130; SSE-NEXT: cmpltpd %xmm3, %xmm7
131; SSE-NEXT: cmpltpd %xmm2, %xmm6
132; SSE-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,2],xmm7[0,2]
Craig Toppercf772032017-12-14 06:49:07 +0000133; SSE-NEXT: cmpltpd %xmm1, %xmm5
134; SSE-NEXT: cmpltpd %xmm0, %xmm4
135; SSE-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
136; SSE-NEXT: packssdw %xmm6, %xmm4
Simon Pilgrim11e29692017-09-14 10:30:22 +0000137; SSE-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm11
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000138; SSE-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm10
Craig Toppercf772032017-12-14 06:49:07 +0000139; SSE-NEXT: shufps {{.*#+}} xmm10 = xmm10[0,2],xmm11[0,2]
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000140; SSE-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm9
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000141; SSE-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm8
142; SSE-NEXT: shufps {{.*#+}} xmm8 = xmm8[0,2],xmm9[0,2]
Craig Toppercf772032017-12-14 06:49:07 +0000143; SSE-NEXT: packssdw %xmm10, %xmm8
144; SSE-NEXT: pand %xmm4, %xmm8
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000145; SSE-NEXT: packsswb %xmm0, %xmm8
146; SSE-NEXT: pmovmskb %xmm8, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000147; SSE-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrima5793822017-10-31 18:43:24 +0000148; SSE-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000149;
150; AVX12-LABEL: v8f64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000151; AVX12: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000152; AVX12-NEXT: vcmpltpd %ymm1, %ymm3, %ymm1
153; AVX12-NEXT: vextractf128 $1, %ymm1, %xmm3
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000154; AVX12-NEXT: vpackssdw %xmm3, %xmm1, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +0000155; AVX12-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
156; AVX12-NEXT: vpshufb %xmm3, %xmm1, %xmm1
157; AVX12-NEXT: vcmpltpd %ymm0, %ymm2, %ymm0
158; AVX12-NEXT: vextractf128 $1, %ymm0, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000159; AVX12-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
Simon Pilgrim11e29692017-09-14 10:30:22 +0000160; AVX12-NEXT: vpshufb %xmm3, %xmm0, %xmm0
161; AVX12-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
Simon Pilgrim11e29692017-09-14 10:30:22 +0000162; AVX12-NEXT: vcmpltpd %ymm5, %ymm7, %ymm1
163; AVX12-NEXT: vextractf128 $1, %ymm1, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000164; AVX12-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +0000165; AVX12-NEXT: vpshufb %xmm3, %xmm1, %xmm1
166; AVX12-NEXT: vcmpltpd %ymm4, %ymm6, %ymm2
167; AVX12-NEXT: vextractf128 $1, %ymm2, %xmm4
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000168; AVX12-NEXT: vpackssdw %xmm4, %xmm2, %xmm2
Simon Pilgrim11e29692017-09-14 10:30:22 +0000169; AVX12-NEXT: vpshufb %xmm3, %xmm2, %xmm2
170; AVX12-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
Simon Pilgrim11e29692017-09-14 10:30:22 +0000171; AVX12-NEXT: vpand %xmm1, %xmm0, %xmm0
Simon Pilgrimf5f291d2017-10-03 12:01:31 +0000172; AVX12-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
Simon Pilgrim11e29692017-09-14 10:30:22 +0000173; AVX12-NEXT: vpmovmskb %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000174; AVX12-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000175; AVX12-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000176; AVX12-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000177;
178; AVX512F-LABEL: v8f64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000179; AVX512F: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000180; AVX512F-NEXT: vcmpltpd %zmm0, %zmm1, %k1
181; AVX512F-NEXT: vcmpltpd %zmm2, %zmm3, %k0 {%k1}
182; AVX512F-NEXT: kmovw %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000183; AVX512F-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000184; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000185; AVX512F-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000186;
187; AVX512BW-LABEL: v8f64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000188; AVX512BW: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000189; AVX512BW-NEXT: vcmpltpd %zmm0, %zmm1, %k1
190; AVX512BW-NEXT: vcmpltpd %zmm2, %zmm3, %k0 {%k1}
191; AVX512BW-NEXT: kmovd %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000192; AVX512BW-NEXT: # kill: def $al killed $al killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000193; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000194; AVX512BW-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000195 %x0 = fcmp ogt <8 x double> %a, %b
196 %x1 = fcmp ogt <8 x double> %c, %d
197 %y = and <8 x i1> %x0, %x1
198 %res = bitcast <8 x i1> %y to i8
199 ret i8 %res
200}
201
202define i32 @v32i16(<32 x i16> %a, <32 x i16> %b, <32 x i16> %c, <32 x i16> %d) {
203; SSE-LABEL: v32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000204; SSE: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000205; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000206; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9
Simon Pilgrimf5f291d2017-10-03 12:01:31 +0000207; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10
Simon Pilgrim11e29692017-09-14 10:30:22 +0000208; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11
209; SSE-NEXT: pcmpgtw %xmm5, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +0000210; SSE-NEXT: pcmpgtw %xmm4, %xmm0
Simon Pilgrimf5f291d2017-10-03 12:01:31 +0000211; SSE-NEXT: packsswb %xmm1, %xmm0
Simon Pilgrim11e29692017-09-14 10:30:22 +0000212; SSE-NEXT: pcmpgtw %xmm7, %xmm3
Simon Pilgrim11e29692017-09-14 10:30:22 +0000213; SSE-NEXT: pcmpgtw %xmm6, %xmm2
Simon Pilgrimf5f291d2017-10-03 12:01:31 +0000214; SSE-NEXT: packsswb %xmm3, %xmm2
Simon Pilgrim11e29692017-09-14 10:30:22 +0000215; SSE-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm11
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000216; SSE-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm10
Simon Pilgrimf5f291d2017-10-03 12:01:31 +0000217; SSE-NEXT: packsswb %xmm11, %xmm10
218; SSE-NEXT: pand %xmm0, %xmm10
219; SSE-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm9
Simon Pilgrim11e29692017-09-14 10:30:22 +0000220; SSE-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm8
Simon Pilgrimf5f291d2017-10-03 12:01:31 +0000221; SSE-NEXT: packsswb %xmm9, %xmm8
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000222; SSE-NEXT: pand %xmm2, %xmm8
Simon Pilgrimf5f291d2017-10-03 12:01:31 +0000223; SSE-NEXT: pmovmskb %xmm10, %ecx
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000224; SSE-NEXT: pmovmskb %xmm8, %eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000225; SSE-NEXT: shll $16, %eax
226; SSE-NEXT: orl %ecx, %eax
Simon Pilgrima5793822017-10-31 18:43:24 +0000227; SSE-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000228;
229; AVX1-LABEL: v32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000230; AVX1: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000231; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm8
232; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm9
233; AVX1-NEXT: vpcmpgtw %xmm8, %xmm9, %xmm8
234; AVX1-NEXT: vpcmpgtw %xmm3, %xmm1, %xmm1
235; AVX1-NEXT: vpacksswb %xmm8, %xmm1, %xmm8
236; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
237; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
238; AVX1-NEXT: vpcmpgtw %xmm3, %xmm1, %xmm1
239; AVX1-NEXT: vpcmpgtw %xmm2, %xmm0, %xmm0
240; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
241; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm1
242; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm2
243; AVX1-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm1
244; AVX1-NEXT: vpcmpgtw %xmm7, %xmm5, %xmm2
245; AVX1-NEXT: vpacksswb %xmm1, %xmm2, %xmm1
246; AVX1-NEXT: vpand %xmm1, %xmm8, %xmm1
247; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm2
248; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm3
249; AVX1-NEXT: vpcmpgtw %xmm2, %xmm3, %xmm2
250; AVX1-NEXT: vpcmpgtw %xmm6, %xmm4, %xmm3
251; AVX1-NEXT: vpacksswb %xmm2, %xmm3, %xmm2
252; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
253; AVX1-NEXT: vpmovmskb %xmm0, %ecx
254; AVX1-NEXT: vpmovmskb %xmm1, %eax
255; AVX1-NEXT: shll $16, %eax
256; AVX1-NEXT: orl %ecx, %eax
257; AVX1-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000258; AVX1-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000259;
260; AVX2-LABEL: v32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000261; AVX2: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000262; AVX2-NEXT: vpcmpgtw %ymm3, %ymm1, %ymm1
263; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3
264; AVX2-NEXT: vpacksswb %xmm3, %xmm1, %xmm1
265; AVX2-NEXT: vpcmpgtw %ymm2, %ymm0, %ymm0
266; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
267; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm0
268; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
269; AVX2-NEXT: vpcmpgtw %ymm7, %ymm5, %ymm1
270; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
271; AVX2-NEXT: vpacksswb %xmm2, %xmm1, %xmm1
272; AVX2-NEXT: vpcmpgtw %ymm6, %ymm4, %ymm2
273; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm3
274; AVX2-NEXT: vpacksswb %xmm3, %xmm2, %xmm2
275; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm2, %ymm1
276; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
277; AVX2-NEXT: vpmovmskb %ymm0, %eax
278; AVX2-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000279; AVX2-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000280;
281; AVX512F-LABEL: v32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000282; AVX512F: # %bb.0:
Craig Toppereab2d462017-12-14 08:25:58 +0000283; AVX512F-NEXT: vpcmpgtw %ymm3, %ymm1, %ymm1
Simon Pilgrim11e29692017-09-14 10:30:22 +0000284; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1
Craig Topper76adcc82018-01-23 14:25:39 +0000285; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k1
286; AVX512F-NEXT: vpcmpgtw %ymm2, %ymm0, %ymm0
287; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0
288; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k2
289; AVX512F-NEXT: vpcmpgtw %ymm7, %ymm5, %ymm0
290; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0
291; AVX512F-NEXT: vpcmpgtw %ymm6, %ymm4, %ymm1
292; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1
293; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 {%k2}
294; AVX512F-NEXT: kmovw %k0, %ecx
295; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 {%k1}
296; AVX512F-NEXT: kmovw %k0, %eax
297; AVX512F-NEXT: shll $16, %eax
298; AVX512F-NEXT: orl %ecx, %eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000299; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000300; AVX512F-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000301;
302; AVX512BW-LABEL: v32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000303; AVX512BW: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000304; AVX512BW-NEXT: vpcmpgtw %zmm1, %zmm0, %k1
305; AVX512BW-NEXT: vpcmpgtw %zmm3, %zmm2, %k0 {%k1}
306; AVX512BW-NEXT: kmovd %k0, %eax
307; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000308; AVX512BW-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000309 %x0 = icmp sgt <32 x i16> %a, %b
310 %x1 = icmp sgt <32 x i16> %c, %d
311 %y = and <32 x i1> %x0, %x1
312 %res = bitcast <32 x i1> %y to i32
313 ret i32 %res
314}
315
316define i16 @v16i32(<16 x i32> %a, <16 x i32> %b, <16 x i32> %c, <16 x i32> %d) {
317; SSE-LABEL: v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000318; SSE: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000319; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8
Simon Pilgrim11e29692017-09-14 10:30:22 +0000320; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9
Simon Pilgrimb47b3f22017-10-04 17:31:28 +0000321; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10
Simon Pilgrim11e29692017-09-14 10:30:22 +0000322; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11
323; SSE-NEXT: pcmpgtd %xmm7, %xmm3
Simon Pilgrim11e29692017-09-14 10:30:22 +0000324; SSE-NEXT: pcmpgtd %xmm6, %xmm2
Simon Pilgrimb47b3f22017-10-04 17:31:28 +0000325; SSE-NEXT: packssdw %xmm3, %xmm2
Simon Pilgrim11e29692017-09-14 10:30:22 +0000326; SSE-NEXT: pcmpgtd %xmm5, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +0000327; SSE-NEXT: pcmpgtd %xmm4, %xmm0
Simon Pilgrimb47b3f22017-10-04 17:31:28 +0000328; SSE-NEXT: packssdw %xmm1, %xmm0
Simon Pilgrimf5f291d2017-10-03 12:01:31 +0000329; SSE-NEXT: packsswb %xmm2, %xmm0
Simon Pilgrim11e29692017-09-14 10:30:22 +0000330; SSE-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm11
Simon Pilgrim11e29692017-09-14 10:30:22 +0000331; SSE-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm10
Simon Pilgrimb47b3f22017-10-04 17:31:28 +0000332; SSE-NEXT: packssdw %xmm11, %xmm10
333; SSE-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm9
Simon Pilgrim11e29692017-09-14 10:30:22 +0000334; SSE-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm8
Simon Pilgrimb47b3f22017-10-04 17:31:28 +0000335; SSE-NEXT: packssdw %xmm9, %xmm8
336; SSE-NEXT: packsswb %xmm10, %xmm8
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000337; SSE-NEXT: pand %xmm0, %xmm8
338; SSE-NEXT: pmovmskb %xmm8, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000339; SSE-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrima5793822017-10-31 18:43:24 +0000340; SSE-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000341;
342; AVX1-LABEL: v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000343; AVX1: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000344; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm8
345; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm9
346; AVX1-NEXT: vpcmpgtd %xmm8, %xmm9, %xmm8
347; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm1
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000348; AVX1-NEXT: vpackssdw %xmm8, %xmm1, %xmm8
Simon Pilgrim11e29692017-09-14 10:30:22 +0000349; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
350; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
351; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm1
352; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000353; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
354; AVX1-NEXT: vpacksswb %xmm8, %xmm0, %xmm0
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000355; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm1
356; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm2
357; AVX1-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm1
358; AVX1-NEXT: vpcmpgtd %xmm7, %xmm5, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000359; AVX1-NEXT: vpackssdw %xmm1, %xmm2, %xmm1
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000360; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm2
361; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm3
362; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2
363; AVX1-NEXT: vpcmpgtd %xmm6, %xmm4, %xmm3
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000364; AVX1-NEXT: vpackssdw %xmm2, %xmm3, %xmm2
365; AVX1-NEXT: vpacksswb %xmm1, %xmm2, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +0000366; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
367; AVX1-NEXT: vpmovmskb %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000368; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000369; AVX1-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000370; AVX1-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000371;
372; AVX2-LABEL: v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000373; AVX2: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000374; AVX2-NEXT: vpcmpgtd %ymm3, %ymm1, %ymm1
375; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000376; AVX2-NEXT: vpackssdw %xmm3, %xmm1, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +0000377; AVX2-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm0
378; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000379; AVX2-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
380; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000381; AVX2-NEXT: vpcmpgtd %ymm7, %ymm5, %ymm1
382; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000383; AVX2-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000384; AVX2-NEXT: vpcmpgtd %ymm6, %ymm4, %ymm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000385; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm3
386; AVX2-NEXT: vpackssdw %xmm3, %xmm2, %xmm2
387; AVX2-NEXT: vpacksswb %xmm1, %xmm2, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +0000388; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
389; AVX2-NEXT: vpmovmskb %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000390; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000391; AVX2-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000392; AVX2-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000393;
394; AVX512F-LABEL: v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000395; AVX512F: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000396; AVX512F-NEXT: vpcmpgtd %zmm1, %zmm0, %k1
397; AVX512F-NEXT: vpcmpgtd %zmm3, %zmm2, %k0 {%k1}
398; AVX512F-NEXT: kmovw %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000399; AVX512F-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000400; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000401; AVX512F-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000402;
403; AVX512BW-LABEL: v16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000404; AVX512BW: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000405; AVX512BW-NEXT: vpcmpgtd %zmm1, %zmm0, %k1
406; AVX512BW-NEXT: vpcmpgtd %zmm3, %zmm2, %k0 {%k1}
407; AVX512BW-NEXT: kmovd %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000408; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000409; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000410; AVX512BW-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000411 %x0 = icmp sgt <16 x i32> %a, %b
412 %x1 = icmp sgt <16 x i32> %c, %d
413 %y = and <16 x i1> %x0, %x1
414 %res = bitcast <16 x i1> %y to i16
415 ret i16 %res
416}
417
418define i16 @v16f32(<16 x float> %a, <16 x float> %b, <16 x float> %c, <16 x float> %d) {
419; SSE-LABEL: v16f32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000420; SSE: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000421; SSE-NEXT: movaps {{[0-9]+}}(%rsp), %xmm8
Simon Pilgrim11e29692017-09-14 10:30:22 +0000422; SSE-NEXT: movaps {{[0-9]+}}(%rsp), %xmm9
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000423; SSE-NEXT: movaps {{[0-9]+}}(%rsp), %xmm10
Simon Pilgrim11e29692017-09-14 10:30:22 +0000424; SSE-NEXT: movaps {{[0-9]+}}(%rsp), %xmm11
425; SSE-NEXT: cmpltps %xmm3, %xmm7
Simon Pilgrim11e29692017-09-14 10:30:22 +0000426; SSE-NEXT: cmpltps %xmm2, %xmm6
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000427; SSE-NEXT: packssdw %xmm7, %xmm6
Simon Pilgrim11e29692017-09-14 10:30:22 +0000428; SSE-NEXT: cmpltps %xmm1, %xmm5
Simon Pilgrim11e29692017-09-14 10:30:22 +0000429; SSE-NEXT: cmpltps %xmm0, %xmm4
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000430; SSE-NEXT: packssdw %xmm5, %xmm4
431; SSE-NEXT: packsswb %xmm6, %xmm4
Simon Pilgrim11e29692017-09-14 10:30:22 +0000432; SSE-NEXT: cmpltps {{[0-9]+}}(%rsp), %xmm11
Simon Pilgrim11e29692017-09-14 10:30:22 +0000433; SSE-NEXT: cmpltps {{[0-9]+}}(%rsp), %xmm10
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000434; SSE-NEXT: packssdw %xmm11, %xmm10
435; SSE-NEXT: cmpltps {{[0-9]+}}(%rsp), %xmm9
Simon Pilgrim11e29692017-09-14 10:30:22 +0000436; SSE-NEXT: cmpltps {{[0-9]+}}(%rsp), %xmm8
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000437; SSE-NEXT: packssdw %xmm9, %xmm8
438; SSE-NEXT: packsswb %xmm10, %xmm8
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000439; SSE-NEXT: pand %xmm4, %xmm8
440; SSE-NEXT: pmovmskb %xmm8, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000441; SSE-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrima5793822017-10-31 18:43:24 +0000442; SSE-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000443;
444; AVX12-LABEL: v16f32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000445; AVX12: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000446; AVX12-NEXT: vcmpltps %ymm1, %ymm3, %ymm1
447; AVX12-NEXT: vextractf128 $1, %ymm1, %xmm3
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000448; AVX12-NEXT: vpackssdw %xmm3, %xmm1, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +0000449; AVX12-NEXT: vcmpltps %ymm0, %ymm2, %ymm0
450; AVX12-NEXT: vextractf128 $1, %ymm0, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000451; AVX12-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000452; AVX12-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000453; AVX12-NEXT: vcmpltps %ymm5, %ymm7, %ymm1
454; AVX12-NEXT: vextractf128 $1, %ymm1, %xmm2
Simon Pilgrim0a12c232017-10-24 15:38:16 +0000455; AVX12-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
Simon Pilgrim0b21ef12017-09-18 16:45:05 +0000456; AVX12-NEXT: vcmpltps %ymm4, %ymm6, %ymm2
Simon Pilgrimd09c1ac2017-10-28 14:27:53 +0000457; AVX12-NEXT: vextractf128 $1, %ymm2, %xmm3
458; AVX12-NEXT: vpackssdw %xmm3, %xmm2, %xmm2
459; AVX12-NEXT: vpacksswb %xmm1, %xmm2, %xmm1
Simon Pilgrim11e29692017-09-14 10:30:22 +0000460; AVX12-NEXT: vpand %xmm1, %xmm0, %xmm0
461; AVX12-NEXT: vpmovmskb %xmm0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000462; AVX12-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000463; AVX12-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000464; AVX12-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000465;
466; AVX512F-LABEL: v16f32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000467; AVX512F: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000468; AVX512F-NEXT: vcmpltps %zmm0, %zmm1, %k1
469; AVX512F-NEXT: vcmpltps %zmm2, %zmm3, %k0 {%k1}
470; AVX512F-NEXT: kmovw %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000471; AVX512F-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000472; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000473; AVX512F-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000474;
475; AVX512BW-LABEL: v16f32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000476; AVX512BW: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000477; AVX512BW-NEXT: vcmpltps %zmm0, %zmm1, %k1
478; AVX512BW-NEXT: vcmpltps %zmm2, %zmm3, %k0 {%k1}
479; AVX512BW-NEXT: kmovd %k0, %eax
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000480; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000481; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000482; AVX512BW-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000483 %x0 = fcmp ogt <16 x float> %a, %b
484 %x1 = fcmp ogt <16 x float> %c, %d
485 %y = and <16 x i1> %x0, %x1
486 %res = bitcast <16 x i1> %y to i16
487 ret i16 %res
488}
489
490define i64 @v64i8(<64 x i8> %a, <64 x i8> %b, <64 x i8> %c, <64 x i8> %d) {
491; SSE-LABEL: v64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000492; SSE: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000493; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10
Craig Topper5e0ceb82018-02-26 20:32:27 +0000494; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11
Simon Pilgrim11e29692017-09-14 10:30:22 +0000495; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8
Craig Topper5e0ceb82018-02-26 20:32:27 +0000496; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9
Simon Pilgrim11e29692017-09-14 10:30:22 +0000497; SSE-NEXT: pcmpgtb %xmm7, %xmm3
Craig Topper5e0ceb82018-02-26 20:32:27 +0000498; SSE-NEXT: pcmpgtb %xmm6, %xmm2
Simon Pilgrim11e29692017-09-14 10:30:22 +0000499; SSE-NEXT: pcmpgtb %xmm5, %xmm1
Craig Topper5e0ceb82018-02-26 20:32:27 +0000500; SSE-NEXT: pcmpgtb %xmm4, %xmm0
Simon Pilgrim11e29692017-09-14 10:30:22 +0000501; SSE-NEXT: pcmpgtb {{[0-9]+}}(%rsp), %xmm9
502; SSE-NEXT: pand %xmm3, %xmm9
Craig Topper5e0ceb82018-02-26 20:32:27 +0000503; SSE-NEXT: pcmpgtb {{[0-9]+}}(%rsp), %xmm8
504; SSE-NEXT: pand %xmm2, %xmm8
Simon Pilgrim11e29692017-09-14 10:30:22 +0000505; SSE-NEXT: pcmpgtb {{[0-9]+}}(%rsp), %xmm11
506; SSE-NEXT: pand %xmm1, %xmm11
Craig Topper5e0ceb82018-02-26 20:32:27 +0000507; SSE-NEXT: pcmpgtb {{[0-9]+}}(%rsp), %xmm10
508; SSE-NEXT: pand %xmm0, %xmm10
509; SSE-NEXT: pmovmskb %xmm10, %eax
510; SSE-NEXT: pmovmskb %xmm11, %ecx
511; SSE-NEXT: shll $16, %ecx
Jonas Paulsson7ad28862018-01-20 16:05:10 +0000512; SSE-NEXT: orl %eax, %ecx
Craig Topper5e0ceb82018-02-26 20:32:27 +0000513; SSE-NEXT: pmovmskb %xmm8, %edx
514; SSE-NEXT: pmovmskb %xmm9, %eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000515; SSE-NEXT: shll $16, %eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000516; SSE-NEXT: orl %edx, %eax
517; SSE-NEXT: shlq $32, %rax
518; SSE-NEXT: orq %rcx, %rax
Simon Pilgrima5793822017-10-31 18:43:24 +0000519; SSE-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000520;
521; AVX1-LABEL: v64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000522; AVX1: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000523; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm8
524; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm9
525; AVX1-NEXT: vpcmpgtb %xmm8, %xmm9, %xmm8
Craig Topper5e0ceb82018-02-26 20:32:27 +0000526; AVX1-NEXT: vpcmpgtb %xmm3, %xmm1, %xmm9
Simon Pilgrim11e29692017-09-14 10:30:22 +0000527; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
528; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
529; AVX1-NEXT: vpcmpgtb %xmm3, %xmm1, %xmm1
530; AVX1-NEXT: vpcmpgtb %xmm2, %xmm0, %xmm0
Craig Topper5e0ceb82018-02-26 20:32:27 +0000531; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm2
532; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm3
Simon Pilgrim11e29692017-09-14 10:30:22 +0000533; AVX1-NEXT: vpcmpgtb %xmm2, %xmm3, %xmm2
Craig Topper5e0ceb82018-02-26 20:32:27 +0000534; AVX1-NEXT: vpand %xmm2, %xmm8, %xmm2
535; AVX1-NEXT: vpcmpgtb %xmm7, %xmm5, %xmm3
536; AVX1-NEXT: vpand %xmm3, %xmm9, %xmm3
537; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm5
538; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm7
539; AVX1-NEXT: vpcmpgtb %xmm5, %xmm7, %xmm5
540; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1
541; AVX1-NEXT: vpcmpgtb %xmm6, %xmm4, %xmm4
542; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
543; AVX1-NEXT: vpmovmskb %xmm0, %eax
544; AVX1-NEXT: vpmovmskb %xmm1, %ecx
Jonas Paulsson7ad28862018-01-20 16:05:10 +0000545; AVX1-NEXT: shll $16, %ecx
Jonas Paulsson7ad28862018-01-20 16:05:10 +0000546; AVX1-NEXT: orl %eax, %ecx
Craig Topper5e0ceb82018-02-26 20:32:27 +0000547; AVX1-NEXT: vpmovmskb %xmm3, %edx
548; AVX1-NEXT: vpmovmskb %xmm2, %eax
549; AVX1-NEXT: shll $16, %eax
550; AVX1-NEXT: orl %edx, %eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000551; AVX1-NEXT: shlq $32, %rax
552; AVX1-NEXT: orq %rcx, %rax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000553; AVX1-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000554; AVX1-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000555;
556; AVX2-LABEL: v64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000557; AVX2: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000558; AVX2-NEXT: vpcmpgtb %ymm3, %ymm1, %ymm1
Craig Topper5e0ceb82018-02-26 20:32:27 +0000559; AVX2-NEXT: vpcmpgtb %ymm2, %ymm0, %ymm0
560; AVX2-NEXT: vpcmpgtb %ymm7, %ymm5, %ymm2
561; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
562; AVX2-NEXT: vpcmpgtb %ymm6, %ymm4, %ymm2
563; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
564; AVX2-NEXT: vpmovmskb %ymm0, %ecx
565; AVX2-NEXT: vpmovmskb %ymm1, %eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000566; AVX2-NEXT: shlq $32, %rax
567; AVX2-NEXT: orq %rcx, %rax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000568; AVX2-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000569; AVX2-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000570;
571; AVX512F-LABEL: v64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000572; AVX512F: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000573; AVX512F-NEXT: vpcmpgtb %ymm3, %ymm1, %ymm1
Craig Topper76adcc82018-01-23 14:25:39 +0000574; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm3
575; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3
576; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k1
577; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1
578; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k2
Simon Pilgrim11e29692017-09-14 10:30:22 +0000579; AVX512F-NEXT: vpcmpgtb %ymm2, %ymm0, %ymm0
Craig Topper76adcc82018-01-23 14:25:39 +0000580; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
581; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1
582; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k3
583; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0
584; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k4
585; AVX512F-NEXT: vpcmpgtb %ymm7, %ymm5, %ymm0
586; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
587; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1
588; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0
Simon Pilgrim11e29692017-09-14 10:30:22 +0000589; AVX512F-NEXT: vpcmpgtb %ymm6, %ymm4, %ymm2
Craig Topper76adcc82018-01-23 14:25:39 +0000590; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm3
591; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3
Simon Pilgrim11e29692017-09-14 10:30:22 +0000592; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2
Craig Topper76adcc82018-01-23 14:25:39 +0000593; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 {%k4}
594; AVX512F-NEXT: kmovw %k0, %eax
595; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 {%k3}
596; AVX512F-NEXT: kmovw %k0, %ecx
597; AVX512F-NEXT: shll $16, %ecx
598; AVX512F-NEXT: orl %eax, %ecx
599; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 {%k2}
600; AVX512F-NEXT: kmovw %k0, %edx
601; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 {%k1}
602; AVX512F-NEXT: kmovw %k0, %eax
603; AVX512F-NEXT: shll $16, %eax
604; AVX512F-NEXT: orl %edx, %eax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000605; AVX512F-NEXT: shlq $32, %rax
606; AVX512F-NEXT: orq %rcx, %rax
Simon Pilgrim11e29692017-09-14 10:30:22 +0000607; AVX512F-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000608; AVX512F-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000609;
610; AVX512BW-LABEL: v64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000611; AVX512BW: # %bb.0:
Simon Pilgrim11e29692017-09-14 10:30:22 +0000612; AVX512BW-NEXT: vpcmpgtb %zmm1, %zmm0, %k1
613; AVX512BW-NEXT: vpcmpgtb %zmm3, %zmm2, %k0 {%k1}
614; AVX512BW-NEXT: kmovq %k0, %rax
615; AVX512BW-NEXT: vzeroupper
Simon Pilgrima5793822017-10-31 18:43:24 +0000616; AVX512BW-NEXT: retq
Simon Pilgrim11e29692017-09-14 10:30:22 +0000617 %x0 = icmp sgt <64 x i8> %a, %b
618 %x1 = icmp sgt <64 x i8> %c, %d
619 %y = and <64 x i1> %x0, %x1
620 %res = bitcast <64 x i1> %y to i64
621 ret i64 %res
622}