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
11 define <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:
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
26 ; X64-SSE41-LABEL: blendw_to_blendd_32:
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
34 ; X86-AVX-LABEL: blendw_to_blendd_32:
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]
44 ; X64-AVX-LABEL: blendw_to_blendd_32:
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]
54 ; X86-AVX2-LABEL: blendw_to_blendd_32:
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]
60 ; X64-AVX2-LABEL: blendw_to_blendd_32:
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]
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
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
82 define <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:
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
89 ; X64-SSE41-LABEL: blendw_to_blendd_16:
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
95 ; X86-AVX-LABEL: blendw_to_blendd_16:
97 ; X86-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0
98 ; X86-AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
101 ; X64-AVX-LABEL: blendw_to_blendd_16:
103 ; X64-AVX-NEXT: vpaddw %xmm2, %xmm0, %xmm0
104 ; X64-AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
107 ; X86-AVX2-LABEL: blendw_to_blendd_16:
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
113 ; X64-AVX2-LABEL: blendw_to_blendd_16:
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
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
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
135 define <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
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
158 ; X86-AVX-LABEL: blendw_to_blendd_fail_32:
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
172 ; X64-AVX-LABEL: blendw_to_blendd_fail_32:
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
186 ; X86-AVX2-LABEL: blendw_to_blendd_fail_32:
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
192 ; X64-AVX2-LABEL: blendw_to_blendd_fail_32:
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
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
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
214 define <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
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
227 ; X86-AVX-LABEL: blendw_to_blendd_fail_16:
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]
233 ; X64-AVX-LABEL: blendw_to_blendd_fail_16:
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]
239 ; X86-AVX2-LABEL: blendw_to_blendd_fail_16:
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
245 ; X64-AVX2-LABEL: blendw_to_blendd_fail_16:
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
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
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