[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / active_lane_mask.ll
blobe8437b5cd801f5b4f0798a049b687051779b1ff9
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 ; == Scalable ==
6 define <vscale x 16 x i1> @lane_mask_nxv16i1_i32(i32 %index, i32 %TC) {
7 ; CHECK-LABEL: lane_mask_nxv16i1_i32:
8 ; CHECK:       // %bb.0:
9 ; CHECK-NEXT:    whilelo p0.b, w0, w1
10 ; CHECK-NEXT:    ret
11   %active.lane.mask = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i32(i32 %index, i32 %TC)
12   ret <vscale x 16 x i1> %active.lane.mask
15 define <vscale x 8 x i1> @lane_mask_nxv8i1_i32(i32 %index, i32 %TC) {
16 ; CHECK-LABEL: lane_mask_nxv8i1_i32:
17 ; CHECK:       // %bb.0:
18 ; CHECK-NEXT:    whilelo p0.h, w0, w1
19 ; CHECK-NEXT:    ret
20   %active.lane.mask = call <vscale x 8 x i1> @llvm.get.active.lane.mask.nxv8i1.i32(i32 %index, i32 %TC)
21   ret <vscale x 8 x i1> %active.lane.mask
24 define <vscale x 4 x i1> @lane_mask_nxv4i1_i32(i32 %index, i32 %TC) {
25 ; CHECK-LABEL: lane_mask_nxv4i1_i32:
26 ; CHECK:       // %bb.0:
27 ; CHECK-NEXT:    whilelo p0.s, w0, w1
28 ; CHECK-NEXT:    ret
29   %active.lane.mask = call <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i32(i32 %index, i32 %TC)
30   ret <vscale x 4 x i1> %active.lane.mask
33 define <vscale x 2 x i1> @lane_mask_nxv2i1_i32(i32 %index, i32 %TC) {
34 ; CHECK-LABEL: lane_mask_nxv2i1_i32:
35 ; CHECK:       // %bb.0:
36 ; CHECK-NEXT:    whilelo p0.d, w0, w1
37 ; CHECK-NEXT:    ret
38   %active.lane.mask = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i32(i32 %index, i32 %TC)
39   ret <vscale x 2 x i1> %active.lane.mask
42 define <vscale x 16 x i1> @lane_mask_nxv16i1_i64(i64 %index, i64 %TC) {
43 ; CHECK-LABEL: lane_mask_nxv16i1_i64:
44 ; CHECK:       // %bb.0:
45 ; CHECK-NEXT:    whilelo p0.b, x0, x1
46 ; CHECK-NEXT:    ret
47   %active.lane.mask = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 %index, i64 %TC)
48   ret <vscale x 16 x i1> %active.lane.mask
51 define <vscale x 8 x i1> @lane_mask_nxv8i1_i64(i64 %index, i64 %TC) {
52 ; CHECK-LABEL: lane_mask_nxv8i1_i64:
53 ; CHECK:       // %bb.0:
54 ; CHECK-NEXT:    whilelo p0.h, x0, x1
55 ; CHECK-NEXT:    ret
56   %active.lane.mask = call <vscale x 8 x i1> @llvm.get.active.lane.mask.nxv8i1.i64(i64 %index, i64 %TC)
57   ret <vscale x 8 x i1> %active.lane.mask
60 define <vscale x 4 x i1> @lane_mask_nxv4i1_i64(i64 %index, i64 %TC) {
61 ; CHECK-LABEL: lane_mask_nxv4i1_i64:
62 ; CHECK:       // %bb.0:
63 ; CHECK-NEXT:    whilelo p0.s, x0, x1
64 ; CHECK-NEXT:    ret
65   %active.lane.mask = call <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i64(i64 %index, i64 %TC)
66   ret <vscale x 4 x i1> %active.lane.mask
69 define <vscale x 2 x i1> @lane_mask_nxv2i1_i64(i64 %index, i64 %TC) {
70 ; CHECK-LABEL: lane_mask_nxv2i1_i64:
71 ; CHECK:       // %bb.0:
72 ; CHECK-NEXT:    whilelo p0.d, x0, x1
73 ; CHECK-NEXT:    ret
74   %active.lane.mask = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i64(i64 %index, i64 %TC)
75   ret <vscale x 2 x i1> %active.lane.mask
78 define <vscale x 16 x i1> @lane_mask_nxv16i1_i8(i8 %index, i8 %TC) {
79 ; CHECK-LABEL: lane_mask_nxv16i1_i8:
80 ; CHECK:       // %bb.0:
81 ; CHECK-NEXT:    index z0.b, #0, #1
82 ; CHECK-NEXT:    mov z1.b, w0
83 ; CHECK-NEXT:    ptrue p0.b
84 ; CHECK-NEXT:    uqadd z0.b, z0.b, z1.b
85 ; CHECK-NEXT:    mov z1.b, w1
86 ; CHECK-NEXT:    cmphi p0.b, p0/z, z1.b, z0.b
87 ; CHECK-NEXT:    ret
88   %active.lane.mask = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i8(i8 %index, i8 %TC)
89   ret <vscale x 16 x i1> %active.lane.mask
92 define <vscale x 8 x i1> @lane_mask_nxv8i1_i8(i8 %index, i8 %TC) {
93 ; CHECK-LABEL: lane_mask_nxv8i1_i8:
94 ; CHECK:       // %bb.0:
95 ; CHECK-NEXT:    index z0.h, #0, #1
96 ; CHECK-NEXT:    mov z1.h, w0
97 ; CHECK-NEXT:    ptrue p0.h
98 ; CHECK-NEXT:    and z1.h, z1.h, #0xff
99 ; CHECK-NEXT:    and z0.h, z0.h, #0xff
100 ; CHECK-NEXT:    add z0.h, z0.h, z1.h
101 ; CHECK-NEXT:    mov z1.h, w1
102 ; CHECK-NEXT:    umin z0.h, z0.h, #255
103 ; CHECK-NEXT:    and z1.h, z1.h, #0xff
104 ; CHECK-NEXT:    cmphi p0.h, p0/z, z1.h, z0.h
105 ; CHECK-NEXT:    ret
106   %active.lane.mask = call <vscale x 8 x i1> @llvm.get.active.lane.mask.nxv8i1.i8(i8 %index, i8 %TC)
107   ret <vscale x 8 x i1> %active.lane.mask
110 define <vscale x 4 x i1> @lane_mask_nxv4i1_i8(i8 %index, i8 %TC) {
111 ; CHECK-LABEL: lane_mask_nxv4i1_i8:
112 ; CHECK:       // %bb.0:
113 ; CHECK-NEXT:    index z0.s, #0, #1
114 ; CHECK-NEXT:    and w8, w0, #0xff
115 ; CHECK-NEXT:    ptrue p0.s
116 ; CHECK-NEXT:    mov z1.s, w8
117 ; CHECK-NEXT:    and w8, w1, #0xff
118 ; CHECK-NEXT:    and z0.s, z0.s, #0xff
119 ; CHECK-NEXT:    add z0.s, z0.s, z1.s
120 ; CHECK-NEXT:    mov z1.s, w8
121 ; CHECK-NEXT:    umin z0.s, z0.s, #255
122 ; CHECK-NEXT:    cmphi p0.s, p0/z, z1.s, z0.s
123 ; CHECK-NEXT:    ret
124   %active.lane.mask = call <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i8(i8 %index, i8 %TC)
125   ret <vscale x 4 x i1> %active.lane.mask
128 define <vscale x 2 x i1> @lane_mask_nxv2i1_i8(i8 %index, i8 %TC) {
129 ; CHECK-LABEL: lane_mask_nxv2i1_i8:
130 ; CHECK:       // %bb.0:
131 ; CHECK-NEXT:    index z0.d, #0, #1
132 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
133 ; CHECK-NEXT:    and x8, x0, #0xff
134 ; CHECK-NEXT:    ptrue p0.d
135 ; CHECK-NEXT:    mov z1.d, x8
136 ; CHECK-NEXT:    // kill: def $w1 killed $w1 def $x1
137 ; CHECK-NEXT:    and x8, x1, #0xff
138 ; CHECK-NEXT:    and z0.d, z0.d, #0xff
139 ; CHECK-NEXT:    add z0.d, z0.d, z1.d
140 ; CHECK-NEXT:    mov z1.d, x8
141 ; CHECK-NEXT:    umin z0.d, z0.d, #255
142 ; CHECK-NEXT:    cmphi p0.d, p0/z, z1.d, z0.d
143 ; CHECK-NEXT:    ret
144   %active.lane.mask = call <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i8(i8 %index, i8 %TC)
145   ret <vscale x 2 x i1> %active.lane.mask
149 ; Illegal types
151 define <vscale x 32 x i1> @lane_mask_nxv32i1_i32(i32 %index, i32 %TC) {
152 ; CHECK-LABEL: lane_mask_nxv32i1_i32:
153 ; CHECK:       // %bb.0:
154 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
155 ; CHECK-NEXT:    addvl sp, sp, #-1
156 ; CHECK-NEXT:    str p6, [sp, #5, mul vl] // 2-byte Folded Spill
157 ; CHECK-NEXT:    str p5, [sp, #6, mul vl] // 2-byte Folded Spill
158 ; CHECK-NEXT:    str p4, [sp, #7, mul vl] // 2-byte Folded Spill
159 ; CHECK-NEXT:    .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 8 * VG
160 ; CHECK-NEXT:    .cfi_offset w29, -16
161 ; CHECK-NEXT:    index z0.s, #0, #1
162 ; CHECK-NEXT:    mov z1.s, w0
163 ; CHECK-NEXT:    ptrue p0.s
164 ; CHECK-NEXT:    mov z25.s, w1
165 ; CHECK-NEXT:    mov z2.d, z0.d
166 ; CHECK-NEXT:    mov z3.d, z0.d
167 ; CHECK-NEXT:    uqadd z6.s, z0.s, z1.s
168 ; CHECK-NEXT:    incw z0.s, all, mul #4
169 ; CHECK-NEXT:    incw z2.s
170 ; CHECK-NEXT:    incw z3.s, all, mul #2
171 ; CHECK-NEXT:    cmphi p2.s, p0/z, z25.s, z6.s
172 ; CHECK-NEXT:    uqadd z0.s, z0.s, z1.s
173 ; CHECK-NEXT:    mov z4.d, z2.d
174 ; CHECK-NEXT:    uqadd z5.s, z2.s, z1.s
175 ; CHECK-NEXT:    uqadd z7.s, z3.s, z1.s
176 ; CHECK-NEXT:    incw z2.s, all, mul #4
177 ; CHECK-NEXT:    incw z3.s, all, mul #4
178 ; CHECK-NEXT:    cmphi p5.s, p0/z, z25.s, z0.s
179 ; CHECK-NEXT:    incw z4.s, all, mul #2
180 ; CHECK-NEXT:    cmphi p1.s, p0/z, z25.s, z5.s
181 ; CHECK-NEXT:    cmphi p3.s, p0/z, z25.s, z7.s
182 ; CHECK-NEXT:    uqadd z2.s, z2.s, z1.s
183 ; CHECK-NEXT:    uqadd z3.s, z3.s, z1.s
184 ; CHECK-NEXT:    uqadd z24.s, z4.s, z1.s
185 ; CHECK-NEXT:    incw z4.s, all, mul #4
186 ; CHECK-NEXT:    uzp1 p1.h, p2.h, p1.h
187 ; CHECK-NEXT:    cmphi p6.s, p0/z, z25.s, z2.s
188 ; CHECK-NEXT:    cmphi p2.s, p0/z, z25.s, z3.s
189 ; CHECK-NEXT:    uqadd z1.s, z4.s, z1.s
190 ; CHECK-NEXT:    cmphi p4.s, p0/z, z25.s, z24.s
191 ; CHECK-NEXT:    uzp1 p3.h, p3.h, p4.h
192 ; CHECK-NEXT:    cmphi p0.s, p0/z, z25.s, z1.s
193 ; CHECK-NEXT:    uzp1 p4.h, p5.h, p6.h
194 ; CHECK-NEXT:    ldr p6, [sp, #5, mul vl] // 2-byte Folded Reload
195 ; CHECK-NEXT:    ldr p5, [sp, #6, mul vl] // 2-byte Folded Reload
196 ; CHECK-NEXT:    uzp1 p2.h, p2.h, p0.h
197 ; CHECK-NEXT:    uzp1 p0.b, p1.b, p3.b
198 ; CHECK-NEXT:    uzp1 p1.b, p4.b, p2.b
199 ; CHECK-NEXT:    ldr p4, [sp, #7, mul vl] // 2-byte Folded Reload
200 ; CHECK-NEXT:    addvl sp, sp, #1
201 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
202 ; CHECK-NEXT:    ret
203   %active.lane.mask = call <vscale x 32 x i1> @llvm.get.active.lane.mask.nxv32i1.i32(i32 %index, i32 %TC)
204   ret <vscale x 32 x i1> %active.lane.mask
207 define <vscale x 32 x i1> @lane_mask_nxv32i1_i64(i64 %index, i64 %TC) {
208 ; CHECK-LABEL: lane_mask_nxv32i1_i64:
209 ; CHECK:       // %bb.0:
210 ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill
211 ; CHECK-NEXT:    addvl sp, sp, #-1
212 ; CHECK-NEXT:    str p10, [sp, #1, mul vl] // 2-byte Folded Spill
213 ; CHECK-NEXT:    str p9, [sp, #2, mul vl] // 2-byte Folded Spill
214 ; CHECK-NEXT:    str p8, [sp, #3, mul vl] // 2-byte Folded Spill
215 ; CHECK-NEXT:    str p7, [sp, #4, mul vl] // 2-byte Folded Spill
216 ; CHECK-NEXT:    str p6, [sp, #5, mul vl] // 2-byte Folded Spill
217 ; CHECK-NEXT:    str p5, [sp, #6, mul vl] // 2-byte Folded Spill
218 ; CHECK-NEXT:    str p4, [sp, #7, mul vl] // 2-byte Folded Spill
219 ; CHECK-NEXT:    .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 8 * VG
220 ; CHECK-NEXT:    .cfi_offset w29, -16
221 ; CHECK-NEXT:    index z1.d, #0, #1
222 ; CHECK-NEXT:    mov z0.d, x0
223 ; CHECK-NEXT:    ptrue p0.d
224 ; CHECK-NEXT:    mov z7.d, x1
225 ; CHECK-NEXT:    mov z2.d, z1.d
226 ; CHECK-NEXT:    mov z3.d, z1.d
227 ; CHECK-NEXT:    mov z6.d, z1.d
228 ; CHECK-NEXT:    uqadd z5.d, z1.d, z0.d
229 ; CHECK-NEXT:    incd z1.d, all, mul #8
230 ; CHECK-NEXT:    incd z2.d
231 ; CHECK-NEXT:    incd z3.d, all, mul #2
232 ; CHECK-NEXT:    incd z6.d, all, mul #4
233 ; CHECK-NEXT:    cmphi p1.d, p0/z, z7.d, z5.d
234 ; CHECK-NEXT:    uqadd z1.d, z1.d, z0.d
235 ; CHECK-NEXT:    mov z4.d, z2.d
236 ; CHECK-NEXT:    uqadd z24.d, z2.d, z0.d
237 ; CHECK-NEXT:    mov z25.d, z2.d
238 ; CHECK-NEXT:    mov z27.d, z3.d
239 ; CHECK-NEXT:    uqadd z26.d, z3.d, z0.d
240 ; CHECK-NEXT:    uqadd z28.d, z6.d, z0.d
241 ; CHECK-NEXT:    incd z2.d, all, mul #8
242 ; CHECK-NEXT:    incd z3.d, all, mul #8
243 ; CHECK-NEXT:    incd z6.d, all, mul #8
244 ; CHECK-NEXT:    incd z4.d, all, mul #2
245 ; CHECK-NEXT:    incd z25.d, all, mul #4
246 ; CHECK-NEXT:    cmphi p2.d, p0/z, z7.d, z24.d
247 ; CHECK-NEXT:    incd z27.d, all, mul #4
248 ; CHECK-NEXT:    cmphi p3.d, p0/z, z7.d, z26.d
249 ; CHECK-NEXT:    cmphi p5.d, p0/z, z7.d, z28.d
250 ; CHECK-NEXT:    uqadd z2.d, z2.d, z0.d
251 ; CHECK-NEXT:    uqadd z3.d, z3.d, z0.d
252 ; CHECK-NEXT:    mov z24.d, z4.d
253 ; CHECK-NEXT:    uqadd z5.d, z4.d, z0.d
254 ; CHECK-NEXT:    uqadd z26.d, z25.d, z0.d
255 ; CHECK-NEXT:    incd z4.d, all, mul #8
256 ; CHECK-NEXT:    incd z25.d, all, mul #8
257 ; CHECK-NEXT:    uzp1 p1.s, p1.s, p2.s
258 ; CHECK-NEXT:    incd z24.d, all, mul #4
259 ; CHECK-NEXT:    cmphi p8.d, p0/z, z7.d, z2.d
260 ; CHECK-NEXT:    cmphi p4.d, p0/z, z7.d, z5.d
261 ; CHECK-NEXT:    uqadd z5.d, z27.d, z0.d
262 ; CHECK-NEXT:    incd z27.d, all, mul #8
263 ; CHECK-NEXT:    uqadd z4.d, z4.d, z0.d
264 ; CHECK-NEXT:    cmphi p6.d, p0/z, z7.d, z26.d
265 ; CHECK-NEXT:    uqadd z28.d, z24.d, z0.d
266 ; CHECK-NEXT:    incd z24.d, all, mul #8
267 ; CHECK-NEXT:    uzp1 p3.s, p3.s, p4.s
268 ; CHECK-NEXT:    cmphi p7.d, p0/z, z7.d, z5.d
269 ; CHECK-NEXT:    uqadd z5.d, z6.d, z0.d
270 ; CHECK-NEXT:    uqadd z6.d, z25.d, z0.d
271 ; CHECK-NEXT:    uqadd z25.d, z27.d, z0.d
272 ; CHECK-NEXT:    cmphi p4.d, p0/z, z7.d, z1.d
273 ; CHECK-NEXT:    uzp1 p5.s, p5.s, p6.s
274 ; CHECK-NEXT:    cmphi p6.d, p0/z, z7.d, z3.d
275 ; CHECK-NEXT:    cmphi p9.d, p0/z, z7.d, z4.d
276 ; CHECK-NEXT:    uqadd z0.d, z24.d, z0.d
277 ; CHECK-NEXT:    cmphi p2.d, p0/z, z7.d, z28.d
278 ; CHECK-NEXT:    cmphi p10.d, p0/z, z7.d, z6.d
279 ; CHECK-NEXT:    uzp1 p4.s, p4.s, p8.s
280 ; CHECK-NEXT:    cmphi p8.d, p0/z, z7.d, z25.d
281 ; CHECK-NEXT:    uzp1 p6.s, p6.s, p9.s
282 ; CHECK-NEXT:    ldr p9, [sp, #2, mul vl] // 2-byte Folded Reload
283 ; CHECK-NEXT:    uzp1 p2.s, p7.s, p2.s
284 ; CHECK-NEXT:    cmphi p7.d, p0/z, z7.d, z5.d
285 ; CHECK-NEXT:    cmphi p0.d, p0/z, z7.d, z0.d
286 ; CHECK-NEXT:    uzp1 p1.h, p1.h, p3.h
287 ; CHECK-NEXT:    uzp1 p7.s, p7.s, p10.s
288 ; CHECK-NEXT:    ldr p10, [sp, #1, mul vl] // 2-byte Folded Reload
289 ; CHECK-NEXT:    uzp1 p0.s, p8.s, p0.s
290 ; CHECK-NEXT:    ldr p8, [sp, #3, mul vl] // 2-byte Folded Reload
291 ; CHECK-NEXT:    uzp1 p3.h, p4.h, p6.h
292 ; CHECK-NEXT:    ldr p6, [sp, #5, mul vl] // 2-byte Folded Reload
293 ; CHECK-NEXT:    uzp1 p2.h, p5.h, p2.h
294 ; CHECK-NEXT:    ldr p5, [sp, #6, mul vl] // 2-byte Folded Reload
295 ; CHECK-NEXT:    uzp1 p4.h, p7.h, p0.h
296 ; CHECK-NEXT:    ldr p7, [sp, #4, mul vl] // 2-byte Folded Reload
297 ; CHECK-NEXT:    uzp1 p0.b, p1.b, p2.b
298 ; CHECK-NEXT:    uzp1 p1.b, p3.b, p4.b
299 ; CHECK-NEXT:    ldr p4, [sp, #7, mul vl] // 2-byte Folded Reload
300 ; CHECK-NEXT:    addvl sp, sp, #1
301 ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload
302 ; CHECK-NEXT:    ret
303   %active.lane.mask = call <vscale x 32 x i1> @llvm.get.active.lane.mask.nxv32i1.i64(i64 %index, i64 %TC)
304   ret <vscale x 32 x i1> %active.lane.mask
307 define <vscale x 32 x i1> @lane_mask_nxv32i1_i8(i8 %index, i8 %TC) {
308 ; CHECK-LABEL: lane_mask_nxv32i1_i8:
309 ; CHECK:       // %bb.0:
310 ; CHECK-NEXT:    index z0.b, #0, #1
311 ; CHECK-NEXT:    rdvl x8, #1
312 ; CHECK-NEXT:    mov z2.b, w0
313 ; CHECK-NEXT:    mov z1.b, w8
314 ; CHECK-NEXT:    ptrue p1.b
315 ; CHECK-NEXT:    add z1.b, z0.b, z1.b
316 ; CHECK-NEXT:    uqadd z0.b, z0.b, z2.b
317 ; CHECK-NEXT:    uqadd z1.b, z1.b, z2.b
318 ; CHECK-NEXT:    mov z2.b, w1
319 ; CHECK-NEXT:    cmphi p0.b, p1/z, z2.b, z0.b
320 ; CHECK-NEXT:    cmphi p1.b, p1/z, z2.b, z1.b
321 ; CHECK-NEXT:    ret
322   %active.lane.mask = call <vscale x 32 x i1> @llvm.get.active.lane.mask.nxv32i1.i8(i8 %index, i8 %TC)
323   ret <vscale x 32 x i1> %active.lane.mask
326 ; UTC_ARGS: --disable
327 ; This test exists to protect against a compiler crash caused by an attempt to
328 ; convert (via changeVectorElementType) an MVT into an EVT, which is impossible.
329 ; The test's output is large and not relevant so check lines have been disabled.
330 define <vscale x 64 x i1> @lane_mask_nxv64i1_i64(i64 %index, i64 %TC) {
331 ; CHECK-LABEL: lane_mask_nxv64i1_i64:
332   %active.lane.mask = call <vscale x 64 x i1> @llvm.get.active.lane.mask.nxv64i1.i64(i64 %index, i64 %TC)
333   ret <vscale x 64 x i1> %active.lane.mask
335 ; UTC_ARGS: --enable
337 ; == Fixed width ==
339 define <16 x i1> @lane_mask_v16i1_i32(i32 %index, i32 %TC) {
340 ; CHECK-LABEL: lane_mask_v16i1_i32:
341 ; CHECK:       // %bb.0:
342 ; CHECK-NEXT:    whilelo p0.b, w0, w1
343 ; CHECK-NEXT:    mov z0.b, p0/z, #-1 // =0xffffffffffffffff
344 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
345 ; CHECK-NEXT:    ret
346   %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 %index, i32 %TC)
347   ret <16 x i1> %active.lane.mask
350 define <8 x i1> @lane_mask_v8i1_i32(i32 %index, i32 %TC) {
351 ; CHECK-LABEL: lane_mask_v8i1_i32:
352 ; CHECK:       // %bb.0:
353 ; CHECK-NEXT:    whilelo p0.h, w0, w1
354 ; CHECK-NEXT:    mov z0.h, p0/z, #-1 // =0xffffffffffffffff
355 ; CHECK-NEXT:    xtn v0.8b, v0.8h
356 ; CHECK-NEXT:    ret
357   %active.lane.mask = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 %index, i32 %TC)
358   ret <8 x i1> %active.lane.mask
361 define <4 x i1> @lane_mask_v4i1_i32(i32 %index, i32 %TC) {
362 ; CHECK-LABEL: lane_mask_v4i1_i32:
363 ; CHECK:       // %bb.0:
364 ; CHECK-NEXT:    whilelo p0.s, w0, w1
365 ; CHECK-NEXT:    mov z0.s, p0/z, #-1 // =0xffffffffffffffff
366 ; CHECK-NEXT:    xtn v0.4h, v0.4s
367 ; CHECK-NEXT:    ret
368   %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %TC)
369   ret <4 x i1> %active.lane.mask
372 define <2 x i1> @lane_mask_v2i1_i32(i32 %index, i32 %TC) {
373 ; CHECK-LABEL: lane_mask_v2i1_i32:
374 ; CHECK:       // %bb.0:
375 ; CHECK-NEXT:    whilelo p0.d, w0, w1
376 ; CHECK-NEXT:    mov z0.d, p0/z, #-1 // =0xffffffffffffffff
377 ; CHECK-NEXT:    xtn v0.2s, v0.2d
378 ; CHECK-NEXT:    ret
379   %active.lane.mask = call <2 x i1> @llvm.get.active.lane.mask.v2i1.i32(i32 %index, i32 %TC)
380   ret <2 x i1> %active.lane.mask
383 define <16 x i1> @lane_mask_v16i1_i64(i64 %index, i64 %TC) {
384 ; CHECK-LABEL: lane_mask_v16i1_i64:
385 ; CHECK:       // %bb.0:
386 ; CHECK-NEXT:    whilelo p0.b, x0, x1
387 ; CHECK-NEXT:    mov z0.b, p0/z, #-1 // =0xffffffffffffffff
388 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
389 ; CHECK-NEXT:    ret
390   %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i64(i64 %index, i64 %TC)
391   ret <16 x i1> %active.lane.mask
394 define <8 x i1> @lane_mask_v8i1_i64(i64 %index, i64 %TC) {
395 ; CHECK-LABEL: lane_mask_v8i1_i64:
396 ; CHECK:       // %bb.0:
397 ; CHECK-NEXT:    whilelo p0.h, x0, x1
398 ; CHECK-NEXT:    mov z0.h, p0/z, #-1 // =0xffffffffffffffff
399 ; CHECK-NEXT:    xtn v0.8b, v0.8h
400 ; CHECK-NEXT:    ret
401   %active.lane.mask = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i64(i64 %index, i64 %TC)
402   ret <8 x i1> %active.lane.mask
405 define <4 x i1> @lane_mask_v4i1_i64(i64 %index, i64 %TC) {
406 ; CHECK-LABEL: lane_mask_v4i1_i64:
407 ; CHECK:       // %bb.0:
408 ; CHECK-NEXT:    whilelo p0.s, x0, x1
409 ; CHECK-NEXT:    mov z0.s, p0/z, #-1 // =0xffffffffffffffff
410 ; CHECK-NEXT:    xtn v0.4h, v0.4s
411 ; CHECK-NEXT:    ret
412   %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i64(i64 %index, i64 %TC)
413   ret <4 x i1> %active.lane.mask
416 define <2 x i1> @lane_mask_v2i1_i64(i64 %index, i64 %TC) {
417 ; CHECK-LABEL: lane_mask_v2i1_i64:
418 ; CHECK:       // %bb.0:
419 ; CHECK-NEXT:    whilelo p0.d, x0, x1
420 ; CHECK-NEXT:    mov z0.d, p0/z, #-1 // =0xffffffffffffffff
421 ; CHECK-NEXT:    xtn v0.2s, v0.2d
422 ; CHECK-NEXT:    ret
423   %active.lane.mask = call <2 x i1> @llvm.get.active.lane.mask.v2i1.i64(i64 %index, i64 %TC)
424   ret <2 x i1> %active.lane.mask
427 define <16 x i1> @lane_mask_v16i1_i8(i8 %index, i8 %TC) {
428 ; CHECK-LABEL: lane_mask_v16i1_i8:
429 ; CHECK:       // %bb.0:
430 ; CHECK-NEXT:    adrp x8, .LCPI24_0
431 ; CHECK-NEXT:    dup v0.16b, w0
432 ; CHECK-NEXT:    ldr q1, [x8, :lo12:.LCPI24_0]
433 ; CHECK-NEXT:    uqadd v0.16b, v0.16b, v1.16b
434 ; CHECK-NEXT:    dup v1.16b, w1
435 ; CHECK-NEXT:    cmhi v0.16b, v1.16b, v0.16b
436 ; CHECK-NEXT:    ret
437   %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i8(i8 %index, i8 %TC)
438   ret <16 x i1> %active.lane.mask
441 define <8 x i1> @lane_mask_v8i1_i8(i8 %index, i8 %TC) {
442 ; CHECK-LABEL: lane_mask_v8i1_i8:
443 ; CHECK:       // %bb.0:
444 ; CHECK-NEXT:    dup v0.8b, w0
445 ; CHECK-NEXT:    adrp x8, .LCPI25_0
446 ; CHECK-NEXT:    ldr d1, [x8, :lo12:.LCPI25_0]
447 ; CHECK-NEXT:    uqadd v0.8b, v0.8b, v1.8b
448 ; CHECK-NEXT:    dup v1.8b, w1
449 ; CHECK-NEXT:    cmhi v0.8b, v1.8b, v0.8b
450 ; CHECK-NEXT:    ret
451   %active.lane.mask = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i8(i8 %index, i8 %TC)
452   ret <8 x i1> %active.lane.mask
455 define <4 x i1> @lane_mask_v4i1_i8(i8 %index, i8 %TC) {
456 ; CHECK-LABEL: lane_mask_v4i1_i8:
457 ; CHECK:       // %bb.0:
458 ; CHECK-NEXT:    dup v0.4h, w0
459 ; CHECK-NEXT:    adrp x8, .LCPI26_0
460 ; CHECK-NEXT:    movi d2, #0xff00ff00ff00ff
461 ; CHECK-NEXT:    ldr d1, [x8, :lo12:.LCPI26_0]
462 ; CHECK-NEXT:    bic v0.4h, #255, lsl #8
463 ; CHECK-NEXT:    add v0.4h, v0.4h, v1.4h
464 ; CHECK-NEXT:    dup v1.4h, w1
465 ; CHECK-NEXT:    umin v0.4h, v0.4h, v2.4h
466 ; CHECK-NEXT:    bic v1.4h, #255, lsl #8
467 ; CHECK-NEXT:    cmhi v0.4h, v1.4h, v0.4h
468 ; CHECK-NEXT:    ret
469   %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i8(i8 %index, i8 %TC)
470   ret <4 x i1> %active.lane.mask
473 define <2 x i1> @lane_mask_v2i1_i8(i8 %index, i8 %TC) {
474 ; CHECK-LABEL: lane_mask_v2i1_i8:
475 ; CHECK:       // %bb.0:
476 ; CHECK-NEXT:    movi d0, #0x0000ff000000ff
477 ; CHECK-NEXT:    dup v1.2s, w0
478 ; CHECK-NEXT:    adrp x8, .LCPI27_0
479 ; CHECK-NEXT:    ldr d2, [x8, :lo12:.LCPI27_0]
480 ; CHECK-NEXT:    dup v3.2s, w1
481 ; CHECK-NEXT:    and v1.8b, v1.8b, v0.8b
482 ; CHECK-NEXT:    add v1.2s, v1.2s, v2.2s
483 ; CHECK-NEXT:    umin v1.2s, v1.2s, v0.2s
484 ; CHECK-NEXT:    and v0.8b, v3.8b, v0.8b
485 ; CHECK-NEXT:    cmhi v0.2s, v0.2s, v1.2s
486 ; CHECK-NEXT:    ret
487   %active.lane.mask = call <2 x i1> @llvm.get.active.lane.mask.v2i1.i8(i8 %index, i8 %TC)
488   ret <2 x i1> %active.lane.mask
491 define <vscale x 4 x i1> @lane_mask_nxv4i1_imm3() {
492 ; CHECK-LABEL: lane_mask_nxv4i1_imm3:
493 ; CHECK:       // %bb.0: // %entry
494 ; CHECK-NEXT:    ptrue p0.s, vl3
495 ; CHECK-NEXT:    ret
496 entry:
497   %active.lane.mask = call <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i64(i64 0, i64 3)
498   ret <vscale x 4 x i1> %active.lane.mask
501 define <vscale x 4 x i1> @lane_mask_nxv4i1_imm5() {
502 ; CHECK-LABEL: lane_mask_nxv4i1_imm5:
503 ; CHECK:       // %bb.0: // %entry
504 ; CHECK-NEXT:    mov w8, #5 // =0x5
505 ; CHECK-NEXT:    whilelo p0.s, xzr, x8
506 ; CHECK-NEXT:    ret
507 entry:
508   %active.lane.mask = call <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i64(i64 0, i64 5)
509   ret <vscale x 4 x i1> %active.lane.mask
512 define <vscale x 4 x i1> @lane_mask_nxv4i1_imm4() {
513 ; CHECK-LABEL: lane_mask_nxv4i1_imm4:
514 ; CHECK:       // %bb.0: // %entry
515 ; CHECK-NEXT:    ptrue p0.s, vl4
516 ; CHECK-NEXT:    ret
517 entry:
518   %active.lane.mask = call <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i64(i64 10, i64 14)
519   ret <vscale x 4 x i1> %active.lane.mask
522 define <vscale x 16 x i1> @lane_mask_nxv16i1_imm10() {
523 ; CHECK-LABEL: lane_mask_nxv16i1_imm10:
524 ; CHECK:       // %bb.0: // %entry
525 ; CHECK-NEXT:    mov w8, #10 // =0xa
526 ; CHECK-NEXT:    whilelo p0.b, xzr, x8
527 ; CHECK-NEXT:    ret
528 entry:
529   %active.lane.mask = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 0, i64 10)
530   ret <vscale x 16 x i1> %active.lane.mask
533 define <vscale x 16 x i1> @lane_mask_nxv16i1_imm256() vscale_range(16, 16) {
534 ; CHECK-LABEL: lane_mask_nxv16i1_imm256:
535 ; CHECK:       // %bb.0: // %entry
536 ; CHECK-NEXT:    ptrue p0.b, vl256
537 ; CHECK-NEXT:    ret
538 entry:
539   %active.lane.mask = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 0, i64 256)
540   ret <vscale x 16 x i1> %active.lane.mask
544 declare <vscale x 32 x i1> @llvm.get.active.lane.mask.nxv32i1.i32(i32, i32)
545 declare <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i32(i32, i32)
546 declare <vscale x 8 x i1> @llvm.get.active.lane.mask.nxv8i1.i32(i32, i32)
547 declare <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i32(i32, i32)
548 declare <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i32(i32, i32)
550 declare <vscale x 64 x i1> @llvm.get.active.lane.mask.nxv64i1.i64(i64, i64)
551 declare <vscale x 32 x i1> @llvm.get.active.lane.mask.nxv32i1.i64(i64, i64)
552 declare <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64, i64)
553 declare <vscale x 8 x i1> @llvm.get.active.lane.mask.nxv8i1.i64(i64, i64)
554 declare <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i64(i64, i64)
555 declare <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i64(i64, i64)
557 declare <vscale x 32 x i1> @llvm.get.active.lane.mask.nxv32i1.i8(i8, i8)
558 declare <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i8(i8, i8)
559 declare <vscale x 8 x i1> @llvm.get.active.lane.mask.nxv8i1.i8(i8, i8)
560 declare <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i8(i8, i8)
561 declare <vscale x 2 x i1> @llvm.get.active.lane.mask.nxv2i1.i8(i8, i8)
564 declare <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32, i32)
565 declare <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32, i32)
566 declare <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32, i32)
567 declare <2 x i1> @llvm.get.active.lane.mask.v2i1.i32(i32, i32)
569 declare <16 x i1> @llvm.get.active.lane.mask.v16i1.i64(i64, i64)
570 declare <8 x i1> @llvm.get.active.lane.mask.v8i1.i64(i64, i64)
571 declare <4 x i1> @llvm.get.active.lane.mask.v4i1.i64(i64, i64)
572 declare <2 x i1> @llvm.get.active.lane.mask.v2i1.i64(i64, i64)
574 declare <16 x i1> @llvm.get.active.lane.mask.v16i1.i8(i8, i8)
575 declare <8 x i1> @llvm.get.active.lane.mask.v8i1.i8(i8, i8)
576 declare <4 x i1> @llvm.get.active.lane.mask.v4i1.i8(i8, i8)
577 declare <2 x i1> @llvm.get.active.lane.mask.v2i1.i8(i8, i8)