blob: fc91fda3a3c66048c4ddd003d9174287508baa08 [file] [log] [blame]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +00001; 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-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
Craig Topper5befc5b2017-11-28 01:36:31 +00006; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512VLBW
Simon Pilgrima80cb1d2017-07-06 19:33:10 +00008
9;
10; 128-bit vectors
11;
12
13define <2 x i64> @ext_i2_2i64(i2 %a0) {
14; SSE2-SSSE3-LABEL: ext_i2_2i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000015; SSE2-SSSE3: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +000016; SSE2-SSSE3-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +000017; SSE2-SSSE3-NEXT: movq %rdi, %xmm0
18; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
19; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
20; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
21; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
22; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
23; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
24; SSE2-SSSE3-NEXT: psrlq $63, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +000025; SSE2-SSSE3-NEXT: retq
26;
Simon Pilgrima705db92017-09-24 13:42:31 +000027; AVX1-LABEL: ext_i2_2i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000028; AVX1: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +000029; AVX1-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +000030; AVX1-NEXT: vmovq %rdi, %xmm0
31; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
32; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2]
33; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
34; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
35; AVX1-NEXT: vpsrlq $63, %xmm0, %xmm0
36; AVX1-NEXT: retq
37;
38; AVX2-LABEL: ext_i2_2i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000039; AVX2: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +000040; AVX2-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +000041; AVX2-NEXT: vmovq %rdi, %xmm0
42; AVX2-NEXT: vpbroadcastq %xmm0, %xmm0
43; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2]
44; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
45; AVX2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
46; AVX2-NEXT: vpsrlq $63, %xmm0, %xmm0
47; AVX2-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +000048;
Craig Topper5befc5b2017-11-28 01:36:31 +000049; AVX512F-LABEL: ext_i2_2i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000050; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +000051; AVX512F-NEXT: andb $3, %dil
Craig Topper876ec0b2017-12-31 07:38:41 +000052; AVX512F-NEXT: kmovw %edi, %k1
Craig Topper5befc5b2017-11-28 01:36:31 +000053; AVX512F-NEXT: vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +000054; AVX512F-NEXT: # kill: def %xmm0 killed %xmm0 killed %zmm0
Craig Topper5befc5b2017-11-28 01:36:31 +000055; AVX512F-NEXT: vzeroupper
56; AVX512F-NEXT: retq
57;
58; AVX512VLBW-LABEL: ext_i2_2i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000059; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +000060; AVX512VLBW-NEXT: andb $3, %dil
Craig Topper876ec0b2017-12-31 07:38:41 +000061; AVX512VLBW-NEXT: kmovd %edi, %k1
Craig Topper55cf8802017-12-28 19:46:11 +000062; AVX512VLBW-NEXT: vmovdqa64 {{.*}}(%rip), %xmm0 {%k1} {z}
Craig Topper5befc5b2017-11-28 01:36:31 +000063; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +000064 %1 = bitcast i2 %a0 to <2 x i1>
65 %2 = zext <2 x i1> %1 to <2 x i64>
66 ret <2 x i64> %2
67}
68
69define <4 x i32> @ext_i4_4i32(i4 %a0) {
70; SSE2-SSSE3-LABEL: ext_i4_4i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000071; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +000072; SSE2-SSSE3-NEXT: movd %edi, %xmm0
73; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
74; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8]
75; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
76; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
77; SSE2-SSSE3-NEXT: psrld $31, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +000078; SSE2-SSSE3-NEXT: retq
79;
80; AVX1-LABEL: ext_i4_4i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000081; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +000082; AVX1-NEXT: vmovd %edi, %xmm0
83; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
84; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8]
85; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
86; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
87; AVX1-NEXT: vpsrld $31, %xmm0, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +000088; AVX1-NEXT: retq
89;
90; AVX2-LABEL: ext_i4_4i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000091; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +000092; AVX2-NEXT: vmovd %edi, %xmm0
93; AVX2-NEXT: vpbroadcastd %xmm0, %xmm0
94; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +000095; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
Simon Pilgrima705db92017-09-24 13:42:31 +000096; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
97; AVX2-NEXT: vpsrld $31, %xmm0, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +000098; AVX2-NEXT: retq
99;
Craig Topper5befc5b2017-11-28 01:36:31 +0000100; AVX512F-LABEL: ext_i4_4i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000101; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000102; AVX512F-NEXT: andb $15, %dil
Craig Topper876ec0b2017-12-31 07:38:41 +0000103; AVX512F-NEXT: kmovw %edi, %k1
Craig Topper276c7702017-12-05 01:45:46 +0000104; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000105; AVX512F-NEXT: # kill: def %xmm0 killed %xmm0 killed %zmm0
Craig Topper5befc5b2017-11-28 01:36:31 +0000106; AVX512F-NEXT: vzeroupper
107; AVX512F-NEXT: retq
108;
109; AVX512VLBW-LABEL: ext_i4_4i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000110; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000111; AVX512VLBW-NEXT: andb $15, %dil
Craig Topper876ec0b2017-12-31 07:38:41 +0000112; AVX512VLBW-NEXT: kmovd %edi, %k1
Craig Topper55cf8802017-12-28 19:46:11 +0000113; AVX512VLBW-NEXT: vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}
Craig Topper5befc5b2017-11-28 01:36:31 +0000114; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000115 %1 = bitcast i4 %a0 to <4 x i1>
116 %2 = zext <4 x i1> %1 to <4 x i32>
117 ret <4 x i32> %2
118}
119
120define <8 x i16> @ext_i8_8i16(i8 %a0) {
121; SSE2-SSSE3-LABEL: ext_i8_8i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000122; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000123; SSE2-SSSE3-NEXT: movd %edi, %xmm0
Simon Pilgrimc7015962017-12-29 14:41:50 +0000124; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
125; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
Simon Pilgrima705db92017-09-24 13:42:31 +0000126; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
127; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
128; SSE2-SSSE3-NEXT: pcmpeqw %xmm1, %xmm0
129; SSE2-SSSE3-NEXT: psrlw $15, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000130; SSE2-SSSE3-NEXT: retq
131;
Simon Pilgrima705db92017-09-24 13:42:31 +0000132; AVX1-LABEL: ext_i8_8i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000133; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000134; AVX1-NEXT: vmovd %edi, %xmm0
Simon Pilgrimc7015962017-12-29 14:41:50 +0000135; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
136; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
Simon Pilgrima705db92017-09-24 13:42:31 +0000137; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
138; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
139; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
140; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm0
141; AVX1-NEXT: retq
142;
143; AVX2-LABEL: ext_i8_8i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000144; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000145; AVX2-NEXT: vmovd %edi, %xmm0
146; AVX2-NEXT: vpbroadcastw %xmm0, %xmm0
147; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
148; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
149; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
150; AVX2-NEXT: vpsrlw $15, %xmm0, %xmm0
151; AVX2-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000152;
Craig Topper5befc5b2017-11-28 01:36:31 +0000153; AVX512F-LABEL: ext_i8_8i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000154; AVX512F: # %bb.0:
Craig Topperddbc3402017-11-28 01:36:33 +0000155; AVX512F-NEXT: kmovw %edi, %k1
Craig Topper276c7702017-12-05 01:45:46 +0000156; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
157; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000158; AVX512F-NEXT: # kill: def %xmm0 killed %xmm0 killed %ymm0
Craig Topperddbc3402017-11-28 01:36:33 +0000159; AVX512F-NEXT: vzeroupper
Craig Topper5befc5b2017-11-28 01:36:31 +0000160; AVX512F-NEXT: retq
161;
162; AVX512VLBW-LABEL: ext_i8_8i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000163; AVX512VLBW: # %bb.0:
Craig Topperddbc3402017-11-28 01:36:33 +0000164; AVX512VLBW-NEXT: kmovd %edi, %k1
165; AVX512VLBW-NEXT: vmovdqu16 {{.*}}(%rip), %xmm0 {%k1} {z}
Craig Topper5befc5b2017-11-28 01:36:31 +0000166; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000167 %1 = bitcast i8 %a0 to <8 x i1>
168 %2 = zext <8 x i1> %1 to <8 x i16>
169 ret <8 x i16> %2
170}
171
172define <16 x i8> @ext_i16_16i8(i16 %a0) {
Simon Pilgrima705db92017-09-24 13:42:31 +0000173; SSE2-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000174; SSE2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000175; SSE2-NEXT: movd %edi, %xmm0
176; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
177; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]
178; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
179; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
180; SSE2-NEXT: pand %xmm1, %xmm0
181; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
182; SSE2-NEXT: psrlw $7, %xmm0
183; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
184; SSE2-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000185;
Simon Pilgrima705db92017-09-24 13:42:31 +0000186; SSSE3-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000187; SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000188; SSSE3-NEXT: movd %edi, %xmm0
189; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
190; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
191; SSSE3-NEXT: pand %xmm1, %xmm0
192; SSSE3-NEXT: pcmpeqb %xmm1, %xmm0
193; SSSE3-NEXT: psrlw $7, %xmm0
194; SSSE3-NEXT: pand {{.*}}(%rip), %xmm0
195; SSSE3-NEXT: retq
196;
197; AVX1-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000198; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000199; AVX1-NEXT: vmovd %edi, %xmm0
200; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
201; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = mem[0,0]
202; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
203; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
204; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm0
205; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
206; AVX1-NEXT: retq
207;
208; AVX2-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000209; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000210; AVX2-NEXT: vmovd %edi, %xmm0
211; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
212; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [9241421688590303745,9241421688590303745]
213; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
214; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
215; AVX2-NEXT: vpsrlw $7, %xmm0, %xmm0
216; AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
217; AVX2-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000218;
Craig Topper5befc5b2017-11-28 01:36:31 +0000219; AVX512F-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000220; AVX512F: # %bb.0:
Craig Topperddbc3402017-11-28 01:36:33 +0000221; AVX512F-NEXT: kmovw %edi, %k1
222; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
223; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
224; AVX512F-NEXT: vzeroupper
Craig Topper5befc5b2017-11-28 01:36:31 +0000225; AVX512F-NEXT: retq
226;
227; AVX512VLBW-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000228; AVX512VLBW: # %bb.0:
Craig Topperddbc3402017-11-28 01:36:33 +0000229; AVX512VLBW-NEXT: kmovd %edi, %k1
230; AVX512VLBW-NEXT: vmovdqu8 {{.*}}(%rip), %xmm0 {%k1} {z}
Craig Topper5befc5b2017-11-28 01:36:31 +0000231; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000232 %1 = bitcast i16 %a0 to <16 x i1>
233 %2 = zext <16 x i1> %1 to <16 x i8>
234 ret <16 x i8> %2
235}
236
237;
238; 256-bit vectors
239;
240
241define <4 x i64> @ext_i4_4i64(i4 %a0) {
242; SSE2-SSSE3-LABEL: ext_i4_4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000243; SSE2-SSSE3: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000244; SSE2-SSSE3-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000245; SSE2-SSSE3-NEXT: movq %rdi, %xmm0
246; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,1,0,1]
247; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
248; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm1
249; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
250; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
251; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
252; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
253; SSE2-SSSE3-NEXT: psrlq $63, %xmm0
254; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [4,8]
255; SSE2-SSSE3-NEXT: pand %xmm1, %xmm2
256; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm2
257; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
258; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
259; SSE2-SSSE3-NEXT: psrlq $63, %xmm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000260; SSE2-SSSE3-NEXT: retq
261;
262; AVX1-LABEL: ext_i4_4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000263; AVX1: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000264; AVX1-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000265; AVX1-NEXT: vmovq %rdi, %xmm0
266; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
267; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
268; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
269; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
270; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm2
271; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
272; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
273; AVX1-NEXT: vpsrlq $63, %xmm2, %xmm2
274; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
275; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
276; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
277; AVX1-NEXT: vpsrlq $63, %xmm0, %xmm0
278; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000279; AVX1-NEXT: retq
280;
281; AVX2-LABEL: ext_i4_4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000282; AVX2: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000283; AVX2-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000284; AVX2-NEXT: vmovq %rdi, %xmm0
285; AVX2-NEXT: vpbroadcastq %xmm0, %ymm0
286; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8]
287; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
288; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
289; AVX2-NEXT: vpsrlq $63, %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000290; AVX2-NEXT: retq
291;
Craig Topper5befc5b2017-11-28 01:36:31 +0000292; AVX512F-LABEL: ext_i4_4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000293; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000294; AVX512F-NEXT: andb $15, %dil
Craig Topper876ec0b2017-12-31 07:38:41 +0000295; AVX512F-NEXT: kmovw %edi, %k1
Craig Topper5befc5b2017-11-28 01:36:31 +0000296; AVX512F-NEXT: vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000297; AVX512F-NEXT: # kill: def %ymm0 killed %ymm0 killed %zmm0
Craig Topper5befc5b2017-11-28 01:36:31 +0000298; AVX512F-NEXT: retq
299;
300; AVX512VLBW-LABEL: ext_i4_4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000301; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000302; AVX512VLBW-NEXT: andb $15, %dil
Craig Topper876ec0b2017-12-31 07:38:41 +0000303; AVX512VLBW-NEXT: kmovd %edi, %k1
Craig Topper55cf8802017-12-28 19:46:11 +0000304; AVX512VLBW-NEXT: vpbroadcastq {{.*}}(%rip), %ymm0 {%k1} {z}
Craig Topper5befc5b2017-11-28 01:36:31 +0000305; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000306 %1 = bitcast i4 %a0 to <4 x i1>
307 %2 = zext <4 x i1> %1 to <4 x i64>
308 ret <4 x i64> %2
309}
310
311define <8 x i32> @ext_i8_8i32(i8 %a0) {
312; SSE2-SSSE3-LABEL: ext_i8_8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000313; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000314; SSE2-SSSE3-NEXT: movd %edi, %xmm0
315; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
316; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000317; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000318; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000319; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
320; SSE2-SSSE3-NEXT: psrld $31, %xmm0
321; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000322; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000323; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
324; SSE2-SSSE3-NEXT: psrld $31, %xmm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000325; SSE2-SSSE3-NEXT: retq
326;
327; AVX1-LABEL: ext_i8_8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000328; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000329; AVX1-NEXT: vmovd %edi, %xmm0
330; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
331; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000332; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000333; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
334; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm2
335; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
336; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
337; AVX1-NEXT: vpsrld $31, %xmm2, %xmm2
338; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
339; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
340; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
341; AVX1-NEXT: vpsrld $31, %xmm0, %xmm0
342; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000343; AVX1-NEXT: retq
344;
345; AVX2-LABEL: ext_i8_8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000346; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000347; AVX2-NEXT: vmovd %edi, %xmm0
348; AVX2-NEXT: vpbroadcastd %xmm0, %ymm0
349; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000350; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000351; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
352; AVX2-NEXT: vpsrld $31, %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000353; AVX2-NEXT: retq
354;
Craig Topper5befc5b2017-11-28 01:36:31 +0000355; AVX512F-LABEL: ext_i8_8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000356; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000357; AVX512F-NEXT: kmovw %edi, %k1
Craig Topper276c7702017-12-05 01:45:46 +0000358; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000359; AVX512F-NEXT: # kill: def %ymm0 killed %ymm0 killed %zmm0
Craig Topper5befc5b2017-11-28 01:36:31 +0000360; AVX512F-NEXT: retq
361;
362; AVX512VLBW-LABEL: ext_i8_8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000363; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000364; AVX512VLBW-NEXT: kmovd %edi, %k1
365; AVX512VLBW-NEXT: vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z}
366; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000367 %1 = bitcast i8 %a0 to <8 x i1>
368 %2 = zext <8 x i1> %1 to <8 x i32>
369 ret <8 x i32> %2
370}
371
372define <16 x i16> @ext_i16_16i16(i16 %a0) {
373; SSE2-SSSE3-LABEL: ext_i16_16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000374; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000375; SSE2-SSSE3-NEXT: movd %edi, %xmm0
Simon Pilgrimc7015962017-12-29 14:41:50 +0000376; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
377; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
Simon Pilgrima705db92017-09-24 13:42:31 +0000378; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000379; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000380; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000381; SSE2-SSSE3-NEXT: pcmpeqw %xmm2, %xmm0
382; SSE2-SSSE3-NEXT: psrlw $15, %xmm0
383; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000384; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000385; SSE2-SSSE3-NEXT: pcmpeqw %xmm2, %xmm1
386; SSE2-SSSE3-NEXT: psrlw $15, %xmm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000387; SSE2-SSSE3-NEXT: retq
388;
389; AVX1-LABEL: ext_i16_16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000390; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000391; AVX1-NEXT: vmovd %edi, %xmm0
Simon Pilgrimc7015962017-12-29 14:41:50 +0000392; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
393; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
Simon Pilgrima705db92017-09-24 13:42:31 +0000394; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
395; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
396; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
397; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm2
398; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
399; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
400; AVX1-NEXT: vpsrlw $15, %xmm2, %xmm2
401; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
402; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
403; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
404; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm0
405; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000406; AVX1-NEXT: retq
407;
408; AVX2-LABEL: ext_i16_16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000409; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000410; AVX2-NEXT: vmovd %edi, %xmm0
411; AVX2-NEXT: vpbroadcastw %xmm0, %ymm0
412; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
413; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
414; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
415; AVX2-NEXT: vpsrlw $15, %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000416; AVX2-NEXT: retq
417;
Craig Topper5befc5b2017-11-28 01:36:31 +0000418; AVX512F-LABEL: ext_i16_16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000419; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000420; AVX512F-NEXT: kmovw %edi, %k1
421; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
422; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
423; AVX512F-NEXT: retq
424;
425; AVX512VLBW-LABEL: ext_i16_16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000426; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000427; AVX512VLBW-NEXT: kmovd %edi, %k1
428; AVX512VLBW-NEXT: vmovdqu16 {{.*}}(%rip), %ymm0 {%k1} {z}
429; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000430 %1 = bitcast i16 %a0 to <16 x i1>
431 %2 = zext <16 x i1> %1 to <16 x i16>
432 ret <16 x i16> %2
433}
434
435define <32 x i8> @ext_i32_32i8(i32 %a0) {
436; SSE2-SSSE3-LABEL: ext_i32_32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000437; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000438; SSE2-SSSE3-NEXT: movd %edi, %xmm1
439; SSE2-SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
440; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
441; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
442; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
443; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
444; SSE2-SSSE3-NEXT: pcmpeqb %xmm2, %xmm0
445; SSE2-SSSE3-NEXT: psrlw $7, %xmm0
446; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
447; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0
448; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,3,4,5,6,7]
449; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
450; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
451; SSE2-SSSE3-NEXT: pcmpeqb %xmm2, %xmm1
452; SSE2-SSSE3-NEXT: psrlw $7, %xmm1
453; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000454; SSE2-SSSE3-NEXT: retq
455;
456; AVX1-LABEL: ext_i32_32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000457; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000458; AVX1-NEXT: vmovd %edi, %xmm0
459; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
460; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm0[0,0,1,1,4,5,6,7]
461; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
462; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[2,2,3,3,4,5,6,7]
463; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000464; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000465; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
466; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
467; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
468; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
469; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
470; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1
471; AVX1-NEXT: vpsrlw $7, %xmm1, %xmm1
472; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
473; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1
474; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
475; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
476; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm0
477; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
478; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000479; AVX1-NEXT: retq
480;
481; AVX2-LABEL: ext_i32_32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000482; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000483; AVX2-NEXT: vmovd %edi, %xmm0
484; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
485; AVX2-NEXT: vpshuflw {{.*#+}} xmm1 = xmm0[0,0,1,1,4,5,6,7]
486; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
487; AVX2-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[2,2,3,3,4,5,6,7]
488; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000489; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000490; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
491; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
492; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
493; AVX2-NEXT: vpsrlw $7, %ymm0, %ymm0
494; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000495; AVX2-NEXT: retq
496;
Craig Topper5befc5b2017-11-28 01:36:31 +0000497; AVX512F-LABEL: ext_i32_32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000498; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000499; AVX512F-NEXT: pushq %rbp
500; AVX512F-NEXT: .cfi_def_cfa_offset 16
501; AVX512F-NEXT: .cfi_offset %rbp, -16
502; AVX512F-NEXT: movq %rsp, %rbp
503; AVX512F-NEXT: .cfi_def_cfa_register %rbp
504; AVX512F-NEXT: andq $-32, %rsp
505; AVX512F-NEXT: subq $32, %rsp
506; AVX512F-NEXT: movl %edi, (%rsp)
Craig Topperddbc3402017-11-28 01:36:33 +0000507; AVX512F-NEXT: movl {{.*}}(%rip), %eax
508; AVX512F-NEXT: kmovw (%rsp), %k1
509; AVX512F-NEXT: kmovw {{[0-9]+}}(%rsp), %k2
510; AVX512F-NEXT: vpbroadcastd %eax, %zmm0 {%k1} {z}
511; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
512; AVX512F-NEXT: vpbroadcastd %eax, %zmm1 {%k2} {z}
513; AVX512F-NEXT: vpmovdb %zmm1, %xmm1
514; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
Craig Topper5befc5b2017-11-28 01:36:31 +0000515; AVX512F-NEXT: movq %rbp, %rsp
516; AVX512F-NEXT: popq %rbp
517; AVX512F-NEXT: retq
518;
519; AVX512VLBW-LABEL: ext_i32_32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000520; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000521; AVX512VLBW-NEXT: kmovd %edi, %k1
522; AVX512VLBW-NEXT: vmovdqu8 {{.*}}(%rip), %ymm0 {%k1} {z}
523; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000524 %1 = bitcast i32 %a0 to <32 x i1>
525 %2 = zext <32 x i1> %1 to <32 x i8>
526 ret <32 x i8> %2
527}
528
529;
530; 512-bit vectors
531;
532
533define <8 x i64> @ext_i8_8i64(i8 %a0) {
534; SSE2-SSSE3-LABEL: ext_i8_8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000535; SSE2-SSSE3: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000536; SSE2-SSSE3-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000537; SSE2-SSSE3-NEXT: movq %rdi, %xmm0
538; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,1,0,1]
539; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
540; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm1
541; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
542; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
543; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
544; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
545; SSE2-SSSE3-NEXT: psrlq $63, %xmm0
546; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [4,8]
547; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm2
548; SSE2-SSSE3-NEXT: pand %xmm1, %xmm2
549; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm2
550; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
551; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
552; SSE2-SSSE3-NEXT: psrlq $63, %xmm1
553; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32]
554; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm3
555; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3
556; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
557; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,0,3,2]
558; SSE2-SSSE3-NEXT: pand %xmm3, %xmm2
559; SSE2-SSSE3-NEXT: psrlq $63, %xmm2
560; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [64,128]
561; SSE2-SSSE3-NEXT: pand %xmm3, %xmm4
562; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
563; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000564; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3
Simon Pilgrima705db92017-09-24 13:42:31 +0000565; SSE2-SSSE3-NEXT: psrlq $63, %xmm3
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000566; SSE2-SSSE3-NEXT: retq
567;
568; AVX1-LABEL: ext_i8_8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000569; AVX1: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000570; AVX1-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000571; AVX1-NEXT: vmovq %rdi, %xmm0
572; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
573; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1
574; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm0
575; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
576; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm3
577; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
578; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
579; AVX1-NEXT: vpsrlq $63, %xmm3, %xmm3
580; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
581; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0
582; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
583; AVX1-NEXT: vpsrlq $63, %xmm0, %xmm0
584; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0
585; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm1
586; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm3
587; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
588; AVX1-NEXT: vpsrlq $63, %xmm3, %xmm3
589; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
590; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1
591; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
592; AVX1-NEXT: vpsrlq $63, %xmm1, %xmm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000593; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000594; AVX1-NEXT: retq
595;
596; AVX2-LABEL: ext_i8_8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000597; AVX2: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000598; AVX2-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000599; AVX2-NEXT: vmovq %rdi, %xmm0
600; AVX2-NEXT: vpbroadcastq %xmm0, %ymm1
601; AVX2-NEXT: vmovdqa {{.*#+}} ymm0 = [1,2,4,8]
602; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm2
603; AVX2-NEXT: vpcmpeqq %ymm0, %ymm2, %ymm0
604; AVX2-NEXT: vpsrlq $63, %ymm0, %ymm0
605; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000606; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000607; AVX2-NEXT: vpcmpeqq %ymm2, %ymm1, %ymm1
608; AVX2-NEXT: vpsrlq $63, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000609; AVX2-NEXT: retq
610;
Craig Topper5befc5b2017-11-28 01:36:31 +0000611; AVX512F-LABEL: ext_i8_8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000612; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000613; AVX512F-NEXT: kmovw %edi, %k1
614; AVX512F-NEXT: vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
615; AVX512F-NEXT: retq
616;
617; AVX512VLBW-LABEL: ext_i8_8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000618; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000619; AVX512VLBW-NEXT: kmovd %edi, %k1
620; AVX512VLBW-NEXT: vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
621; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000622 %1 = bitcast i8 %a0 to <8 x i1>
623 %2 = zext <8 x i1> %1 to <8 x i64>
624 ret <8 x i64> %2
625}
626
627define <16 x i32> @ext_i16_16i32(i16 %a0) {
628; SSE2-SSSE3-LABEL: ext_i16_16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000629; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000630; SSE2-SSSE3-NEXT: movd %edi, %xmm0
631; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
632; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8]
633; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0
634; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
635; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
636; SSE2-SSSE3-NEXT: psrld $31, %xmm0
637; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000638; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000639; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
640; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
641; SSE2-SSSE3-NEXT: psrld $31, %xmm1
642; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [256,512,1024,2048]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000643; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000644; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
Simon Pilgrima705db92017-09-24 13:42:31 +0000645; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm2
646; SSE2-SSSE3-NEXT: psrld $31, %xmm2
647; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [4096,8192,16384,32768]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000648; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3
Simon Pilgrima705db92017-09-24 13:42:31 +0000649; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm3
650; SSE2-SSSE3-NEXT: psrld $31, %xmm3
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000651; SSE2-SSSE3-NEXT: retq
652;
653; AVX1-LABEL: ext_i16_16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000654; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000655; AVX1-NEXT: vmovd %edi, %xmm0
656; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
657; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1
658; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm0
659; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
660; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm3
661; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
662; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
663; AVX1-NEXT: vpsrld $31, %xmm3, %xmm3
664; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
665; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
666; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
667; AVX1-NEXT: vpsrld $31, %xmm0, %xmm0
668; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0
669; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm1
670; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm3
671; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
672; AVX1-NEXT: vpsrld $31, %xmm3, %xmm3
673; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
674; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
675; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
676; AVX1-NEXT: vpsrld $31, %xmm1, %xmm1
677; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000678; AVX1-NEXT: retq
679;
680; AVX2-LABEL: ext_i16_16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000681; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000682; AVX2-NEXT: vmovd %edi, %xmm0
683; AVX2-NEXT: vpbroadcastd %xmm0, %ymm1
684; AVX2-NEXT: vmovdqa {{.*#+}} ymm0 = [1,2,4,8,16,32,64,128]
685; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm2
686; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0
687; AVX2-NEXT: vpsrld $31, %ymm0, %ymm0
688; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [256,512,1024,2048,4096,8192,16384,32768]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000689; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000690; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1
691; AVX2-NEXT: vpsrld $31, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000692; AVX2-NEXT: retq
693;
Craig Topper5befc5b2017-11-28 01:36:31 +0000694; AVX512F-LABEL: ext_i16_16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000695; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000696; AVX512F-NEXT: kmovw %edi, %k1
697; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
698; AVX512F-NEXT: retq
699;
700; AVX512VLBW-LABEL: ext_i16_16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000701; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000702; AVX512VLBW-NEXT: kmovd %edi, %k1
703; AVX512VLBW-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
704; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000705 %1 = bitcast i16 %a0 to <16 x i1>
706 %2 = zext <16 x i1> %1 to <16 x i32>
707 ret <16 x i32> %2
708}
709
710define <32 x i16> @ext_i32_32i16(i32 %a0) {
711; SSE2-SSSE3-LABEL: ext_i32_32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000712; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000713; SSE2-SSSE3-NEXT: movd %edi, %xmm2
Simon Pilgrimc7015962017-12-29 14:41:50 +0000714; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm2[0,0,2,3,4,5,6,7]
715; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
Simon Pilgrima705db92017-09-24 13:42:31 +0000716; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000717; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000718; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000719; SSE2-SSSE3-NEXT: pcmpeqw %xmm4, %xmm0
720; SSE2-SSSE3-NEXT: psrlw $15, %xmm0
721; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [256,512,1024,2048,4096,8192,16384,32768]
722; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
723; SSE2-SSSE3-NEXT: pcmpeqw %xmm5, %xmm1
724; SSE2-SSSE3-NEXT: psrlw $15, %xmm1
Simon Pilgrimc7015962017-12-29 14:41:50 +0000725; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[1,1,2,3,4,5,6,7]
726; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,0,0]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000727; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000728; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
Simon Pilgrima705db92017-09-24 13:42:31 +0000729; SSE2-SSSE3-NEXT: pcmpeqw %xmm4, %xmm2
730; SSE2-SSSE3-NEXT: psrlw $15, %xmm2
731; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3
732; SSE2-SSSE3-NEXT: pcmpeqw %xmm5, %xmm3
733; SSE2-SSSE3-NEXT: psrlw $15, %xmm3
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000734; SSE2-SSSE3-NEXT: retq
735;
736; AVX1-LABEL: ext_i32_32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000737; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000738; AVX1-NEXT: vmovd %edi, %xmm1
Simon Pilgrimc7015962017-12-29 14:41:50 +0000739; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm1[0,0,2,3,4,5,6,7]
740; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
Simon Pilgrima705db92017-09-24 13:42:31 +0000741; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
742; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000743; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000744; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
745; AVX1-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm4
746; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
747; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
748; AVX1-NEXT: vpsrlw $15, %xmm4, %xmm4
749; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
750; AVX1-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm0
751; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0
752; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm0
753; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm4, %ymm0
Simon Pilgrimc7015962017-12-29 14:41:50 +0000754; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[1,1,2,3,4,5,6,7]
755; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
Simon Pilgrima705db92017-09-24 13:42:31 +0000756; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000757; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000758; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm2
759; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
760; AVX1-NEXT: vpsrlw $15, %xmm2, %xmm2
761; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
762; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm1
763; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
764; AVX1-NEXT: vpsrlw $15, %xmm1, %xmm1
765; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000766; AVX1-NEXT: retq
767;
768; AVX2-LABEL: ext_i32_32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000769; AVX2: # %bb.0:
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000770; AVX2-NEXT: vmovd %edi, %xmm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000771; AVX2-NEXT: vpbroadcastw %xmm0, %ymm0
772; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
773; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
774; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
775; AVX2-NEXT: vpsrlw $15, %ymm0, %ymm0
776; AVX2-NEXT: shrl $16, %edi
777; AVX2-NEXT: vmovd %edi, %xmm2
778; AVX2-NEXT: vpbroadcastw %xmm2, %ymm2
779; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm2
780; AVX2-NEXT: vpcmpeqw %ymm1, %ymm2, %ymm1
781; AVX2-NEXT: vpsrlw $15, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000782; AVX2-NEXT: retq
783;
Craig Topper5befc5b2017-11-28 01:36:31 +0000784; AVX512F-LABEL: ext_i32_32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000785; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000786; AVX512F-NEXT: pushq %rbp
787; AVX512F-NEXT: .cfi_def_cfa_offset 16
788; AVX512F-NEXT: .cfi_offset %rbp, -16
789; AVX512F-NEXT: movq %rsp, %rbp
790; AVX512F-NEXT: .cfi_def_cfa_register %rbp
791; AVX512F-NEXT: andq $-32, %rsp
792; AVX512F-NEXT: subq $32, %rsp
793; AVX512F-NEXT: movl %edi, (%rsp)
794; AVX512F-NEXT: kmovw (%rsp), %k1
795; AVX512F-NEXT: kmovw {{[0-9]+}}(%rsp), %k2
796; AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k2} {z}
797; AVX512F-NEXT: vpmovdb %zmm0, %xmm1
798; AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
799; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
800; AVX512F-NEXT: vmovdqa {{.*#+}} xmm2 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
801; AVX512F-NEXT: vpand %xmm2, %xmm0, %xmm0
802; AVX512F-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
803; AVX512F-NEXT: vpand %xmm2, %xmm1, %xmm1
804; AVX512F-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
805; AVX512F-NEXT: movq %rbp, %rsp
806; AVX512F-NEXT: popq %rbp
807; AVX512F-NEXT: retq
808;
809; AVX512VLBW-LABEL: ext_i32_32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000810; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000811; AVX512VLBW-NEXT: kmovd %edi, %k1
812; AVX512VLBW-NEXT: vmovdqu16 {{.*}}(%rip), %zmm0 {%k1} {z}
813; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000814 %1 = bitcast i32 %a0 to <32 x i1>
815 %2 = zext <32 x i1> %1 to <32 x i16>
816 ret <32 x i16> %2
817}
818
819define <64 x i8> @ext_i64_64i8(i64 %a0) {
820; SSE2-SSSE3-LABEL: ext_i64_64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000821; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000822; SSE2-SSSE3-NEXT: movq %rdi, %xmm3
823; SSE2-SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
824; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm3[0,0,1,1,4,5,6,7]
825; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
826; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
827; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
828; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm0
829; SSE2-SSSE3-NEXT: psrlw $7, %xmm0
830; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
831; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0
832; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm3[2,2,3,3,4,5,6,7]
833; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
834; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
835; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm1
836; SSE2-SSSE3-NEXT: psrlw $7, %xmm1
837; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
838; SSE2-SSSE3-NEXT: pshufhw {{.*#+}} xmm2 = xmm3[0,1,2,3,4,4,5,5]
839; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,2,3,3]
840; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
841; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm2
842; SSE2-SSSE3-NEXT: psrlw $7, %xmm2
843; SSE2-SSSE3-NEXT: pand %xmm5, %xmm2
844; SSE2-SSSE3-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,6,7,7]
845; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,2,3,3]
846; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3
847; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm3
848; SSE2-SSSE3-NEXT: psrlw $7, %xmm3
849; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000850; SSE2-SSSE3-NEXT: retq
851;
852; AVX1-LABEL: ext_i64_64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000853; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000854; AVX1-NEXT: vmovq %rdi, %xmm0
855; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
856; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
857; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
858; AVX1-NEXT: vpshuflw {{.*#+}} xmm2 = xmm1[2,2,3,3,4,5,6,7]
859; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,1,1]
860; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
861; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
862; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
863; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
864; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
865; AVX1-NEXT: vpcmpeqb %xmm4, %xmm3, %xmm3
866; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
867; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
868; AVX1-NEXT: vpsrlw $7, %xmm3, %xmm3
869; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
870; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
871; AVX1-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm0
872; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0
873; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm0
874; AVX1-NEXT: vpand %xmm6, %xmm0, %xmm0
875; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
876; AVX1-NEXT: vpshufhw {{.*#+}} xmm3 = xmm1[0,1,2,3,4,4,5,5]
877; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[2,2,3,3]
878; AVX1-NEXT: vpshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,6,7,7]
879; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
880; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
881; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1
882; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
883; AVX1-NEXT: vpcmpeqb %xmm4, %xmm2, %xmm2
884; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
885; AVX1-NEXT: vpsrlw $7, %xmm2, %xmm2
886; AVX1-NEXT: vpand %xmm6, %xmm2, %xmm2
887; AVX1-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm1
888; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
889; AVX1-NEXT: vpsrlw $7, %xmm1, %xmm1
890; AVX1-NEXT: vpand %xmm6, %xmm1, %xmm1
891; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000892; AVX1-NEXT: retq
893;
894; AVX2-LABEL: ext_i64_64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000895; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000896; AVX2-NEXT: vmovq %rdi, %xmm0
897; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
898; AVX2-NEXT: vpshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
899; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
900; AVX2-NEXT: vpshuflw {{.*#+}} xmm2 = xmm1[2,2,3,3,4,5,6,7]
901; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,1,1]
902; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
903; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
904; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
905; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0
906; AVX2-NEXT: vpsrlw $7, %ymm0, %ymm0
907; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
908; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0
909; AVX2-NEXT: vpshufhw {{.*#+}} xmm4 = xmm1[0,1,2,3,4,4,5,5]
910; AVX2-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[2,2,3,3]
911; AVX2-NEXT: vpshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,6,7,7]
912; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
913; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm4, %ymm1
914; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
915; AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1
916; AVX2-NEXT: vpsrlw $7, %ymm1, %ymm1
917; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000918; AVX2-NEXT: retq
919;
Craig Topper5befc5b2017-11-28 01:36:31 +0000920; AVX512F-LABEL: ext_i64_64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000921; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000922; AVX512F-NEXT: pushq %rbp
923; AVX512F-NEXT: .cfi_def_cfa_offset 16
924; AVX512F-NEXT: .cfi_offset %rbp, -16
925; AVX512F-NEXT: movq %rsp, %rbp
926; AVX512F-NEXT: .cfi_def_cfa_register %rbp
927; AVX512F-NEXT: andq $-32, %rsp
928; AVX512F-NEXT: subq $64, %rsp
929; AVX512F-NEXT: movl %edi, (%rsp)
930; AVX512F-NEXT: shrq $32, %rdi
931; AVX512F-NEXT: movl %edi, {{[0-9]+}}(%rsp)
Craig Topperddbc3402017-11-28 01:36:33 +0000932; AVX512F-NEXT: movl {{.*}}(%rip), %eax
933; AVX512F-NEXT: kmovw (%rsp), %k1
934; AVX512F-NEXT: kmovw {{[0-9]+}}(%rsp), %k2
935; AVX512F-NEXT: vpbroadcastd %eax, %zmm0 {%k1} {z}
936; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
937; AVX512F-NEXT: vpbroadcastd %eax, %zmm1 {%k2} {z}
938; AVX512F-NEXT: vpmovdb %zmm1, %xmm1
939; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
Craig Topper5befc5b2017-11-28 01:36:31 +0000940; AVX512F-NEXT: kmovw {{[0-9]+}}(%rsp), %k1
Craig Topperddbc3402017-11-28 01:36:33 +0000941; AVX512F-NEXT: kmovw {{[0-9]+}}(%rsp), %k2
942; AVX512F-NEXT: vpbroadcastd %eax, %zmm1 {%k1} {z}
943; AVX512F-NEXT: vpmovdb %zmm1, %xmm1
944; AVX512F-NEXT: vpbroadcastd %eax, %zmm2 {%k2} {z}
945; AVX512F-NEXT: vpmovdb %zmm2, %xmm2
946; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1
Craig Topper5befc5b2017-11-28 01:36:31 +0000947; AVX512F-NEXT: movq %rbp, %rsp
948; AVX512F-NEXT: popq %rbp
949; AVX512F-NEXT: retq
950;
951; AVX512VLBW-LABEL: ext_i64_64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000952; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000953; AVX512VLBW-NEXT: kmovq %rdi, %k1
954; AVX512VLBW-NEXT: vmovdqu8 {{.*}}(%rip), %zmm0 {%k1} {z}
955; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000956 %1 = bitcast i64 %a0 to <64 x i1>
957 %2 = zext <64 x i1> %1 to <64 x i8>
958 ret <64 x i8> %2
959}