blob: 9e77cd11449e67f9240f6978d257939864060a72 [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
52; AVX512F-NEXT: movb %dil, -{{[0-9]+}}(%rsp)
53; AVX512F-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax
54; AVX512F-NEXT: kmovw %eax, %k1
55; AVX512F-NEXT: vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +000056; AVX512F-NEXT: # kill: def %xmm0 killed %xmm0 killed %zmm0
Craig Topper5befc5b2017-11-28 01:36:31 +000057; AVX512F-NEXT: vzeroupper
58; AVX512F-NEXT: retq
59;
60; AVX512VLBW-LABEL: ext_i2_2i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000061; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +000062; AVX512VLBW-NEXT: andb $3, %dil
63; AVX512VLBW-NEXT: movb %dil, -{{[0-9]+}}(%rsp)
64; AVX512VLBW-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax
65; AVX512VLBW-NEXT: kmovd %eax, %k1
Craig Topper55cf8802017-12-28 19:46:11 +000066; AVX512VLBW-NEXT: vmovdqa64 {{.*}}(%rip), %xmm0 {%k1} {z}
Craig Topper5befc5b2017-11-28 01:36:31 +000067; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +000068 %1 = bitcast i2 %a0 to <2 x i1>
69 %2 = zext <2 x i1> %1 to <2 x i64>
70 ret <2 x i64> %2
71}
72
73define <4 x i32> @ext_i4_4i32(i4 %a0) {
74; SSE2-SSSE3-LABEL: ext_i4_4i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000075; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +000076; SSE2-SSSE3-NEXT: movd %edi, %xmm0
77; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
78; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8]
79; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
80; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
81; SSE2-SSSE3-NEXT: psrld $31, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +000082; SSE2-SSSE3-NEXT: retq
83;
84; AVX1-LABEL: ext_i4_4i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000085; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +000086; AVX1-NEXT: vmovd %edi, %xmm0
87; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
88; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8]
89; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
90; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
91; AVX1-NEXT: vpsrld $31, %xmm0, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +000092; AVX1-NEXT: retq
93;
94; AVX2-LABEL: ext_i4_4i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000095; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +000096; AVX2-NEXT: vmovd %edi, %xmm0
97; AVX2-NEXT: vpbroadcastd %xmm0, %xmm0
98; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +000099; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000100; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
101; AVX2-NEXT: vpsrld $31, %xmm0, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000102; AVX2-NEXT: retq
103;
Craig Topper5befc5b2017-11-28 01:36:31 +0000104; AVX512F-LABEL: ext_i4_4i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000105; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000106; AVX512F-NEXT: andb $15, %dil
107; AVX512F-NEXT: movb %dil, -{{[0-9]+}}(%rsp)
108; AVX512F-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax
109; AVX512F-NEXT: kmovw %eax, %k1
Craig Topper276c7702017-12-05 01:45:46 +0000110; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000111; AVX512F-NEXT: # kill: def %xmm0 killed %xmm0 killed %zmm0
Craig Topper5befc5b2017-11-28 01:36:31 +0000112; AVX512F-NEXT: vzeroupper
113; AVX512F-NEXT: retq
114;
115; AVX512VLBW-LABEL: ext_i4_4i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000116; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000117; AVX512VLBW-NEXT: andb $15, %dil
118; AVX512VLBW-NEXT: movb %dil, -{{[0-9]+}}(%rsp)
119; AVX512VLBW-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax
120; AVX512VLBW-NEXT: kmovd %eax, %k1
Craig Topper55cf8802017-12-28 19:46:11 +0000121; AVX512VLBW-NEXT: vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}
Craig Topper5befc5b2017-11-28 01:36:31 +0000122; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000123 %1 = bitcast i4 %a0 to <4 x i1>
124 %2 = zext <4 x i1> %1 to <4 x i32>
125 ret <4 x i32> %2
126}
127
128define <8 x i16> @ext_i8_8i16(i8 %a0) {
129; SSE2-SSSE3-LABEL: ext_i8_8i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000130; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000131; SSE2-SSSE3-NEXT: movd %edi, %xmm0
132; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
133; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
134; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
135; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
136; SSE2-SSSE3-NEXT: pcmpeqw %xmm1, %xmm0
137; SSE2-SSSE3-NEXT: psrlw $15, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000138; SSE2-SSSE3-NEXT: retq
139;
Simon Pilgrima705db92017-09-24 13:42:31 +0000140; AVX1-LABEL: ext_i8_8i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000141; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000142; AVX1-NEXT: vmovd %edi, %xmm0
143; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
144; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
145; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
146; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
147; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
148; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm0
149; AVX1-NEXT: retq
150;
151; AVX2-LABEL: ext_i8_8i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000152; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000153; AVX2-NEXT: vmovd %edi, %xmm0
154; AVX2-NEXT: vpbroadcastw %xmm0, %xmm0
155; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
156; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
157; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
158; AVX2-NEXT: vpsrlw $15, %xmm0, %xmm0
159; AVX2-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000160;
Craig Topper5befc5b2017-11-28 01:36:31 +0000161; AVX512F-LABEL: ext_i8_8i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000162; AVX512F: # %bb.0:
Craig Topperddbc3402017-11-28 01:36:33 +0000163; AVX512F-NEXT: kmovw %edi, %k1
Craig Topper276c7702017-12-05 01:45:46 +0000164; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
165; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000166; AVX512F-NEXT: # kill: def %xmm0 killed %xmm0 killed %ymm0
Craig Topperddbc3402017-11-28 01:36:33 +0000167; AVX512F-NEXT: vzeroupper
Craig Topper5befc5b2017-11-28 01:36:31 +0000168; AVX512F-NEXT: retq
169;
170; AVX512VLBW-LABEL: ext_i8_8i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000171; AVX512VLBW: # %bb.0:
Craig Topperddbc3402017-11-28 01:36:33 +0000172; AVX512VLBW-NEXT: kmovd %edi, %k1
173; AVX512VLBW-NEXT: vmovdqu16 {{.*}}(%rip), %xmm0 {%k1} {z}
Craig Topper5befc5b2017-11-28 01:36:31 +0000174; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000175 %1 = bitcast i8 %a0 to <8 x i1>
176 %2 = zext <8 x i1> %1 to <8 x i16>
177 ret <8 x i16> %2
178}
179
180define <16 x i8> @ext_i16_16i8(i16 %a0) {
Simon Pilgrima705db92017-09-24 13:42:31 +0000181; SSE2-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000182; SSE2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000183; SSE2-NEXT: movd %edi, %xmm0
184; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
185; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]
186; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
187; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
188; SSE2-NEXT: pand %xmm1, %xmm0
189; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
190; SSE2-NEXT: psrlw $7, %xmm0
191; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
192; SSE2-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000193;
Simon Pilgrima705db92017-09-24 13:42:31 +0000194; SSSE3-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000195; SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000196; SSSE3-NEXT: movd %edi, %xmm0
197; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
198; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
199; SSSE3-NEXT: pand %xmm1, %xmm0
200; SSSE3-NEXT: pcmpeqb %xmm1, %xmm0
201; SSSE3-NEXT: psrlw $7, %xmm0
202; SSSE3-NEXT: pand {{.*}}(%rip), %xmm0
203; SSSE3-NEXT: retq
204;
205; AVX1-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000206; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000207; AVX1-NEXT: vmovd %edi, %xmm0
208; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
209; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = mem[0,0]
210; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
211; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
212; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm0
213; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
214; AVX1-NEXT: retq
215;
216; AVX2-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000217; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000218; AVX2-NEXT: vmovd %edi, %xmm0
219; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
220; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [9241421688590303745,9241421688590303745]
221; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
222; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
223; AVX2-NEXT: vpsrlw $7, %xmm0, %xmm0
224; AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
225; AVX2-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000226;
Craig Topper5befc5b2017-11-28 01:36:31 +0000227; AVX512F-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000228; AVX512F: # %bb.0:
Craig Topperddbc3402017-11-28 01:36:33 +0000229; AVX512F-NEXT: kmovw %edi, %k1
230; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
231; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
232; AVX512F-NEXT: vzeroupper
Craig Topper5befc5b2017-11-28 01:36:31 +0000233; AVX512F-NEXT: retq
234;
235; AVX512VLBW-LABEL: ext_i16_16i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000236; AVX512VLBW: # %bb.0:
Craig Topperddbc3402017-11-28 01:36:33 +0000237; AVX512VLBW-NEXT: kmovd %edi, %k1
238; AVX512VLBW-NEXT: vmovdqu8 {{.*}}(%rip), %xmm0 {%k1} {z}
Craig Topper5befc5b2017-11-28 01:36:31 +0000239; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000240 %1 = bitcast i16 %a0 to <16 x i1>
241 %2 = zext <16 x i1> %1 to <16 x i8>
242 ret <16 x i8> %2
243}
244
245;
246; 256-bit vectors
247;
248
249define <4 x i64> @ext_i4_4i64(i4 %a0) {
250; SSE2-SSSE3-LABEL: ext_i4_4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000251; SSE2-SSSE3: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000252; SSE2-SSSE3-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000253; SSE2-SSSE3-NEXT: movq %rdi, %xmm0
254; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,1,0,1]
255; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
256; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm1
257; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
258; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
259; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
260; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
261; SSE2-SSSE3-NEXT: psrlq $63, %xmm0
262; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [4,8]
263; SSE2-SSSE3-NEXT: pand %xmm1, %xmm2
264; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm2
265; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
266; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
267; SSE2-SSSE3-NEXT: psrlq $63, %xmm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000268; SSE2-SSSE3-NEXT: retq
269;
270; AVX1-LABEL: ext_i4_4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000271; AVX1: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000272; AVX1-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000273; AVX1-NEXT: vmovq %rdi, %xmm0
274; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
275; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
276; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
277; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
278; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm2
279; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
280; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
281; AVX1-NEXT: vpsrlq $63, %xmm2, %xmm2
282; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
283; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
284; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
285; AVX1-NEXT: vpsrlq $63, %xmm0, %xmm0
286; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000287; AVX1-NEXT: retq
288;
289; AVX2-LABEL: ext_i4_4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000290; AVX2: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000291; AVX2-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000292; AVX2-NEXT: vmovq %rdi, %xmm0
293; AVX2-NEXT: vpbroadcastq %xmm0, %ymm0
294; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8]
295; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
296; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
297; AVX2-NEXT: vpsrlq $63, %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000298; AVX2-NEXT: retq
299;
Craig Topper5befc5b2017-11-28 01:36:31 +0000300; AVX512F-LABEL: ext_i4_4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000301; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000302; AVX512F-NEXT: andb $15, %dil
303; AVX512F-NEXT: movb %dil, -{{[0-9]+}}(%rsp)
304; AVX512F-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax
305; AVX512F-NEXT: kmovw %eax, %k1
306; AVX512F-NEXT: vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000307; AVX512F-NEXT: # kill: def %ymm0 killed %ymm0 killed %zmm0
Craig Topper5befc5b2017-11-28 01:36:31 +0000308; AVX512F-NEXT: retq
309;
310; AVX512VLBW-LABEL: ext_i4_4i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000311; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000312; AVX512VLBW-NEXT: andb $15, %dil
313; AVX512VLBW-NEXT: movb %dil, -{{[0-9]+}}(%rsp)
314; AVX512VLBW-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax
315; AVX512VLBW-NEXT: kmovd %eax, %k1
Craig Topper55cf8802017-12-28 19:46:11 +0000316; AVX512VLBW-NEXT: vpbroadcastq {{.*}}(%rip), %ymm0 {%k1} {z}
Craig Topper5befc5b2017-11-28 01:36:31 +0000317; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000318 %1 = bitcast i4 %a0 to <4 x i1>
319 %2 = zext <4 x i1> %1 to <4 x i64>
320 ret <4 x i64> %2
321}
322
323define <8 x i32> @ext_i8_8i32(i8 %a0) {
324; SSE2-SSSE3-LABEL: ext_i8_8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000325; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000326; SSE2-SSSE3-NEXT: movd %edi, %xmm0
327; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
328; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000329; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000330; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000331; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
332; SSE2-SSSE3-NEXT: psrld $31, %xmm0
333; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000334; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000335; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
336; SSE2-SSSE3-NEXT: psrld $31, %xmm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000337; SSE2-SSSE3-NEXT: retq
338;
339; AVX1-LABEL: ext_i8_8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000340; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000341; AVX1-NEXT: vmovd %edi, %xmm0
342; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
343; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000344; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000345; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
346; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm2
347; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
348; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
349; AVX1-NEXT: vpsrld $31, %xmm2, %xmm2
350; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
351; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
352; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
353; AVX1-NEXT: vpsrld $31, %xmm0, %xmm0
354; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000355; AVX1-NEXT: retq
356;
357; AVX2-LABEL: ext_i8_8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000358; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000359; AVX2-NEXT: vmovd %edi, %xmm0
360; AVX2-NEXT: vpbroadcastd %xmm0, %ymm0
361; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000362; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000363; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
364; AVX2-NEXT: vpsrld $31, %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000365; AVX2-NEXT: retq
366;
Craig Topper5befc5b2017-11-28 01:36:31 +0000367; AVX512F-LABEL: ext_i8_8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000368; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000369; AVX512F-NEXT: kmovw %edi, %k1
Craig Topper276c7702017-12-05 01:45:46 +0000370; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000371; AVX512F-NEXT: # kill: def %ymm0 killed %ymm0 killed %zmm0
Craig Topper5befc5b2017-11-28 01:36:31 +0000372; AVX512F-NEXT: retq
373;
374; AVX512VLBW-LABEL: ext_i8_8i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000375; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000376; AVX512VLBW-NEXT: kmovd %edi, %k1
377; AVX512VLBW-NEXT: vpbroadcastd {{.*}}(%rip), %ymm0 {%k1} {z}
378; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000379 %1 = bitcast i8 %a0 to <8 x i1>
380 %2 = zext <8 x i1> %1 to <8 x i32>
381 ret <8 x i32> %2
382}
383
384define <16 x i16> @ext_i16_16i16(i16 %a0) {
385; SSE2-SSSE3-LABEL: ext_i16_16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000386; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000387; SSE2-SSSE3-NEXT: movd %edi, %xmm0
388; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
389; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,1]
390; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000391; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000392; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000393; SSE2-SSSE3-NEXT: pcmpeqw %xmm2, %xmm0
394; SSE2-SSSE3-NEXT: psrlw $15, %xmm0
395; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000396; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000397; SSE2-SSSE3-NEXT: pcmpeqw %xmm2, %xmm1
398; SSE2-SSSE3-NEXT: psrlw $15, %xmm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000399; SSE2-SSSE3-NEXT: retq
400;
401; AVX1-LABEL: ext_i16_16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000402; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000403; AVX1-NEXT: vmovd %edi, %xmm0
404; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
405; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
406; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
407; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
408; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
409; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm2
410; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
411; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
412; AVX1-NEXT: vpsrlw $15, %xmm2, %xmm2
413; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
414; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
415; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
416; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm0
417; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000418; AVX1-NEXT: retq
419;
420; AVX2-LABEL: ext_i16_16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000421; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000422; AVX2-NEXT: vmovd %edi, %xmm0
423; AVX2-NEXT: vpbroadcastw %xmm0, %ymm0
424; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
425; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
426; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
427; AVX2-NEXT: vpsrlw $15, %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000428; AVX2-NEXT: retq
429;
Craig Topper5befc5b2017-11-28 01:36:31 +0000430; AVX512F-LABEL: ext_i16_16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000431; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000432; AVX512F-NEXT: kmovw %edi, %k1
433; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
434; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
435; AVX512F-NEXT: retq
436;
437; AVX512VLBW-LABEL: ext_i16_16i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000438; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000439; AVX512VLBW-NEXT: kmovd %edi, %k1
440; AVX512VLBW-NEXT: vmovdqu16 {{.*}}(%rip), %ymm0 {%k1} {z}
441; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000442 %1 = bitcast i16 %a0 to <16 x i1>
443 %2 = zext <16 x i1> %1 to <16 x i16>
444 ret <16 x i16> %2
445}
446
447define <32 x i8> @ext_i32_32i8(i32 %a0) {
448; SSE2-SSSE3-LABEL: ext_i32_32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000449; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000450; SSE2-SSSE3-NEXT: movd %edi, %xmm1
451; SSE2-SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
452; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
453; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
454; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
455; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
456; SSE2-SSSE3-NEXT: pcmpeqb %xmm2, %xmm0
457; SSE2-SSSE3-NEXT: psrlw $7, %xmm0
458; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
459; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0
460; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,3,4,5,6,7]
461; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
462; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
463; SSE2-SSSE3-NEXT: pcmpeqb %xmm2, %xmm1
464; SSE2-SSSE3-NEXT: psrlw $7, %xmm1
465; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000466; SSE2-SSSE3-NEXT: retq
467;
468; AVX1-LABEL: ext_i32_32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000469; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000470; AVX1-NEXT: vmovd %edi, %xmm0
471; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
472; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm0[0,0,1,1,4,5,6,7]
473; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
474; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[2,2,3,3,4,5,6,7]
475; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000476; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000477; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
478; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
479; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
480; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
481; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
482; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1
483; AVX1-NEXT: vpsrlw $7, %xmm1, %xmm1
484; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
485; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1
486; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
487; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
488; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm0
489; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0
490; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000491; AVX1-NEXT: retq
492;
493; AVX2-LABEL: ext_i32_32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000494; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000495; AVX2-NEXT: vmovd %edi, %xmm0
496; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
497; AVX2-NEXT: vpshuflw {{.*#+}} xmm1 = xmm0[0,0,1,1,4,5,6,7]
498; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
499; AVX2-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[2,2,3,3,4,5,6,7]
500; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000501; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000502; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
503; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
504; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
505; AVX2-NEXT: vpsrlw $7, %ymm0, %ymm0
506; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000507; AVX2-NEXT: retq
508;
Craig Topper5befc5b2017-11-28 01:36:31 +0000509; AVX512F-LABEL: ext_i32_32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000510; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000511; AVX512F-NEXT: pushq %rbp
512; AVX512F-NEXT: .cfi_def_cfa_offset 16
513; AVX512F-NEXT: .cfi_offset %rbp, -16
514; AVX512F-NEXT: movq %rsp, %rbp
515; AVX512F-NEXT: .cfi_def_cfa_register %rbp
516; AVX512F-NEXT: andq $-32, %rsp
517; AVX512F-NEXT: subq $32, %rsp
518; AVX512F-NEXT: movl %edi, (%rsp)
Craig Topperddbc3402017-11-28 01:36:33 +0000519; AVX512F-NEXT: movl {{.*}}(%rip), %eax
520; AVX512F-NEXT: kmovw (%rsp), %k1
521; AVX512F-NEXT: kmovw {{[0-9]+}}(%rsp), %k2
522; AVX512F-NEXT: vpbroadcastd %eax, %zmm0 {%k1} {z}
523; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
524; AVX512F-NEXT: vpbroadcastd %eax, %zmm1 {%k2} {z}
525; AVX512F-NEXT: vpmovdb %zmm1, %xmm1
526; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
Craig Topper5befc5b2017-11-28 01:36:31 +0000527; AVX512F-NEXT: movq %rbp, %rsp
528; AVX512F-NEXT: popq %rbp
529; AVX512F-NEXT: retq
530;
531; AVX512VLBW-LABEL: ext_i32_32i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000532; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000533; AVX512VLBW-NEXT: kmovd %edi, %k1
534; AVX512VLBW-NEXT: vmovdqu8 {{.*}}(%rip), %ymm0 {%k1} {z}
535; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000536 %1 = bitcast i32 %a0 to <32 x i1>
537 %2 = zext <32 x i1> %1 to <32 x i8>
538 ret <32 x i8> %2
539}
540
541;
542; 512-bit vectors
543;
544
545define <8 x i64> @ext_i8_8i64(i8 %a0) {
546; SSE2-SSSE3-LABEL: ext_i8_8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000547; SSE2-SSSE3: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000548; SSE2-SSSE3-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000549; SSE2-SSSE3-NEXT: movq %rdi, %xmm0
550; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,1,0,1]
551; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
552; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm1
553; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
554; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
555; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
556; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
557; SSE2-SSSE3-NEXT: psrlq $63, %xmm0
558; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [4,8]
559; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm2
560; SSE2-SSSE3-NEXT: pand %xmm1, %xmm2
561; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm2
562; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
563; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
564; SSE2-SSSE3-NEXT: psrlq $63, %xmm1
565; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32]
566; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm3
567; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3
568; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
569; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,0,3,2]
570; SSE2-SSSE3-NEXT: pand %xmm3, %xmm2
571; SSE2-SSSE3-NEXT: psrlq $63, %xmm2
572; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [64,128]
573; SSE2-SSSE3-NEXT: pand %xmm3, %xmm4
574; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
575; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000576; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3
Simon Pilgrima705db92017-09-24 13:42:31 +0000577; SSE2-SSSE3-NEXT: psrlq $63, %xmm3
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000578; SSE2-SSSE3-NEXT: retq
579;
580; AVX1-LABEL: ext_i8_8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000581; AVX1: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000582; AVX1-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000583; AVX1-NEXT: vmovq %rdi, %xmm0
584; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
585; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1
586; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm0
587; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
588; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm3
589; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
590; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
591; AVX1-NEXT: vpsrlq $63, %xmm3, %xmm3
592; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
593; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0
594; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
595; AVX1-NEXT: vpsrlq $63, %xmm0, %xmm0
596; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0
597; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm1
598; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm3
599; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
600; AVX1-NEXT: vpsrlq $63, %xmm3, %xmm3
601; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
602; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1
603; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
604; AVX1-NEXT: vpsrlq $63, %xmm1, %xmm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000605; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000606; AVX1-NEXT: retq
607;
608; AVX2-LABEL: ext_i8_8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000609; AVX2: # %bb.0:
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000610; AVX2-NEXT: # kill: def %edi killed %edi def %rdi
Simon Pilgrima705db92017-09-24 13:42:31 +0000611; AVX2-NEXT: vmovq %rdi, %xmm0
612; AVX2-NEXT: vpbroadcastq %xmm0, %ymm1
613; AVX2-NEXT: vmovdqa {{.*#+}} ymm0 = [1,2,4,8]
614; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm2
615; AVX2-NEXT: vpcmpeqq %ymm0, %ymm2, %ymm0
616; AVX2-NEXT: vpsrlq $63, %ymm0, %ymm0
617; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000618; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000619; AVX2-NEXT: vpcmpeqq %ymm2, %ymm1, %ymm1
620; AVX2-NEXT: vpsrlq $63, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000621; AVX2-NEXT: retq
622;
Craig Topper5befc5b2017-11-28 01:36:31 +0000623; AVX512F-LABEL: ext_i8_8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000624; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000625; AVX512F-NEXT: kmovw %edi, %k1
626; AVX512F-NEXT: vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
627; AVX512F-NEXT: retq
628;
629; AVX512VLBW-LABEL: ext_i8_8i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000630; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000631; AVX512VLBW-NEXT: kmovd %edi, %k1
632; AVX512VLBW-NEXT: vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
633; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000634 %1 = bitcast i8 %a0 to <8 x i1>
635 %2 = zext <8 x i1> %1 to <8 x i64>
636 ret <8 x i64> %2
637}
638
639define <16 x i32> @ext_i16_16i32(i16 %a0) {
640; SSE2-SSSE3-LABEL: ext_i16_16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000641; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000642; SSE2-SSSE3-NEXT: movd %edi, %xmm0
643; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
644; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8]
645; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0
646; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
647; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
648; SSE2-SSSE3-NEXT: psrld $31, %xmm0
649; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000650; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000651; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
652; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
653; SSE2-SSSE3-NEXT: psrld $31, %xmm1
654; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [256,512,1024,2048]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000655; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000656; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
Simon Pilgrima705db92017-09-24 13:42:31 +0000657; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm2
658; SSE2-SSSE3-NEXT: psrld $31, %xmm2
659; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [4096,8192,16384,32768]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000660; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3
Simon Pilgrima705db92017-09-24 13:42:31 +0000661; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm3
662; SSE2-SSSE3-NEXT: psrld $31, %xmm3
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000663; SSE2-SSSE3-NEXT: retq
664;
665; AVX1-LABEL: ext_i16_16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000666; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000667; AVX1-NEXT: vmovd %edi, %xmm0
668; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
669; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1
670; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm0
671; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
672; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm3
673; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
674; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
675; AVX1-NEXT: vpsrld $31, %xmm3, %xmm3
676; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
677; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
678; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
679; AVX1-NEXT: vpsrld $31, %xmm0, %xmm0
680; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0
681; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm1
682; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm3
683; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
684; AVX1-NEXT: vpsrld $31, %xmm3, %xmm3
685; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
686; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
687; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
688; AVX1-NEXT: vpsrld $31, %xmm1, %xmm1
689; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000690; AVX1-NEXT: retq
691;
692; AVX2-LABEL: ext_i16_16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000693; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000694; AVX2-NEXT: vmovd %edi, %xmm0
695; AVX2-NEXT: vpbroadcastd %xmm0, %ymm1
696; AVX2-NEXT: vmovdqa {{.*#+}} ymm0 = [1,2,4,8,16,32,64,128]
697; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm2
698; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0
699; AVX2-NEXT: vpsrld $31, %ymm0, %ymm0
700; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [256,512,1024,2048,4096,8192,16384,32768]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000701; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000702; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1
703; AVX2-NEXT: vpsrld $31, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000704; AVX2-NEXT: retq
705;
Craig Topper5befc5b2017-11-28 01:36:31 +0000706; AVX512F-LABEL: ext_i16_16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000707; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000708; AVX512F-NEXT: kmovw %edi, %k1
709; AVX512F-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
710; AVX512F-NEXT: retq
711;
712; AVX512VLBW-LABEL: ext_i16_16i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000713; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000714; AVX512VLBW-NEXT: kmovd %edi, %k1
715; AVX512VLBW-NEXT: vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
716; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000717 %1 = bitcast i16 %a0 to <16 x i1>
718 %2 = zext <16 x i1> %1 to <16 x i32>
719 ret <16 x i32> %2
720}
721
722define <32 x i16> @ext_i32_32i16(i32 %a0) {
723; SSE2-SSSE3-LABEL: ext_i32_32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000724; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000725; SSE2-SSSE3-NEXT: movd %edi, %xmm2
726; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm2[0,0,0,0,4,5,6,7]
727; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,1]
728; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000729; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000730; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000731; SSE2-SSSE3-NEXT: pcmpeqw %xmm4, %xmm0
732; SSE2-SSSE3-NEXT: psrlw $15, %xmm0
733; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [256,512,1024,2048,4096,8192,16384,32768]
734; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
735; SSE2-SSSE3-NEXT: pcmpeqw %xmm5, %xmm1
736; SSE2-SSSE3-NEXT: psrlw $15, %xmm1
737; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[1,1,1,1,4,5,6,7]
738; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,1,1]
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000739; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000740; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
Simon Pilgrima705db92017-09-24 13:42:31 +0000741; SSE2-SSSE3-NEXT: pcmpeqw %xmm4, %xmm2
742; SSE2-SSSE3-NEXT: psrlw $15, %xmm2
743; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3
744; SSE2-SSSE3-NEXT: pcmpeqw %xmm5, %xmm3
745; SSE2-SSSE3-NEXT: psrlw $15, %xmm3
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000746; SSE2-SSSE3-NEXT: retq
747;
748; AVX1-LABEL: ext_i32_32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000749; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000750; AVX1-NEXT: vmovd %edi, %xmm1
751; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm1[0,0,0,0,4,5,6,7]
752; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
753; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
754; 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 +0000755; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000756; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
757; AVX1-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm4
758; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
759; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
760; AVX1-NEXT: vpsrlw $15, %xmm4, %xmm4
761; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
762; AVX1-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm0
763; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0
764; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm0
765; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm4, %ymm0
766; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[1,1,1,1,4,5,6,7]
767; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
768; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000769; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1
Simon Pilgrima705db92017-09-24 13:42:31 +0000770; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm2
771; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
772; AVX1-NEXT: vpsrlw $15, %xmm2, %xmm2
773; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
774; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm1
775; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
776; AVX1-NEXT: vpsrlw $15, %xmm1, %xmm1
777; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000778; AVX1-NEXT: retq
779;
780; AVX2-LABEL: ext_i32_32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000781; AVX2: # %bb.0:
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000782; AVX2-NEXT: vmovd %edi, %xmm0
Simon Pilgrima705db92017-09-24 13:42:31 +0000783; AVX2-NEXT: vpbroadcastw %xmm0, %ymm0
784; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
785; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
786; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
787; AVX2-NEXT: vpsrlw $15, %ymm0, %ymm0
788; AVX2-NEXT: shrl $16, %edi
789; AVX2-NEXT: vmovd %edi, %xmm2
790; AVX2-NEXT: vpbroadcastw %xmm2, %ymm2
791; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm2
792; AVX2-NEXT: vpcmpeqw %ymm1, %ymm2, %ymm1
793; AVX2-NEXT: vpsrlw $15, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000794; AVX2-NEXT: retq
795;
Craig Topper5befc5b2017-11-28 01:36:31 +0000796; AVX512F-LABEL: ext_i32_32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000797; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000798; AVX512F-NEXT: pushq %rbp
799; AVX512F-NEXT: .cfi_def_cfa_offset 16
800; AVX512F-NEXT: .cfi_offset %rbp, -16
801; AVX512F-NEXT: movq %rsp, %rbp
802; AVX512F-NEXT: .cfi_def_cfa_register %rbp
803; AVX512F-NEXT: andq $-32, %rsp
804; AVX512F-NEXT: subq $32, %rsp
805; AVX512F-NEXT: movl %edi, (%rsp)
806; AVX512F-NEXT: kmovw (%rsp), %k1
807; AVX512F-NEXT: kmovw {{[0-9]+}}(%rsp), %k2
808; AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k2} {z}
809; AVX512F-NEXT: vpmovdb %zmm0, %xmm1
810; AVX512F-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
811; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
812; AVX512F-NEXT: vmovdqa {{.*#+}} xmm2 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
813; AVX512F-NEXT: vpand %xmm2, %xmm0, %xmm0
814; 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
815; AVX512F-NEXT: vpand %xmm2, %xmm1, %xmm1
816; 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
817; AVX512F-NEXT: movq %rbp, %rsp
818; AVX512F-NEXT: popq %rbp
819; AVX512F-NEXT: retq
820;
821; AVX512VLBW-LABEL: ext_i32_32i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000822; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000823; AVX512VLBW-NEXT: kmovd %edi, %k1
824; AVX512VLBW-NEXT: vmovdqu16 {{.*}}(%rip), %zmm0 {%k1} {z}
825; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000826 %1 = bitcast i32 %a0 to <32 x i1>
827 %2 = zext <32 x i1> %1 to <32 x i16>
828 ret <32 x i16> %2
829}
830
831define <64 x i8> @ext_i64_64i8(i64 %a0) {
832; SSE2-SSSE3-LABEL: ext_i64_64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000833; SSE2-SSSE3: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000834; SSE2-SSSE3-NEXT: movq %rdi, %xmm3
835; SSE2-SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
836; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm3[0,0,1,1,4,5,6,7]
837; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
838; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
839; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
840; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm0
841; SSE2-SSSE3-NEXT: psrlw $7, %xmm0
842; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
843; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0
844; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm3[2,2,3,3,4,5,6,7]
845; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
846; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
847; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm1
848; SSE2-SSSE3-NEXT: psrlw $7, %xmm1
849; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
850; SSE2-SSSE3-NEXT: pshufhw {{.*#+}} xmm2 = xmm3[0,1,2,3,4,4,5,5]
851; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,2,3,3]
852; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
853; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm2
854; SSE2-SSSE3-NEXT: psrlw $7, %xmm2
855; SSE2-SSSE3-NEXT: pand %xmm5, %xmm2
856; SSE2-SSSE3-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,6,7,7]
857; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,2,3,3]
858; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3
859; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm3
860; SSE2-SSSE3-NEXT: psrlw $7, %xmm3
861; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000862; SSE2-SSSE3-NEXT: retq
863;
864; AVX1-LABEL: ext_i64_64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000865; AVX1: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000866; AVX1-NEXT: vmovq %rdi, %xmm0
867; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
868; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
869; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
870; AVX1-NEXT: vpshuflw {{.*#+}} xmm2 = xmm1[2,2,3,3,4,5,6,7]
871; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,1,1]
872; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
873; 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]
874; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
875; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
876; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
877; AVX1-NEXT: vpcmpeqb %xmm4, %xmm3, %xmm3
878; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
879; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
880; AVX1-NEXT: vpsrlw $7, %xmm3, %xmm3
881; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
882; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
883; AVX1-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm0
884; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0
885; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm0
886; AVX1-NEXT: vpand %xmm6, %xmm0, %xmm0
887; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
888; AVX1-NEXT: vpshufhw {{.*#+}} xmm3 = xmm1[0,1,2,3,4,4,5,5]
889; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[2,2,3,3]
890; AVX1-NEXT: vpshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,6,7,7]
891; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
892; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
893; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1
894; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
895; AVX1-NEXT: vpcmpeqb %xmm4, %xmm2, %xmm2
896; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
897; AVX1-NEXT: vpsrlw $7, %xmm2, %xmm2
898; AVX1-NEXT: vpand %xmm6, %xmm2, %xmm2
899; AVX1-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm1
900; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1
901; AVX1-NEXT: vpsrlw $7, %xmm1, %xmm1
902; AVX1-NEXT: vpand %xmm6, %xmm1, %xmm1
903; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000904; AVX1-NEXT: retq
905;
906; AVX2-LABEL: ext_i64_64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000907; AVX2: # %bb.0:
Simon Pilgrima705db92017-09-24 13:42:31 +0000908; AVX2-NEXT: vmovq %rdi, %xmm0
909; AVX2-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
910; AVX2-NEXT: vpshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
911; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
912; AVX2-NEXT: vpshuflw {{.*#+}} xmm2 = xmm1[2,2,3,3,4,5,6,7]
913; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,1,1]
914; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
915; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9241421688590303745,9241421688590303745,9241421688590303745,9241421688590303745]
916; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
917; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0
918; AVX2-NEXT: vpsrlw $7, %ymm0, %ymm0
919; 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]
920; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0
921; AVX2-NEXT: vpshufhw {{.*#+}} xmm4 = xmm1[0,1,2,3,4,4,5,5]
922; AVX2-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[2,2,3,3]
923; AVX2-NEXT: vpshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,6,7,7]
924; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,2,3,3]
925; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm4, %ymm1
926; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
927; AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1
928; AVX2-NEXT: vpsrlw $7, %ymm1, %ymm1
929; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000930; AVX2-NEXT: retq
931;
Craig Topper5befc5b2017-11-28 01:36:31 +0000932; AVX512F-LABEL: ext_i64_64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000933; AVX512F: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000934; AVX512F-NEXT: pushq %rbp
935; AVX512F-NEXT: .cfi_def_cfa_offset 16
936; AVX512F-NEXT: .cfi_offset %rbp, -16
937; AVX512F-NEXT: movq %rsp, %rbp
938; AVX512F-NEXT: .cfi_def_cfa_register %rbp
939; AVX512F-NEXT: andq $-32, %rsp
940; AVX512F-NEXT: subq $64, %rsp
941; AVX512F-NEXT: movl %edi, (%rsp)
942; AVX512F-NEXT: shrq $32, %rdi
943; AVX512F-NEXT: movl %edi, {{[0-9]+}}(%rsp)
Craig Topperddbc3402017-11-28 01:36:33 +0000944; AVX512F-NEXT: movl {{.*}}(%rip), %eax
945; AVX512F-NEXT: kmovw (%rsp), %k1
946; AVX512F-NEXT: kmovw {{[0-9]+}}(%rsp), %k2
947; AVX512F-NEXT: vpbroadcastd %eax, %zmm0 {%k1} {z}
948; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
949; AVX512F-NEXT: vpbroadcastd %eax, %zmm1 {%k2} {z}
950; AVX512F-NEXT: vpmovdb %zmm1, %xmm1
951; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
Craig Topper5befc5b2017-11-28 01:36:31 +0000952; AVX512F-NEXT: kmovw {{[0-9]+}}(%rsp), %k1
Craig Topperddbc3402017-11-28 01:36:33 +0000953; AVX512F-NEXT: kmovw {{[0-9]+}}(%rsp), %k2
954; AVX512F-NEXT: vpbroadcastd %eax, %zmm1 {%k1} {z}
955; AVX512F-NEXT: vpmovdb %zmm1, %xmm1
956; AVX512F-NEXT: vpbroadcastd %eax, %zmm2 {%k2} {z}
957; AVX512F-NEXT: vpmovdb %zmm2, %xmm2
958; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1
Craig Topper5befc5b2017-11-28 01:36:31 +0000959; AVX512F-NEXT: movq %rbp, %rsp
960; AVX512F-NEXT: popq %rbp
961; AVX512F-NEXT: retq
962;
963; AVX512VLBW-LABEL: ext_i64_64i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000964; AVX512VLBW: # %bb.0:
Craig Topper5befc5b2017-11-28 01:36:31 +0000965; AVX512VLBW-NEXT: kmovq %rdi, %k1
966; AVX512VLBW-NEXT: vmovdqu8 {{.*}}(%rip), %zmm0 {%k1} {z}
967; AVX512VLBW-NEXT: retq
Simon Pilgrima80cb1d2017-07-06 19:33:10 +0000968 %1 = bitcast i64 %a0 to <64 x i1>
969 %2 = zext <64 x i1> %1 to <64 x i8>
970 ret <64 x i8> %2
971}