1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -mattr=+use-experimental-zeroing-pseudos < %s | FileCheck %s
8 define <vscale x 16 x i8> @add_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
9 ; CHECK-LABEL: add_i8_zero:
11 ; CHECK-NEXT: movprfx z0.b, p0/z, z0.b
12 ; CHECK-NEXT: add z0.b, p0/m, z0.b, z1.b
14 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer
15 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.add.nxv16i8(<vscale x 16 x i1> %pg,
16 <vscale x 16 x i8> %a_z,
17 <vscale x 16 x i8> %b)
18 ret <vscale x 16 x i8> %out
21 define <vscale x 8 x i16> @add_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
22 ; CHECK-LABEL: add_i16_zero:
24 ; CHECK-NEXT: movprfx z0.h, p0/z, z0.h
25 ; CHECK-NEXT: add z0.h, p0/m, z0.h, z1.h
27 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer
28 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.add.nxv8i16(<vscale x 8 x i1> %pg,
29 <vscale x 8 x i16> %a_z,
30 <vscale x 8 x i16> %b)
31 ret <vscale x 8 x i16> %out
34 define <vscale x 4 x i32> @add_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
35 ; CHECK-LABEL: add_i32_zero:
37 ; CHECK-NEXT: movprfx z0.s, p0/z, z0.s
38 ; CHECK-NEXT: add z0.s, p0/m, z0.s, z1.s
40 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer
41 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.add.nxv4i32(<vscale x 4 x i1> %pg,
42 <vscale x 4 x i32> %a_z,
43 <vscale x 4 x i32> %b)
44 ret <vscale x 4 x i32> %out
47 define <vscale x 2 x i64> @add_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
48 ; CHECK-LABEL: add_i64_zero:
50 ; CHECK-NEXT: movprfx z0.d, p0/z, z0.d
51 ; CHECK-NEXT: add z0.d, p0/m, z0.d, z1.d
53 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer
54 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.add.nxv2i64(<vscale x 2 x i1> %pg,
55 <vscale x 2 x i64> %a_z,
56 <vscale x 2 x i64> %b)
57 ret <vscale x 2 x i64> %out
64 define <vscale x 16 x i8> @sub_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
65 ; CHECK-LABEL: sub_i8_zero:
67 ; CHECK-NEXT: movprfx z0.b, p0/z, z0.b
68 ; CHECK-NEXT: sub z0.b, p0/m, z0.b, z1.b
70 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer
71 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.sub.nxv16i8(<vscale x 16 x i1> %pg,
72 <vscale x 16 x i8> %a_z,
73 <vscale x 16 x i8> %b)
74 ret <vscale x 16 x i8> %out
77 define <vscale x 8 x i16> @sub_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
78 ; CHECK-LABEL: sub_i16_zero:
80 ; CHECK-NEXT: movprfx z0.h, p0/z, z0.h
81 ; CHECK-NEXT: sub z0.h, p0/m, z0.h, z1.h
83 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer
84 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.sub.nxv8i16(<vscale x 8 x i1> %pg,
85 <vscale x 8 x i16> %a_z,
86 <vscale x 8 x i16> %b)
87 ret <vscale x 8 x i16> %out
90 define <vscale x 4 x i32> @sub_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
91 ; CHECK-LABEL: sub_i32_zero:
93 ; CHECK-NEXT: movprfx z0.s, p0/z, z0.s
94 ; CHECK-NEXT: sub z0.s, p0/m, z0.s, z1.s
96 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer
97 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.sub.nxv4i32(<vscale x 4 x i1> %pg,
98 <vscale x 4 x i32> %a_z,
99 <vscale x 4 x i32> %b)
100 ret <vscale x 4 x i32> %out
103 define <vscale x 2 x i64> @sub_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
104 ; CHECK-LABEL: sub_i64_zero:
106 ; CHECK-NEXT: movprfx z0.d, p0/z, z0.d
107 ; CHECK-NEXT: sub z0.d, p0/m, z0.d, z1.d
109 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer
110 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.sub.nxv2i64(<vscale x 2 x i1> %pg,
111 <vscale x 2 x i64> %a_z,
112 <vscale x 2 x i64> %b)
113 ret <vscale x 2 x i64> %out
120 define <vscale x 16 x i8> @subr_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
121 ; CHECK-LABEL: subr_i8_zero:
123 ; CHECK-NEXT: movprfx z0.b, p0/z, z0.b
124 ; CHECK-NEXT: subr z0.b, p0/m, z0.b, z1.b
126 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer
127 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.subr.nxv16i8(<vscale x 16 x i1> %pg,
128 <vscale x 16 x i8> %a_z,
129 <vscale x 16 x i8> %b)
130 ret <vscale x 16 x i8> %out
133 define <vscale x 8 x i16> @subr_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
134 ; CHECK-LABEL: subr_i16_zero:
136 ; CHECK-NEXT: movprfx z0.h, p0/z, z0.h
137 ; CHECK-NEXT: subr z0.h, p0/m, z0.h, z1.h
139 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer
140 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.subr.nxv8i16(<vscale x 8 x i1> %pg,
141 <vscale x 8 x i16> %a_z,
142 <vscale x 8 x i16> %b)
143 ret <vscale x 8 x i16> %out
146 define <vscale x 4 x i32> @subr_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
147 ; CHECK-LABEL: subr_i32_zero:
149 ; CHECK-NEXT: movprfx z0.s, p0/z, z0.s
150 ; CHECK-NEXT: subr z0.s, p0/m, z0.s, z1.s
152 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer
153 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.subr.nxv4i32(<vscale x 4 x i1> %pg,
154 <vscale x 4 x i32> %a_z,
155 <vscale x 4 x i32> %b)
156 ret <vscale x 4 x i32> %out
159 define <vscale x 2 x i64> @subr_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
160 ; CHECK-LABEL: subr_i64_zero:
162 ; CHECK-NEXT: movprfx z0.d, p0/z, z0.d
163 ; CHECK-NEXT: subr z0.d, p0/m, z0.d, z1.d
165 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer
166 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.subr.nxv2i64(<vscale x 2 x i1> %pg,
167 <vscale x 2 x i64> %a_z,
168 <vscale x 2 x i64> %b)
169 ret <vscale x 2 x i64> %out
176 define <vscale x 16 x i8> @orr_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
177 ; CHECK-LABEL: orr_i8_zero:
179 ; CHECK-NEXT: movprfx z0.b, p0/z, z0.b
180 ; CHECK-NEXT: orr z0.b, p0/m, z0.b, z1.b
182 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer
183 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.orr.nxv16i8(<vscale x 16 x i1> %pg,
184 <vscale x 16 x i8> %a_z,
185 <vscale x 16 x i8> %b)
186 ret <vscale x 16 x i8> %out
189 define <vscale x 8 x i16> @orr_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
190 ; CHECK-LABEL: orr_i16_zero:
192 ; CHECK-NEXT: movprfx z0.h, p0/z, z0.h
193 ; CHECK-NEXT: orr z0.h, p0/m, z0.h, z1.h
195 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer
196 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.orr.nxv8i16(<vscale x 8 x i1> %pg,
197 <vscale x 8 x i16> %a_z,
198 <vscale x 8 x i16> %b)
199 ret <vscale x 8 x i16> %out
202 define <vscale x 4 x i32> @orr_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
203 ; CHECK-LABEL: orr_i32_zero:
205 ; CHECK-NEXT: movprfx z0.s, p0/z, z0.s
206 ; CHECK-NEXT: orr z0.s, p0/m, z0.s, z1.s
208 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer
209 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.orr.nxv4i32(<vscale x 4 x i1> %pg,
210 <vscale x 4 x i32> %a_z,
211 <vscale x 4 x i32> %b)
212 ret <vscale x 4 x i32> %out
215 define <vscale x 2 x i64> @orr_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
216 ; CHECK-LABEL: orr_i64_zero:
218 ; CHECK-NEXT: movprfx z0.d, p0/z, z0.d
219 ; CHECK-NEXT: orr z0.d, p0/m, z0.d, z1.d
221 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer
222 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.orr.nxv2i64(<vscale x 2 x i1> %pg,
223 <vscale x 2 x i64> %a_z,
224 <vscale x 2 x i64> %b)
225 ret <vscale x 2 x i64> %out
232 define <vscale x 16 x i8> @eor_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
233 ; CHECK-LABEL: eor_i8_zero:
235 ; CHECK-NEXT: movprfx z0.b, p0/z, z0.b
236 ; CHECK-NEXT: eor z0.b, p0/m, z0.b, z1.b
238 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer
239 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.eor.nxv16i8(<vscale x 16 x i1> %pg,
240 <vscale x 16 x i8> %a_z,
241 <vscale x 16 x i8> %b)
242 ret <vscale x 16 x i8> %out
245 define <vscale x 8 x i16> @eor_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
246 ; CHECK-LABEL: eor_i16_zero:
248 ; CHECK-NEXT: movprfx z0.h, p0/z, z0.h
249 ; CHECK-NEXT: eor z0.h, p0/m, z0.h, z1.h
251 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer
252 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.eor.nxv8i16(<vscale x 8 x i1> %pg,
253 <vscale x 8 x i16> %a_z,
254 <vscale x 8 x i16> %b)
255 ret <vscale x 8 x i16> %out
258 define <vscale x 4 x i32> @eor_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
259 ; CHECK-LABEL: eor_i32_zero:
261 ; CHECK-NEXT: movprfx z0.s, p0/z, z0.s
262 ; CHECK-NEXT: eor z0.s, p0/m, z0.s, z1.s
264 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer
265 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.eor.nxv4i32(<vscale x 4 x i1> %pg,
266 <vscale x 4 x i32> %a_z,
267 <vscale x 4 x i32> %b)
268 ret <vscale x 4 x i32> %out
271 define <vscale x 2 x i64> @eor_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
272 ; CHECK-LABEL: eor_i64_zero:
274 ; CHECK-NEXT: movprfx z0.d, p0/z, z0.d
275 ; CHECK-NEXT: eor z0.d, p0/m, z0.d, z1.d
277 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer
278 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.eor.nxv2i64(<vscale x 2 x i1> %pg,
279 <vscale x 2 x i64> %a_z,
280 <vscale x 2 x i64> %b)
281 ret <vscale x 2 x i64> %out
288 define <vscale x 16 x i8> @and_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
289 ; CHECK-LABEL: and_i8_zero:
291 ; CHECK-NEXT: movprfx z0.b, p0/z, z0.b
292 ; CHECK-NEXT: and z0.b, p0/m, z0.b, z1.b
294 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer
295 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.and.nxv16i8(<vscale x 16 x i1> %pg,
296 <vscale x 16 x i8> %a_z,
297 <vscale x 16 x i8> %b)
298 ret <vscale x 16 x i8> %out
301 define <vscale x 8 x i16> @and_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
302 ; CHECK-LABEL: and_i16_zero:
304 ; CHECK-NEXT: movprfx z0.h, p0/z, z0.h
305 ; CHECK-NEXT: and z0.h, p0/m, z0.h, z1.h
307 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer
308 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.and.nxv8i16(<vscale x 8 x i1> %pg,
309 <vscale x 8 x i16> %a_z,
310 <vscale x 8 x i16> %b)
311 ret <vscale x 8 x i16> %out
314 define <vscale x 4 x i32> @and_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
315 ; CHECK-LABEL: and_i32_zero:
317 ; CHECK-NEXT: movprfx z0.s, p0/z, z0.s
318 ; CHECK-NEXT: and z0.s, p0/m, z0.s, z1.s
320 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer
321 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.and.nxv4i32(<vscale x 4 x i1> %pg,
322 <vscale x 4 x i32> %a_z,
323 <vscale x 4 x i32> %b)
324 ret <vscale x 4 x i32> %out
327 define <vscale x 2 x i64> @and_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
328 ; CHECK-LABEL: and_i64_zero:
330 ; CHECK-NEXT: movprfx z0.d, p0/z, z0.d
331 ; CHECK-NEXT: and z0.d, p0/m, z0.d, z1.d
333 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer
334 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.and.nxv2i64(<vscale x 2 x i1> %pg,
335 <vscale x 2 x i64> %a_z,
336 <vscale x 2 x i64> %b)
337 ret <vscale x 2 x i64> %out
344 define <vscale x 16 x i8> @bic_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
345 ; CHECK-LABEL: bic_i8_zero:
347 ; CHECK-NEXT: movprfx z0.b, p0/z, z0.b
348 ; CHECK-NEXT: bic z0.b, p0/m, z0.b, z1.b
350 %a_z = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> zeroinitializer
351 %out = call <vscale x 16 x i8> @llvm.aarch64.sve.bic.nxv16i8(<vscale x 16 x i1> %pg,
352 <vscale x 16 x i8> %a_z,
353 <vscale x 16 x i8> %b)
354 ret <vscale x 16 x i8> %out
357 define <vscale x 8 x i16> @bic_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
358 ; CHECK-LABEL: bic_i16_zero:
360 ; CHECK-NEXT: movprfx z0.h, p0/z, z0.h
361 ; CHECK-NEXT: bic z0.h, p0/m, z0.h, z1.h
363 %a_z = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> zeroinitializer
364 %out = call <vscale x 8 x i16> @llvm.aarch64.sve.bic.nxv8i16(<vscale x 8 x i1> %pg,
365 <vscale x 8 x i16> %a_z,
366 <vscale x 8 x i16> %b)
367 ret <vscale x 8 x i16> %out
370 define <vscale x 4 x i32> @bic_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
371 ; CHECK-LABEL: bic_i32_zero:
373 ; CHECK-NEXT: movprfx z0.s, p0/z, z0.s
374 ; CHECK-NEXT: bic z0.s, p0/m, z0.s, z1.s
376 %a_z = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> zeroinitializer
377 %out = call <vscale x 4 x i32> @llvm.aarch64.sve.bic.nxv4i32(<vscale x 4 x i1> %pg,
378 <vscale x 4 x i32> %a_z,
379 <vscale x 4 x i32> %b)
380 ret <vscale x 4 x i32> %out
383 define <vscale x 2 x i64> @bic_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
384 ; CHECK-LABEL: bic_i64_zero:
386 ; CHECK-NEXT: movprfx z0.d, p0/z, z0.d
387 ; CHECK-NEXT: bic z0.d, p0/m, z0.d, z1.d
389 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer
390 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.bic.nxv2i64(<vscale x 2 x i1> %pg,
391 <vscale x 2 x i64> %a_z,
392 <vscale x 2 x i64> %b)
393 ret <vscale x 2 x i64> %out
396 ; BIC (i.e. A & ~A) is illegal operation with movprfx, so the codegen depend on IR before expand-pseudo
397 define <vscale x 2 x i64> @bic_i64_zero_no_unique_reg(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a) {
398 ; CHECK-LABEL: bic_i64_zero_no_unique_reg:
400 ; CHECK-NEXT: mov z1.d, #0 // =0x0
401 ; CHECK-NEXT: mov z1.d, p0/m, z0.d
402 ; CHECK-NEXT: movprfx z0.d, p0/z, z0.d
403 ; CHECK-NEXT: bic z0.d, p0/m, z0.d, z1.d
405 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer
406 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.bic.nxv2i64(<vscale x 2 x i1> %pg,
407 <vscale x 2 x i64> %a_z,
408 <vscale x 2 x i64> %a_z)
409 ret <vscale x 2 x i64> %out
412 ; BIC (i.e. A & ~B) is not a commutative operation, so disable it when the
413 ; destination operand is not the destructive operand
414 define <vscale x 2 x i64> @bic_i64_zero_no_comm(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
415 ; CHECK-LABEL: bic_i64_zero_no_comm:
417 ; CHECK-NEXT: mov z2.d, #0 // =0x0
418 ; CHECK-NEXT: mov z2.d, p0/m, z0.d
419 ; CHECK-NEXT: mov z0.d, z1.d
420 ; CHECK-NEXT: bic z0.d, p0/m, z0.d, z2.d
422 %a_z = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> zeroinitializer
423 %out = call <vscale x 2 x i64> @llvm.aarch64.sve.bic.nxv2i64(<vscale x 2 x i1> %pg,
424 <vscale x 2 x i64> %b,
425 <vscale x 2 x i64> %a_z)
426 ret <vscale x 2 x i64> %out
429 declare <vscale x 16 x i8> @llvm.aarch64.sve.add.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>)
430 declare <vscale x 8 x i16> @llvm.aarch64.sve.add.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>)
431 declare <vscale x 4 x i32> @llvm.aarch64.sve.add.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>)
432 declare <vscale x 2 x i64> @llvm.aarch64.sve.add.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>)
434 declare <vscale x 16 x i8> @llvm.aarch64.sve.sub.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>)
435 declare <vscale x 8 x i16> @llvm.aarch64.sve.sub.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>)
436 declare <vscale x 4 x i32> @llvm.aarch64.sve.sub.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>)
437 declare <vscale x 2 x i64> @llvm.aarch64.sve.sub.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>)
439 declare <vscale x 16 x i8> @llvm.aarch64.sve.subr.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>)
440 declare <vscale x 8 x i16> @llvm.aarch64.sve.subr.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>)
441 declare <vscale x 4 x i32> @llvm.aarch64.sve.subr.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>)
442 declare <vscale x 2 x i64> @llvm.aarch64.sve.subr.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>)
444 declare <vscale x 16 x i8> @llvm.aarch64.sve.orr.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>)
445 declare <vscale x 8 x i16> @llvm.aarch64.sve.orr.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>)
446 declare <vscale x 4 x i32> @llvm.aarch64.sve.orr.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>)
447 declare <vscale x 2 x i64> @llvm.aarch64.sve.orr.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>)
449 declare <vscale x 16 x i8> @llvm.aarch64.sve.eor.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>)
450 declare <vscale x 8 x i16> @llvm.aarch64.sve.eor.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>)
451 declare <vscale x 4 x i32> @llvm.aarch64.sve.eor.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>)
452 declare <vscale x 2 x i64> @llvm.aarch64.sve.eor.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>)
454 declare <vscale x 16 x i8> @llvm.aarch64.sve.and.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>)
455 declare <vscale x 8 x i16> @llvm.aarch64.sve.and.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>)
456 declare <vscale x 4 x i32> @llvm.aarch64.sve.and.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>)
457 declare <vscale x 2 x i64> @llvm.aarch64.sve.and.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>)
459 declare <vscale x 16 x i8> @llvm.aarch64.sve.bic.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>)
460 declare <vscale x 8 x i16> @llvm.aarch64.sve.bic.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>)
461 declare <vscale x 4 x i32> @llvm.aarch64.sve.bic.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>)
462 declare <vscale x 2 x i64> @llvm.aarch64.sve.bic.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>)