@@ -344,8 +344,7 @@ define <vscale x 2 x i64> @and_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64
344
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
345
; CHECK-LABEL: bic_i8_zero:
346
346
; CHECK: // %bb.0:
347
- ; CHECK-NEXT: mov z2.b, #0 // =0x0
348
- ; CHECK-NEXT: sel z0.b, p0, z0.b, z2.b
347
+ ; CHECK-NEXT: movprfx z0.b, p0/z, z0.b
349
348
; CHECK-NEXT: bic z0.b, p0/m, z0.b, z1.b
350
349
; CHECK-NEXT: ret
351
350
%a_z = select <vscale x 16 x i1 > %pg , <vscale x 16 x i8 > %a , <vscale x 16 x i8 > zeroinitializer
@@ -358,8 +357,7 @@ define <vscale x 16 x i8> @bic_i8_zero(<vscale x 16 x i1> %pg, <vscale x 16 x i8
358
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 ) {
359
358
; CHECK-LABEL: bic_i16_zero:
360
359
; CHECK: // %bb.0:
361
- ; CHECK-NEXT: mov z2.h, #0 // =0x0
362
- ; CHECK-NEXT: sel z0.h, p0, z0.h, z2.h
360
+ ; CHECK-NEXT: movprfx z0.h, p0/z, z0.h
363
361
; CHECK-NEXT: bic z0.h, p0/m, z0.h, z1.h
364
362
; CHECK-NEXT: ret
365
363
%a_z = select <vscale x 8 x i1 > %pg , <vscale x 8 x i16 > %a , <vscale x 8 x i16 > zeroinitializer
@@ -372,8 +370,7 @@ define <vscale x 8 x i16> @bic_i16_zero(<vscale x 8 x i1> %pg, <vscale x 8 x i16
372
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 ) {
373
371
; CHECK-LABEL: bic_i32_zero:
374
372
; CHECK: // %bb.0:
375
- ; CHECK-NEXT: mov z2.s, #0 // =0x0
376
- ; CHECK-NEXT: sel z0.s, p0, z0.s, z2.s
373
+ ; CHECK-NEXT: movprfx z0.s, p0/z, z0.s
377
374
; CHECK-NEXT: bic z0.s, p0/m, z0.s, z1.s
378
375
; CHECK-NEXT: ret
379
376
%a_z = select <vscale x 4 x i1 > %pg , <vscale x 4 x i32 > %a , <vscale x 4 x i32 > zeroinitializer
@@ -386,8 +383,7 @@ define <vscale x 4 x i32> @bic_i32_zero(<vscale x 4 x i1> %pg, <vscale x 4 x i32
386
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 ) {
387
384
; CHECK-LABEL: bic_i64_zero:
388
385
; CHECK: // %bb.0:
389
- ; CHECK-NEXT: mov z2.d, #0 // =0x0
390
- ; CHECK-NEXT: sel z0.d, p0, z0.d, z2.d
386
+ ; CHECK-NEXT: movprfx z0.d, p0/z, z0.d
391
387
; CHECK-NEXT: bic z0.d, p0/m, z0.d, z1.d
392
388
; CHECK-NEXT: ret
393
389
%a_z = select <vscale x 2 x i1 > %pg , <vscale x 2 x i64 > %a , <vscale x 2 x i64 > zeroinitializer
@@ -397,6 +393,39 @@ define <vscale x 2 x i64> @bic_i64_zero(<vscale x 2 x i1> %pg, <vscale x 2 x i64
397
393
ret <vscale x 2 x i64 > %out
398
394
}
399
395
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
410
+ }
411
+
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: sel z0.d, p0, z0.d, z2.d
419
+ ; CHECK-NEXT: bic z1.d, p0/m, z1.d, z0.d
420
+ ; CHECK-NEXT: mov z0.d, z1.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
427
+ }
428
+
400
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 >)
401
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 >)
402
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 >)
0 commit comments