xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-and-combine.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s
3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s
4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
5
6target triple = "aarch64-unknown-linux-gnu"
7
8; i8
9define <4 x i8> @vls_sve_and_4xi8(<4 x i8> %b) nounwind {
10; CHECK-LABEL: vls_sve_and_4xi8:
11; CHECK:       // %bb.0:
12; CHECK-NEXT:    adrp x8, .LCPI0_0
13; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
14; CHECK-NEXT:    ldr d1, [x8, :lo12:.LCPI0_0]
15; CHECK-NEXT:    and z0.d, z0.d, z1.d
16; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
17; CHECK-NEXT:    ret
18;
19; NONEON-NOSVE-LABEL: vls_sve_and_4xi8:
20; NONEON-NOSVE:       // %bb.0:
21; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
22; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
23; NONEON-NOSVE-NEXT:    strh wzr, [sp, #12]
24; NONEON-NOSVE-NEXT:    strh wzr, [sp, #8]
25; NONEON-NOSVE-NEXT:    strh w8, [sp, #14]
26; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #2]
27; NONEON-NOSVE-NEXT:    strh w8, [sp, #10]
28; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
29; NONEON-NOSVE-NEXT:    add sp, sp, #16
30; NONEON-NOSVE-NEXT:    ret
31 %c = and <4 x i8> %b, <i8 0, i8 255, i8 0, i8 255>
32 ret <4 x i8> %c
33}
34
35define <8 x i8> @vls_sve_and_8xi8(<8 x i8> %b) nounwind {
36; CHECK-LABEL: vls_sve_and_8xi8:
37; CHECK:       // %bb.0:
38; CHECK-NEXT:    adrp x8, .LCPI1_0
39; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
40; CHECK-NEXT:    ldr d1, [x8, :lo12:.LCPI1_0]
41; CHECK-NEXT:    and z0.d, z0.d, z1.d
42; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
43; CHECK-NEXT:    ret
44;
45; NONEON-NOSVE-LABEL: vls_sve_and_8xi8:
46; NONEON-NOSVE:       // %bb.0:
47; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
48; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
49; NONEON-NOSVE-NEXT:    strb wzr, [sp, #14]
50; NONEON-NOSVE-NEXT:    strb wzr, [sp, #12]
51; NONEON-NOSVE-NEXT:    strb w8, [sp, #15]
52; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
53; NONEON-NOSVE-NEXT:    strb wzr, [sp, #10]
54; NONEON-NOSVE-NEXT:    strb w8, [sp, #13]
55; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
56; NONEON-NOSVE-NEXT:    strb wzr, [sp, #8]
57; NONEON-NOSVE-NEXT:    strb w8, [sp, #11]
58; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
59; NONEON-NOSVE-NEXT:    strb w8, [sp, #9]
60; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
61; NONEON-NOSVE-NEXT:    add sp, sp, #16
62; NONEON-NOSVE-NEXT:    ret
63 %c = and <8 x i8> %b, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255>
64 ret <8 x i8> %c
65}
66
67define <16 x i8> @vls_sve_and_16xi8(<16 x i8> %b) nounwind {
68; CHECK-LABEL: vls_sve_and_16xi8:
69; CHECK:       // %bb.0:
70; CHECK-NEXT:    adrp x8, .LCPI2_0
71; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
72; CHECK-NEXT:    ldr q1, [x8, :lo12:.LCPI2_0]
73; CHECK-NEXT:    and z0.d, z0.d, z1.d
74; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
75; CHECK-NEXT:    ret
76;
77; NONEON-NOSVE-LABEL: vls_sve_and_16xi8:
78; NONEON-NOSVE:       // %bb.0:
79; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
80; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
81; NONEON-NOSVE-NEXT:    strb wzr, [sp, #30]
82; NONEON-NOSVE-NEXT:    strb wzr, [sp, #28]
83; NONEON-NOSVE-NEXT:    strb w8, [sp, #31]
84; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
85; NONEON-NOSVE-NEXT:    strb wzr, [sp, #26]
86; NONEON-NOSVE-NEXT:    strb w8, [sp, #29]
87; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
88; NONEON-NOSVE-NEXT:    strb wzr, [sp, #24]
89; NONEON-NOSVE-NEXT:    strb w8, [sp, #27]
90; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
91; NONEON-NOSVE-NEXT:    strb wzr, [sp, #22]
92; NONEON-NOSVE-NEXT:    strb w8, [sp, #25]
93; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
94; NONEON-NOSVE-NEXT:    strb wzr, [sp, #20]
95; NONEON-NOSVE-NEXT:    strb w8, [sp, #23]
96; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
97; NONEON-NOSVE-NEXT:    strb wzr, [sp, #18]
98; NONEON-NOSVE-NEXT:    strb w8, [sp, #21]
99; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
100; NONEON-NOSVE-NEXT:    strb wzr, [sp, #16]
101; NONEON-NOSVE-NEXT:    strb w8, [sp, #19]
102; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
103; NONEON-NOSVE-NEXT:    strb w8, [sp, #17]
104; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
105; NONEON-NOSVE-NEXT:    add sp, sp, #32
106; NONEON-NOSVE-NEXT:    ret
107 %c = and <16 x i8> %b, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255>
108 ret <16 x i8> %c
109}
110
111define <32 x i8> @vls_sve_and_32xi8(<32 x i8> %ap) nounwind {
112; CHECK-LABEL: vls_sve_and_32xi8:
113; CHECK:       // %bb.0:
114; CHECK-NEXT:    adrp x8, .LCPI3_0
115; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
116; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
117; CHECK-NEXT:    ldr q2, [x8, :lo12:.LCPI3_0]
118; CHECK-NEXT:    and z0.d, z0.d, z2.d
119; CHECK-NEXT:    and z1.d, z1.d, z2.d
120; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
121; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $z1
122; CHECK-NEXT:    ret
123;
124; NONEON-NOSVE-LABEL: vls_sve_and_32xi8:
125; NONEON-NOSVE:       // %bb.0:
126; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-64]!
127; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #15]
128; NONEON-NOSVE-NEXT:    strb wzr, [sp, #46]
129; NONEON-NOSVE-NEXT:    strb wzr, [sp, #44]
130; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
131; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #13]
132; NONEON-NOSVE-NEXT:    strb wzr, [sp, #42]
133; NONEON-NOSVE-NEXT:    strb w8, [sp, #45]
134; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #11]
135; NONEON-NOSVE-NEXT:    strb wzr, [sp, #40]
136; NONEON-NOSVE-NEXT:    strb w8, [sp, #43]
137; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #9]
138; NONEON-NOSVE-NEXT:    strb wzr, [sp, #38]
139; NONEON-NOSVE-NEXT:    strb w8, [sp, #41]
140; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #7]
141; NONEON-NOSVE-NEXT:    strb wzr, [sp, #36]
142; NONEON-NOSVE-NEXT:    strb w8, [sp, #39]
143; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #5]
144; NONEON-NOSVE-NEXT:    strb wzr, [sp, #34]
145; NONEON-NOSVE-NEXT:    strb w8, [sp, #37]
146; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #3]
147; NONEON-NOSVE-NEXT:    strb wzr, [sp, #32]
148; NONEON-NOSVE-NEXT:    strb w8, [sp, #35]
149; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #1]
150; NONEON-NOSVE-NEXT:    strb wzr, [sp, #62]
151; NONEON-NOSVE-NEXT:    strb w8, [sp, #33]
152; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #31]
153; NONEON-NOSVE-NEXT:    strb wzr, [sp, #60]
154; NONEON-NOSVE-NEXT:    strb w8, [sp, #63]
155; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #29]
156; NONEON-NOSVE-NEXT:    strb wzr, [sp, #58]
157; NONEON-NOSVE-NEXT:    strb w8, [sp, #61]
158; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #27]
159; NONEON-NOSVE-NEXT:    strb wzr, [sp, #56]
160; NONEON-NOSVE-NEXT:    strb w8, [sp, #59]
161; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #25]
162; NONEON-NOSVE-NEXT:    strb wzr, [sp, #54]
163; NONEON-NOSVE-NEXT:    strb w8, [sp, #57]
164; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #23]
165; NONEON-NOSVE-NEXT:    strb wzr, [sp, #52]
166; NONEON-NOSVE-NEXT:    strb w8, [sp, #55]
167; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #21]
168; NONEON-NOSVE-NEXT:    strb wzr, [sp, #50]
169; NONEON-NOSVE-NEXT:    strb w8, [sp, #53]
170; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #19]
171; NONEON-NOSVE-NEXT:    strb wzr, [sp, #48]
172; NONEON-NOSVE-NEXT:    strb w8, [sp, #51]
173; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #17]
174; NONEON-NOSVE-NEXT:    strb w8, [sp, #49]
175; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
176; NONEON-NOSVE-NEXT:    add sp, sp, #64
177; NONEON-NOSVE-NEXT:    ret
178 %b = and <32 x i8> %ap, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255,
179                         i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255>
180 ret <32 x i8> %b
181}
182
183; i16
184define <2 x i16> @vls_sve_and_2xi16(<2 x i16> %b) nounwind {
185; CHECK-LABEL: vls_sve_and_2xi16:
186; CHECK:       // %bb.0:
187; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
188; CHECK-NEXT:    fmov s1, wzr
189; CHECK-NEXT:    mov z0.s, z0.s[1]
190; CHECK-NEXT:    zip1 z0.s, z1.s, z0.s
191; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
192; CHECK-NEXT:    ret
193;
194; NONEON-NOSVE-LABEL: vls_sve_and_2xi16:
195; NONEON-NOSVE:       // %bb.0:
196; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
197; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
198; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #8]
199; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
200; NONEON-NOSVE-NEXT:    add sp, sp, #16
201; NONEON-NOSVE-NEXT:    ret
202 %c = and <2 x i16> %b, <i16 0, i16 65535>
203 ret <2 x i16> %c
204}
205
206define <4 x i16> @vls_sve_and_4xi16(<4 x i16> %b) nounwind {
207; CHECK-LABEL: vls_sve_and_4xi16:
208; CHECK:       // %bb.0:
209; CHECK-NEXT:    adrp x8, .LCPI5_0
210; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
211; CHECK-NEXT:    ldr d1, [x8, :lo12:.LCPI5_0]
212; CHECK-NEXT:    and z0.d, z0.d, z1.d
213; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
214; CHECK-NEXT:    ret
215;
216; NONEON-NOSVE-LABEL: vls_sve_and_4xi16:
217; NONEON-NOSVE:       // %bb.0:
218; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
219; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
220; NONEON-NOSVE-NEXT:    strh wzr, [sp, #12]
221; NONEON-NOSVE-NEXT:    strh wzr, [sp, #8]
222; NONEON-NOSVE-NEXT:    strh w8, [sp, #14]
223; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
224; NONEON-NOSVE-NEXT:    strh w8, [sp, #10]
225; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
226; NONEON-NOSVE-NEXT:    add sp, sp, #16
227; NONEON-NOSVE-NEXT:    ret
228 %c = and <4 x i16> %b, <i16 0, i16 65535, i16 0, i16 65535>
229 ret <4 x i16> %c
230}
231
232define <8 x i16> @vls_sve_and_8xi16(<8 x i16> %b) nounwind {
233; CHECK-LABEL: vls_sve_and_8xi16:
234; CHECK:       // %bb.0:
235; CHECK-NEXT:    adrp x8, .LCPI6_0
236; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
237; CHECK-NEXT:    ldr q1, [x8, :lo12:.LCPI6_0]
238; CHECK-NEXT:    and z0.d, z0.d, z1.d
239; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
240; CHECK-NEXT:    ret
241;
242; NONEON-NOSVE-LABEL: vls_sve_and_8xi16:
243; NONEON-NOSVE:       // %bb.0:
244; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
245; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
246; NONEON-NOSVE-NEXT:    strh wzr, [sp, #28]
247; NONEON-NOSVE-NEXT:    strh wzr, [sp, #24]
248; NONEON-NOSVE-NEXT:    strh w8, [sp, #30]
249; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
250; NONEON-NOSVE-NEXT:    strh wzr, [sp, #20]
251; NONEON-NOSVE-NEXT:    strh w8, [sp, #26]
252; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
253; NONEON-NOSVE-NEXT:    strh wzr, [sp, #16]
254; NONEON-NOSVE-NEXT:    strh w8, [sp, #22]
255; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
256; NONEON-NOSVE-NEXT:    strh w8, [sp, #18]
257; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
258; NONEON-NOSVE-NEXT:    add sp, sp, #32
259; NONEON-NOSVE-NEXT:    ret
260 %c = and <8 x i16> %b, <i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535>
261 ret <8 x i16> %c
262}
263
264define <16 x i16> @vls_sve_and_16xi16(<16 x i16> %b) nounwind {
265; CHECK-LABEL: vls_sve_and_16xi16:
266; CHECK:       // %bb.0:
267; CHECK-NEXT:    adrp x8, .LCPI7_0
268; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
269; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
270; CHECK-NEXT:    ldr q2, [x8, :lo12:.LCPI7_0]
271; CHECK-NEXT:    and z0.d, z0.d, z2.d
272; CHECK-NEXT:    and z1.d, z1.d, z2.d
273; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
274; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $z1
275; CHECK-NEXT:    ret
276;
277; NONEON-NOSVE-LABEL: vls_sve_and_16xi16:
278; NONEON-NOSVE:       // %bb.0:
279; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-64]!
280; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
281; NONEON-NOSVE-NEXT:    strh wzr, [sp, #44]
282; NONEON-NOSVE-NEXT:    strh wzr, [sp, #40]
283; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
284; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
285; NONEON-NOSVE-NEXT:    strh wzr, [sp, #36]
286; NONEON-NOSVE-NEXT:    strh w8, [sp, #42]
287; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
288; NONEON-NOSVE-NEXT:    strh wzr, [sp, #32]
289; NONEON-NOSVE-NEXT:    strh w8, [sp, #38]
290; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
291; NONEON-NOSVE-NEXT:    strh wzr, [sp, #60]
292; NONEON-NOSVE-NEXT:    strh w8, [sp, #34]
293; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
294; NONEON-NOSVE-NEXT:    strh wzr, [sp, #56]
295; NONEON-NOSVE-NEXT:    strh w8, [sp, #62]
296; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
297; NONEON-NOSVE-NEXT:    strh wzr, [sp, #52]
298; NONEON-NOSVE-NEXT:    strh w8, [sp, #58]
299; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
300; NONEON-NOSVE-NEXT:    strh wzr, [sp, #48]
301; NONEON-NOSVE-NEXT:    strh w8, [sp, #54]
302; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
303; NONEON-NOSVE-NEXT:    strh w8, [sp, #50]
304; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
305; NONEON-NOSVE-NEXT:    add sp, sp, #64
306; NONEON-NOSVE-NEXT:    ret
307 %c = and <16 x i16> %b, <i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535>
308 ret <16 x i16> %c
309}
310
311; i32
312define <2 x i32> @vls_sve_and_2xi32(<2 x i32> %b) nounwind {
313; CHECK-LABEL: vls_sve_and_2xi32:
314; CHECK:       // %bb.0:
315; CHECK-NEXT:    index z1.s, #0, #-1
316; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
317; CHECK-NEXT:    and z0.d, z0.d, z1.d
318; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
319; CHECK-NEXT:    ret
320;
321; NONEON-NOSVE-LABEL: vls_sve_and_2xi32:
322; NONEON-NOSVE:       // %bb.0:
323; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
324; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
325; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #8]
326; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
327; NONEON-NOSVE-NEXT:    add sp, sp, #16
328; NONEON-NOSVE-NEXT:    ret
329 %c = and <2 x i32> %b, <i32 0, i32 4294967295>
330 ret <2 x i32> %c
331}
332
333define <4 x i32> @vls_sve_and_4xi32(<4 x i32> %b) nounwind {
334; CHECK-LABEL: vls_sve_and_4xi32:
335; CHECK:       // %bb.0:
336; CHECK-NEXT:    adrp x8, .LCPI9_0
337; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
338; CHECK-NEXT:    ldr q1, [x8, :lo12:.LCPI9_0]
339; CHECK-NEXT:    and z0.d, z0.d, z1.d
340; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
341; CHECK-NEXT:    ret
342;
343; NONEON-NOSVE-LABEL: vls_sve_and_4xi32:
344; NONEON-NOSVE:       // %bb.0:
345; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
346; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
347; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #24]
348; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
349; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #16]
350; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
351; NONEON-NOSVE-NEXT:    add sp, sp, #32
352; NONEON-NOSVE-NEXT:    ret
353 %c = and <4 x i32> %b, <i32 0, i32 4294967295, i32 0, i32 4294967295>
354 ret <4 x i32> %c
355}
356
357define <8 x i32> @vls_sve_and_8xi32(<8 x i32> %b) nounwind {
358; CHECK-LABEL: vls_sve_and_8xi32:
359; CHECK:       // %bb.0:
360; CHECK-NEXT:    adrp x8, .LCPI10_0
361; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
362; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
363; CHECK-NEXT:    ldr q2, [x8, :lo12:.LCPI10_0]
364; CHECK-NEXT:    and z0.d, z0.d, z2.d
365; CHECK-NEXT:    and z1.d, z1.d, z2.d
366; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
367; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $z1
368; CHECK-NEXT:    ret
369;
370; NONEON-NOSVE-LABEL: vls_sve_and_8xi32:
371; NONEON-NOSVE:       // %bb.0:
372; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-64]!
373; NONEON-NOSVE-NEXT:    ldr w8, [sp, #12]
374; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #40]
375; NONEON-NOSVE-NEXT:    ldr w8, [sp, #4]
376; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #32]
377; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
378; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #56]
379; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
380; NONEON-NOSVE-NEXT:    stp wzr, w8, [sp, #48]
381; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
382; NONEON-NOSVE-NEXT:    add sp, sp, #64
383; NONEON-NOSVE-NEXT:    ret
384 %c = and <8 x i32> %b, <i32 0, i32 4294967295, i32 0, i32 4294967295, i32 0, i32 4294967295, i32 0, i32 4294967295>
385 ret <8 x i32> %c
386}
387
388; i64
389define <2 x i64> @vls_sve_and_2xi64(<2 x i64> %b) nounwind {
390; CHECK-LABEL: vls_sve_and_2xi64:
391; CHECK:       // %bb.0:
392; CHECK-NEXT:    index z1.d, #0, #-1
393; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
394; CHECK-NEXT:    and z0.d, z0.d, z1.d
395; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
396; CHECK-NEXT:    ret
397;
398; NONEON-NOSVE-LABEL: vls_sve_and_2xi64:
399; NONEON-NOSVE:       // %bb.0:
400; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
401; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
402; NONEON-NOSVE-NEXT:    stp xzr, x8, [sp, #16]
403; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
404; NONEON-NOSVE-NEXT:    add sp, sp, #32
405; NONEON-NOSVE-NEXT:    ret
406 %c = and <2 x i64> %b, <i64 0, i64 18446744073709551615>
407 ret <2 x i64> %c
408}
409
410define <4 x i64> @vls_sve_and_4xi64(<4 x i64> %b) nounwind {
411; CHECK-LABEL: vls_sve_and_4xi64:
412; CHECK:       // %bb.0:
413; CHECK-NEXT:    index z2.d, #0, #-1
414; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
415; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
416; CHECK-NEXT:    and z0.d, z0.d, z2.d
417; CHECK-NEXT:    and z1.d, z1.d, z2.d
418; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
419; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $z1
420; CHECK-NEXT:    ret
421;
422; NONEON-NOSVE-LABEL: vls_sve_and_4xi64:
423; NONEON-NOSVE:       // %bb.0:
424; NONEON-NOSVE-NEXT:    sub sp, sp, #64
425; NONEON-NOSVE-NEXT:    str q0, [sp, #32]
426; NONEON-NOSVE-NEXT:    ldr x8, [sp, #40]
427; NONEON-NOSVE-NEXT:    str q1, [sp]
428; NONEON-NOSVE-NEXT:    stp xzr, x8, [sp, #48]
429; NONEON-NOSVE-NEXT:    ldr x8, [sp, #8]
430; NONEON-NOSVE-NEXT:    ldr q0, [sp, #48]
431; NONEON-NOSVE-NEXT:    stp xzr, x8, [sp, #16]
432; NONEON-NOSVE-NEXT:    ldr q1, [sp, #16]
433; NONEON-NOSVE-NEXT:    add sp, sp, #64
434; NONEON-NOSVE-NEXT:    ret
435 %c = and <4 x i64> %b, <i64 0, i64 18446744073709551615, i64 0, i64 18446744073709551615>
436 ret <4 x i64> %c
437}
438