@@ -294,12 +294,7 @@ define i8 @extract_last_i8_scalable(<vscale x 16 x i8> %data, <vscale x 16 x i1>
294
294
; CHECK-LABEL: extract_last_i8_scalable:
295
295
; CHECK: // %bb.0:
296
296
; CHECK-NEXT: index z1.b, #0, #1
297
- ; CHECK-NEXT: mov z2.b, #0 // =0x0
298
- ; CHECK-NEXT: ptrue p1.b
299
- ; CHECK-NEXT: sel z1.b, p0, z1.b, z2.b
300
- ; CHECK-NEXT: umaxv b1, p1, z1.b
301
- ; CHECK-NEXT: fmov w8, s1
302
- ; CHECK-NEXT: and x8, x8, #0xff
297
+ ; CHECK-NEXT: lastb w8, p0, z1.b
303
298
; CHECK-NEXT: whilels p1.b, xzr, x8
304
299
; CHECK-NEXT: ptest p0, p0.b
305
300
; CHECK-NEXT: lastb w8, p1, z0.b
@@ -313,15 +308,11 @@ define i16 @extract_last_i16_scalable(<vscale x 8 x i16> %data, <vscale x 8 x i1
313
308
; CHECK-LABEL: extract_last_i16_scalable:
314
309
; CHECK: // %bb.0:
315
310
; CHECK-NEXT: index z1.h, #0, #1
316
- ; CHECK-NEXT: mov z2.h, #0 // =0x0
311
+ ; CHECK-NEXT: lastb w8, p0, z1.h
312
+ ; CHECK-NEXT: whilels p1.h, xzr, x8
313
+ ; CHECK-NEXT: lastb w8, p1, z0.h
317
314
; CHECK-NEXT: ptrue p1.h
318
- ; CHECK-NEXT: sel z1.h, p0, z1.h, z2.h
319
- ; CHECK-NEXT: umaxv h1, p1, z1.h
320
- ; CHECK-NEXT: fmov w8, s1
321
- ; CHECK-NEXT: and x8, x8, #0xffff
322
- ; CHECK-NEXT: whilels p2.h, xzr, x8
323
315
; CHECK-NEXT: ptest p1, p0.b
324
- ; CHECK-NEXT: lastb w8, p2, z0.h
325
316
; CHECK-NEXT: csel w0, w8, w0, ne
326
317
; CHECK-NEXT: ret
327
318
%res = call i16 @llvm.experimental.vector.extract.last.active.nxv8i16 (<vscale x 8 x i16 > %data , <vscale x 8 x i1 > %mask , i16 %passthru )
@@ -332,15 +323,11 @@ define i32 @extract_last_i32_scalable(<vscale x 4 x i32> %data, <vscale x 4 x i1
332
323
; CHECK-LABEL: extract_last_i32_scalable:
333
324
; CHECK: // %bb.0:
334
325
; CHECK-NEXT: index z1.s, #0, #1
335
- ; CHECK-NEXT: mov z2.s, #0 // =0x0
326
+ ; CHECK-NEXT: lastb w8, p0, z1.s
327
+ ; CHECK-NEXT: whilels p1.s, xzr, x8
328
+ ; CHECK-NEXT: lastb w8, p1, z0.s
336
329
; CHECK-NEXT: ptrue p1.s
337
- ; CHECK-NEXT: sel z1.s, p0, z1.s, z2.s
338
- ; CHECK-NEXT: umaxv s1, p1, z1.s
339
- ; CHECK-NEXT: fmov w8, s1
340
- ; CHECK-NEXT: mov w8, w8
341
- ; CHECK-NEXT: whilels p2.s, xzr, x8
342
330
; CHECK-NEXT: ptest p1, p0.b
343
- ; CHECK-NEXT: lastb w8, p2, z0.s
344
331
; CHECK-NEXT: csel w0, w8, w0, ne
345
332
; CHECK-NEXT: ret
346
333
%res = call i32 @llvm.experimental.vector.extract.last.active.nxv4i32 (<vscale x 4 x i32 > %data , <vscale x 4 x i1 > %mask , i32 %passthru )
@@ -351,14 +338,11 @@ define i64 @extract_last_i64_scalable(<vscale x 2 x i64> %data, <vscale x 2 x i1
351
338
; CHECK-LABEL: extract_last_i64_scalable:
352
339
; CHECK: // %bb.0:
353
340
; CHECK-NEXT: index z1.d, #0, #1
354
- ; CHECK-NEXT: mov z2.d, #0 // =0x0
341
+ ; CHECK-NEXT: lastb x8, p0, z1.d
342
+ ; CHECK-NEXT: whilels p1.d, xzr, x8
343
+ ; CHECK-NEXT: lastb x8, p1, z0.d
355
344
; CHECK-NEXT: ptrue p1.d
356
- ; CHECK-NEXT: sel z1.d, p0, z1.d, z2.d
357
- ; CHECK-NEXT: umaxv d1, p1, z1.d
358
- ; CHECK-NEXT: fmov x8, d1
359
- ; CHECK-NEXT: whilels p2.d, xzr, x8
360
345
; CHECK-NEXT: ptest p1, p0.b
361
- ; CHECK-NEXT: lastb x8, p2, z0.d
362
346
; CHECK-NEXT: csel x0, x8, x0, ne
363
347
; CHECK-NEXT: ret
364
348
%res = call i64 @llvm.experimental.vector.extract.last.active.nxv2i64 (<vscale x 2 x i64 > %data , <vscale x 2 x i1 > %mask , i64 %passthru )
@@ -369,15 +353,11 @@ define float @extract_last_float_scalable(<vscale x 4 x float> %data, <vscale x
369
353
; CHECK-LABEL: extract_last_float_scalable:
370
354
; CHECK: // %bb.0:
371
355
; CHECK-NEXT: index z2.s, #0, #1
372
- ; CHECK-NEXT: mov z3.s, #0 // =0x0
356
+ ; CHECK-NEXT: lastb w8, p0, z2.s
357
+ ; CHECK-NEXT: whilels p1.s, xzr, x8
358
+ ; CHECK-NEXT: lastb s0, p1, z0.s
373
359
; CHECK-NEXT: ptrue p1.s
374
- ; CHECK-NEXT: sel z2.s, p0, z2.s, z3.s
375
- ; CHECK-NEXT: umaxv s2, p1, z2.s
376
- ; CHECK-NEXT: fmov w8, s2
377
- ; CHECK-NEXT: mov w8, w8
378
- ; CHECK-NEXT: whilels p2.s, xzr, x8
379
360
; CHECK-NEXT: ptest p1, p0.b
380
- ; CHECK-NEXT: lastb s0, p2, z0.s
381
361
; CHECK-NEXT: fcsel s0, s0, s1, ne
382
362
; CHECK-NEXT: ret
383
363
%res = call float @llvm.experimental.vector.extract.last.active.nxv4f32 (<vscale x 4 x float > %data , <vscale x 4 x i1 > %mask , float %passthru )
@@ -388,14 +368,11 @@ define double @extract_last_double_scalable(<vscale x 2 x double> %data, <vscale
388
368
; CHECK-LABEL: extract_last_double_scalable:
389
369
; CHECK: // %bb.0:
390
370
; CHECK-NEXT: index z2.d, #0, #1
391
- ; CHECK-NEXT: mov z3.d, #0 // =0x0
371
+ ; CHECK-NEXT: lastb x8, p0, z2.d
372
+ ; CHECK-NEXT: whilels p1.d, xzr, x8
373
+ ; CHECK-NEXT: lastb d0, p1, z0.d
392
374
; CHECK-NEXT: ptrue p1.d
393
- ; CHECK-NEXT: sel z2.d, p0, z2.d, z3.d
394
- ; CHECK-NEXT: umaxv d2, p1, z2.d
395
- ; CHECK-NEXT: fmov x8, d2
396
- ; CHECK-NEXT: whilels p2.d, xzr, x8
397
375
; CHECK-NEXT: ptest p1, p0.b
398
- ; CHECK-NEXT: lastb d0, p2, z0.d
399
376
; CHECK-NEXT: fcsel d0, d0, d1, ne
400
377
; CHECK-NEXT: ret
401
378
%res = call double @llvm.experimental.vector.extract.last.active.nxv2f64 (<vscale x 2 x double > %data , <vscale x 2 x i1 > %mask , double %passthru )
@@ -407,12 +384,7 @@ define i8 @extract_last_i8_scalable_poison_passthru(<vscale x 16 x i8> %data, <v
407
384
; CHECK-LABEL: extract_last_i8_scalable_poison_passthru:
408
385
; CHECK: // %bb.0:
409
386
; CHECK-NEXT: index z1.b, #0, #1
410
- ; CHECK-NEXT: mov z2.b, #0 // =0x0
411
- ; CHECK-NEXT: sel z1.b, p0, z1.b, z2.b
412
- ; CHECK-NEXT: ptrue p0.b
413
- ; CHECK-NEXT: umaxv b1, p0, z1.b
414
- ; CHECK-NEXT: fmov w8, s1
415
- ; CHECK-NEXT: and x8, x8, #0xff
387
+ ; CHECK-NEXT: lastb w8, p0, z1.b
416
388
; CHECK-NEXT: whilels p0.b, xzr, x8
417
389
; CHECK-NEXT: lastb w0, p0, z0.b
418
390
; CHECK-NEXT: ret
0 commit comments