Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-vector-shuffle.ll
blob1757314804072845d908c0df3a0e991c752059e1
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve -force-streaming-compatible-sve < %s | FileCheck %s
3 ; RUN: llc -mattr=+sme -force-streaming-compatible-sve < %s | FileCheck %s
6 target triple = "aarch64-unknown-linux-gnu"
8 define <4 x i8> @shuffle_ext_byone_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
9 ; CHECK-LABEL: shuffle_ext_byone_v4i8:
10 ; CHECK:       // %bb.0:
11 ; CHECK-NEXT:    adrp x8, .LCPI0_0
12 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
13 ; CHECK-NEXT:    ldr q1, [x8, :lo12:.LCPI0_0]
14 ; CHECK-NEXT:    tbl z0.h, { z0.h }, z1.h
15 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
16 ; CHECK-NEXT:    ret
17   %ret = shufflevector <4 x i8> %op1, <4 x i8> %op2, <4 x i32> <i32 0, i32 3, i32 2, i32 1>
18   ret <4 x i8> %ret
21 define <8 x i8> @shuffle_ext_byone_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
22 ; CHECK-LABEL: shuffle_ext_byone_v8i8:
23 ; CHECK:       // %bb.0:
24 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
25 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
26 ; CHECK-NEXT:    mov z0.b, z0.b[7]
27 ; CHECK-NEXT:    fmov w8, s0
28 ; CHECK-NEXT:    insr z1.b, w8
29 ; CHECK-NEXT:    fmov d0, d1
30 ; CHECK-NEXT:    ret
31   %ret = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>
32   ret <8 x i8> %ret
35 define <16 x i8> @shuffle_ext_byone_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
36 ; CHECK-LABEL: shuffle_ext_byone_v16i8:
37 ; CHECK:       // %bb.0:
38 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
39 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
40 ; CHECK-NEXT:    mov z0.b, z0.b[15]
41 ; CHECK-NEXT:    fmov w8, s0
42 ; CHECK-NEXT:    insr z1.b, w8
43 ; CHECK-NEXT:    mov z0.d, z1.d
44 ; CHECK-NEXT:    ret
45   %ret = shufflevector <16 x i8> %op1, <16 x i8> %op2, <16 x i32> <i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22,
46                                                                    i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30>
47   ret <16 x i8> %ret
50 define void @shuffle_ext_byone_v32i8(ptr %a, ptr %b) {
51 ; CHECK-LABEL: shuffle_ext_byone_v32i8:
52 ; CHECK:       // %bb.0:
53 ; CHECK-NEXT:    ldr q0, [x0, #16]
54 ; CHECK-NEXT:    ldp q1, q3, [x1]
55 ; CHECK-NEXT:    mov z0.b, z0.b[15]
56 ; CHECK-NEXT:    mov z2.b, z1.b[15]
57 ; CHECK-NEXT:    fmov w8, s0
58 ; CHECK-NEXT:    insr z1.b, w8
59 ; CHECK-NEXT:    fmov w8, s2
60 ; CHECK-NEXT:    insr z3.b, w8
61 ; CHECK-NEXT:    stp q1, q3, [x0]
62 ; CHECK-NEXT:    ret
63   %op1 = load <32 x i8>, ptr %a
64   %op2 = load <32 x i8>, ptr %b
65   %ret = shufflevector <32 x i8> %op1, <32 x i8> %op2, <32 x i32> <i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38,
66                                                                    i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46,
67                                                                    i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54,
68                                                                    i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62>
69   store <32 x i8> %ret, ptr %a
70   ret void
73 define <2 x i16> @shuffle_ext_byone_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
74 ; CHECK-LABEL: shuffle_ext_byone_v2i16:
75 ; CHECK:       // %bb.0:
76 ; CHECK-NEXT:    ptrue p0.d
77 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
78 ; CHECK-NEXT:    revw z0.d, p0/m, z0.d
79 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
80 ; CHECK-NEXT:    ret
81   %ret = shufflevector <2 x i16> %op1, <2 x i16> %op2, <2 x i32> <i32 1, i32 0>
82   ret <2 x i16> %ret
85 define <4 x i16> @shuffle_ext_byone_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
86 ; CHECK-LABEL: shuffle_ext_byone_v4i16:
87 ; CHECK:       // %bb.0:
88 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
89 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
90 ; CHECK-NEXT:    mov z0.h, z0.h[3]
91 ; CHECK-NEXT:    fmov w8, s0
92 ; CHECK-NEXT:    insr z1.h, w8
93 ; CHECK-NEXT:    fmov d0, d1
94 ; CHECK-NEXT:    ret
95   %ret = shufflevector <4 x i16> %op1, <4 x i16> %op2, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
96   ret <4 x i16> %ret
99 define <8 x i16> @shuffle_ext_byone_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
100 ; CHECK-LABEL: shuffle_ext_byone_v8i16:
101 ; CHECK:       // %bb.0:
102 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
103 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
104 ; CHECK-NEXT:    mov z0.h, z0.h[7]
105 ; CHECK-NEXT:    fmov w8, s0
106 ; CHECK-NEXT:    insr z1.h, w8
107 ; CHECK-NEXT:    mov z0.d, z1.d
108 ; CHECK-NEXT:    ret
109   %ret = shufflevector <8 x i16> %op1, <8 x i16> %op2, <8 x i32> <i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>
110   ret <8 x i16> %ret
113 define void @shuffle_ext_byone_v16i16(ptr %a, ptr %b) {
114 ; CHECK-LABEL: shuffle_ext_byone_v16i16:
115 ; CHECK:       // %bb.0:
116 ; CHECK-NEXT:    ldr q0, [x0, #16]
117 ; CHECK-NEXT:    ldp q1, q3, [x1]
118 ; CHECK-NEXT:    mov z0.h, z0.h[7]
119 ; CHECK-NEXT:    mov z2.h, z1.h[7]
120 ; CHECK-NEXT:    fmov w8, s0
121 ; CHECK-NEXT:    insr z1.h, w8
122 ; CHECK-NEXT:    fmov w8, s2
123 ; CHECK-NEXT:    insr z3.h, w8
124 ; CHECK-NEXT:    stp q1, q3, [x0]
125 ; CHECK-NEXT:    ret
126   %op1 = load <16 x i16>, ptr %a
127   %op2 = load <16 x i16>, ptr %b
128   %ret = shufflevector <16 x i16> %op1, <16 x i16> %op2, <16 x i32> <i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22,
129                                                                      i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30>
130   store <16 x i16> %ret, ptr %a
131   ret void
134 define <2 x i32> @shuffle_ext_byone_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
135 ; CHECK-LABEL: shuffle_ext_byone_v2i32:
136 ; CHECK:       // %bb.0:
137 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
138 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
139 ; CHECK-NEXT:    mov z0.s, z0.s[1]
140 ; CHECK-NEXT:    fmov w8, s0
141 ; CHECK-NEXT:    insr z1.s, w8
142 ; CHECK-NEXT:    fmov d0, d1
143 ; CHECK-NEXT:    ret
144   %ret = shufflevector <2 x i32> %op1, <2 x i32> %op2, <2 x i32> <i32 1, i32 2>
145   ret <2 x i32> %ret
148 define <4 x i32> @shuffle_ext_byone_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
149 ; CHECK-LABEL: shuffle_ext_byone_v4i32:
150 ; CHECK:       // %bb.0:
151 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
152 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
153 ; CHECK-NEXT:    mov z0.s, z0.s[3]
154 ; CHECK-NEXT:    fmov w8, s0
155 ; CHECK-NEXT:    insr z1.s, w8
156 ; CHECK-NEXT:    mov z0.d, z1.d
157 ; CHECK-NEXT:    ret
158   %ret = shufflevector <4 x i32> %op1, <4 x i32> %op2, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
159   ret <4 x i32> %ret
162 define void @shuffle_ext_byone_v8i32(ptr %a, ptr %b) {
163 ; CHECK-LABEL: shuffle_ext_byone_v8i32:
164 ; CHECK:       // %bb.0:
165 ; CHECK-NEXT:    ldr q0, [x0, #16]
166 ; CHECK-NEXT:    ldp q1, q3, [x1]
167 ; CHECK-NEXT:    mov z0.s, z0.s[3]
168 ; CHECK-NEXT:    mov z2.s, z1.s[3]
169 ; CHECK-NEXT:    fmov w8, s0
170 ; CHECK-NEXT:    insr z1.s, w8
171 ; CHECK-NEXT:    fmov w8, s2
172 ; CHECK-NEXT:    insr z3.s, w8
173 ; CHECK-NEXT:    stp q1, q3, [x0]
174 ; CHECK-NEXT:    ret
175   %op1 = load <8 x i32>, ptr %a
176   %op2 = load <8 x i32>, ptr %b
177   %ret = shufflevector <8 x i32> %op1, <8 x i32> %op2, <8 x i32> <i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>
178   store <8 x i32> %ret, ptr %a
179   ret void
182 define <2 x i64> @shuffle_ext_byone_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
183 ; CHECK-LABEL: shuffle_ext_byone_v2i64:
184 ; CHECK:       // %bb.0:
185 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
186 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
187 ; CHECK-NEXT:    mov z0.d, z0.d[1]
188 ; CHECK-NEXT:    fmov x8, d0
189 ; CHECK-NEXT:    insr z1.d, x8
190 ; CHECK-NEXT:    mov z0.d, z1.d
191 ; CHECK-NEXT:    ret
192   %ret = shufflevector <2 x i64> %op1, <2 x i64> %op2, <2 x i32> <i32 1, i32 2>
193   ret <2 x i64> %ret
196 define void @shuffle_ext_byone_v4i64(ptr %a, ptr %b) {
197 ; CHECK-LABEL: shuffle_ext_byone_v4i64:
198 ; CHECK:       // %bb.0:
199 ; CHECK-NEXT:    ldr q0, [x0, #16]
200 ; CHECK-NEXT:    ldp q1, q3, [x1]
201 ; CHECK-NEXT:    mov z0.d, z0.d[1]
202 ; CHECK-NEXT:    mov z2.d, z1.d[1]
203 ; CHECK-NEXT:    fmov x8, d0
204 ; CHECK-NEXT:    insr z1.d, x8
205 ; CHECK-NEXT:    fmov x8, d2
206 ; CHECK-NEXT:    insr z3.d, x8
207 ; CHECK-NEXT:    stp q1, q3, [x0]
208 ; CHECK-NEXT:    ret
209   %op1 = load <4 x i64>, ptr %a
210   %op2 = load <4 x i64>, ptr %b
211   %ret = shufflevector <4 x i64> %op1, <4 x i64> %op2, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
212   store <4 x i64> %ret, ptr %a
213   ret void
217 define <4 x half> @shuffle_ext_byone_v4f16(<4 x half> %op1, <4 x half> %op2) {
218 ; CHECK-LABEL: shuffle_ext_byone_v4f16:
219 ; CHECK:       // %bb.0:
220 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
221 ; CHECK-NEXT:    mov z2.h, z0.h[3]
222 ; CHECK-NEXT:    fmov d0, d1
223 ; CHECK-NEXT:    insr z0.h, h2
224 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
225 ; CHECK-NEXT:    ret
226   %ret = shufflevector <4 x half> %op1, <4 x half> %op2, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
227   ret <4 x half> %ret
230 define <8 x half> @shuffle_ext_byone_v8f16(<8 x half> %op1, <8 x half> %op2) {
231 ; CHECK-LABEL: shuffle_ext_byone_v8f16:
232 ; CHECK:       // %bb.0:
233 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
234 ; CHECK-NEXT:    mov z2.h, z0.h[7]
235 ; CHECK-NEXT:    mov z0.d, z1.d
236 ; CHECK-NEXT:    insr z0.h, h2
237 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
238 ; CHECK-NEXT:    ret
239   %ret = shufflevector <8 x half> %op1, <8 x half> %op2, <8 x i32> <i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>
240   ret <8 x half> %ret
243 define void @shuffle_ext_byone_v16f16(ptr %a, ptr %b) {
244 ; CHECK-LABEL: shuffle_ext_byone_v16f16:
245 ; CHECK:       // %bb.0:
246 ; CHECK-NEXT:    ldp q1, q3, [x1]
247 ; CHECK-NEXT:    ldr q0, [x0, #16]
248 ; CHECK-NEXT:    mov z0.h, z0.h[7]
249 ; CHECK-NEXT:    mov z2.h, z1.h[7]
250 ; CHECK-NEXT:    insr z1.h, h0
251 ; CHECK-NEXT:    insr z3.h, h2
252 ; CHECK-NEXT:    stp q1, q3, [x0]
253 ; CHECK-NEXT:    ret
254   %op1 = load <16 x half>, ptr %a
255   %op2 = load <16 x half>, ptr %b
256   %ret = shufflevector <16 x half> %op1, <16 x half> %op2, <16 x i32> <i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22,
257                                                                        i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30>
258   store <16 x half> %ret, ptr %a
259   ret void
262 define <2 x float> @shuffle_ext_byone_v2f32(<2 x float> %op1, <2 x float> %op2) {
263 ; CHECK-LABEL: shuffle_ext_byone_v2f32:
264 ; CHECK:       // %bb.0:
265 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
266 ; CHECK-NEXT:    mov z2.s, z0.s[1]
267 ; CHECK-NEXT:    fmov d0, d1
268 ; CHECK-NEXT:    insr z0.s, s2
269 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
270 ; CHECK-NEXT:    ret
271   %ret = shufflevector <2 x float> %op1, <2 x float> %op2, <2 x i32> <i32 1, i32 2>
272   ret <2 x float> %ret
275 define <4 x float> @shuffle_ext_byone_v4f32(<4 x float> %op1, <4 x float> %op2) {
276 ; CHECK-LABEL: shuffle_ext_byone_v4f32:
277 ; CHECK:       // %bb.0:
278 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
279 ; CHECK-NEXT:    mov z2.s, z0.s[3]
280 ; CHECK-NEXT:    mov z0.d, z1.d
281 ; CHECK-NEXT:    insr z0.s, s2
282 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
283 ; CHECK-NEXT:    ret
284   %ret = shufflevector <4 x float> %op1, <4 x float> %op2, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
285   ret <4 x float> %ret
288 define void @shuffle_ext_byone_v8f32(ptr %a, ptr %b) {
289 ; CHECK-LABEL: shuffle_ext_byone_v8f32:
290 ; CHECK:       // %bb.0:
291 ; CHECK-NEXT:    ldp q1, q3, [x1]
292 ; CHECK-NEXT:    ldr q0, [x0, #16]
293 ; CHECK-NEXT:    mov z0.s, z0.s[3]
294 ; CHECK-NEXT:    mov z2.s, z1.s[3]
295 ; CHECK-NEXT:    insr z1.s, s0
296 ; CHECK-NEXT:    insr z3.s, s2
297 ; CHECK-NEXT:    stp q1, q3, [x0]
298 ; CHECK-NEXT:    ret
299   %op1 = load <8 x float>, ptr %a
300   %op2 = load <8 x float>, ptr %b
301   %ret = shufflevector <8 x float> %op1, <8 x float> %op2, <8 x i32> <i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>
302   store <8 x float> %ret, ptr %a
303   ret void
306 define <2 x double> @shuffle_ext_byone_v2f64(<2 x double> %op1, <2 x double> %op2) {
307 ; CHECK-LABEL: shuffle_ext_byone_v2f64:
308 ; CHECK:       // %bb.0:
309 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
310 ; CHECK-NEXT:    mov z2.d, z0.d[1]
311 ; CHECK-NEXT:    mov z0.d, z1.d
312 ; CHECK-NEXT:    insr z0.d, d2
313 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
314 ; CHECK-NEXT:    ret
315   %ret = shufflevector <2 x double> %op1, <2 x double> %op2, <2 x i32> <i32 1, i32 2>
316   ret <2 x double> %ret
319 define void @shuffle_ext_byone_v4f64(ptr %a, ptr %b) {
320 ; CHECK-LABEL: shuffle_ext_byone_v4f64:
321 ; CHECK:       // %bb.0:
322 ; CHECK-NEXT:    ldp q1, q3, [x1]
323 ; CHECK-NEXT:    ldr q0, [x0, #16]
324 ; CHECK-NEXT:    mov z0.d, z0.d[1]
325 ; CHECK-NEXT:    mov z2.d, z1.d[1]
326 ; CHECK-NEXT:    insr z1.d, d0
327 ; CHECK-NEXT:    insr z3.d, d2
328 ; CHECK-NEXT:    stp q1, q3, [x0]
329 ; CHECK-NEXT:    ret
330   %op1 = load <4 x double>, ptr %a
331   %op2 = load <4 x double>, ptr %b
332   %ret = shufflevector <4 x double> %op1, <4 x double> %op2, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
333   store <4 x double> %ret, ptr %a
334   ret void
337 define void @shuffle_ext_byone_reverse(ptr %a, ptr %b) {
338 ; CHECK-LABEL: shuffle_ext_byone_reverse:
339 ; CHECK:       // %bb.0:
340 ; CHECK-NEXT:    ldp q1, q3, [x0]
341 ; CHECK-NEXT:    ldr q0, [x1, #16]
342 ; CHECK-NEXT:    mov z0.d, z0.d[1]
343 ; CHECK-NEXT:    mov z2.d, z1.d[1]
344 ; CHECK-NEXT:    insr z1.d, d0
345 ; CHECK-NEXT:    insr z3.d, d2
346 ; CHECK-NEXT:    stp q1, q3, [x0]
347 ; CHECK-NEXT:    ret
348   %op1 = load <4 x double>, ptr %a
349   %op2 = load <4 x double>, ptr %b
350   %ret = shufflevector <4 x double> %op1, <4 x double> %op2, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
351   store <4 x double> %ret, ptr %a
352   ret void
355 define void @shuffle_ext_invalid(ptr %a, ptr %b) {
356 ; CHECK-LABEL: shuffle_ext_invalid:
357 ; CHECK:       // %bb.0:
358 ; CHECK-NEXT:    ldr q0, [x0, #16]
359 ; CHECK-NEXT:    ldr q1, [x1]
360 ; CHECK-NEXT:    stp q0, q1, [x0]
361 ; CHECK-NEXT:    ret
362   %op1 = load <4 x double>, ptr %a
363   %op2 = load <4 x double>, ptr %b
364   %ret = shufflevector <4 x double> %op1, <4 x double> %op2, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
365   store <4 x double> %ret, ptr %a
366   ret void