Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / X86 / shuffle-blendw.ll
blob9f90657dc64d112cb37539c2b93b9ad7860e9a68
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:
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
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
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
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
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
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
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:
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
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
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
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
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
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
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:
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
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
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
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
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:
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
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
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
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
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