[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / neon-shift-left-long.ll
blob282f43763f362535abf007c9f4ea3f42b2f17082
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
5 define <8 x i16> @test_sshll_v8i8(<8 x i8> %a) {
6 ; CHECK-LABEL: test_sshll_v8i8:
7 ; CHECK:       // %bb.0:
8 ; CHECK-NEXT:    sshll v0.8h, v0.8b, #3
9 ; CHECK-NEXT:    ret
10   %1 = sext <8 x i8> %a to <8 x i16>
11   %tmp = shl <8 x i16> %1, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
12   ret <8 x i16> %tmp
15 define <8 x i16> @test_sshll_v8i8_big(<8 x i8> %a) {
16 ; CHECK-SD-LABEL: test_sshll_v8i8_big:
17 ; CHECK-SD:       // %bb.0:
18 ; CHECK-SD-NEXT:    ushll v0.8h, v0.8b, #0
19 ; CHECK-SD-NEXT:    shl v0.8h, v0.8h, #9
20 ; CHECK-SD-NEXT:    ret
22 ; CHECK-GI-LABEL: test_sshll_v8i8_big:
23 ; CHECK-GI:       // %bb.0:
24 ; CHECK-GI-NEXT:    sshll v0.8h, v0.8b, #0
25 ; CHECK-GI-NEXT:    shl v0.8h, v0.8h, #9
26 ; CHECK-GI-NEXT:    ret
27   %1 = sext <8 x i8> %a to <8 x i16>
28   %tmp = shl <8 x i16> %1, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>
29   ret <8 x i16> %tmp
32 define <4 x i32> @test_sshll_v4i16(<4 x i16> %a) {
33 ; CHECK-LABEL: test_sshll_v4i16:
34 ; CHECK:       // %bb.0:
35 ; CHECK-NEXT:    sshll v0.4s, v0.4h, #9
36 ; CHECK-NEXT:    ret
37   %1 = sext <4 x i16> %a to <4 x i32>
38   %tmp = shl <4 x i32> %1, <i32 9, i32 9, i32 9, i32 9>
39   ret <4 x i32> %tmp
42 define <4 x i32> @test_sshll_v4i16_big(<4 x i16> %a) {
43 ; CHECK-SD-LABEL: test_sshll_v4i16_big:
44 ; CHECK-SD:       // %bb.0:
45 ; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0
46 ; CHECK-SD-NEXT:    shl v0.4s, v0.4s, #19
47 ; CHECK-SD-NEXT:    ret
49 ; CHECK-GI-LABEL: test_sshll_v4i16_big:
50 ; CHECK-GI:       // %bb.0:
51 ; CHECK-GI-NEXT:    sshll v0.4s, v0.4h, #0
52 ; CHECK-GI-NEXT:    shl v0.4s, v0.4s, #19
53 ; CHECK-GI-NEXT:    ret
54   %1 = sext <4 x i16> %a to <4 x i32>
55   %tmp = shl <4 x i32> %1, <i32 19, i32 19, i32 19, i32 19>
56   ret <4 x i32> %tmp
59 define <2 x i64> @test_sshll_v2i32(<2 x i32> %a) {
60 ; CHECK-LABEL: test_sshll_v2i32:
61 ; CHECK:       // %bb.0:
62 ; CHECK-NEXT:    sshll v0.2d, v0.2s, #19
63 ; CHECK-NEXT:    ret
64   %1 = sext <2 x i32> %a to <2 x i64>
65   %tmp = shl <2 x i64> %1, <i64 19, i64 19>
66   ret <2 x i64> %tmp
69 define <2 x i64> @test_sshll_v2i32_big(<2 x i32> %a) {
70 ; CHECK-SD-LABEL: test_sshll_v2i32_big:
71 ; CHECK-SD:       // %bb.0:
72 ; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
73 ; CHECK-SD-NEXT:    shl v0.2d, v0.2d, #36
74 ; CHECK-SD-NEXT:    ret
76 ; CHECK-GI-LABEL: test_sshll_v2i32_big:
77 ; CHECK-GI:       // %bb.0:
78 ; CHECK-GI-NEXT:    sshll v0.2d, v0.2s, #0
79 ; CHECK-GI-NEXT:    shl v0.2d, v0.2d, #36
80 ; CHECK-GI-NEXT:    ret
81   %1 = sext <2 x i32> %a to <2 x i64>
82   %tmp = shl <2 x i64> %1, <i64 36, i64 36>
83   ret <2 x i64> %tmp
86 define <8 x i16> @test_ushll_v8i8(<8 x i8> %a) {
87 ; CHECK-LABEL: test_ushll_v8i8:
88 ; CHECK:       // %bb.0:
89 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #3
90 ; CHECK-NEXT:    ret
91   %1 = zext <8 x i8> %a to <8 x i16>
92   %tmp = shl <8 x i16> %1, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
93   ret <8 x i16> %tmp
96 define <8 x i16> @test_ushll_v8i8_big(<8 x i8> %a) {
97 ; CHECK-LABEL: test_ushll_v8i8_big:
98 ; CHECK:       // %bb.0:
99 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
100 ; CHECK-NEXT:    shl v0.8h, v0.8h, #9
101 ; CHECK-NEXT:    ret
102   %1 = zext <8 x i8> %a to <8 x i16>
103   %tmp = shl <8 x i16> %1, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>
104   ret <8 x i16> %tmp
107 define <4 x i32> @test_ushll_v4i16(<4 x i16> %a) {
108 ; CHECK-LABEL: test_ushll_v4i16:
109 ; CHECK:       // %bb.0:
110 ; CHECK-NEXT:    ushll v0.4s, v0.4h, #9
111 ; CHECK-NEXT:    ret
112   %1 = zext <4 x i16> %a to <4 x i32>
113   %tmp = shl <4 x i32> %1, <i32 9, i32 9, i32 9, i32 9>
114   ret <4 x i32> %tmp
117 define <4 x i32> @test_ushll_v4i16_big(<4 x i16> %a) {
118 ; CHECK-LABEL: test_ushll_v4i16_big:
119 ; CHECK:       // %bb.0:
120 ; CHECK-NEXT:    ushll v0.4s, v0.4h, #0
121 ; CHECK-NEXT:    shl v0.4s, v0.4s, #19
122 ; CHECK-NEXT:    ret
123   %1 = zext <4 x i16> %a to <4 x i32>
124   %tmp = shl <4 x i32> %1, <i32 19, i32 19, i32 19, i32 19>
125   ret <4 x i32> %tmp
128 define <2 x i64> @test_ushll_v2i32(<2 x i32> %a) {
129 ; CHECK-LABEL: test_ushll_v2i32:
130 ; CHECK:       // %bb.0:
131 ; CHECK-NEXT:    ushll v0.2d, v0.2s, #19
132 ; CHECK-NEXT:    ret
133   %1 = zext <2 x i32> %a to <2 x i64>
134   %tmp = shl <2 x i64> %1, <i64 19, i64 19>
135   ret <2 x i64> %tmp
138 define <2 x i64> @test_ushll_v2i32_big(<2 x i32> %a) {
139 ; CHECK-LABEL: test_ushll_v2i32_big:
140 ; CHECK:       // %bb.0:
141 ; CHECK-NEXT:    ushll v0.2d, v0.2s, #0
142 ; CHECK-NEXT:    shl v0.2d, v0.2d, #36
143 ; CHECK-NEXT:    ret
144   %1 = zext <2 x i32> %a to <2 x i64>
145   %tmp = shl <2 x i64> %1, <i64 36, i64 36>
146   ret <2 x i64> %tmp
149 define <8 x i16> @test_sshll2_v16i8(<16 x i8> %a) {
150 ; CHECK-SD-LABEL: test_sshll2_v16i8:
151 ; CHECK-SD:       // %bb.0:
152 ; CHECK-SD-NEXT:    sshll2 v0.8h, v0.16b, #3
153 ; CHECK-SD-NEXT:    ret
155 ; CHECK-GI-LABEL: test_sshll2_v16i8:
156 ; CHECK-GI:       // %bb.0:
157 ; CHECK-GI-NEXT:    mov d0, v0.d[1]
158 ; CHECK-GI-NEXT:    sshll v0.8h, v0.8b, #3
159 ; CHECK-GI-NEXT:    ret
160   %1 = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
161   %2 = sext <8 x i8> %1 to <8 x i16>
162   %tmp = shl <8 x i16> %2, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
163   ret <8 x i16> %tmp
166 define <8 x i16> @test_sshll2_v16i8_big(<16 x i8> %a) {
167 ; CHECK-SD-LABEL: test_sshll2_v16i8_big:
168 ; CHECK-SD:       // %bb.0:
169 ; CHECK-SD-NEXT:    ushll2 v0.8h, v0.16b, #0
170 ; CHECK-SD-NEXT:    shl v0.8h, v0.8h, #9
171 ; CHECK-SD-NEXT:    ret
173 ; CHECK-GI-LABEL: test_sshll2_v16i8_big:
174 ; CHECK-GI:       // %bb.0:
175 ; CHECK-GI-NEXT:    sshll2 v0.8h, v0.16b, #0
176 ; CHECK-GI-NEXT:    shl v0.8h, v0.8h, #9
177 ; CHECK-GI-NEXT:    ret
178   %1 = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
179   %2 = sext <8 x i8> %1 to <8 x i16>
180   %tmp = shl <8 x i16> %2, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>
181   ret <8 x i16> %tmp
184 define <4 x i32> @test_sshll2_v8i16(<8 x i16> %a) {
185 ; CHECK-SD-LABEL: test_sshll2_v8i16:
186 ; CHECK-SD:       // %bb.0:
187 ; CHECK-SD-NEXT:    sshll2 v0.4s, v0.8h, #9
188 ; CHECK-SD-NEXT:    ret
190 ; CHECK-GI-LABEL: test_sshll2_v8i16:
191 ; CHECK-GI:       // %bb.0:
192 ; CHECK-GI-NEXT:    mov d0, v0.d[1]
193 ; CHECK-GI-NEXT:    sshll v0.4s, v0.4h, #9
194 ; CHECK-GI-NEXT:    ret
195   %1 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
196   %2 = sext <4 x i16> %1 to <4 x i32>
197   %tmp = shl <4 x i32> %2, <i32 9, i32 9, i32 9, i32 9>
198   ret <4 x i32> %tmp
201 define <4 x i32> @test_sshll2_v8i16_big(<8 x i16> %a) {
202 ; CHECK-SD-LABEL: test_sshll2_v8i16_big:
203 ; CHECK-SD:       // %bb.0:
204 ; CHECK-SD-NEXT:    ushll2 v0.4s, v0.8h, #0
205 ; CHECK-SD-NEXT:    shl v0.4s, v0.4s, #19
206 ; CHECK-SD-NEXT:    ret
208 ; CHECK-GI-LABEL: test_sshll2_v8i16_big:
209 ; CHECK-GI:       // %bb.0:
210 ; CHECK-GI-NEXT:    sshll2 v0.4s, v0.8h, #0
211 ; CHECK-GI-NEXT:    shl v0.4s, v0.4s, #19
212 ; CHECK-GI-NEXT:    ret
213   %1 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
214   %2 = sext <4 x i16> %1 to <4 x i32>
215   %tmp = shl <4 x i32> %2, <i32 19, i32 19, i32 19, i32 19>
216   ret <4 x i32> %tmp
219 define <2 x i64> @test_sshll2_v4i32(<4 x i32> %a) {
220 ; CHECK-SD-LABEL: test_sshll2_v4i32:
221 ; CHECK-SD:       // %bb.0:
222 ; CHECK-SD-NEXT:    sshll2 v0.2d, v0.4s, #19
223 ; CHECK-SD-NEXT:    ret
225 ; CHECK-GI-LABEL: test_sshll2_v4i32:
226 ; CHECK-GI:       // %bb.0:
227 ; CHECK-GI-NEXT:    mov d0, v0.d[1]
228 ; CHECK-GI-NEXT:    sshll v0.2d, v0.2s, #19
229 ; CHECK-GI-NEXT:    ret
230   %1 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
231   %2 = sext <2 x i32> %1 to <2 x i64>
232   %tmp = shl <2 x i64> %2, <i64 19, i64 19>
233   ret <2 x i64> %tmp
236 define <2 x i64> @test_sshll2_v4i32_big(<4 x i32> %a) {
237 ; CHECK-SD-LABEL: test_sshll2_v4i32_big:
238 ; CHECK-SD:       // %bb.0:
239 ; CHECK-SD-NEXT:    ushll2 v0.2d, v0.4s, #0
240 ; CHECK-SD-NEXT:    shl v0.2d, v0.2d, #36
241 ; CHECK-SD-NEXT:    ret
243 ; CHECK-GI-LABEL: test_sshll2_v4i32_big:
244 ; CHECK-GI:       // %bb.0:
245 ; CHECK-GI-NEXT:    sshll2 v0.2d, v0.4s, #0
246 ; CHECK-GI-NEXT:    shl v0.2d, v0.2d, #36
247 ; CHECK-GI-NEXT:    ret
248   %1 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
249   %2 = sext <2 x i32> %1 to <2 x i64>
250   %tmp = shl <2 x i64> %2, <i64 36, i64 36>
251   ret <2 x i64> %tmp
254 define <8 x i16> @test_ushll2_v16i8(<16 x i8> %a) {
255 ; CHECK-SD-LABEL: test_ushll2_v16i8:
256 ; CHECK-SD:       // %bb.0:
257 ; CHECK-SD-NEXT:    ushll2 v0.8h, v0.16b, #3
258 ; CHECK-SD-NEXT:    ret
260 ; CHECK-GI-LABEL: test_ushll2_v16i8:
261 ; CHECK-GI:       // %bb.0:
262 ; CHECK-GI-NEXT:    mov d0, v0.d[1]
263 ; CHECK-GI-NEXT:    ushll v0.8h, v0.8b, #3
264 ; CHECK-GI-NEXT:    ret
265   %1 = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
266   %2 = zext <8 x i8> %1 to <8 x i16>
267   %tmp = shl <8 x i16> %2, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
268   ret <8 x i16> %tmp
271 define <8 x i16> @test_ushll2_v16i8_big(<16 x i8> %a) {
272 ; CHECK-LABEL: test_ushll2_v16i8_big:
273 ; CHECK:       // %bb.0:
274 ; CHECK-NEXT:    ushll2 v0.8h, v0.16b, #0
275 ; CHECK-NEXT:    shl v0.8h, v0.8h, #9
276 ; CHECK-NEXT:    ret
277   %1 = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
278   %2 = zext <8 x i8> %1 to <8 x i16>
279   %tmp = shl <8 x i16> %2, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>
280   ret <8 x i16> %tmp
283 define <4 x i32> @test_ushll2_v8i16(<8 x i16> %a) {
284 ; CHECK-SD-LABEL: test_ushll2_v8i16:
285 ; CHECK-SD:       // %bb.0:
286 ; CHECK-SD-NEXT:    ushll2 v0.4s, v0.8h, #9
287 ; CHECK-SD-NEXT:    ret
289 ; CHECK-GI-LABEL: test_ushll2_v8i16:
290 ; CHECK-GI:       // %bb.0:
291 ; CHECK-GI-NEXT:    mov d0, v0.d[1]
292 ; CHECK-GI-NEXT:    ushll v0.4s, v0.4h, #9
293 ; CHECK-GI-NEXT:    ret
294   %1 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
295   %2 = zext <4 x i16> %1 to <4 x i32>
296   %tmp = shl <4 x i32> %2, <i32 9, i32 9, i32 9, i32 9>
297   ret <4 x i32> %tmp
300 define <4 x i32> @test_ushll2_v8i16_big(<8 x i16> %a) {
301 ; CHECK-LABEL: test_ushll2_v8i16_big:
302 ; CHECK:       // %bb.0:
303 ; CHECK-NEXT:    ushll2 v0.4s, v0.8h, #0
304 ; CHECK-NEXT:    shl v0.4s, v0.4s, #19
305 ; CHECK-NEXT:    ret
306   %1 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
307   %2 = zext <4 x i16> %1 to <4 x i32>
308   %tmp = shl <4 x i32> %2, <i32 19, i32 19, i32 19, i32 19>
309   ret <4 x i32> %tmp
312 define <2 x i64> @test_ushll2_v4i32(<4 x i32> %a) {
313 ; CHECK-SD-LABEL: test_ushll2_v4i32:
314 ; CHECK-SD:       // %bb.0:
315 ; CHECK-SD-NEXT:    ushll2 v0.2d, v0.4s, #19
316 ; CHECK-SD-NEXT:    ret
318 ; CHECK-GI-LABEL: test_ushll2_v4i32:
319 ; CHECK-GI:       // %bb.0:
320 ; CHECK-GI-NEXT:    mov d0, v0.d[1]
321 ; CHECK-GI-NEXT:    ushll v0.2d, v0.2s, #19
322 ; CHECK-GI-NEXT:    ret
323   %1 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
324   %2 = zext <2 x i32> %1 to <2 x i64>
325   %tmp = shl <2 x i64> %2, <i64 19, i64 19>
326   ret <2 x i64> %tmp
329 define <2 x i64> @test_ushll2_v4i32_big(<4 x i32> %a) {
330 ; CHECK-LABEL: test_ushll2_v4i32_big:
331 ; CHECK:       // %bb.0:
332 ; CHECK-NEXT:    ushll2 v0.2d, v0.4s, #0
333 ; CHECK-NEXT:    shl v0.2d, v0.2d, #36
334 ; CHECK-NEXT:    ret
335   %1 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
336   %2 = zext <2 x i32> %1 to <2 x i64>
337   %tmp = shl <2 x i64> %2, <i64 36, i64 36>
338   ret <2 x i64> %tmp
341 define <8 x i16> @test_sshll_shl0_v8i8(<8 x i8> %a) {
342 ; CHECK-LABEL: test_sshll_shl0_v8i8:
343 ; CHECK:       // %bb.0:
344 ; CHECK-NEXT:    sshll v0.8h, v0.8b, #0
345 ; CHECK-NEXT:    ret
346   %tmp = sext <8 x i8> %a to <8 x i16>
347   ret <8 x i16> %tmp
350 define <4 x i32> @test_sshll_shl0_v4i16(<4 x i16> %a) {
351 ; CHECK-LABEL: test_sshll_shl0_v4i16:
352 ; CHECK:       // %bb.0:
353 ; CHECK-NEXT:    sshll v0.4s, v0.4h, #0
354 ; CHECK-NEXT:    ret
355   %tmp = sext <4 x i16> %a to <4 x i32>
356   ret <4 x i32> %tmp
359 define <2 x i64> @test_sshll_shl0_v2i32(<2 x i32> %a) {
360 ; CHECK-LABEL: test_sshll_shl0_v2i32:
361 ; CHECK:       // %bb.0:
362 ; CHECK-NEXT:    sshll v0.2d, v0.2s, #0
363 ; CHECK-NEXT:    ret
364   %tmp = sext <2 x i32> %a to <2 x i64>
365   ret <2 x i64> %tmp
368 define <8 x i16> @test_ushll_shl0_v8i8(<8 x i8> %a) {
369 ; CHECK-LABEL: test_ushll_shl0_v8i8:
370 ; CHECK:       // %bb.0:
371 ; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
372 ; CHECK-NEXT:    ret
373   %tmp = zext <8 x i8> %a to <8 x i16>
374   ret <8 x i16> %tmp
377 define <4 x i32> @test_ushll_shl0_v4i16(<4 x i16> %a) {
378 ; CHECK-LABEL: test_ushll_shl0_v4i16:
379 ; CHECK:       // %bb.0:
380 ; CHECK-NEXT:    ushll v0.4s, v0.4h, #0
381 ; CHECK-NEXT:    ret
382   %tmp = zext <4 x i16> %a to <4 x i32>
383   ret <4 x i32> %tmp
386 define <2 x i64> @test_ushll_shl0_v2i32(<2 x i32> %a) {
387 ; CHECK-LABEL: test_ushll_shl0_v2i32:
388 ; CHECK:       // %bb.0:
389 ; CHECK-NEXT:    ushll v0.2d, v0.2s, #0
390 ; CHECK-NEXT:    ret
391   %tmp = zext <2 x i32> %a to <2 x i64>
392   ret <2 x i64> %tmp
395 define <8 x i16> @test_sshll2_shl0_v16i8(<16 x i8> %a) {
396 ; CHECK-LABEL: test_sshll2_shl0_v16i8:
397 ; CHECK:       // %bb.0:
398 ; CHECK-NEXT:    sshll2 v0.8h, v0.16b, #0
399 ; CHECK-NEXT:    ret
400   %1 = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
401   %tmp = sext <8 x i8> %1 to <8 x i16>
402   ret <8 x i16> %tmp
405 define <4 x i32> @test_sshll2_shl0_v8i16(<8 x i16> %a) {
406 ; CHECK-LABEL: test_sshll2_shl0_v8i16:
407 ; CHECK:       // %bb.0:
408 ; CHECK-NEXT:    sshll2 v0.4s, v0.8h, #0
409 ; CHECK-NEXT:    ret
410   %1 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
411   %tmp = sext <4 x i16> %1 to <4 x i32>
412   ret <4 x i32> %tmp
415 define <2 x i64> @test_sshll2_shl0_v4i32(<4 x i32> %a) {
416 ; CHECK-LABEL: test_sshll2_shl0_v4i32:
417 ; CHECK:       // %bb.0:
418 ; CHECK-NEXT:    sshll2 v0.2d, v0.4s, #0
419 ; CHECK-NEXT:    ret
420   %1 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
421   %tmp = sext <2 x i32> %1 to <2 x i64>
422   ret <2 x i64> %tmp
425 define <8 x i16> @test_ushll2_shl0_v16i8(<16 x i8> %a) {
426 ; CHECK-LABEL: test_ushll2_shl0_v16i8:
427 ; CHECK:       // %bb.0:
428 ; CHECK-NEXT:    ushll2 v0.8h, v0.16b, #0
429 ; CHECK-NEXT:    ret
430   %1 = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
431   %tmp = zext <8 x i8> %1 to <8 x i16>
432   ret <8 x i16> %tmp
435 define <4 x i32> @test_ushll2_shl0_v8i16(<8 x i16> %a) {
436 ; CHECK-LABEL: test_ushll2_shl0_v8i16:
437 ; CHECK:       // %bb.0:
438 ; CHECK-NEXT:    ushll2 v0.4s, v0.8h, #0
439 ; CHECK-NEXT:    ret
440   %1 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
441   %tmp = zext <4 x i16> %1 to <4 x i32>
442   ret <4 x i32> %tmp
445 define <2 x i64> @test_ushll2_shl0_v4i32(<4 x i32> %a) {
446 ; CHECK-LABEL: test_ushll2_shl0_v4i32:
447 ; CHECK:       // %bb.0:
448 ; CHECK-NEXT:    ushll2 v0.2d, v0.4s, #0
449 ; CHECK-NEXT:    ret
450   %1 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
451   %tmp = zext <2 x i32> %1 to <2 x i64>
452   ret <2 x i64> %tmp
455 define <8 x i16> @test_ushll_cmp(<8 x i8> %a, <8 x i8> %b) #0 {
456 ; CHECK-SD-LABEL: test_ushll_cmp:
457 ; CHECK-SD:       // %bb.0:
458 ; CHECK-SD-NEXT:    cmeq v0.8b, v0.8b, v1.8b
459 ; CHECK-SD-NEXT:    ushll v0.8h, v0.8b, #0
460 ; CHECK-SD-NEXT:    ret
462 ; CHECK-GI-LABEL: test_ushll_cmp:
463 ; CHECK-GI:       // %bb.0:
464 ; CHECK-GI-NEXT:    cmeq v0.8b, v0.8b, v1.8b
465 ; CHECK-GI-NEXT:    movi v1.2d, #0xff00ff00ff00ff
466 ; CHECK-GI-NEXT:    ushll v0.8h, v0.8b, #0
467 ; CHECK-GI-NEXT:    shl v0.8h, v0.8h, #15
468 ; CHECK-GI-NEXT:    sshr v0.8h, v0.8h, #15
469 ; CHECK-GI-NEXT:    and v0.16b, v0.16b, v1.16b
470 ; CHECK-GI-NEXT:    ret
471   %cmp.i = icmp eq <8 x i8> %a, %b
472   %vcgtz.i.i = sext <8 x i1> %cmp.i to <8 x i8>
473   %vmovl.i.i.i = zext <8 x i8> %vcgtz.i.i to <8 x i16>
474   ret <8 x i16> %vmovl.i.i.i