Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-fixed-length-vector-shuffle-tbl.ll
blob276f23703df3df1dcb9d24af835b8473a976ab63
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve2 -force-streaming-compatible -aarch64-sve-vector-bits-min=128 -aarch64-sve-vector-bits-max=128  < %s | FileCheck %s -check-prefixes=CHECK,SVE2_128
3 ; RUN: llc -mattr=+sve2 -force-streaming-compatible -aarch64-sve-vector-bits-min=128 < %s | FileCheck %s -check-prefixes=CHECK,SVE2_128_NOMAX
4 ; RUN: llc -mattr=+sve2 -force-streaming-compatible < %s | FileCheck %s -check-prefixes=CHECK,SVE2_NOMIN_NOMAX
5 ; RUN: llc -mattr=+sve2 -force-streaming-compatible -aarch64-sve-vector-bits-min=256 < %s | FileCheck %s -check-prefixes=CHECK,SVE2_MIN_256_NOMAX
7 target triple = "aarch64-unknown-linux-gnu"
9 ; SVE2_128: .LCPI0_0:
10 ; SVE2_128-NEXT:        .byte   0                               // 0x0
11 ; SVE2_128-NEXT:        .byte   7                               // 0x7
12 ; SVE2_128-NEXT:        .byte   2                               // 0x2
13 ; SVE2_128-NEXT:        .byte   3                               // 0x3
14 ; SVE2_128-NEXT:        .byte   4                               // 0x4
15 ; SVE2_128-NEXT:        .byte   5                               // 0x5
16 ; SVE2_128-NEXT:        .byte   6                               // 0x6
17 ; SVE2_128-NEXT:        .byte   7                               // 0x7
18 ; SVE2_128-NEXT:        .byte   255                             // 0xff
19 ; SVE2_128-NEXT:        .byte   255                             // 0xff
20 define <8 x i8> @shuffle_index_indices_from_op1(ptr %a, ptr %b) {
21 ; SVE2_128-LABEL: shuffle_index_indices_from_op1:
22 ; SVE2_128:       // %bb.0:
23 ; SVE2_128-NEXT:    adrp x8, .LCPI0_0
24 ; SVE2_128-NEXT:    ldr d0, [x0]
25 ; SVE2_128-NEXT:    ldr q1, [x8, :lo12:.LCPI0_0]
26 ; SVE2_128-NEXT:    tbl z0.b, { z0.b }, z1.b
27 ; SVE2_128-NEXT:    // kill: def $d0 killed $d0 killed $z0
28 ; SVE2_128-NEXT:    ret
30 ; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_op1:
31 ; SVE2_128_NOMAX:       // %bb.0:
32 ; SVE2_128_NOMAX-NEXT:    adrp x8, .LCPI0_0
33 ; SVE2_128_NOMAX-NEXT:    ldr d0, [x0]
34 ; SVE2_128_NOMAX-NEXT:    ldr q1, [x8, :lo12:.LCPI0_0]
35 ; SVE2_128_NOMAX-NEXT:    tbl z0.b, { z0.b }, z1.b
36 ; SVE2_128_NOMAX-NEXT:    // kill: def $d0 killed $d0 killed $z0
37 ; SVE2_128_NOMAX-NEXT:    ret
39 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_op1:
40 ; SVE2_NOMIN_NOMAX:       // %bb.0:
41 ; SVE2_NOMIN_NOMAX-NEXT:    adrp x8, .LCPI0_0
42 ; SVE2_NOMIN_NOMAX-NEXT:    ldr d0, [x0]
43 ; SVE2_NOMIN_NOMAX-NEXT:    ldr q1, [x8, :lo12:.LCPI0_0]
44 ; SVE2_NOMIN_NOMAX-NEXT:    tbl z0.b, { z0.b }, z1.b
45 ; SVE2_NOMIN_NOMAX-NEXT:    // kill: def $d0 killed $d0 killed $z0
46 ; SVE2_NOMIN_NOMAX-NEXT:    ret
48 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_op1:
49 ; SVE2_MIN_256_NOMAX:       // %bb.0:
50 ; SVE2_MIN_256_NOMAX-NEXT:    ptrue p0.b, vl32
51 ; SVE2_MIN_256_NOMAX-NEXT:    adrp x8, .LCPI0_0
52 ; SVE2_MIN_256_NOMAX-NEXT:    add x8, x8, :lo12:.LCPI0_0
53 ; SVE2_MIN_256_NOMAX-NEXT:    ldr d1, [x0]
54 ; SVE2_MIN_256_NOMAX-NEXT:    ld1b { z0.b }, p0/z, [x8]
55 ; SVE2_MIN_256_NOMAX-NEXT:    tbl z0.b, { z1.b }, z0.b
56 ; SVE2_MIN_256_NOMAX-NEXT:    // kill: def $d0 killed $d0 killed $z0
57 ; SVE2_MIN_256_NOMAX-NEXT:    ret
58   %op1 = load <8 x i8>, ptr %a
59   %op2 = load <8 x i8>, ptr %b
60   %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 0, i32 7, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
61   ret <8 x i8> %1
64 ; SVE2_128: .LCPI1_0:
65 ; SVE2_128-NEXT:        .byte   0                               // 0x0
66 ; SVE2_128-NEXT:        .byte   1                               // 0x1
67 ; SVE2_128-NEXT:        .byte   1                               // 0x1
68 ; SVE2_128-NEXT:        .byte   3                               // 0x3
69 ; SVE2_128-NEXT:        .byte   4                               // 0x4
70 ; SVE2_128-NEXT:        .byte   7                               // 0x7
71 ; SVE2_128-NEXT:        .byte   6                               // 0x6
72 ; SVE2_128-NEXT:        .byte   7                               // 0x7
73 ; SVE2_128-NEXT:        .byte   255                             // 0xff
74 ; SVE2_128-NEXT:        .byte   255                             // 0xff
75 define <8 x i8> @shuffle_index_indices_from_op2(ptr %a, ptr %b) {
76 ; SVE2_128-LABEL: shuffle_index_indices_from_op2:
77 ; SVE2_128:       // %bb.0:
78 ; SVE2_128-NEXT:    adrp x8, .LCPI1_0
79 ; SVE2_128-NEXT:    ldr d0, [x1]
80 ; SVE2_128-NEXT:    ldr q1, [x8, :lo12:.LCPI1_0]
81 ; SVE2_128-NEXT:    tbl z0.b, { z0.b }, z1.b
82 ; SVE2_128-NEXT:    // kill: def $d0 killed $d0 killed $z0
83 ; SVE2_128-NEXT:    ret
85 ; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_op2:
86 ; SVE2_128_NOMAX:       // %bb.0:
87 ; SVE2_128_NOMAX-NEXT:    adrp x8, .LCPI1_0
88 ; SVE2_128_NOMAX-NEXT:    ldr d0, [x1]
89 ; SVE2_128_NOMAX-NEXT:    ldr q1, [x8, :lo12:.LCPI1_0]
90 ; SVE2_128_NOMAX-NEXT:    tbl z0.b, { z0.b }, z1.b
91 ; SVE2_128_NOMAX-NEXT:    // kill: def $d0 killed $d0 killed $z0
92 ; SVE2_128_NOMAX-NEXT:    ret
94 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_op2:
95 ; SVE2_NOMIN_NOMAX:       // %bb.0:
96 ; SVE2_NOMIN_NOMAX-NEXT:    adrp x8, .LCPI1_0
97 ; SVE2_NOMIN_NOMAX-NEXT:    ldr d0, [x1]
98 ; SVE2_NOMIN_NOMAX-NEXT:    ldr q1, [x8, :lo12:.LCPI1_0]
99 ; SVE2_NOMIN_NOMAX-NEXT:    tbl z0.b, { z0.b }, z1.b
100 ; SVE2_NOMIN_NOMAX-NEXT:    // kill: def $d0 killed $d0 killed $z0
101 ; SVE2_NOMIN_NOMAX-NEXT:    ret
103 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_op2:
104 ; SVE2_MIN_256_NOMAX:       // %bb.0:
105 ; SVE2_MIN_256_NOMAX-NEXT:    ptrue p0.b, vl32
106 ; SVE2_MIN_256_NOMAX-NEXT:    adrp x8, .LCPI1_0
107 ; SVE2_MIN_256_NOMAX-NEXT:    add x8, x8, :lo12:.LCPI1_0
108 ; SVE2_MIN_256_NOMAX-NEXT:    ldr d1, [x1]
109 ; SVE2_MIN_256_NOMAX-NEXT:    ld1b { z0.b }, p0/z, [x8]
110 ; SVE2_MIN_256_NOMAX-NEXT:    tbl z0.b, { z1.b }, z0.b
111 ; SVE2_MIN_256_NOMAX-NEXT:    // kill: def $d0 killed $d0 killed $z0
112 ; SVE2_MIN_256_NOMAX-NEXT:    ret
113   %op1 = load <8 x i8>, ptr %a
114   %op2 = load <8 x i8>, ptr %b
115   %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 8, i32 9, i32 9, i32 11, i32 12, i32 15, i32 14, i32 15>
116   ret <8 x i8> %1
119 ; SVE2_128: .LCPI2_0:
120 ; SVE2_128-NEXT:        .byte   1                               // 0x1
121 ; SVE2_128-NEXT:        .byte   17                              // 0x11
122 ; SVE2_128-NEXT:        .byte   18                              // 0x12
123 ; SVE2_128-NEXT:        .byte   19                              // 0x13
124 ; SVE2_128-NEXT:        .byte   20                              // 0x14
125 ; SVE2_128-NEXT:        .byte   20                              // 0x14
126 ; SVE2_128-NEXT:        .byte   22                              // 0x16
127 ; SVE2_128-NEXT:        .byte   23                              // 0x17
128 ; SVE2_128-NEXT:        .byte   255                             // 0xff
129 ; SVE2_128-NEXT:        .byte   255                             // 0xff
130 define <8 x i8> @shuffle_index_indices_from_both_ops(ptr %a, ptr %b) {
131 ; SVE2_128-LABEL: shuffle_index_indices_from_both_ops:
132 ; SVE2_128:       // %bb.0:
133 ; SVE2_128-NEXT:    adrp x8, .LCPI2_0
134 ; SVE2_128-NEXT:    ldr d0, [x0]
135 ; SVE2_128-NEXT:    ldr d1, [x1]
136 ; SVE2_128-NEXT:    ldr q2, [x8, :lo12:.LCPI2_0]
137 ; SVE2_128-NEXT:    tbl z0.b, { z0.b, z1.b }, z2.b
138 ; SVE2_128-NEXT:    // kill: def $d0 killed $d0 killed $z0
139 ; SVE2_128-NEXT:    ret
141 ; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_both_ops:
142 ; SVE2_128_NOMAX:       // %bb.0:
143 ; SVE2_128_NOMAX-NEXT:    sub sp, sp, #16
144 ; SVE2_128_NOMAX-NEXT:    .cfi_def_cfa_offset 16
145 ; SVE2_128_NOMAX-NEXT:    ldr d0, [x1]
146 ; SVE2_128_NOMAX-NEXT:    mov z1.b, z0.b[7]
147 ; SVE2_128_NOMAX-NEXT:    mov z2.b, z0.b[6]
148 ; SVE2_128_NOMAX-NEXT:    mov z3.b, z0.b[4]
149 ; SVE2_128_NOMAX-NEXT:    fmov w8, s1
150 ; SVE2_128_NOMAX-NEXT:    ldr d1, [x0]
151 ; SVE2_128_NOMAX-NEXT:    fmov w9, s2
152 ; SVE2_128_NOMAX-NEXT:    mov z2.b, z0.b[3]
153 ; SVE2_128_NOMAX-NEXT:    mov z1.b, z1.b[1]
154 ; SVE2_128_NOMAX-NEXT:    strb w8, [sp, #15]
155 ; SVE2_128_NOMAX-NEXT:    fmov w8, s3
156 ; SVE2_128_NOMAX-NEXT:    mov z3.b, z0.b[2]
157 ; SVE2_128_NOMAX-NEXT:    strb w9, [sp, #14]
158 ; SVE2_128_NOMAX-NEXT:    mov z0.b, z0.b[1]
159 ; SVE2_128_NOMAX-NEXT:    fmov w9, s2
160 ; SVE2_128_NOMAX-NEXT:    strb w8, [sp, #13]
161 ; SVE2_128_NOMAX-NEXT:    strb w8, [sp, #12]
162 ; SVE2_128_NOMAX-NEXT:    fmov w8, s3
163 ; SVE2_128_NOMAX-NEXT:    strb w9, [sp, #11]
164 ; SVE2_128_NOMAX-NEXT:    fmov w9, s0
165 ; SVE2_128_NOMAX-NEXT:    strb w8, [sp, #10]
166 ; SVE2_128_NOMAX-NEXT:    fmov w8, s1
167 ; SVE2_128_NOMAX-NEXT:    strb w9, [sp, #9]
168 ; SVE2_128_NOMAX-NEXT:    strb w8, [sp, #8]
169 ; SVE2_128_NOMAX-NEXT:    ldr d0, [sp, #8]
170 ; SVE2_128_NOMAX-NEXT:    add sp, sp, #16
171 ; SVE2_128_NOMAX-NEXT:    ret
173 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_both_ops:
174 ; SVE2_NOMIN_NOMAX:       // %bb.0:
175 ; SVE2_NOMIN_NOMAX-NEXT:    sub sp, sp, #16
176 ; SVE2_NOMIN_NOMAX-NEXT:    .cfi_def_cfa_offset 16
177 ; SVE2_NOMIN_NOMAX-NEXT:    ldr d0, [x1]
178 ; SVE2_NOMIN_NOMAX-NEXT:    mov z1.b, z0.b[7]
179 ; SVE2_NOMIN_NOMAX-NEXT:    mov z2.b, z0.b[6]
180 ; SVE2_NOMIN_NOMAX-NEXT:    mov z3.b, z0.b[4]
181 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w8, s1
182 ; SVE2_NOMIN_NOMAX-NEXT:    ldr d1, [x0]
183 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w9, s2
184 ; SVE2_NOMIN_NOMAX-NEXT:    mov z2.b, z0.b[3]
185 ; SVE2_NOMIN_NOMAX-NEXT:    mov z1.b, z1.b[1]
186 ; SVE2_NOMIN_NOMAX-NEXT:    strb w8, [sp, #15]
187 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w8, s3
188 ; SVE2_NOMIN_NOMAX-NEXT:    mov z3.b, z0.b[2]
189 ; SVE2_NOMIN_NOMAX-NEXT:    strb w9, [sp, #14]
190 ; SVE2_NOMIN_NOMAX-NEXT:    mov z0.b, z0.b[1]
191 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w9, s2
192 ; SVE2_NOMIN_NOMAX-NEXT:    strb w8, [sp, #13]
193 ; SVE2_NOMIN_NOMAX-NEXT:    strb w8, [sp, #12]
194 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w8, s3
195 ; SVE2_NOMIN_NOMAX-NEXT:    strb w9, [sp, #11]
196 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w9, s0
197 ; SVE2_NOMIN_NOMAX-NEXT:    strb w8, [sp, #10]
198 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w8, s1
199 ; SVE2_NOMIN_NOMAX-NEXT:    strb w9, [sp, #9]
200 ; SVE2_NOMIN_NOMAX-NEXT:    strb w8, [sp, #8]
201 ; SVE2_NOMIN_NOMAX-NEXT:    ldr d0, [sp, #8]
202 ; SVE2_NOMIN_NOMAX-NEXT:    add sp, sp, #16
203 ; SVE2_NOMIN_NOMAX-NEXT:    ret
205 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_both_ops:
206 ; SVE2_MIN_256_NOMAX:       // %bb.0:
207 ; SVE2_MIN_256_NOMAX-NEXT:    sub sp, sp, #16
208 ; SVE2_MIN_256_NOMAX-NEXT:    .cfi_def_cfa_offset 16
209 ; SVE2_MIN_256_NOMAX-NEXT:    ldr d0, [x1]
210 ; SVE2_MIN_256_NOMAX-NEXT:    mov z1.b, z0.b[7]
211 ; SVE2_MIN_256_NOMAX-NEXT:    mov z2.b, z0.b[6]
212 ; SVE2_MIN_256_NOMAX-NEXT:    mov z3.b, z0.b[4]
213 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w8, s1
214 ; SVE2_MIN_256_NOMAX-NEXT:    ldr d1, [x0]
215 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w9, s2
216 ; SVE2_MIN_256_NOMAX-NEXT:    mov z2.b, z0.b[3]
217 ; SVE2_MIN_256_NOMAX-NEXT:    mov z1.b, z1.b[1]
218 ; SVE2_MIN_256_NOMAX-NEXT:    strb w8, [sp, #15]
219 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w8, s3
220 ; SVE2_MIN_256_NOMAX-NEXT:    mov z3.b, z0.b[2]
221 ; SVE2_MIN_256_NOMAX-NEXT:    strb w9, [sp, #14]
222 ; SVE2_MIN_256_NOMAX-NEXT:    mov z0.b, z0.b[1]
223 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w9, s2
224 ; SVE2_MIN_256_NOMAX-NEXT:    strb w8, [sp, #13]
225 ; SVE2_MIN_256_NOMAX-NEXT:    strb w8, [sp, #12]
226 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w8, s3
227 ; SVE2_MIN_256_NOMAX-NEXT:    strb w9, [sp, #11]
228 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w9, s0
229 ; SVE2_MIN_256_NOMAX-NEXT:    strb w8, [sp, #10]
230 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w8, s1
231 ; SVE2_MIN_256_NOMAX-NEXT:    strb w9, [sp, #9]
232 ; SVE2_MIN_256_NOMAX-NEXT:    strb w8, [sp, #8]
233 ; SVE2_MIN_256_NOMAX-NEXT:    ldr d0, [sp, #8]
234 ; SVE2_MIN_256_NOMAX-NEXT:    add sp, sp, #16
235 ; SVE2_MIN_256_NOMAX-NEXT:    ret
236   %op1 = load <8 x i8>, ptr %a
237   %op2 = load <8 x i8>, ptr %b
238   %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>
239   ret <8 x i8> %1
242 ; SVE2_128: .LCPI3_0:
243 ; SVE2_128-NEXT:        .byte   1                               // 0x1
244 ; SVE2_128-NEXT:        .byte   17                              // 0x11
245 ; SVE2_128-NEXT:        .byte   18                              // 0x12
246 ; SVE2_128-NEXT:        .byte   19                              // 0x13
247 ; SVE2_128-NEXT:        .byte   20                              // 0x14
248 ; SVE2_128-NEXT:        .byte   20                              // 0x14
249 ; SVE2_128-NEXT:        .byte   22                              // 0x16
250 ; SVE2_128-NEXT:        .byte   0                               // 0x0
251 ; SVE2_128-NEXT:        .byte   255                             // 0xff
252 ; SVE2_128-NEXT:        .byte   255                             // 0xff
253 define <8 x i8> @shuffle_index_poison_value(ptr %a, ptr %b) {
254 ; SVE2_128-LABEL: shuffle_index_poison_value:
255 ; SVE2_128:       // %bb.0:
256 ; SVE2_128-NEXT:    adrp x8, .LCPI3_0
257 ; SVE2_128-NEXT:    ldr d0, [x0]
258 ; SVE2_128-NEXT:    ldr d1, [x1]
259 ; SVE2_128-NEXT:    ldr q2, [x8, :lo12:.LCPI3_0]
260 ; SVE2_128-NEXT:    tbl z0.b, { z0.b, z1.b }, z2.b
261 ; SVE2_128-NEXT:    // kill: def $d0 killed $d0 killed $z0
262 ; SVE2_128-NEXT:    ret
264 ; SVE2_128_NOMAX-LABEL: shuffle_index_poison_value:
265 ; SVE2_128_NOMAX:       // %bb.0:
266 ; SVE2_128_NOMAX-NEXT:    sub sp, sp, #16
267 ; SVE2_128_NOMAX-NEXT:    .cfi_def_cfa_offset 16
268 ; SVE2_128_NOMAX-NEXT:    ldr d0, [x1]
269 ; SVE2_128_NOMAX-NEXT:    ldr d3, [x0]
270 ; SVE2_128_NOMAX-NEXT:    mov z1.b, z0.b[6]
271 ; SVE2_128_NOMAX-NEXT:    mov z2.b, z0.b[4]
272 ; SVE2_128_NOMAX-NEXT:    fmov w8, s1
273 ; SVE2_128_NOMAX-NEXT:    mov z1.b, z0.b[3]
274 ; SVE2_128_NOMAX-NEXT:    fmov w9, s2
275 ; SVE2_128_NOMAX-NEXT:    mov z2.b, z0.b[2]
276 ; SVE2_128_NOMAX-NEXT:    mov z0.b, z0.b[1]
277 ; SVE2_128_NOMAX-NEXT:    strb w8, [sp, #14]
278 ; SVE2_128_NOMAX-NEXT:    fmov w8, s1
279 ; SVE2_128_NOMAX-NEXT:    mov z1.b, z3.b[1]
280 ; SVE2_128_NOMAX-NEXT:    strb w9, [sp, #13]
281 ; SVE2_128_NOMAX-NEXT:    strb w9, [sp, #12]
282 ; SVE2_128_NOMAX-NEXT:    fmov w9, s2
283 ; SVE2_128_NOMAX-NEXT:    strb w8, [sp, #11]
284 ; SVE2_128_NOMAX-NEXT:    fmov w8, s0
285 ; SVE2_128_NOMAX-NEXT:    strb w9, [sp, #10]
286 ; SVE2_128_NOMAX-NEXT:    fmov w9, s1
287 ; SVE2_128_NOMAX-NEXT:    strb w8, [sp, #9]
288 ; SVE2_128_NOMAX-NEXT:    strb w9, [sp, #8]
289 ; SVE2_128_NOMAX-NEXT:    ldr d0, [sp, #8]
290 ; SVE2_128_NOMAX-NEXT:    add sp, sp, #16
291 ; SVE2_128_NOMAX-NEXT:    ret
293 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_poison_value:
294 ; SVE2_NOMIN_NOMAX:       // %bb.0:
295 ; SVE2_NOMIN_NOMAX-NEXT:    sub sp, sp, #16
296 ; SVE2_NOMIN_NOMAX-NEXT:    .cfi_def_cfa_offset 16
297 ; SVE2_NOMIN_NOMAX-NEXT:    ldr d0, [x1]
298 ; SVE2_NOMIN_NOMAX-NEXT:    ldr d3, [x0]
299 ; SVE2_NOMIN_NOMAX-NEXT:    mov z1.b, z0.b[6]
300 ; SVE2_NOMIN_NOMAX-NEXT:    mov z2.b, z0.b[4]
301 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w8, s1
302 ; SVE2_NOMIN_NOMAX-NEXT:    mov z1.b, z0.b[3]
303 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w9, s2
304 ; SVE2_NOMIN_NOMAX-NEXT:    mov z2.b, z0.b[2]
305 ; SVE2_NOMIN_NOMAX-NEXT:    mov z0.b, z0.b[1]
306 ; SVE2_NOMIN_NOMAX-NEXT:    strb w8, [sp, #14]
307 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w8, s1
308 ; SVE2_NOMIN_NOMAX-NEXT:    mov z1.b, z3.b[1]
309 ; SVE2_NOMIN_NOMAX-NEXT:    strb w9, [sp, #13]
310 ; SVE2_NOMIN_NOMAX-NEXT:    strb w9, [sp, #12]
311 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w9, s2
312 ; SVE2_NOMIN_NOMAX-NEXT:    strb w8, [sp, #11]
313 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w8, s0
314 ; SVE2_NOMIN_NOMAX-NEXT:    strb w9, [sp, #10]
315 ; SVE2_NOMIN_NOMAX-NEXT:    fmov w9, s1
316 ; SVE2_NOMIN_NOMAX-NEXT:    strb w8, [sp, #9]
317 ; SVE2_NOMIN_NOMAX-NEXT:    strb w9, [sp, #8]
318 ; SVE2_NOMIN_NOMAX-NEXT:    ldr d0, [sp, #8]
319 ; SVE2_NOMIN_NOMAX-NEXT:    add sp, sp, #16
320 ; SVE2_NOMIN_NOMAX-NEXT:    ret
322 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_poison_value:
323 ; SVE2_MIN_256_NOMAX:       // %bb.0:
324 ; SVE2_MIN_256_NOMAX-NEXT:    sub sp, sp, #16
325 ; SVE2_MIN_256_NOMAX-NEXT:    .cfi_def_cfa_offset 16
326 ; SVE2_MIN_256_NOMAX-NEXT:    ldr d0, [x1]
327 ; SVE2_MIN_256_NOMAX-NEXT:    ldr d3, [x0]
328 ; SVE2_MIN_256_NOMAX-NEXT:    mov z1.b, z0.b[6]
329 ; SVE2_MIN_256_NOMAX-NEXT:    mov z2.b, z0.b[4]
330 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w8, s1
331 ; SVE2_MIN_256_NOMAX-NEXT:    mov z1.b, z0.b[3]
332 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w9, s2
333 ; SVE2_MIN_256_NOMAX-NEXT:    mov z2.b, z0.b[2]
334 ; SVE2_MIN_256_NOMAX-NEXT:    mov z0.b, z0.b[1]
335 ; SVE2_MIN_256_NOMAX-NEXT:    strb w8, [sp, #14]
336 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w8, s1
337 ; SVE2_MIN_256_NOMAX-NEXT:    mov z1.b, z3.b[1]
338 ; SVE2_MIN_256_NOMAX-NEXT:    strb w9, [sp, #13]
339 ; SVE2_MIN_256_NOMAX-NEXT:    strb w9, [sp, #12]
340 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w9, s2
341 ; SVE2_MIN_256_NOMAX-NEXT:    strb w8, [sp, #11]
342 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w8, s0
343 ; SVE2_MIN_256_NOMAX-NEXT:    strb w9, [sp, #10]
344 ; SVE2_MIN_256_NOMAX-NEXT:    fmov w9, s1
345 ; SVE2_MIN_256_NOMAX-NEXT:    strb w8, [sp, #9]
346 ; SVE2_MIN_256_NOMAX-NEXT:    strb w9, [sp, #8]
347 ; SVE2_MIN_256_NOMAX-NEXT:    ldr d0, [sp, #8]
348 ; SVE2_MIN_256_NOMAX-NEXT:    add sp, sp, #16
349 ; SVE2_MIN_256_NOMAX-NEXT:    ret
350   %op1 = load <8 x i8>, ptr %a
351   %op2 = load <8 x i8>, ptr %b
352   %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 poison>
353   ret <8 x i8> %1
356 define <8 x i8> @shuffle_op1_poison(ptr %a, ptr %b) {
357 ; SVE2_128-LABEL: shuffle_op1_poison:
358 ; SVE2_128:       // %bb.0:
359 ; SVE2_128-NEXT:    adrp x8, .LCPI4_0
360 ; SVE2_128-NEXT:    ldr d0, [x1]
361 ; SVE2_128-NEXT:    ldr q1, [x8, :lo12:.LCPI4_0]
362 ; SVE2_128-NEXT:    tbl z0.b, { z0.b }, z1.b
363 ; SVE2_128-NEXT:    // kill: def $d0 killed $d0 killed $z0
364 ; SVE2_128-NEXT:    ret
366 ; SVE2_128_NOMAX-LABEL: shuffle_op1_poison:
367 ; SVE2_128_NOMAX:       // %bb.0:
368 ; SVE2_128_NOMAX-NEXT:    adrp x8, .LCPI4_0
369 ; SVE2_128_NOMAX-NEXT:    ldr d0, [x1]
370 ; SVE2_128_NOMAX-NEXT:    ldr q1, [x8, :lo12:.LCPI4_0]
371 ; SVE2_128_NOMAX-NEXT:    tbl z0.b, { z0.b }, z1.b
372 ; SVE2_128_NOMAX-NEXT:    // kill: def $d0 killed $d0 killed $z0
373 ; SVE2_128_NOMAX-NEXT:    ret
375 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_op1_poison:
376 ; SVE2_NOMIN_NOMAX:       // %bb.0:
377 ; SVE2_NOMIN_NOMAX-NEXT:    adrp x8, .LCPI4_0
378 ; SVE2_NOMIN_NOMAX-NEXT:    ldr d0, [x1]
379 ; SVE2_NOMIN_NOMAX-NEXT:    ldr q1, [x8, :lo12:.LCPI4_0]
380 ; SVE2_NOMIN_NOMAX-NEXT:    tbl z0.b, { z0.b }, z1.b
381 ; SVE2_NOMIN_NOMAX-NEXT:    // kill: def $d0 killed $d0 killed $z0
382 ; SVE2_NOMIN_NOMAX-NEXT:    ret
384 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_op1_poison:
385 ; SVE2_MIN_256_NOMAX:       // %bb.0:
386 ; SVE2_MIN_256_NOMAX-NEXT:    ptrue p0.b, vl32
387 ; SVE2_MIN_256_NOMAX-NEXT:    adrp x8, .LCPI4_0
388 ; SVE2_MIN_256_NOMAX-NEXT:    add x8, x8, :lo12:.LCPI4_0
389 ; SVE2_MIN_256_NOMAX-NEXT:    ldr d1, [x1]
390 ; SVE2_MIN_256_NOMAX-NEXT:    ld1b { z0.b }, p0/z, [x8]
391 ; SVE2_MIN_256_NOMAX-NEXT:    tbl z0.b, { z1.b }, z0.b
392 ; SVE2_MIN_256_NOMAX-NEXT:    // kill: def $d0 killed $d0 killed $z0
393 ; SVE2_MIN_256_NOMAX-NEXT:    ret
394   %op2 = load <8 x i8>, ptr %b
395   %1 = shufflevector <8 x i8> poison, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>
396   ret <8 x i8> %1
399 ; In this function, we could not represent indexes for the second operand
400 ; because for i8 type, the maximum constant in the mask is 256.
401 define <8 x i8> @negative_test_shuffle_index_size_op_both_maxhw(ptr %a, ptr %b) "target-features"="+sve2" vscale_range(16,16) {
402 ; CHECK-LABEL: negative_test_shuffle_index_size_op_both_maxhw:
403 ; CHECK:       // %bb.0:
404 ; CHECK-NEXT:    sub sp, sp, #16
405 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
406 ; CHECK-NEXT:    ldr d0, [x1]
407 ; CHECK-NEXT:    mov z1.b, z0.b[7]
408 ; CHECK-NEXT:    mov z2.b, z0.b[6]
409 ; CHECK-NEXT:    mov z3.b, z0.b[4]
410 ; CHECK-NEXT:    fmov w8, s1
411 ; CHECK-NEXT:    ldr d1, [x0]
412 ; CHECK-NEXT:    fmov w9, s2
413 ; CHECK-NEXT:    mov z2.b, z0.b[3]
414 ; CHECK-NEXT:    mov z1.b, z1.b[1]
415 ; CHECK-NEXT:    strb w8, [sp, #15]
416 ; CHECK-NEXT:    fmov w8, s3
417 ; CHECK-NEXT:    mov z3.b, z0.b[2]
418 ; CHECK-NEXT:    strb w9, [sp, #14]
419 ; CHECK-NEXT:    mov z0.b, z0.b[1]
420 ; CHECK-NEXT:    fmov w9, s2
421 ; CHECK-NEXT:    strb w8, [sp, #13]
422 ; CHECK-NEXT:    strb w8, [sp, #12]
423 ; CHECK-NEXT:    fmov w8, s3
424 ; CHECK-NEXT:    strb w9, [sp, #11]
425 ; CHECK-NEXT:    fmov w9, s0
426 ; CHECK-NEXT:    strb w8, [sp, #10]
427 ; CHECK-NEXT:    fmov w8, s1
428 ; CHECK-NEXT:    strb w9, [sp, #9]
429 ; CHECK-NEXT:    strb w8, [sp, #8]
430 ; CHECK-NEXT:    ldr d0, [sp, #8]
431 ; CHECK-NEXT:    add sp, sp, #16
432 ; CHECK-NEXT:    ret
433   %op1 = load <8 x i8>, ptr %a
434   %op2 = load <8 x i8>, ptr %b
435   %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>
436   ret <8 x i8> %1
439 ; CHECK: .LCPI6_0:
440 ; CHECK-NEXT:        .byte   0                               // 0x0
441 ; CHECK-NEXT:        .byte   7                               // 0x7
442 ; CHECK-NEXT:        .byte   2                               // 0x2
443 ; CHECK-NEXT:        .byte   3                               // 0x3
444 ; CHECK-NEXT:        .byte   4                               // 0x4
445 ; CHECK-NEXT:        .byte   5                               // 0x5
446 ; CHECK-NEXT:        .byte   6                               // 0x6
447 ; CHECK-NEXT:        .byte   7                               // 0x7
448 ; CHECK-NEXT:        .byte   255                             // 0xff
449 ; CHECK-NEXT:        .byte   255                             // 0xff
450 define <8 x i8> @shuffle_index_size_op1_maxhw(ptr %a, ptr %b) "target-features"="+sve2" vscale_range(16,16) {
451 ; CHECK-LABEL: shuffle_index_size_op1_maxhw:
452 ; CHECK:       // %bb.0:
453 ; CHECK-NEXT:    ptrue p0.b
454 ; CHECK-NEXT:    adrp x8, .LCPI6_0
455 ; CHECK-NEXT:    add x8, x8, :lo12:.LCPI6_0
456 ; CHECK-NEXT:    ldr d1, [x0]
457 ; CHECK-NEXT:    ld1b { z0.b }, p0/z, [x8]
458 ; CHECK-NEXT:    tbl z0.b, { z1.b }, z0.b
459 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
460 ; CHECK-NEXT:    ret
461   %op1 = load <8 x i8>, ptr %a
462   %op2 = load <8 x i8>, ptr %b
463   %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 0, i32 7, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
464   ret <8 x i8> %1
467 ; SVE2_128: .LCPI7_0:
468 ; SVE2_128-NEXT:        .hword  1                               // 0x1
469 ; SVE2_128-NEXT:        .hword  9                               // 0x9
470 ; SVE2_128-NEXT:        .hword  10                              // 0xa
471 ; SVE2_128-NEXT:        .hword  11                              // 0xb
472 ; SVE2_128-NEXT:        .hword  12                              // 0xc
473 ; SVE2_128-NEXT:        .hword  12                              // 0xc
474 ; SVE2_128-NEXT:        .hword  14                              // 0xe
475 ; SVE2_128-NEXT:        .hword  15                              // 0xf
477 ; SVE2_128_NOMAX: .LCPI7_0:
478 ; SVE2_128_NOMAX-NEXT:        .hword  0                               // 0x0
479 ; SVE2_128_NOMAX-NEXT:        .hword  1                               // 0x1
480 ; SVE2_128_NOMAX-NEXT:        .hword  1                               // 0x1
481 ; SVE2_128_NOMAX-NEXT:        .hword  1                               // 0x1
482 ; SVE2_128_NOMAX-NEXT:        .hword  1                               // 0x1
483 ; SVE2_128_NOMAX-NEXT:        .hword  1                               // 0x1
484 ; SVE2_128_NOMAX-NEXT:        .hword  1                               // 0x1
485 ; SVE2_128_NOMAX-NEXT:        .hword  1                               // 0x1
486 ; SVE2_128_NOMAX-NEXT:.LCPI7_1:
487 ; SVE2_128_NOMAX-NEXT:        .hword  1                               // 0x1
488 ; SVE2_128_NOMAX-NEXT:        .hword  1                               // 0x1
489 ; SVE2_128_NOMAX-NEXT:        .hword  2                               // 0x2
490 ; SVE2_128_NOMAX-NEXT:        .hword  3                               // 0x3
491 ; SVE2_128_NOMAX-NEXT:        .hword  4                               // 0x4
492 ; SVE2_128_NOMAX-NEXT:        .hword  4                               // 0x4
493 ; SVE2_128_NOMAX-NEXT:        .hword  6                               // 0x6
494 ; SVE2_128_NOMAX-NEXT:        .hword  7                               // 0x7
496 ; SVE2_NOMIN_NOMAX: .LCPI7_0:
497 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  0                               // 0x0
498 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  1                               // 0x1
499 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  1                               // 0x1
500 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  1                               // 0x1
501 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  1                               // 0x1
502 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  1                               // 0x1
503 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  1                               // 0x1
504 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  1                               // 0x1
505 ; SVE2_NOMIN_NOMAX-NEXT:.LCPI7_1:
506 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  1                               // 0x1
507 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  1                               // 0x1
508 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  2                               // 0x2
509 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  3                               // 0x3
510 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  4                               // 0x4
511 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  4                               // 0x4
512 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  6                               // 0x6
513 ; SVE2_NOMIN_NOMAX-NEXT:        .hword  7                               // 0x7
515 ; SVE2_MIN_256_NOMAX: .LCPI7_0:
516 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  0                               // 0x0
517 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  1                               // 0x1
518 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  1                               // 0x1
519 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  1                               // 0x1
520 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  1                               // 0x1
521 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  1                               // 0x1
522 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  1                               // 0x1
523 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  1                               // 0x1
524 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  0                               // 0x0
525 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  0                               // 0x0
526 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  0                               // 0x0
527 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  0                               // 0x0
528 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  0                               // 0x0
529 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  0                               // 0x0
530 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  0                               // 0x0
531 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  0                               // 0x0
532 ; SVE2_MIN_256_NOMAX-NEXT:.LCPI7_1:
533 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  1                               // 0x1
534 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  1                               // 0x1
535 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  2                               // 0x2
536 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  3                               // 0x3
537 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  4                               // 0x4
538 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  4                               // 0x4
539 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  6                               // 0x6
540 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  7                               // 0x7
541 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  65535                           // 0xffff
542 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  65535                           // 0xffff
543 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  65535                           // 0xffff
544 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  65535                           // 0xffff
545 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  65535                           // 0xffff
546 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  65535                           // 0xffff
547 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  65535                           // 0xffff
548 ; SVE2_MIN_256_NOMAX-NEXT:        .hword  65535                           // 0xffff
549 define <8 x i16> @shuffle_index_indices_from_both_ops_i16(ptr %a, ptr %b) {
550 ; SVE2_128-LABEL: shuffle_index_indices_from_both_ops_i16:
551 ; SVE2_128:       // %bb.0:
552 ; SVE2_128-NEXT:    adrp x8, .LCPI7_0
553 ; SVE2_128-NEXT:    ldr q0, [x0]
554 ; SVE2_128-NEXT:    ldr q1, [x1]
555 ; SVE2_128-NEXT:    ldr q2, [x8, :lo12:.LCPI7_0]
556 ; SVE2_128-NEXT:    tbl z0.h, { z0.h, z1.h }, z2.h
557 ; SVE2_128-NEXT:    // kill: def $q0 killed $q0 killed $z0
558 ; SVE2_128-NEXT:    ret
560 ; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_both_ops_i16:
561 ; SVE2_128_NOMAX:       // %bb.0:
562 ; SVE2_128_NOMAX-NEXT:    cnth x8
563 ; SVE2_128_NOMAX-NEXT:    adrp x9, .LCPI7_0
564 ; SVE2_128_NOMAX-NEXT:    adrp x10, .LCPI7_1
565 ; SVE2_128_NOMAX-NEXT:    mov z0.h, w8
566 ; SVE2_128_NOMAX-NEXT:    ldr q1, [x9, :lo12:.LCPI7_0]
567 ; SVE2_128_NOMAX-NEXT:    ldr q2, [x10, :lo12:.LCPI7_1]
568 ; SVE2_128_NOMAX-NEXT:    ptrue p0.h, vl8
569 ; SVE2_128_NOMAX-NEXT:    mad z0.h, p0/m, z1.h, z2.h
570 ; SVE2_128_NOMAX-NEXT:    ldr q1, [x0]
571 ; SVE2_128_NOMAX-NEXT:    ldr q2, [x1]
572 ; SVE2_128_NOMAX-NEXT:    tbl z0.h, { z1.h, z2.h }, z0.h
573 ; SVE2_128_NOMAX-NEXT:    // kill: def $q0 killed $q0 killed $z0
574 ; SVE2_128_NOMAX-NEXT:    ret
576 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_both_ops_i16:
577 ; SVE2_NOMIN_NOMAX:       // %bb.0:
578 ; SVE2_NOMIN_NOMAX-NEXT:    cnth x8
579 ; SVE2_NOMIN_NOMAX-NEXT:    adrp x9, .LCPI7_0
580 ; SVE2_NOMIN_NOMAX-NEXT:    adrp x10, .LCPI7_1
581 ; SVE2_NOMIN_NOMAX-NEXT:    mov z0.h, w8
582 ; SVE2_NOMIN_NOMAX-NEXT:    ldr q1, [x9, :lo12:.LCPI7_0]
583 ; SVE2_NOMIN_NOMAX-NEXT:    ldr q2, [x10, :lo12:.LCPI7_1]
584 ; SVE2_NOMIN_NOMAX-NEXT:    ptrue p0.h, vl8
585 ; SVE2_NOMIN_NOMAX-NEXT:    mad z0.h, p0/m, z1.h, z2.h
586 ; SVE2_NOMIN_NOMAX-NEXT:    ldr q1, [x0]
587 ; SVE2_NOMIN_NOMAX-NEXT:    ldr q2, [x1]
588 ; SVE2_NOMIN_NOMAX-NEXT:    tbl z0.h, { z1.h, z2.h }, z0.h
589 ; SVE2_NOMIN_NOMAX-NEXT:    // kill: def $q0 killed $q0 killed $z0
590 ; SVE2_NOMIN_NOMAX-NEXT:    ret
592 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_both_ops_i16:
593 ; SVE2_MIN_256_NOMAX:       // %bb.0:
594 ; SVE2_MIN_256_NOMAX-NEXT:    ptrue p0.h, vl16
595 ; SVE2_MIN_256_NOMAX-NEXT:    adrp x8, .LCPI7_0
596 ; SVE2_MIN_256_NOMAX-NEXT:    add x8, x8, :lo12:.LCPI7_0
597 ; SVE2_MIN_256_NOMAX-NEXT:    adrp x9, .LCPI7_1
598 ; SVE2_MIN_256_NOMAX-NEXT:    add x9, x9, :lo12:.LCPI7_1
599 ; SVE2_MIN_256_NOMAX-NEXT:    cnth x10
600 ; SVE2_MIN_256_NOMAX-NEXT:    ld1h { z0.h }, p0/z, [x8]
601 ; SVE2_MIN_256_NOMAX-NEXT:    ld1h { z1.h }, p0/z, [x9]
602 ; SVE2_MIN_256_NOMAX-NEXT:    mov z2.h, w10
603 ; SVE2_MIN_256_NOMAX-NEXT:    mad z0.h, p0/m, z2.h, z1.h
604 ; SVE2_MIN_256_NOMAX-NEXT:    ldr q1, [x0]
605 ; SVE2_MIN_256_NOMAX-NEXT:    ldr q2, [x1]
606 ; SVE2_MIN_256_NOMAX-NEXT:    tbl z0.h, { z1.h, z2.h }, z0.h
607 ; SVE2_MIN_256_NOMAX-NEXT:    // kill: def $q0 killed $q0 killed $z0
608 ; SVE2_MIN_256_NOMAX-NEXT:    ret
609   %op1 = load <8 x i16>, ptr %a
610   %op2 = load <8 x i16>, ptr %b
611   %1 = shufflevector <8 x i16> %op1, <8 x i16> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>
612   ret <8 x i16> %1