@@ -3537,23 +3537,37 @@ class sve_int_cmp<bit cmp_1, bits<2> sz8_64, bits<3> opc, string asm,
35373537 let Defs = [NZCV];
35383538}
35393539
3540- multiclass sve_int_cmp_0<bits<3> opc, string asm> {
3540+ multiclass sve_int_cmp_0<bits<3> opc, string asm, SDPatternOperator op,
3541+ CondCode cc> {
35413542 def _B : sve_int_cmp<0b0, 0b00, opc, asm, PPR8, ZPR8, ZPR8>;
35423543 def _H : sve_int_cmp<0b0, 0b01, opc, asm, PPR16, ZPR16, ZPR16>;
35433544 def _S : sve_int_cmp<0b0, 0b10, opc, asm, PPR32, ZPR32, ZPR32>;
35443545 def _D : sve_int_cmp<0b0, 0b11, opc, asm, PPR64, ZPR64, ZPR64>;
3546+
3547+ def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
3548+ def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
3549+ def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
3550+ def : SVE_3_Op_Pat<nxv2i1, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
35453551}
35463552
3547- multiclass sve_int_cmp_0_wide<bits<3> opc, string asm> {
3553+ multiclass sve_int_cmp_0_wide<bits<3> opc, string asm, SDPatternOperator op > {
35483554 def _B : sve_int_cmp<0b0, 0b00, opc, asm, PPR8, ZPR8, ZPR64>;
35493555 def _H : sve_int_cmp<0b0, 0b01, opc, asm, PPR16, ZPR16, ZPR64>;
35503556 def _S : sve_int_cmp<0b0, 0b10, opc, asm, PPR32, ZPR32, ZPR64>;
3557+
3558+ def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
3559+ def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
3560+ def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
35513561}
35523562
3553- multiclass sve_int_cmp_1_wide<bits<3> opc, string asm> {
3563+ multiclass sve_int_cmp_1_wide<bits<3> opc, string asm, SDPatternOperator op > {
35543564 def _B : sve_int_cmp<0b1, 0b00, opc, asm, PPR8, ZPR8, ZPR64>;
35553565 def _H : sve_int_cmp<0b1, 0b01, opc, asm, PPR16, ZPR16, ZPR64>;
35563566 def _S : sve_int_cmp<0b1, 0b10, opc, asm, PPR32, ZPR32, ZPR64>;
3567+
3568+ def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
3569+ def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
3570+ def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
35573571}
35583572
35593573
@@ -3585,13 +3599,70 @@ class sve_int_scmp_vi<bits<2> sz8_64, bits<3> opc, string asm, PPRRegOp pprty,
35853599 let Inst{3-0} = Pd;
35863600
35873601 let Defs = [NZCV];
3602+ let ElementSize = pprty.ElementSize;
35883603}
35893604
3590- multiclass sve_int_scmp_vi<bits<3> opc, string asm> {
3605+ multiclass sve_int_scmp_vi<bits<3> opc, string asm, CondCode cc,
3606+ SDPatternOperator op = null_frag,
3607+ SDPatternOperator inv_op = null_frag> {
35913608 def _B : sve_int_scmp_vi<0b00, opc, asm, PPR8, ZPR8, simm5_32b>;
35923609 def _H : sve_int_scmp_vi<0b01, opc, asm, PPR16, ZPR16, simm5_32b>;
35933610 def _S : sve_int_scmp_vi<0b10, opc, asm, PPR32, ZPR32, simm5_32b>;
35943611 def _D : sve_int_scmp_vi<0b11, opc, asm, PPR64, ZPR64, simm5_64b>;
3612+
3613+ // IR version
3614+ def : Pat<(nxv16i1 (setcc (nxv16i8 ZPR:$Zs1),
3615+ (nxv16i8 (AArch64dup (simm5_32b:$imm))),
3616+ cc)),
3617+ (!cast<Instruction>(NAME # "_B") (PTRUE_B 31), ZPR:$Zs1, simm5_32b:$imm)>;
3618+ def : Pat<(nxv8i1 (setcc (nxv8i16 ZPR:$Zs1),
3619+ (nxv8i16 (AArch64dup (simm5_32b:$imm))),
3620+ cc)),
3621+ (!cast<Instruction>(NAME # "_H") (PTRUE_H 31), ZPR:$Zs1, simm5_32b:$imm)>;
3622+ def : Pat<(nxv4i1 (setcc (nxv4i32 ZPR:$Zs1),
3623+ (nxv4i32 (AArch64dup (simm5_32b:$imm))),
3624+ cc)),
3625+ (!cast<Instruction>(NAME # "_S") (PTRUE_S 31), ZPR:$Zs1, simm5_32b:$imm)>;
3626+ def : Pat<(nxv2i1 (setcc (nxv2i64 ZPR:$Zs1),
3627+ (nxv2i64 (AArch64dup (simm5_64b:$imm))),
3628+ cc)),
3629+ (!cast<Instruction>(NAME # "_D") (PTRUE_D 31), ZPR:$Zs1, simm5_64b:$imm)>;
3630+
3631+ // Intrinsic version
3632+ def : Pat<(nxv16i1 (op (nxv16i1 PPR_3b:$Pg),
3633+ (nxv16i8 ZPR:$Zs1),
3634+ (nxv16i8 (AArch64dup (simm5_32b:$imm))))),
3635+ (!cast<Instruction>(NAME # "_B") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3636+ def : Pat<(nxv8i1 (op (nxv8i1 PPR_3b:$Pg),
3637+ (nxv8i16 ZPR:$Zs1),
3638+ (nxv8i16 (AArch64dup (simm5_32b:$imm))))),
3639+ (!cast<Instruction>(NAME # "_H") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3640+ def : Pat<(nxv4i1 (op (nxv4i1 PPR_3b:$Pg),
3641+ (nxv4i32 ZPR:$Zs1),
3642+ (nxv4i32 (AArch64dup (simm5_32b:$imm))))),
3643+ (!cast<Instruction>(NAME # "_S") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3644+ def : Pat<(nxv2i1 (op (nxv2i1 PPR_3b:$Pg),
3645+ (nxv2i64 ZPR:$Zs1),
3646+ (nxv2i64 (AArch64dup (simm5_64b:$imm))))),
3647+ (!cast<Instruction>(NAME # "_D") PPR_3b:$Pg, ZPR:$Zs1, simm5_64b:$imm)>;
3648+
3649+ // Inverted intrinsic version
3650+ def : Pat<(nxv16i1 (inv_op (nxv16i1 PPR_3b:$Pg),
3651+ (nxv16i8 (AArch64dup (simm5_32b:$imm))),
3652+ (nxv16i8 ZPR:$Zs1))),
3653+ (!cast<Instruction>(NAME # "_B") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3654+ def : Pat<(nxv8i1 (inv_op (nxv8i1 PPR_3b:$Pg),
3655+ (nxv8i16 (AArch64dup (simm5_32b:$imm))),
3656+ (nxv8i16 ZPR:$Zs1))),
3657+ (!cast<Instruction>(NAME # "_H") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3658+ def : Pat<(nxv4i1 (inv_op (nxv4i1 PPR_3b:$Pg),
3659+ (nxv4i32 (AArch64dup (simm5_32b:$imm))),
3660+ (nxv4i32 ZPR:$Zs1))),
3661+ (!cast<Instruction>(NAME # "_S") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3662+ def : Pat<(nxv2i1 (inv_op (nxv2i1 PPR_3b:$Pg),
3663+ (nxv2i64 (AArch64dup (simm5_64b:$imm))),
3664+ (nxv2i64 ZPR:$Zs1))),
3665+ (!cast<Instruction>(NAME # "_D") PPR_3b:$Pg, ZPR:$Zs1, simm5_64b:$imm)>;
35953666}
35963667
35973668
@@ -3622,11 +3693,67 @@ class sve_int_ucmp_vi<bits<2> sz8_64, bits<2> opc, string asm, PPRRegOp pprty,
36223693 let Defs = [NZCV];
36233694}
36243695
3625- multiclass sve_int_ucmp_vi<bits<2> opc, string asm> {
3696+ multiclass sve_int_ucmp_vi<bits<2> opc, string asm, CondCode cc,
3697+ SDPatternOperator op = null_frag,
3698+ SDPatternOperator inv_op = null_frag> {
36263699 def _B : sve_int_ucmp_vi<0b00, opc, asm, PPR8, ZPR8, imm0_127>;
36273700 def _H : sve_int_ucmp_vi<0b01, opc, asm, PPR16, ZPR16, imm0_127>;
36283701 def _S : sve_int_ucmp_vi<0b10, opc, asm, PPR32, ZPR32, imm0_127>;
3629- def _D : sve_int_ucmp_vi<0b11, opc, asm, PPR64, ZPR64, imm0_127>;
3702+ def _D : sve_int_ucmp_vi<0b11, opc, asm, PPR64, ZPR64, imm0_127_64b>;
3703+
3704+ // IR version
3705+ def : Pat<(nxv16i1 (setcc (nxv16i8 ZPR:$Zs1),
3706+ (nxv16i8 (AArch64dup (imm0_127:$imm))),
3707+ cc)),
3708+ (!cast<Instruction>(NAME # "_B") (PTRUE_B 31), ZPR:$Zs1, imm0_127:$imm)>;
3709+ def : Pat<(nxv8i1 (setcc (nxv8i16 ZPR:$Zs1),
3710+ (nxv8i16 (AArch64dup (imm0_127:$imm))),
3711+ cc)),
3712+ (!cast<Instruction>(NAME # "_H") (PTRUE_H 31), ZPR:$Zs1, imm0_127:$imm)>;
3713+ def : Pat<(nxv4i1 (setcc (nxv4i32 ZPR:$Zs1),
3714+ (nxv4i32 (AArch64dup (imm0_127:$imm))),
3715+ cc)),
3716+ (!cast<Instruction>(NAME # "_S") (PTRUE_S 31), ZPR:$Zs1, imm0_127:$imm)>;
3717+ def : Pat<(nxv2i1 (setcc (nxv2i64 ZPR:$Zs1),
3718+ (nxv2i64 (AArch64dup (imm0_127_64b:$imm))),
3719+ cc)),
3720+ (!cast<Instruction>(NAME # "_D") (PTRUE_D 31), ZPR:$Zs1, imm0_127_64b:$imm)>;
3721+
3722+ // Intrinsic version
3723+ def : Pat<(nxv16i1 (op (nxv16i1 PPR_3b:$Pg),
3724+ (nxv16i8 ZPR:$Zs1),
3725+ (nxv16i8 (AArch64dup (imm0_127:$imm))))),
3726+ (!cast<Instruction>(NAME # "_B") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
3727+ def : Pat<(nxv8i1 (op (nxv8i1 PPR_3b:$Pg),
3728+ (nxv8i16 ZPR:$Zs1),
3729+ (nxv8i16 (AArch64dup (imm0_127:$imm))))),
3730+ (!cast<Instruction>(NAME # "_H") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
3731+ def : Pat<(nxv4i1 (op (nxv4i1 PPR_3b:$Pg),
3732+ (nxv4i32 ZPR:$Zs1),
3733+ (nxv4i32 (AArch64dup (imm0_127:$imm))))),
3734+ (!cast<Instruction>(NAME # "_S") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
3735+ def : Pat<(nxv2i1 (op (nxv2i1 PPR_3b:$Pg),
3736+ (nxv2i64 ZPR:$Zs1),
3737+ (nxv2i64 (AArch64dup (imm0_127_64b:$imm))))),
3738+ (!cast<Instruction>(NAME # "_D") PPR_3b:$Pg, ZPR:$Zs1, imm0_127_64b:$imm)>;
3739+
3740+ // Inverted intrinsic version
3741+ def : Pat<(nxv16i1 (inv_op (nxv16i1 PPR_3b:$Pg),
3742+ (nxv16i8 (AArch64dup (imm0_127:$imm))),
3743+ (nxv16i8 ZPR:$Zs1))),
3744+ (!cast<Instruction>(NAME # "_B") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
3745+ def : Pat<(nxv8i1 (inv_op (nxv8i1 PPR_3b:$Pg),
3746+ (nxv8i16 (AArch64dup (imm0_127:$imm))),
3747+ (nxv8i16 ZPR:$Zs1))),
3748+ (!cast<Instruction>(NAME # "_H") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
3749+ def : Pat<(nxv4i1 (inv_op (nxv4i1 PPR_3b:$Pg),
3750+ (nxv4i32 (AArch64dup (imm0_127:$imm))),
3751+ (nxv4i32 ZPR:$Zs1))),
3752+ (!cast<Instruction>(NAME # "_S") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
3753+ def : Pat<(nxv2i1 (inv_op (nxv2i1 PPR_3b:$Pg),
3754+ (nxv2i64 (AArch64dup (imm0_127_64b:$imm))),
3755+ (nxv2i64 ZPR:$Zs1))),
3756+ (!cast<Instruction>(NAME # "_D") PPR_3b:$Pg, ZPR:$Zs1, imm0_127_64b:$imm)>;
36303757}
36313758
36323759
0 commit comments