xref: /llvm-project/llvm/test/CodeGen/X86/shuffle-blendw.ll (revision 6b6c62c75b8b5047a0def2dedcadd367a88e7002)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X86-SSE41
3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X64-SSE41
4; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx | FileCheck %s --check-prefix=X86-AVX
5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=X64-AVX
6; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X86-AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X64-AVX2
8; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefix=X86-AVX512
9; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefix=X64-AVX512
10
11define <16 x i16> @blendw_to_blendd_32(<16 x i16> %x, <16 x i16> %y, <16 x i16> %z) nounwind {
12; X86-SSE41-LABEL: blendw_to_blendd_32:
13; X86-SSE41:       # %bb.0:
14; X86-SSE41-NEXT:    pushl %ebp
15; X86-SSE41-NEXT:    movl %esp, %ebp
16; X86-SSE41-NEXT:    andl $-16, %esp
17; X86-SSE41-NEXT:    subl $16, %esp
18; X86-SSE41-NEXT:    paddw 40(%ebp), %xmm1
19; X86-SSE41-NEXT:    paddw 24(%ebp), %xmm0
20; X86-SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
21; X86-SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],mem[2,3],xmm1[4,5],mem[6,7]
22; X86-SSE41-NEXT:    movl %ebp, %esp
23; X86-SSE41-NEXT:    popl %ebp
24; X86-SSE41-NEXT:    retl
25;
26; X64-SSE41-LABEL: blendw_to_blendd_32:
27; X64-SSE41:       # %bb.0:
28; X64-SSE41-NEXT:    paddw %xmm5, %xmm1
29; X64-SSE41-NEXT:    paddw %xmm4, %xmm0
30; X64-SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
31; X64-SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
32; X64-SSE41-NEXT:    retq
33;
34; X86-AVX-LABEL: blendw_to_blendd_32:
35; X86-AVX:       # %bb.0:
36; X86-AVX-NEXT:    vextractf128 $1, %ymm2, %xmm3
37; X86-AVX-NEXT:    vextractf128 $1, %ymm0, %xmm4
38; X86-AVX-NEXT:    vpaddw %xmm3, %xmm4, %xmm3
39; X86-AVX-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
40; X86-AVX-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
41; X86-AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
42; X86-AVX-NEXT:    retl
43;
44; X64-AVX-LABEL: blendw_to_blendd_32:
45; X64-AVX:       # %bb.0:
46; X64-AVX-NEXT:    vextractf128 $1, %ymm2, %xmm3
47; X64-AVX-NEXT:    vextractf128 $1, %ymm0, %xmm4
48; X64-AVX-NEXT:    vpaddw %xmm3, %xmm4, %xmm3
49; X64-AVX-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
50; X64-AVX-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
51; X64-AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
52; X64-AVX-NEXT:    retq
53;
54; X86-AVX2-LABEL: blendw_to_blendd_32:
55; X86-AVX2:       # %bb.0:
56; X86-AVX2-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
57; X86-AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
58; X86-AVX2-NEXT:    retl
59;
60; X64-AVX2-LABEL: blendw_to_blendd_32:
61; X64-AVX2:       # %bb.0:
62; X64-AVX2-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
63; X64-AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
64; X64-AVX2-NEXT:    retq
65;
66; X86-AVX512-LABEL: blendw_to_blendd_32:
67; X86-AVX512:       # %bb.0:
68; X86-AVX512-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
69; X86-AVX512-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
70; X86-AVX512-NEXT:    retl
71;
72; X64-AVX512-LABEL: blendw_to_blendd_32:
73; X64-AVX512:       # %bb.0:
74; X64-AVX512-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
75; X64-AVX512-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
76; X64-AVX512-NEXT:    retq
77  %x1 = add <16 x i16> %x, %z
78  %shuffle = shufflevector <16 x i16> %x1, <16 x i16> %y, <16 x i32> <i32 0, i32 1, i32 18, i32 19, i32 4, i32 5, i32 22, i32 23, i32 8, i32 9, i32 26, i32 27, i32 12, i32 13, i32 30, i32 31>
79  ret <16 x i16> %shuffle
80}
81
82define <8 x i16> @blendw_to_blendd_16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %z) nounwind {
83; X86-SSE41-LABEL: blendw_to_blendd_16:
84; X86-SSE41:       # %bb.0:
85; X86-SSE41-NEXT:    paddw %xmm2, %xmm0
86; X86-SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
87; X86-SSE41-NEXT:    retl
88;
89; X64-SSE41-LABEL: blendw_to_blendd_16:
90; X64-SSE41:       # %bb.0:
91; X64-SSE41-NEXT:    paddw %xmm2, %xmm0
92; X64-SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
93; X64-SSE41-NEXT:    retq
94;
95; X86-AVX-LABEL: blendw_to_blendd_16:
96; X86-AVX:       # %bb.0:
97; X86-AVX-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
98; X86-AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
99; X86-AVX-NEXT:    retl
100;
101; X64-AVX-LABEL: blendw_to_blendd_16:
102; X64-AVX:       # %bb.0:
103; X64-AVX-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
104; X64-AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
105; X64-AVX-NEXT:    retq
106;
107; X86-AVX2-LABEL: blendw_to_blendd_16:
108; X86-AVX2:       # %bb.0:
109; X86-AVX2-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
110; X86-AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
111; X86-AVX2-NEXT:    retl
112;
113; X64-AVX2-LABEL: blendw_to_blendd_16:
114; X64-AVX2:       # %bb.0:
115; X64-AVX2-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
116; X64-AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
117; X64-AVX2-NEXT:    retq
118;
119; X86-AVX512-LABEL: blendw_to_blendd_16:
120; X86-AVX512:       # %bb.0:
121; X86-AVX512-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
122; X86-AVX512-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
123; X86-AVX512-NEXT:    retl
124;
125; X64-AVX512-LABEL: blendw_to_blendd_16:
126; X64-AVX512:       # %bb.0:
127; X64-AVX512-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
128; X64-AVX512-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
129; X64-AVX512-NEXT:    retq
130  %x1 = add <8 x i16> %x, %z
131  %shuffle = shufflevector <8 x i16> %x1, <8 x i16> %y, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>
132  ret <8 x i16> %shuffle
133}
134
135define <16 x i16> @blendw_to_blendd_fail_32(<16 x i16> %x, <16 x i16> %y, <16 x i16> %z) nounwind {
136; X86-SSE41-LABEL: blendw_to_blendd_fail_32:
137; X86-SSE41:       # %bb.0:
138; X86-SSE41-NEXT:    pushl %ebp
139; X86-SSE41-NEXT:    movl %esp, %ebp
140; X86-SSE41-NEXT:    andl $-16, %esp
141; X86-SSE41-NEXT:    subl $16, %esp
142; X86-SSE41-NEXT:    paddw 40(%ebp), %xmm1
143; X86-SSE41-NEXT:    paddw 24(%ebp), %xmm0
144; X86-SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm2[3],xmm0[4,5],xmm2[6,7]
145; X86-SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2],mem[3],xmm1[4,5],mem[6,7]
146; X86-SSE41-NEXT:    movl %ebp, %esp
147; X86-SSE41-NEXT:    popl %ebp
148; X86-SSE41-NEXT:    retl
149;
150; X64-SSE41-LABEL: blendw_to_blendd_fail_32:
151; X64-SSE41:       # %bb.0:
152; X64-SSE41-NEXT:    paddw %xmm5, %xmm1
153; X64-SSE41-NEXT:    paddw %xmm4, %xmm0
154; X64-SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm2[3],xmm0[4,5],xmm2[6,7]
155; X64-SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2],xmm3[3],xmm1[4,5],xmm3[6,7]
156; X64-SSE41-NEXT:    retq
157;
158; X86-AVX-LABEL: blendw_to_blendd_fail_32:
159; X86-AVX:       # %bb.0:
160; X86-AVX-NEXT:    vextractf128 $1, %ymm2, %xmm3
161; X86-AVX-NEXT:    vextractf128 $1, %ymm0, %xmm4
162; X86-AVX-NEXT:    vpaddw %xmm3, %xmm4, %xmm3
163; X86-AVX-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
164; X86-AVX-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
165; X86-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm2 = [65535,65535,65535,0,65535,65535,0,0,65535,65535,65535,0,65535,65535,0,0]
166; X86-AVX-NEXT:    # ymm2 = mem[0,1,0,1]
167; X86-AVX-NEXT:    vandps %ymm2, %ymm0, %ymm0
168; X86-AVX-NEXT:    vandnps %ymm1, %ymm2, %ymm1
169; X86-AVX-NEXT:    vorps %ymm1, %ymm0, %ymm0
170; X86-AVX-NEXT:    retl
171;
172; X64-AVX-LABEL: blendw_to_blendd_fail_32:
173; X64-AVX:       # %bb.0:
174; X64-AVX-NEXT:    vextractf128 $1, %ymm2, %xmm3
175; X64-AVX-NEXT:    vextractf128 $1, %ymm0, %xmm4
176; X64-AVX-NEXT:    vpaddw %xmm3, %xmm4, %xmm3
177; X64-AVX-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
178; X64-AVX-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
179; X64-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm2 = [65535,65535,65535,0,65535,65535,0,0,65535,65535,65535,0,65535,65535,0,0]
180; X64-AVX-NEXT:    # ymm2 = mem[0,1,0,1]
181; X64-AVX-NEXT:    vandps %ymm2, %ymm0, %ymm0
182; X64-AVX-NEXT:    vandnps %ymm1, %ymm2, %ymm1
183; X64-AVX-NEXT:    vorps %ymm1, %ymm0, %ymm0
184; X64-AVX-NEXT:    retq
185;
186; X86-AVX2-LABEL: blendw_to_blendd_fail_32:
187; X86-AVX2:       # %bb.0:
188; X86-AVX2-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
189; X86-AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0,1,2],ymm1[3],ymm0[4,5],ymm1[6,7],ymm0[8,9,10],ymm1[11],ymm0[12,13],ymm1[14,15]
190; X86-AVX2-NEXT:    retl
191;
192; X64-AVX2-LABEL: blendw_to_blendd_fail_32:
193; X64-AVX2:       # %bb.0:
194; X64-AVX2-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
195; X64-AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0,1,2],ymm1[3],ymm0[4,5],ymm1[6,7],ymm0[8,9,10],ymm1[11],ymm0[12,13],ymm1[14,15]
196; X64-AVX2-NEXT:    retq
197;
198; X86-AVX512-LABEL: blendw_to_blendd_fail_32:
199; X86-AVX512:       # %bb.0:
200; X86-AVX512-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
201; X86-AVX512-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0,1,2],ymm1[3],ymm0[4,5],ymm1[6,7],ymm0[8,9,10],ymm1[11],ymm0[12,13],ymm1[14,15]
202; X86-AVX512-NEXT:    retl
203;
204; X64-AVX512-LABEL: blendw_to_blendd_fail_32:
205; X64-AVX512:       # %bb.0:
206; X64-AVX512-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
207; X64-AVX512-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0,1,2],ymm1[3],ymm0[4,5],ymm1[6,7],ymm0[8,9,10],ymm1[11],ymm0[12,13],ymm1[14,15]
208; X64-AVX512-NEXT:    retq
209  %x1 = add <16 x i16> %x, %z
210  %shuffle = shufflevector <16 x i16> %x1, <16 x i16> %y, <16 x i32> <i32 0, i32 1, i32 2, i32 19, i32 4, i32 5, i32 22, i32 23, i32 8, i32 9, i32 10, i32 27, i32 12, i32 13, i32 30, i32 31>
211  ret <16 x i16> %shuffle
212}
213
214define <8 x i16> @blendw_to_blendd_fail_16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %z) nounwind {
215; X86-SSE41-LABEL: blendw_to_blendd_fail_16:
216; X86-SSE41:       # %bb.0:
217; X86-SSE41-NEXT:    paddw %xmm2, %xmm0
218; X86-SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
219; X86-SSE41-NEXT:    retl
220;
221; X64-SSE41-LABEL: blendw_to_blendd_fail_16:
222; X64-SSE41:       # %bb.0:
223; X64-SSE41-NEXT:    paddw %xmm2, %xmm0
224; X64-SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
225; X64-SSE41-NEXT:    retq
226;
227; X86-AVX-LABEL: blendw_to_blendd_fail_16:
228; X86-AVX:       # %bb.0:
229; X86-AVX-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
230; X86-AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
231; X86-AVX-NEXT:    retl
232;
233; X64-AVX-LABEL: blendw_to_blendd_fail_16:
234; X64-AVX:       # %bb.0:
235; X64-AVX-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
236; X64-AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
237; X64-AVX-NEXT:    retq
238;
239; X86-AVX2-LABEL: blendw_to_blendd_fail_16:
240; X86-AVX2:       # %bb.0:
241; X86-AVX2-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
242; X86-AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
243; X86-AVX2-NEXT:    retl
244;
245; X64-AVX2-LABEL: blendw_to_blendd_fail_16:
246; X64-AVX2:       # %bb.0:
247; X64-AVX2-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
248; X64-AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
249; X64-AVX2-NEXT:    retq
250;
251; X86-AVX512-LABEL: blendw_to_blendd_fail_16:
252; X86-AVX512:       # %bb.0:
253; X86-AVX512-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
254; X86-AVX512-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
255; X86-AVX512-NEXT:    retl
256;
257; X64-AVX512-LABEL: blendw_to_blendd_fail_16:
258; X64-AVX512:       # %bb.0:
259; X64-AVX512-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
260; X64-AVX512-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
261; X64-AVX512-NEXT:    retq
262  %x1 = add <8 x i16> %x, %z
263  %shuffle = shufflevector <8 x i16> %x1, <8 x i16> %y, <8 x i32> <i32 8, i32 1, i32 10, i32 11, i32 4, i32 5, i32 14, i32 15>
264  ret <8 x i16> %shuffle
265}
266