blob: 2a8236cf093fc63764783e8c7e915f08c54d3cee [file] [log] [blame]
Jina Nahias98c7f912017-10-01 14:25:21 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512cd | FileCheck %s --check-prefix=ALL --check-prefix=AVX512CD
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,avx512cd,+avx512bw| FileCheck %s --check-prefix=ALL --check-prefix=AVX512VLCDBW
4; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512vl,avx512cd,+avx512bw| FileCheck %s --check-prefix=ALL --check-prefix=X86-AVX512VLCDBW
5
6define <2 x i64> @test_mm_epi64(<8 x i16> %a, <8 x i16> %b) {
7; AVX512CD-LABEL: test_mm_epi64:
8; AVX512CD: # BB#0: # %entry
9; AVX512CD-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
10; AVX512CD-NEXT: vpmovsxwq %xmm0, %zmm0
11; AVX512CD-NEXT: vpsllq $63, %zmm0, %zmm0
12; AVX512CD-NEXT: vptestmq %zmm0, %zmm0, %k0
13; AVX512CD-NEXT: kmovw %k0, %eax
14; AVX512CD-NEXT: vpxor %xmm0, %xmm0, %xmm0
15; AVX512CD-NEXT: vpinsrb $0, %eax, %xmm0, %xmm0
16; AVX512CD-NEXT: vpinsrb $8, %eax, %xmm0, %xmm0
17; AVX512CD-NEXT: vzeroupper
18; AVX512CD-NEXT: retq
19;
20; AVX512VLCDBW-LABEL: test_mm_epi64:
21; AVX512VLCDBW: # BB#0: # %entry
22; AVX512VLCDBW-NEXT: vpcmpeqw %xmm1, %xmm0, %k0
Jina Nahias5bf66202017-10-30 16:37:28 +000023; AVX512VLCDBW-NEXT: vpbroadcastmb2q %k0, %xmm0
Jina Nahias98c7f912017-10-01 14:25:21 +000024; AVX512VLCDBW-NEXT: retq
25;
26; X86-AVX512VLCDBW-LABEL: test_mm_epi64:
27; X86-AVX512VLCDBW: # BB#0: # %entry
28; X86-AVX512VLCDBW-NEXT: vpcmpeqw %xmm1, %xmm0, %k0
29; X86-AVX512VLCDBW-NEXT: kmovd %k0, %eax
30; X86-AVX512VLCDBW-NEXT: movzbl %al, %eax
31; X86-AVX512VLCDBW-NEXT: vmovd %eax, %xmm0
32; X86-AVX512VLCDBW-NEXT: vpbroadcastq %xmm0, %xmm0
33; X86-AVX512VLCDBW-NEXT: retl
34entry:
35 %0 = icmp eq <8 x i16> %a, %b
36 %1 = bitcast <8 x i1> %0 to i8
37 %conv.i = zext i8 %1 to i64
38 %vecinit.i.i = insertelement <2 x i64> undef, i64 %conv.i, i32 0
39 %vecinit1.i.i = shufflevector <2 x i64> %vecinit.i.i, <2 x i64> undef, <2 x i32> zeroinitializer
40 ret <2 x i64> %vecinit1.i.i
41}
42
43define <4 x i32> @test_mm_epi32(<16 x i8> %a, <16 x i8> %b) {
44; AVX512CD-LABEL: test_mm_epi32:
45; AVX512CD: # BB#0: # %entry
46; AVX512CD-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
47; AVX512CD-NEXT: vpmovsxbd %xmm0, %zmm0
48; AVX512CD-NEXT: vpslld $31, %zmm0, %zmm0
49; AVX512CD-NEXT: vptestmd %zmm0, %zmm0, %k0
50; AVX512CD-NEXT: kmovw %k0, %eax
51; AVX512CD-NEXT: vpxor %xmm0, %xmm0, %xmm0
52; AVX512CD-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0
53; AVX512CD-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0
54; AVX512CD-NEXT: vpinsrw $4, %eax, %xmm0, %xmm0
55; AVX512CD-NEXT: vpinsrw $6, %eax, %xmm0, %xmm0
56; AVX512CD-NEXT: vzeroupper
57; AVX512CD-NEXT: retq
58;
59; AVX512VLCDBW-LABEL: test_mm_epi32:
60; AVX512VLCDBW: # BB#0: # %entry
61; AVX512VLCDBW-NEXT: vpcmpeqb %xmm1, %xmm0, %k0
Jina Nahias5bf66202017-10-30 16:37:28 +000062; AVX512VLCDBW-NEXT: vpbroadcastmw2d %k0, %xmm0
Jina Nahias98c7f912017-10-01 14:25:21 +000063; AVX512VLCDBW-NEXT: retq
64;
65; X86-AVX512VLCDBW-LABEL: test_mm_epi32:
66; X86-AVX512VLCDBW: # BB#0: # %entry
67; X86-AVX512VLCDBW-NEXT: vpcmpeqb %xmm1, %xmm0, %k0
Jina Nahias5bf66202017-10-30 16:37:28 +000068; X86-AVX512VLCDBW-NEXT: vpbroadcastmw2d %k0, %xmm0
Jina Nahias98c7f912017-10-01 14:25:21 +000069; X86-AVX512VLCDBW-NEXT: retl
70entry:
71 %0 = icmp eq <16 x i8> %a, %b
72 %1 = bitcast <16 x i1> %0 to i16
73 %conv.i = zext i16 %1 to i32
74 %vecinit.i.i = insertelement <4 x i32> undef, i32 %conv.i, i32 0
75 %vecinit3.i.i = shufflevector <4 x i32> %vecinit.i.i, <4 x i32> undef, <4 x i32> zeroinitializer
76 ret <4 x i32> %vecinit3.i.i
77}
78
79define <16 x i32> @test_mm512_epi32(<16 x i32> %a, <16 x i32> %b) {
80; AVX512CD-LABEL: test_mm512_epi32:
81; AVX512CD: # BB#0: # %entry
82; AVX512CD-NEXT: vpcmpeqd %zmm1, %zmm0, %k0
83; AVX512CD-NEXT: kmovw %k0, %eax
84; AVX512CD-NEXT: vpbroadcastd %eax, %zmm0
85; AVX512CD-NEXT: retq
86;
87; AVX512VLCDBW-LABEL: test_mm512_epi32:
88; AVX512VLCDBW: # BB#0: # %entry
89; AVX512VLCDBW-NEXT: vpcmpeqd %zmm1, %zmm0, %k0
Jina Nahias5bf66202017-10-30 16:37:28 +000090; AVX512VLCDBW-NEXT: vpbroadcastmw2d %k0, %zmm0
Jina Nahias98c7f912017-10-01 14:25:21 +000091; AVX512VLCDBW-NEXT: retq
92;
93; X86-AVX512VLCDBW-LABEL: test_mm512_epi32:
94; X86-AVX512VLCDBW: # BB#0: # %entry
95; X86-AVX512VLCDBW-NEXT: vpcmpeqd %zmm1, %zmm0, %k0
Jina Nahias5bf66202017-10-30 16:37:28 +000096; X86-AVX512VLCDBW-NEXT: vpbroadcastmw2d %k0, %zmm0
Jina Nahias98c7f912017-10-01 14:25:21 +000097; X86-AVX512VLCDBW-NEXT: retl
98entry:
99 %0 = icmp eq <16 x i32> %a, %b
100 %1 = bitcast <16 x i1> %0 to i16
101 %conv.i = zext i16 %1 to i32
102 %vecinit.i.i = insertelement <16 x i32> undef, i32 %conv.i, i32 0
103 %vecinit15.i.i = shufflevector <16 x i32> %vecinit.i.i, <16 x i32> undef, <16 x i32> zeroinitializer
104 ret <16 x i32> %vecinit15.i.i
105}
106
107define <8 x i64> @test_mm512_epi64(<8 x i32> %a, <8 x i32> %b) {
108; AVX512CD-LABEL: test_mm512_epi64:
109; AVX512CD: # BB#0: # %entry
110; AVX512CD-NEXT: # kill: %YMM1<def> %YMM1<kill> %ZMM1<def>
111; AVX512CD-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
112; AVX512CD-NEXT: vpcmpeqd %zmm1, %zmm0, %k0
113; AVX512CD-NEXT: kmovw %k0, %eax
114; AVX512CD-NEXT: movzbl %al, %eax
115; AVX512CD-NEXT: vpbroadcastq %rax, %zmm0
116; AVX512CD-NEXT: retq
117;
118; AVX512VLCDBW-LABEL: test_mm512_epi64:
119; AVX512VLCDBW: # BB#0: # %entry
120; AVX512VLCDBW-NEXT: vpcmpeqd %ymm1, %ymm0, %k0
Jina Nahias5bf66202017-10-30 16:37:28 +0000121; AVX512VLCDBW-NEXT: vpbroadcastmb2q %k0, %zmm0
Jina Nahias98c7f912017-10-01 14:25:21 +0000122; AVX512VLCDBW-NEXT: retq
123;
124; X86-AVX512VLCDBW-LABEL: test_mm512_epi64:
125; X86-AVX512VLCDBW: # BB#0: # %entry
126; X86-AVX512VLCDBW-NEXT: vpcmpeqd %ymm1, %ymm0, %k0
127; X86-AVX512VLCDBW-NEXT: kmovd %k0, %eax
128; X86-AVX512VLCDBW-NEXT: movzbl %al, %eax
129; X86-AVX512VLCDBW-NEXT: vmovd %eax, %xmm0
130; X86-AVX512VLCDBW-NEXT: vpbroadcastq %xmm0, %xmm0
131; X86-AVX512VLCDBW-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0
132; X86-AVX512VLCDBW-NEXT: vinserti64x4 $1, %ymm0, %zmm0, %zmm0
133; X86-AVX512VLCDBW-NEXT: retl
134entry:
135 %0 = icmp eq <8 x i32> %a, %b
136 %1 = bitcast <8 x i1> %0 to i8
137 %conv.i = zext i8 %1 to i64
138 %vecinit.i.i = insertelement <8 x i64> undef, i64 %conv.i, i32 0
139 %vecinit7.i.i = shufflevector <8 x i64> %vecinit.i.i, <8 x i64> undef, <8 x i32> zeroinitializer
140 ret <8 x i64> %vecinit7.i.i
141}
142
143define <4 x i64> @test_mm256_epi64(<8 x i32> %a, <8 x i32> %b) {
144; AVX512CD-LABEL: test_mm256_epi64:
145; AVX512CD: # BB#0: # %entry
146; AVX512CD-NEXT: # kill: %YMM1<def> %YMM1<kill> %ZMM1<def>
147; AVX512CD-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
148; AVX512CD-NEXT: vpcmpeqd %zmm1, %zmm0, %k0
149; AVX512CD-NEXT: kmovw %k0, %eax
150; AVX512CD-NEXT: vpxor %xmm0, %xmm0, %xmm0
151; AVX512CD-NEXT: vpinsrb $0, %eax, %xmm0, %xmm0
152; AVX512CD-NEXT: vpinsrb $8, %eax, %xmm0, %xmm0
153; AVX512CD-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0
154; AVX512CD-NEXT: retq
155;
156; AVX512VLCDBW-LABEL: test_mm256_epi64:
157; AVX512VLCDBW: # BB#0: # %entry
158; AVX512VLCDBW-NEXT: vpcmpeqd %ymm1, %ymm0, %k0
Jina Nahias5bf66202017-10-30 16:37:28 +0000159; AVX512VLCDBW-NEXT: vpbroadcastmb2q %k0, %ymm0
Jina Nahias98c7f912017-10-01 14:25:21 +0000160; AVX512VLCDBW-NEXT: retq
161;
162; X86-AVX512VLCDBW-LABEL: test_mm256_epi64:
163; X86-AVX512VLCDBW: # BB#0: # %entry
164; X86-AVX512VLCDBW-NEXT: vpcmpeqd %ymm1, %ymm0, %k0
165; X86-AVX512VLCDBW-NEXT: kmovd %k0, %eax
166; X86-AVX512VLCDBW-NEXT: movzbl %al, %eax
167; X86-AVX512VLCDBW-NEXT: vmovd %eax, %xmm0
168; X86-AVX512VLCDBW-NEXT: vpbroadcastq %xmm0, %xmm0
169; X86-AVX512VLCDBW-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0
170; X86-AVX512VLCDBW-NEXT: retl
171entry:
172 %0 = icmp eq <8 x i32> %a, %b
173 %1 = bitcast <8 x i1> %0 to i8
174 %conv.i = zext i8 %1 to i64
175 %vecinit.i.i = insertelement <4 x i64> undef, i64 %conv.i, i32 0
176 %vecinit3.i.i = shufflevector <4 x i64> %vecinit.i.i, <4 x i64> undef, <4 x i32> zeroinitializer
177 ret <4 x i64> %vecinit3.i.i
178}
179
180define <8 x i32> @test_mm256_epi32(<16 x i16> %a, <16 x i16> %b) {
181; AVX512CD-LABEL: test_mm256_epi32:
182; AVX512CD: # BB#0: # %entry
183; AVX512CD-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
184; AVX512CD-NEXT: vpmovsxwd %ymm0, %zmm0
185; AVX512CD-NEXT: vpslld $31, %zmm0, %zmm0
186; AVX512CD-NEXT: vptestmd %zmm0, %zmm0, %k0
187; AVX512CD-NEXT: kmovw %k0, %eax
188; AVX512CD-NEXT: vpxor %xmm0, %xmm0, %xmm0
189; AVX512CD-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0
190; AVX512CD-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0
191; AVX512CD-NEXT: vpinsrw $4, %eax, %xmm0, %xmm0
192; AVX512CD-NEXT: vpinsrw $6, %eax, %xmm0, %xmm0
193; AVX512CD-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0
194; AVX512CD-NEXT: retq
195;
196; AVX512VLCDBW-LABEL: test_mm256_epi32:
197; AVX512VLCDBW: # BB#0: # %entry
198; AVX512VLCDBW-NEXT: vpcmpeqw %ymm1, %ymm0, %k0
Jina Nahias5bf66202017-10-30 16:37:28 +0000199; AVX512VLCDBW-NEXT: vpbroadcastmw2d %k0, %ymm0
Jina Nahias98c7f912017-10-01 14:25:21 +0000200; AVX512VLCDBW-NEXT: retq
201;
202; X86-AVX512VLCDBW-LABEL: test_mm256_epi32:
203; X86-AVX512VLCDBW: # BB#0: # %entry
204; X86-AVX512VLCDBW-NEXT: vpcmpeqw %ymm1, %ymm0, %k0
Jina Nahias5bf66202017-10-30 16:37:28 +0000205; X86-AVX512VLCDBW-NEXT: vpbroadcastmw2d %k0, %ymm0
Jina Nahias98c7f912017-10-01 14:25:21 +0000206; X86-AVX512VLCDBW-NEXT: retl
207entry:
208 %0 = icmp eq <16 x i16> %a, %b
209 %1 = bitcast <16 x i1> %0 to i16
210 %conv.i = zext i16 %1 to i32
211 %vecinit.i.i = insertelement <8 x i32> undef, i32 %conv.i, i32 0
212 %vecinit7.i.i = shufflevector <8 x i32> %vecinit.i.i, <8 x i32> undef, <8 x i32> zeroinitializer
213 ret <8 x i32> %vecinit7.i.i
214}
215