[Instrumentation] Fix a warning
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-intrinsics-int-arith-merging.ll
blobed820e0fc8a2585052e02c2408e54737ab9bb494
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
5 ; ADD
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:
10 ; CHECK:       // %bb.0:
11 ; CHECK-NEXT:    movprfx z0.b, p0/z, z0.b
12 ; CHECK-NEXT:    add z0.b, p0/m, z0.b, z1.b
13 ; CHECK-NEXT:    ret
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:
23 ; CHECK:       // %bb.0:
24 ; CHECK-NEXT:    movprfx z0.h, p0/z, z0.h
25 ; CHECK-NEXT:    add z0.h, p0/m, z0.h, z1.h
26 ; CHECK-NEXT:    ret
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:
36 ; CHECK:       // %bb.0:
37 ; CHECK-NEXT:    movprfx z0.s, p0/z, z0.s
38 ; CHECK-NEXT:    add z0.s, p0/m, z0.s, z1.s
39 ; CHECK-NEXT:    ret
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:
49 ; CHECK:       // %bb.0:
50 ; CHECK-NEXT:    movprfx z0.d, p0/z, z0.d
51 ; CHECK-NEXT:    add z0.d, p0/m, z0.d, z1.d
52 ; CHECK-NEXT:    ret
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
61 ; SUB
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:
66 ; CHECK:       // %bb.0:
67 ; CHECK-NEXT:    movprfx z0.b, p0/z, z0.b
68 ; CHECK-NEXT:    sub z0.b, p0/m, z0.b, z1.b
69 ; CHECK-NEXT:    ret
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:
79 ; CHECK:       // %bb.0:
80 ; CHECK-NEXT:    movprfx z0.h, p0/z, z0.h
81 ; CHECK-NEXT:    sub z0.h, p0/m, z0.h, z1.h
82 ; CHECK-NEXT:    ret
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:
92 ; CHECK:       // %bb.0:
93 ; CHECK-NEXT:    movprfx z0.s, p0/z, z0.s
94 ; CHECK-NEXT:    sub z0.s, p0/m, z0.s, z1.s
95 ; CHECK-NEXT:    ret
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:
105 ; CHECK:       // %bb.0:
106 ; CHECK-NEXT:    movprfx z0.d, p0/z, z0.d
107 ; CHECK-NEXT:    sub z0.d, p0/m, z0.d, z1.d
108 ; CHECK-NEXT:    ret
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
117 ; SUBR
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:
122 ; CHECK:       // %bb.0:
123 ; CHECK-NEXT:    movprfx z0.b, p0/z, z0.b
124 ; CHECK-NEXT:    subr z0.b, p0/m, z0.b, z1.b
125 ; CHECK-NEXT:    ret
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:
135 ; CHECK:       // %bb.0:
136 ; CHECK-NEXT:    movprfx z0.h, p0/z, z0.h
137 ; CHECK-NEXT:    subr z0.h, p0/m, z0.h, z1.h
138 ; CHECK-NEXT:    ret
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:
148 ; CHECK:       // %bb.0:
149 ; CHECK-NEXT:    movprfx z0.s, p0/z, z0.s
150 ; CHECK-NEXT:    subr z0.s, p0/m, z0.s, z1.s
151 ; CHECK-NEXT:    ret
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:
161 ; CHECK:       // %bb.0:
162 ; CHECK-NEXT:    movprfx z0.d, p0/z, z0.d
163 ; CHECK-NEXT:    subr z0.d, p0/m, z0.d, z1.d
164 ; CHECK-NEXT:    ret
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
173 ; ORR
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:
178 ; CHECK:       // %bb.0:
179 ; CHECK-NEXT:    movprfx z0.b, p0/z, z0.b
180 ; CHECK-NEXT:    orr z0.b, p0/m, z0.b, z1.b
181 ; CHECK-NEXT:    ret
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:
191 ; CHECK:       // %bb.0:
192 ; CHECK-NEXT:    movprfx z0.h, p0/z, z0.h
193 ; CHECK-NEXT:    orr z0.h, p0/m, z0.h, z1.h
194 ; CHECK-NEXT:    ret
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:
204 ; CHECK:       // %bb.0:
205 ; CHECK-NEXT:    movprfx z0.s, p0/z, z0.s
206 ; CHECK-NEXT:    orr z0.s, p0/m, z0.s, z1.s
207 ; CHECK-NEXT:    ret
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:
217 ; CHECK:       // %bb.0:
218 ; CHECK-NEXT:    movprfx z0.d, p0/z, z0.d
219 ; CHECK-NEXT:    orr z0.d, p0/m, z0.d, z1.d
220 ; CHECK-NEXT:    ret
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
229 ; EOR
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:
234 ; CHECK:       // %bb.0:
235 ; CHECK-NEXT:    movprfx z0.b, p0/z, z0.b
236 ; CHECK-NEXT:    eor z0.b, p0/m, z0.b, z1.b
237 ; CHECK-NEXT:    ret
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:
247 ; CHECK:       // %bb.0:
248 ; CHECK-NEXT:    movprfx z0.h, p0/z, z0.h
249 ; CHECK-NEXT:    eor z0.h, p0/m, z0.h, z1.h
250 ; CHECK-NEXT:    ret
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:
260 ; CHECK:       // %bb.0:
261 ; CHECK-NEXT:    movprfx z0.s, p0/z, z0.s
262 ; CHECK-NEXT:    eor z0.s, p0/m, z0.s, z1.s
263 ; CHECK-NEXT:    ret
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:
273 ; CHECK:       // %bb.0:
274 ; CHECK-NEXT:    movprfx z0.d, p0/z, z0.d
275 ; CHECK-NEXT:    eor z0.d, p0/m, z0.d, z1.d
276 ; CHECK-NEXT:    ret
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
285 ; AND
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:
290 ; CHECK:       // %bb.0:
291 ; CHECK-NEXT:    movprfx z0.b, p0/z, z0.b
292 ; CHECK-NEXT:    and z0.b, p0/m, z0.b, z1.b
293 ; CHECK-NEXT:    ret
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:
303 ; CHECK:       // %bb.0:
304 ; CHECK-NEXT:    movprfx z0.h, p0/z, z0.h
305 ; CHECK-NEXT:    and z0.h, p0/m, z0.h, z1.h
306 ; CHECK-NEXT:    ret
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:
316 ; CHECK:       // %bb.0:
317 ; CHECK-NEXT:    movprfx z0.s, p0/z, z0.s
318 ; CHECK-NEXT:    and z0.s, p0/m, z0.s, z1.s
319 ; CHECK-NEXT:    ret
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:
329 ; CHECK:       // %bb.0:
330 ; CHECK-NEXT:    movprfx z0.d, p0/z, z0.d
331 ; CHECK-NEXT:    and z0.d, p0/m, z0.d, z1.d
332 ; CHECK-NEXT:    ret
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
341 ; BIC
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:
346 ; CHECK:       // %bb.0:
347 ; CHECK-NEXT:    movprfx z0.b, p0/z, z0.b
348 ; CHECK-NEXT:    bic z0.b, p0/m, z0.b, z1.b
349 ; CHECK-NEXT:    ret
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:
359 ; CHECK:       // %bb.0:
360 ; CHECK-NEXT:    movprfx z0.h, p0/z, z0.h
361 ; CHECK-NEXT:    bic z0.h, p0/m, z0.h, z1.h
362 ; CHECK-NEXT:    ret
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:
372 ; CHECK:       // %bb.0:
373 ; CHECK-NEXT:    movprfx z0.s, p0/z, z0.s
374 ; CHECK-NEXT:    bic z0.s, p0/m, z0.s, z1.s
375 ; CHECK-NEXT:    ret
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:
385 ; CHECK:       // %bb.0:
386 ; CHECK-NEXT:    movprfx z0.d, p0/z, z0.d
387 ; CHECK-NEXT:    bic z0.d, p0/m, z0.d, z1.d
388 ; CHECK-NEXT:    ret
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:
399 ; CHECK:       // %bb.0:
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
404 ; CHECK-NEXT:    ret
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:
416 ; CHECK:       // %bb.0:
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
421 ; CHECK-NEXT:    ret
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>)