@@ -415,17 +415,22 @@ let Predicates = [HasStdExtZbkb, IsRV64], IsSignExtendingOpW = 1 in
415
415
def PACKW : ALUW_rr<0b0000100, 0b100, "packw">,
416
416
Sched<[WritePACK32, ReadPACK32, ReadPACK32]>;
417
417
418
- let Predicates = [HasStdExtZbbOrZbkb , IsRV32] in {
418
+ let Predicates = [HasStdExtZbb , IsRV32] in {
419
419
def ZEXT_H_RV32 : RVBUnary<0b000010000000, 0b100, OPC_OP, "zext.h">,
420
420
Sched<[WriteIALU, ReadIALU]>;
421
+ } // Predicates = [HasStdExtZbb, IsRV32]
422
+
423
+ let Predicates = [HasStdExtZbb, IsRV64], IsSignExtendingOpW = 1 in {
424
+ def ZEXT_H_RV64 : RVBUnary<0b000010000000, 0b100, OPC_OP_32, "zext.h">,
425
+ Sched<[WriteIALU, ReadIALU]>;
426
+ } // Predicates = [HasStdExtZbb, IsRV64]
427
+
428
+ let Predicates = [HasStdExtZbbOrZbkb, IsRV32] in {
421
429
def REV8_RV32 : RVBUnary<0b011010011000, 0b101, OPC_OP_IMM, "rev8">,
422
430
Sched<[WriteREV8, ReadREV8]>;
423
431
} // Predicates = [HasStdExtZbbOrZbkb, IsRV32]
424
432
425
433
let Predicates = [HasStdExtZbbOrZbkb, IsRV64] in {
426
- let IsSignExtendingOpW = 1 in
427
- def ZEXT_H_RV64 : RVBUnary<0b000010000000, 0b100, OPC_OP_32, "zext.h">,
428
- Sched<[WriteIALU, ReadIALU]>;
429
434
def REV8_RV64 : RVBUnary<0b011010111000, 0b101, OPC_OP_IMM, "rev8">,
430
435
Sched<[WriteREV8, ReadREV8]>;
431
436
} // Predicates = [HasStdExtZbbOrZbkb, IsRV64]
@@ -476,6 +481,14 @@ def : InstAlias<"bext $rd, $rs1, $shamt",
476
481
(BEXTI GPR:$rd, GPR:$rs1, uimmlog2xlen:$shamt), 0>;
477
482
} // Predicates = [HasStdExtZbs]
478
483
484
+ let Predicates = [HasStdExtZbkb, NoStdExtZbb, IsRV32] in {
485
+ def : InstAlias<"zext.h $rd, $rs", (PACK GPR:$rd, GPR:$rs, X0)>;
486
+ } // Predicates = [HasStdExtZbkb, NoStdExtZbb, IsRV32]
487
+
488
+ let Predicates = [HasStdExtZbkb, NoStdExtZbb, IsRV64] in {
489
+ def : InstAlias<"zext.h $rd, $rs", (PACKW GPR:$rd, GPR:$rs, X0)>;
490
+ } // Predicates = [HasStdExtZbkb, NoStdExtZbb, IsRV64]
491
+
479
492
//===----------------------------------------------------------------------===//
480
493
// Codegen patterns
481
494
//===----------------------------------------------------------------------===//
@@ -632,11 +645,16 @@ def : Pat<(i64 (or (sext_inreg (shl GPR:$rs2, (i64 16)), i32),
632
645
(PACKW GPR:$rs1, GPR:$rs2)>;
633
646
} // Predicates = [HasStdExtZbkb, IsRV64]
634
647
635
- let Predicates = [HasStdExtZbbOrZbkb , IsRV32] in
648
+ let Predicates = [HasStdExtZbb , IsRV32] in
636
649
def : Pat<(i32 (and GPR:$rs, 0xFFFF)), (ZEXT_H_RV32 GPR:$rs)>;
637
- let Predicates = [HasStdExtZbbOrZbkb , IsRV64] in
650
+ let Predicates = [HasStdExtZbb , IsRV64] in
638
651
def : Pat<(i64 (and GPR:$rs, 0xFFFF)), (ZEXT_H_RV64 GPR:$rs)>;
639
652
653
+ let Predicates = [HasStdExtZbkb, NoStdExtZbb, IsRV32] in
654
+ def : Pat<(i32 (and GPR:$rs, 0xFFFF)), (PACK GPR:$rs, (XLenVT X0))>;
655
+ let Predicates = [HasStdExtZbkb, NoStdExtZbb, IsRV64] in
656
+ def : Pat<(i64 (and GPR:$rs, 0xFFFF)), (PACKW GPR:$rs, (XLenVT X0))>;
657
+
640
658
let Predicates = [HasStdExtZba] in {
641
659
642
660
foreach i = {1,2,3} in {
@@ -743,11 +761,13 @@ def : PatGpr<ctpop, CPOPW, i32>;
743
761
744
762
def : Pat<(i32 (sext_inreg GPR:$rs1, i8)), (SEXT_B GPR:$rs1)>;
745
763
def : Pat<(i32 (sext_inreg GPR:$rs1, i16)), (SEXT_H GPR:$rs1)>;
746
- } // Predicates = [HasStdExtZbb, IsRV64]
747
764
748
- let Predicates = [HasStdExtZbbOrZbkb, IsRV64] in {
749
765
def : Pat<(i32 (and GPR:$rs, 0xFFFF)), (ZEXT_H_RV64 GPR:$rs)>;
750
- } // Predicates = [HasStdExtZbbOrZbkb, IsRV64]
766
+ } // Predicates = [HasStdExtZbb, IsRV64]
767
+
768
+ let Predicates = [HasStdExtZbkb, NoStdExtZbb, IsRV64] in {
769
+ def : Pat<(i32 (and GPR:$rs, 0xFFFF)), (PACKW GPR:$rs, (XLenVT X0))>;
770
+ }
751
771
752
772
let Predicates = [HasStdExtZbbOrZbkb, IsRV64] in {
753
773
def : Pat<(i32 (and GPR:$rs1, (not GPR:$rs2))), (ANDN GPR:$rs1, GPR:$rs2)>;
0 commit comments