@@ -5397,6 +5397,52 @@ def : Pat<(AArch64bsp (v4i32 V128:$Rd), V128:$Rn, V128:$Rm),
5397
5397
def : Pat<(AArch64bsp (v2i64 V128:$Rd), V128:$Rn, V128:$Rm),
5398
5398
(BSPv16i8 V128:$Rd, V128:$Rn, V128:$Rm)>;
5399
5399
5400
+ multiclass SelectSetCCZeroRHS<PatFrags InFrag, string INST> {
5401
+ def : Pat<(v8i8 (InFrag (v8i8 V64:$Rn), immAllZerosV)),
5402
+ (v8i8 (!cast<Instruction>(INST # v8i8rz) (v8i8 V64:$Rn)))>;
5403
+ def : Pat<(v16i8 (InFrag (v16i8 V128:$Rn), immAllZerosV)),
5404
+ (v16i8 (!cast<Instruction>(INST # v16i8rz) (v16i8 V128:$Rn)))>;
5405
+ def : Pat<(v4i16 (InFrag (v4i16 V64:$Rn), immAllZerosV)),
5406
+ (v4i16 (!cast<Instruction>(INST # v4i16rz) (v4i16 V64:$Rn)))>;
5407
+ def : Pat<(v8i16 (InFrag (v8i16 V128:$Rn), immAllZerosV)),
5408
+ (v8i16 (!cast<Instruction>(INST # v8i16rz) (v8i16 V128:$Rn)))>;
5409
+ def : Pat<(v2i32 (InFrag (v2i32 V64:$Rn), immAllZerosV)),
5410
+ (v2i32 (!cast<Instruction>(INST # v2i32rz) (v2i32 V64:$Rn)))>;
5411
+ def : Pat<(v4i32 (InFrag (v4i32 V128:$Rn), immAllZerosV)),
5412
+ (v4i32 (!cast<Instruction>(INST # v4i32rz) (v4i32 V128:$Rn)))>;
5413
+ def : Pat<(v2i64 (InFrag (v2i64 V128:$Rn), immAllZerosV)),
5414
+ (v2i64 (!cast<Instruction>(INST # v2i64rz) (v2i64 V128:$Rn)))>;
5415
+ }
5416
+
5417
+ defm : SelectSetCCZeroRHS<seteq, "CMEQ">;
5418
+ defm : SelectSetCCZeroRHS<setgt, "CMGT">;
5419
+ defm : SelectSetCCZeroRHS<setge, "CMGE">;
5420
+ defm : SelectSetCCZeroRHS<setlt, "CMLT">;
5421
+ defm : SelectSetCCZeroRHS<setle, "CMLE">;
5422
+
5423
+ multiclass SelectSetCCZeroLHS<PatFrags InFrag, string INST> {
5424
+ def : Pat<(v8i8 (InFrag immAllZerosV, (v8i8 V64:$Rn))),
5425
+ (v8i8 (!cast<Instruction>(INST # v8i8rz) (v8i8 V64:$Rn)))>;
5426
+ def : Pat<(v16i8 (InFrag immAllZerosV, (v16i8 V128:$Rn))),
5427
+ (v16i8 (!cast<Instruction>(INST # v16i8rz) (v16i8 V128:$Rn)))>;
5428
+ def : Pat<(v4i16 (InFrag immAllZerosV, (v4i16 V64:$Rn))),
5429
+ (v4i16 (!cast<Instruction>(INST # v4i16rz) (v4i16 V64:$Rn)))>;
5430
+ def : Pat<(v8i16 (InFrag immAllZerosV, (v8i16 V128:$Rn))),
5431
+ (v8i16 (!cast<Instruction>(INST # v8i16rz) (v8i16 V128:$Rn)))>;
5432
+ def : Pat<(v2i32 (InFrag immAllZerosV, (v2i32 V64:$Rn))),
5433
+ (v2i32 (!cast<Instruction>(INST # v2i32rz) (v2i32 V64:$Rn)))>;
5434
+ def : Pat<(v4i32 (InFrag immAllZerosV, (v4i32 V128:$Rn))),
5435
+ (v4i32 (!cast<Instruction>(INST # v4i32rz) (v4i32 V128:$Rn)))>;
5436
+ def : Pat<(v2i64 (InFrag immAllZerosV, (v2i64 V128:$Rn))),
5437
+ (v2i64 (!cast<Instruction>(INST # v2i64rz) (v2i64 V128:$Rn)))>;
5438
+ }
5439
+
5440
+ defm : SelectSetCCZeroLHS<seteq, "CMEQ">;
5441
+ defm : SelectSetCCZeroLHS<setgt, "CMLT">;
5442
+ defm : SelectSetCCZeroLHS<setge, "CMLE">;
5443
+ defm : SelectSetCCZeroLHS<setlt, "CMGT">;
5444
+ defm : SelectSetCCZeroLHS<setle, "CMGE">;
5445
+
5400
5446
let Predicates = [HasNEON] in {
5401
5447
def : InstAlias<"mov{\t$dst.16b, $src.16b|.16b\t$dst, $src}",
5402
5448
(ORRv16i8 V128:$dst, V128:$src, V128:$src), 1>;
0 commit comments