@@ -5450,6 +5450,52 @@ defm : SelectSetCCSwapOperands<setle, "CMGE">;
5450
5450
defm : SelectSetCCSwapOperands<setult, "CMHI">;
5451
5451
defm : SelectSetCCSwapOperands<setule, "CMHS">;
5452
5452
5453
+ multiclass SelectSetCCZeroRHS<PatFrags InFrag, string INST> {
5454
+ def : Pat<(v8i8 (InFrag (v8i8 V64:$Rn), immAllZerosV)),
5455
+ (v8i8 (!cast<Instruction>(INST # v8i8rz) (v8i8 V64:$Rn)))>;
5456
+ def : Pat<(v16i8 (InFrag (v16i8 V128:$Rn), immAllZerosV)),
5457
+ (v16i8 (!cast<Instruction>(INST # v16i8rz) (v16i8 V128:$Rn)))>;
5458
+ def : Pat<(v4i16 (InFrag (v4i16 V64:$Rn), immAllZerosV)),
5459
+ (v4i16 (!cast<Instruction>(INST # v4i16rz) (v4i16 V64:$Rn)))>;
5460
+ def : Pat<(v8i16 (InFrag (v8i16 V128:$Rn), immAllZerosV)),
5461
+ (v8i16 (!cast<Instruction>(INST # v8i16rz) (v8i16 V128:$Rn)))>;
5462
+ def : Pat<(v2i32 (InFrag (v2i32 V64:$Rn), immAllZerosV)),
5463
+ (v2i32 (!cast<Instruction>(INST # v2i32rz) (v2i32 V64:$Rn)))>;
5464
+ def : Pat<(v4i32 (InFrag (v4i32 V128:$Rn), immAllZerosV)),
5465
+ (v4i32 (!cast<Instruction>(INST # v4i32rz) (v4i32 V128:$Rn)))>;
5466
+ def : Pat<(v2i64 (InFrag (v2i64 V128:$Rn), immAllZerosV)),
5467
+ (v2i64 (!cast<Instruction>(INST # v2i64rz) (v2i64 V128:$Rn)))>;
5468
+ }
5469
+
5470
+ defm : SelectSetCCZeroRHS<seteq, "CMEQ">;
5471
+ defm : SelectSetCCZeroRHS<setgt, "CMGT">;
5472
+ defm : SelectSetCCZeroRHS<setge, "CMGE">;
5473
+ defm : SelectSetCCZeroRHS<setlt, "CMLT">;
5474
+ defm : SelectSetCCZeroRHS<setle, "CMLE">;
5475
+
5476
+ multiclass SelectSetCCZeroLHS<PatFrags InFrag, string INST> {
5477
+ def : Pat<(v8i8 (InFrag immAllZerosV, (v8i8 V64:$Rn))),
5478
+ (v8i8 (!cast<Instruction>(INST # v8i8rz) (v8i8 V64:$Rn)))>;
5479
+ def : Pat<(v16i8 (InFrag immAllZerosV, (v16i8 V128:$Rn))),
5480
+ (v16i8 (!cast<Instruction>(INST # v16i8rz) (v16i8 V128:$Rn)))>;
5481
+ def : Pat<(v4i16 (InFrag immAllZerosV, (v4i16 V64:$Rn))),
5482
+ (v4i16 (!cast<Instruction>(INST # v4i16rz) (v4i16 V64:$Rn)))>;
5483
+ def : Pat<(v8i16 (InFrag immAllZerosV, (v8i16 V128:$Rn))),
5484
+ (v8i16 (!cast<Instruction>(INST # v8i16rz) (v8i16 V128:$Rn)))>;
5485
+ def : Pat<(v2i32 (InFrag immAllZerosV, (v2i32 V64:$Rn))),
5486
+ (v2i32 (!cast<Instruction>(INST # v2i32rz) (v2i32 V64:$Rn)))>;
5487
+ def : Pat<(v4i32 (InFrag immAllZerosV, (v4i32 V128:$Rn))),
5488
+ (v4i32 (!cast<Instruction>(INST # v4i32rz) (v4i32 V128:$Rn)))>;
5489
+ def : Pat<(v2i64 (InFrag immAllZerosV, (v2i64 V128:$Rn))),
5490
+ (v2i64 (!cast<Instruction>(INST # v2i64rz) (v2i64 V128:$Rn)))>;
5491
+ }
5492
+
5493
+ defm : SelectSetCCZeroLHS<seteq, "CMEQ">;
5494
+ defm : SelectSetCCZeroLHS<setgt, "CMLT">;
5495
+ defm : SelectSetCCZeroLHS<setge, "CMLE">;
5496
+ defm : SelectSetCCZeroLHS<setlt, "CMGT">;
5497
+ defm : SelectSetCCZeroLHS<setle, "CMGE">;
5498
+
5453
5499
let Predicates = [HasNEON] in {
5454
5500
def : InstAlias<"mov{\t$dst.16b, $src.16b|.16b\t$dst, $src}",
5455
5501
(ORRv16i8 V128:$dst, V128:$src, V128:$src), 1>;
0 commit comments