[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-vselect-imm.ll
blobbd2aa535149cfc5da1d59ea461ecc9501d50cd97
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s
4 define <vscale x 16 x i8> @sel_8_positive(<vscale x 16 x i1> %p) {
5 ; CHECK-LABEL: sel_8_positive:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    mov z0.b, p0/z, #3 // =0x3
8 ; CHECK-NEXT:    ret
9 %vec = shufflevector <vscale x 16 x i8> insertelement (<vscale x 16 x i8> undef, i8 3, i32 0), <vscale x 16 x i8> zeroinitializer, <vscale x 16 x i32> zeroinitializer
10 %sel = select <vscale x 16 x i1> %p, <vscale x 16 x i8> %vec, <vscale x 16 x i8> zeroinitializer
11 ret <vscale x 16 x i8> %sel
14 define <vscale x 8 x i16> @sel_16_positive(<vscale x 8 x i1> %p) {
15 ; CHECK-LABEL: sel_16_positive:
16 ; CHECK:       // %bb.0:
17 ; CHECK-NEXT:    mov z0.h, p0/z, #3 // =0x3
18 ; CHECK-NEXT:    ret
19 %vec = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 3, i32 0), <vscale x 8 x i16> zeroinitializer, <vscale x 8 x i32> zeroinitializer
20 %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> %vec, <vscale x 8 x i16> zeroinitializer
21 ret <vscale x 8 x i16> %sel
24 define <vscale x 4 x i32> @sel_32_positive(<vscale x 4 x i1> %p) {
25 ; CHECK-LABEL: sel_32_positive:
26 ; CHECK:       // %bb.0:
27 ; CHECK-NEXT:    mov z0.s, p0/z, #3 // =0x3
28 ; CHECK-NEXT:    ret
29 %vec = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 3, i32 0), <vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> zeroinitializer
30 %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> %vec, <vscale x 4 x i32> zeroinitializer
31 ret <vscale x 4 x i32> %sel
34 define <vscale x 2 x i64> @sel_64_positive(<vscale x 2 x i1> %p) {
35 ; CHECK-LABEL: sel_64_positive:
36 ; CHECK:       // %bb.0:
37 ; CHECK-NEXT:    mov z0.d, p0/z, #3 // =0x3
38 ; CHECK-NEXT:    ret
39 %vec = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 3, i32 0), <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i32> zeroinitializer
40 %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> %vec, <vscale x 2 x i64> zeroinitializer
41 ret <vscale x 2 x i64> %sel
44 define <vscale x 16 x i8> @sel_8_negative(<vscale x 16 x i1> %p) {
45 ; CHECK-LABEL: sel_8_negative:
46 ; CHECK:       // %bb.0:
47 ; CHECK-NEXT:    mov z0.b, p0/z, #-128 // =0xffffffffffffff80
48 ; CHECK-NEXT:    ret
49 %vec = shufflevector <vscale x 16 x i8> insertelement (<vscale x 16 x i8> undef, i8 -128, i32 0), <vscale x 16 x i8> zeroinitializer, <vscale x 16 x i32> zeroinitializer
50 %sel = select <vscale x 16 x i1> %p, <vscale x 16 x i8> %vec, <vscale x 16 x i8> zeroinitializer
51 ret <vscale x 16 x i8> %sel
54 define <vscale x 8 x i16> @sel_16_negative(<vscale x 8 x i1> %p) {
55 ; CHECK-LABEL: sel_16_negative:
56 ; CHECK:       // %bb.0:
57 ; CHECK-NEXT:    mov z0.h, p0/z, #-128 // =0xffffffffffffff80
58 ; CHECK-NEXT:    ret
59 %vec = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 -128, i32 0), <vscale x 8 x i16> zeroinitializer, <vscale x 8 x i32> zeroinitializer
60 %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> %vec, <vscale x 8 x i16> zeroinitializer
61 ret <vscale x 8 x i16> %sel
64 define <vscale x 4 x i32> @sel_32_negative(<vscale x 4 x i1> %p) {
65 ; CHECK-LABEL: sel_32_negative:
66 ; CHECK:       // %bb.0:
67 ; CHECK-NEXT:    mov z0.s, p0/z, #-128 // =0xffffffffffffff80
68 ; CHECK-NEXT:    ret
69 %vec = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 -128, i32 0), <vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> zeroinitializer
70 %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> %vec, <vscale x 4 x i32> zeroinitializer
71 ret <vscale x 4 x i32> %sel
74 define <vscale x 2 x i64> @sel_64_negative(<vscale x 2 x i1> %p) {
75 ; CHECK-LABEL: sel_64_negative:
76 ; CHECK:       // %bb.0:
77 ; CHECK-NEXT:    mov z0.d, p0/z, #-128 // =0xffffffffffffff80
78 ; CHECK-NEXT:    ret
79 %vec = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 -128, i32 0), <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i32> zeroinitializer
80 %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> %vec, <vscale x 2 x i64> zeroinitializer
81 ret <vscale x 2 x i64> %sel
84 define <vscale x 8 x i16> @sel_16_shifted(<vscale x 8 x i1> %p) {
85 ; CHECK-LABEL: sel_16_shifted:
86 ; CHECK:       // %bb.0:
87 ; CHECK-NEXT:    mov z0.h, p0/z, #512 // =0x200
88 ; CHECK-NEXT:    ret
89 %vec = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 512, i32 0), <vscale x 8 x i16> zeroinitializer, <vscale x 8 x i32> zeroinitializer
90 %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> %vec, <vscale x 8 x i16> zeroinitializer
91 ret <vscale x 8 x i16> %sel
94 define <vscale x 4 x i32> @sel_32_shifted(<vscale x 4 x i1> %p) {
95 ; CHECK-LABEL: sel_32_shifted:
96 ; CHECK:       // %bb.0:
97 ; CHECK-NEXT:    mov z0.s, p0/z, #512 // =0x200
98 ; CHECK-NEXT:    ret
99 %vec = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 512, i32 0), <vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> zeroinitializer
100 %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> %vec, <vscale x 4 x i32> zeroinitializer
101 ret <vscale x 4 x i32> %sel
104 define <vscale x 2 x i64> @sel_64_shifted(<vscale x 2 x i1> %p) {
105 ; CHECK-LABEL: sel_64_shifted:
106 ; CHECK:       // %bb.0:
107 ; CHECK-NEXT:    mov z0.d, p0/z, #512 // =0x200
108 ; CHECK-NEXT:    ret
109 %vec = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 512, i32 0), <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i32> zeroinitializer
110 %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> %vec, <vscale x 2 x i64> zeroinitializer
111 ret <vscale x 2 x i64> %sel
114 ; TODO: We could actually use something like "cpy z0.b, p0/z, #-128". But it's
115 ; a little tricky to prove correctness: we're using the predicate with the
116 ; wrong width, so we'd have to prove the bits which would normally be unused
117 ; are actually zero.
118 define <vscale x 8 x i16> @sel_16_illegal_wrong_extension(<vscale x 8 x i1> %p) {
119 ; CHECK-LABEL: sel_16_illegal_wrong_extension:
120 ; CHECK:       // %bb.0:
121 ; CHECK-NEXT:    mov w8, #128
122 ; CHECK-NEXT:    mov z0.h, w8
123 ; CHECK-NEXT:    mov z1.h, #0 // =0x0
124 ; CHECK-NEXT:    sel z0.h, p0, z0.h, z1.h
125 ; CHECK-NEXT:    ret
126 %vec = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 128, i32 0), <vscale x 8 x i16> zeroinitializer, <vscale x 8 x i32> zeroinitializer
127 %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> %vec, <vscale x 8 x i16> zeroinitializer
128 ret <vscale x 8 x i16> %sel
131 define <vscale x 4 x i32> @sel_32_illegal_wrong_extension(<vscale x 4 x i1> %p) {
132 ; CHECK-LABEL: sel_32_illegal_wrong_extension:
133 ; CHECK:       // %bb.0:
134 ; CHECK-NEXT:    mov w8, #128
135 ; CHECK-NEXT:    mov z0.s, w8
136 ; CHECK-NEXT:    mov z1.s, #0 // =0x0
137 ; CHECK-NEXT:    sel z0.s, p0, z0.s, z1.s
138 ; CHECK-NEXT:    ret
139 %vec = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 128, i32 0), <vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> zeroinitializer
140 %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> %vec, <vscale x 4 x i32> zeroinitializer
141 ret <vscale x 4 x i32> %sel
144 define <vscale x 2 x i64> @sel_64_illegal_wrong_extension(<vscale x 2 x i1> %p) {
145 ; CHECK-LABEL: sel_64_illegal_wrong_extension:
146 ; CHECK:       // %bb.0:
147 ; CHECK-NEXT:    mov w8, #128
148 ; CHECK-NEXT:    mov z0.d, x8
149 ; CHECK-NEXT:    mov z1.d, #0 // =0x0
150 ; CHECK-NEXT:    sel z0.d, p0, z0.d, z1.d
151 ; CHECK-NEXT:    ret
152 %vec = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 128, i32 0), <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i32> zeroinitializer
153 %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> %vec, <vscale x 2 x i64> zeroinitializer
154 ret <vscale x 2 x i64> %sel
157 define <vscale x 8 x i16> @sel_16_illegal_shifted(<vscale x 8 x i1> %p) {
158 ; CHECK-LABEL: sel_16_illegal_shifted:
159 ; CHECK:       // %bb.0:
160 ; CHECK-NEXT:    mov w8, #513
161 ; CHECK-NEXT:    mov z0.h, w8
162 ; CHECK-NEXT:    mov z1.h, #0 // =0x0
163 ; CHECK-NEXT:    sel z0.h, p0, z0.h, z1.h
164 ; CHECK-NEXT:    ret
165 %vec = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 513, i32 0), <vscale x 8 x i16> zeroinitializer, <vscale x 8 x i32> zeroinitializer
166 %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> %vec, <vscale x 8 x i16> zeroinitializer
167 ret <vscale x 8 x i16> %sel
170 define <vscale x 4 x i32> @sel_32_illegal_shifted(<vscale x 4 x i1> %p) {
171 ; CHECK-LABEL: sel_32_illegal_shifted:
172 ; CHECK:       // %bb.0:
173 ; CHECK-NEXT:    mov w8, #513
174 ; CHECK-NEXT:    mov z0.s, w8
175 ; CHECK-NEXT:    mov z1.s, #0 // =0x0
176 ; CHECK-NEXT:    sel z0.s, p0, z0.s, z1.s
177 ; CHECK-NEXT:    ret
178 %vec = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 513, i32 0), <vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> zeroinitializer
179 %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> %vec, <vscale x 4 x i32> zeroinitializer
180 ret <vscale x 4 x i32> %sel
183 define <vscale x 2 x i64> @sel_64_illegal_shifted(<vscale x 2 x i1> %p) {
184 ; CHECK-LABEL: sel_64_illegal_shifted:
185 ; CHECK:       // %bb.0:
186 ; CHECK-NEXT:    mov w8, #513
187 ; CHECK-NEXT:    mov z0.d, x8
188 ; CHECK-NEXT:    mov z1.d, #0 // =0x0
189 ; CHECK-NEXT:    sel z0.d, p0, z0.d, z1.d
190 ; CHECK-NEXT:    ret
191 %vec = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 513, i32 0), <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i32> zeroinitializer
192 %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> %vec, <vscale x 2 x i64> zeroinitializer
193 ret <vscale x 2 x i64> %sel
196 define <vscale x 16 x i8> @sel_merge_8_positive(<vscale x 16 x i1> %p, <vscale x 16 x i8> %in) {
197 ; CHECK-LABEL: sel_merge_8_positive:
198 ; CHECK:       // %bb.0:
199 ; CHECK-NEXT:    mov z0.b, p0/m, #3 // =0x3
200 ; CHECK-NEXT:    ret
201 %vec = shufflevector <vscale x 16 x i8> insertelement (<vscale x 16 x i8> undef, i8 3, i32 0), <vscale x 16 x i8> zeroinitializer, <vscale x 16 x i32> zeroinitializer
202 %sel = select <vscale x 16 x i1> %p, <vscale x 16 x i8> %vec, <vscale x 16 x i8> %in
203 ret <vscale x 16 x i8> %sel
206 define <vscale x 8 x i16> @sel_merge_16_positive(<vscale x 8 x i1> %p, <vscale x 8 x i16> %in) {
207 ; CHECK-LABEL: sel_merge_16_positive:
208 ; CHECK:       // %bb.0:
209 ; CHECK-NEXT:    mov z0.h, p0/m, #3 // =0x3
210 ; CHECK-NEXT:    ret
211 %vec = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 3, i32 0), <vscale x 8 x i16> zeroinitializer, <vscale x 8 x i32> zeroinitializer
212 %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> %vec, <vscale x 8 x i16> %in
213 ret <vscale x 8 x i16> %sel
216 define <vscale x 4 x i32> @sel_merge_32_positive(<vscale x 4 x i1> %p, <vscale x 4 x i32> %in) {
217 ; CHECK-LABEL: sel_merge_32_positive:
218 ; CHECK:       // %bb.0:
219 ; CHECK-NEXT:    mov z0.s, p0/m, #3 // =0x3
220 ; CHECK-NEXT:    ret
221 %vec = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 3, i32 0), <vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> zeroinitializer
222 %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> %vec, <vscale x 4 x i32> %in
223 ret <vscale x 4 x i32> %sel
226 define <vscale x 2 x i64> @sel_merge_64_positive(<vscale x 2 x i1> %p, <vscale x 2 x i64> %in) {
227 ; CHECK-LABEL: sel_merge_64_positive:
228 ; CHECK:       // %bb.0:
229 ; CHECK-NEXT:    mov z0.d, p0/m, #3 // =0x3
230 ; CHECK-NEXT:    ret
231 %vec = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 3, i32 0), <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i32> zeroinitializer
232 %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> %vec, <vscale x 2 x i64> %in
233 ret <vscale x 2 x i64> %sel
236 define <vscale x 16 x i8> @sel_merge_8_negative(<vscale x 16 x i1> %p, <vscale x 16 x i8> %in) {
237 ; CHECK-LABEL: sel_merge_8_negative:
238 ; CHECK:       // %bb.0:
239 ; CHECK-NEXT:    mov z0.b, p0/m, #-128 // =0xffffffffffffff80
240 ; CHECK-NEXT:    ret
241 %vec = shufflevector <vscale x 16 x i8> insertelement (<vscale x 16 x i8> undef, i8 -128, i32 0), <vscale x 16 x i8> zeroinitializer, <vscale x 16 x i32> zeroinitializer
242 %sel = select <vscale x 16 x i1> %p, <vscale x 16 x i8> %vec, <vscale x 16 x i8> %in
243 ret <vscale x 16 x i8> %sel
246 define <vscale x 8 x i16> @sel_merge_16_negative(<vscale x 8 x i1> %p, <vscale x 8 x i16> %in) {
247 ; CHECK-LABEL: sel_merge_16_negative:
248 ; CHECK:       // %bb.0:
249 ; CHECK-NEXT:    mov z0.h, p0/m, #-128 // =0xffffffffffffff80
250 ; CHECK-NEXT:    ret
251 %vec = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 -128, i32 0), <vscale x 8 x i16> zeroinitializer, <vscale x 8 x i32> zeroinitializer
252 %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> %vec, <vscale x 8 x i16> %in
253 ret <vscale x 8 x i16> %sel
256 define <vscale x 4 x i32> @sel_merge_32_negative(<vscale x 4 x i1> %p, <vscale x 4 x i32> %in) {
257 ; CHECK-LABEL: sel_merge_32_negative:
258 ; CHECK:       // %bb.0:
259 ; CHECK-NEXT:    mov z0.s, p0/m, #-128 // =0xffffffffffffff80
260 ; CHECK-NEXT:    ret
261 %vec = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 -128, i32 0), <vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> zeroinitializer
262 %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> %vec, <vscale x 4 x i32> %in
263 ret <vscale x 4 x i32> %sel
266 define <vscale x 2 x i64> @sel_merge_64_negative(<vscale x 2 x i1> %p, <vscale x 2 x i64> %in) {
267 ; CHECK-LABEL: sel_merge_64_negative:
268 ; CHECK:       // %bb.0:
269 ; CHECK-NEXT:    mov z0.d, p0/m, #-128 // =0xffffffffffffff80
270 ; CHECK-NEXT:    ret
271 %vec = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 -128, i32 0), <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i32> zeroinitializer
272 %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> %vec, <vscale x 2 x i64> %in
273 ret <vscale x 2 x i64> %sel
276 define <vscale x 16 x i8> @sel_merge_8_zero(<vscale x 16 x i1> %p, <vscale x 16 x i8> %in) {
277 ; CHECK-LABEL: sel_merge_8_zero:
278 ; CHECK:       // %bb.0:
279 ; CHECK-NEXT:    mov z0.b, p0/m, #0 // =0x0
280 ; CHECK-NEXT:    ret
281 %sel = select <vscale x 16 x i1> %p, <vscale x 16 x i8> zeroinitializer, <vscale x 16 x i8> %in
282 ret <vscale x 16 x i8> %sel
285 define <vscale x 8 x i16> @sel_merge_16_zero(<vscale x 8 x i1> %p, <vscale x 8 x i16> %in) {
286 ; CHECK-LABEL: sel_merge_16_zero:
287 ; CHECK:       // %bb.0:
288 ; CHECK-NEXT:    mov z0.h, p0/m, #0 // =0x0
289 ; CHECK-NEXT:    ret
290 %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> zeroinitializer, <vscale x 8 x i16> %in
291 ret <vscale x 8 x i16> %sel
294 define <vscale x 4 x i32> @sel_merge_32_zero(<vscale x 4 x i1> %p, <vscale x 4 x i32> %in) {
295 ; CHECK-LABEL: sel_merge_32_zero:
296 ; CHECK:       // %bb.0:
297 ; CHECK-NEXT:    mov z0.s, p0/m, #0 // =0x0
298 ; CHECK-NEXT:    ret
299 %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> %in
300 ret <vscale x 4 x i32> %sel
303 define <vscale x 2 x i64> @sel_merge_64_zero(<vscale x 2 x i1> %p, <vscale x 2 x i64> %in) {
304 ; CHECK-LABEL: sel_merge_64_zero:
305 ; CHECK:       // %bb.0:
306 ; CHECK-NEXT:    mov z0.d, p0/m, #0 // =0x0
307 ; CHECK-NEXT:    ret
308 %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i64> %in
309 ret <vscale x 2 x i64> %sel
312 define <vscale x 8 x i16> @sel_merge_16_shifted(<vscale x 8 x i1> %p, <vscale x 8 x i16> %in) {
313 ; CHECK-LABEL: sel_merge_16_shifted:
314 ; CHECK:       // %bb.0:
315 ; CHECK-NEXT:    mov z0.h, p0/m, #512 // =0x200
316 ; CHECK-NEXT:    ret
317 %vec = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 512, i32 0), <vscale x 8 x i16> zeroinitializer, <vscale x 8 x i32> zeroinitializer
318 %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> %vec, <vscale x 8 x i16> %in
319 ret <vscale x 8 x i16> %sel
322 define <vscale x 4 x i32> @sel_merge_32_shifted(<vscale x 4 x i1> %p, <vscale x 4 x i32> %in) {
323 ; CHECK-LABEL: sel_merge_32_shifted:
324 ; CHECK:       // %bb.0:
325 ; CHECK-NEXT:    mov z0.s, p0/m, #512 // =0x200
326 ; CHECK-NEXT:    ret
327 %vec = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 512, i32 0), <vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> zeroinitializer
328 %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> %vec, <vscale x 4 x i32> %in
329 ret <vscale x 4 x i32> %sel
332 define <vscale x 2 x i64> @sel_merge_64_shifted(<vscale x 2 x i1> %p, <vscale x 2 x i64> %in) {
333 ; CHECK-LABEL: sel_merge_64_shifted:
334 ; CHECK:       // %bb.0:
335 ; CHECK-NEXT:    mov z0.d, p0/m, #512 // =0x200
336 ; CHECK-NEXT:    ret
337 %vec = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 512, i32 0), <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i32> zeroinitializer
338 %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> %vec, <vscale x 2 x i64> %in
339 ret <vscale x 2 x i64> %sel
342 ; TODO: We could actually use something like "cpy z0.b, p0/m, #-128". But it's
343 ; a little tricky to prove correctness: we're using the predicate with the
344 ; wrong width, so we'd have to prove the bits which would normally be unused
345 ; are actually zero.
346 define <vscale x 8 x i16> @sel_merge_16_illegal_wrong_extension(<vscale x 8 x i1> %p, <vscale x 8 x i16> %in) {
347 ; CHECK-LABEL: sel_merge_16_illegal_wrong_extension:
348 ; CHECK:       // %bb.0:
349 ; CHECK-NEXT:    mov w8, #128
350 ; CHECK-NEXT:    mov z1.h, w8
351 ; CHECK-NEXT:    mov z0.h, p0/m, z1.h
352 ; CHECK-NEXT:    ret
353 %vec = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 128, i32 0), <vscale x 8 x i16> zeroinitializer, <vscale x 8 x i32> zeroinitializer
354 %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> %vec, <vscale x 8 x i16> %in
355 ret <vscale x 8 x i16> %sel
358 define <vscale x 4 x i32> @sel_merge_32_illegal_wrong_extension(<vscale x 4 x i1> %p, <vscale x 4 x i32> %in) {
359 ; CHECK-LABEL: sel_merge_32_illegal_wrong_extension:
360 ; CHECK:       // %bb.0:
361 ; CHECK-NEXT:    mov w8, #128
362 ; CHECK-NEXT:    mov z1.s, w8
363 ; CHECK-NEXT:    mov z0.s, p0/m, z1.s
364 ; CHECK-NEXT:    ret
365 %vec = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 128, i32 0), <vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> zeroinitializer
366 %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> %vec, <vscale x 4 x i32> %in
367 ret <vscale x 4 x i32> %sel
370 define <vscale x 2 x i64> @sel_merge_64_illegal_wrong_extension(<vscale x 2 x i1> %p, <vscale x 2 x i64> %in) {
371 ; CHECK-LABEL: sel_merge_64_illegal_wrong_extension:
372 ; CHECK:       // %bb.0:
373 ; CHECK-NEXT:    mov w8, #128
374 ; CHECK-NEXT:    mov z1.d, x8
375 ; CHECK-NEXT:    mov z0.d, p0/m, z1.d
376 ; CHECK-NEXT:    ret
377 %vec = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 128, i32 0), <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i32> zeroinitializer
378 %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> %vec, <vscale x 2 x i64> %in
379 ret <vscale x 2 x i64> %sel
382 define <vscale x 8 x i16> @sel_merge_16_illegal_shifted(<vscale x 8 x i1> %p, <vscale x 8 x i16> %in) {
383 ; CHECK-LABEL: sel_merge_16_illegal_shifted:
384 ; CHECK:       // %bb.0:
385 ; CHECK-NEXT:    mov w8, #513
386 ; CHECK-NEXT:    mov z1.h, w8
387 ; CHECK-NEXT:    mov z0.h, p0/m, z1.h
388 ; CHECK-NEXT:    ret
389 %vec = shufflevector <vscale x 8 x i16> insertelement (<vscale x 8 x i16> undef, i16 513, i32 0), <vscale x 8 x i16> zeroinitializer, <vscale x 8 x i32> zeroinitializer
390 %sel = select <vscale x 8 x i1> %p, <vscale x 8 x i16> %vec, <vscale x 8 x i16> %in
391 ret <vscale x 8 x i16> %sel
394 define <vscale x 4 x i32> @sel_merge_32_illegal_shifted(<vscale x 4 x i1> %p, <vscale x 4 x i32> %in) {
395 ; CHECK-LABEL: sel_merge_32_illegal_shifted:
396 ; CHECK:       // %bb.0:
397 ; CHECK-NEXT:    mov w8, #513
398 ; CHECK-NEXT:    mov z1.s, w8
399 ; CHECK-NEXT:    mov z0.s, p0/m, z1.s
400 ; CHECK-NEXT:    ret
401 %vec = shufflevector <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 513, i32 0), <vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> zeroinitializer
402 %sel = select <vscale x 4 x i1> %p, <vscale x 4 x i32> %vec, <vscale x 4 x i32> %in
403 ret <vscale x 4 x i32> %sel
406 define <vscale x 2 x i64> @sel_merge_64_illegal_shifted(<vscale x 2 x i1> %p, <vscale x 2 x i64> %in) {
407 ; CHECK-LABEL: sel_merge_64_illegal_shifted:
408 ; CHECK:       // %bb.0:
409 ; CHECK-NEXT:    mov w8, #513
410 ; CHECK-NEXT:    mov z1.d, x8
411 ; CHECK-NEXT:    mov z0.d, p0/m, z1.d
412 ; CHECK-NEXT:    ret
413 %vec = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 513, i32 0), <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i32> zeroinitializer
414 %sel = select <vscale x 2 x i1> %p, <vscale x 2 x i64> %vec, <vscale x 2 x i64> %in
415 ret <vscale x 2 x i64> %sel