@@ -301,14 +301,6 @@ def C_ADDI4SPN : RVInst16CIW<0b000, 0b00, (outs GPRC:$rd),
301301  let Inst{5} = imm{3};
302302}
303303
304- let Predicates = [HasStdExtCOrZcd, HasStdExtD] in
305- def C_FLD  : CLoad_ri<0b001, "c.fld", FPR64C, uimm8_lsb000>,
306-              Sched<[WriteFLD64, ReadFMemBase]> {
307-   bits<8> imm;
308-   let Inst{12-10} = imm{5-3};
309-   let Inst{6-5} = imm{7-6};
310- }
311- 
312304def C_LW : CLoad_ri<0b010, "c.lw", GPRC, uimm7_lsb00>,
313305           Sched<[WriteLDW, ReadMemBase]> {
314306  bits<7> imm;
@@ -326,16 +318,6 @@ def C_LW_INX : CLoad_ri<0b010, "c.lw", GPRF32C, uimm7_lsb00>,
326318  let Inst{5} = imm{6};
327319}
328320
329- let DecoderNamespace = "RV32Only",
330-     Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32] in
331- def C_FLW  : CLoad_ri<0b011, "c.flw", FPR32C, uimm7_lsb00>,
332-              Sched<[WriteFLD32, ReadFMemBase]> {
333-   bits<7> imm;
334-   let Inst{12-10} = imm{5-3};
335-   let Inst{6} = imm{2};
336-   let Inst{5} = imm{6};
337- }
338- 
339321let Predicates = [HasStdExtZca, IsRV64] in
340322def C_LD : CLoad_ri<0b011, "c.ld", GPRC, uimm8_lsb000>,
341323           Sched<[WriteLDD, ReadMemBase]> {
@@ -344,14 +326,6 @@ def C_LD : CLoad_ri<0b011, "c.ld", GPRC, uimm8_lsb000>,
344326  let Inst{6-5} = imm{7-6};
345327}
346328
347- let Predicates = [HasStdExtCOrZcd, HasStdExtD] in
348- def C_FSD  : CStore_rri<0b101, "c.fsd", FPR64C, uimm8_lsb000>,
349-              Sched<[WriteFST64, ReadFStoreData, ReadFMemBase]> {
350-   bits<8> imm;
351-   let Inst{12-10} = imm{5-3};
352-   let Inst{6-5} = imm{7-6};
353- }
354- 
355329def C_SW : CStore_rri<0b110, "c.sw", GPRC, uimm7_lsb00>,
356330           Sched<[WriteSTW, ReadStoreData, ReadMemBase]> {
357331  bits<7> imm;
@@ -369,16 +343,6 @@ def C_SW_INX : CStore_rri<0b110, "c.sw", GPRF32C, uimm7_lsb00>,
369343  let Inst{5} = imm{6};
370344}
371345
372- let DecoderNamespace = "RV32Only",
373-     Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32]  in
374- def C_FSW  : CStore_rri<0b111, "c.fsw", FPR32C, uimm7_lsb00>,
375-              Sched<[WriteFST32, ReadFStoreData, ReadFMemBase]> {
376-   bits<7> imm;
377-   let Inst{12-10} = imm{5-3};
378-   let Inst{6} = imm{2};
379-   let Inst{5} = imm{6};
380- }
381- 
382346let Predicates = [HasStdExtZca, IsRV64] in
383347def C_SD : CStore_rri<0b111, "c.sd", GPRC, uimm8_lsb000>,
384348           Sched<[WriteSTD, ReadStoreData, ReadMemBase]> {
@@ -500,12 +464,6 @@ def C_SLLI : RVInst16CI<0b000, 0b10, (outs GPR:$rd_wb),
500464  let Constraints = "$rd = $rd_wb";
501465}
502466
503- let Predicates = [HasStdExtCOrZcd, HasStdExtD] in
504- def C_FLDSP  : CStackLoad<0b001, "c.fldsp", FPR64, uimm9_lsb000>,
505-                Sched<[WriteFLD64, ReadFMemBase]> {
506-   let Inst{4-2} = imm{8-6};
507- }
508- 
509467def C_LWSP : CStackLoad<0b010, "c.lwsp", GPRNoX0, uimm8_lsb00>,
510468             Sched<[WriteLDW, ReadMemBase]> {
511469  let Inst{3-2} = imm{7-6};
@@ -517,13 +475,6 @@ def C_LWSP_INX : CStackLoad<0b010, "c.lwsp", GPRF32NoX0, uimm8_lsb00>,
517475  let Inst{3-2} = imm{7-6};
518476}
519477
520- let DecoderNamespace = "RV32Only",
521-     Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32] in
522- def C_FLWSP  : CStackLoad<0b011, "c.flwsp", FPR32, uimm8_lsb00>,
523-                Sched<[WriteFLD32, ReadFMemBase]> {
524-   let Inst{3-2} = imm{7-6};
525- }
526- 
527478let Predicates = [HasStdExtZca, IsRV64] in
528479def C_LDSP : CStackLoad<0b011, "c.ldsp", GPRNoX0, uimm9_lsb000>,
529480             Sched<[WriteLDD, ReadMemBase]> {
@@ -560,12 +511,6 @@ def C_ADD : RVInst16CR<0b1001, 0b10, (outs GPR:$rd),
560511  let Constraints = "$rs1 = $rd";
561512}
562513
563- let Predicates = [HasStdExtCOrZcd, HasStdExtD] in
564- def C_FSDSP  : CStackStore<0b101, "c.fsdsp", FPR64, uimm9_lsb000>,
565-                Sched<[WriteFST64, ReadFStoreData, ReadFMemBase]> {
566-   let Inst{9-7}   = imm{8-6};
567- }
568- 
569514def C_SWSP : CStackStore<0b110, "c.swsp", GPR, uimm8_lsb00>,
570515             Sched<[WriteSTW, ReadStoreData, ReadMemBase]> {
571516  let Inst{8-7}  = imm{7-6};
@@ -577,13 +522,6 @@ def C_SWSP_INX : CStackStore<0b110, "c.swsp", GPRF32, uimm8_lsb00>,
577522  let Inst{8-7}  = imm{7-6};
578523}
579524
580- let DecoderNamespace = "RV32Only",
581-     Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32] in
582- def C_FSWSP  : CStackStore<0b111, "c.fswsp", FPR32, uimm8_lsb00>,
583-                Sched<[WriteFST32, ReadFStoreData, ReadFMemBase]> {
584-   let Inst{8-7}  = imm{7-6};
585- }
586- 
587525let Predicates = [HasStdExtZca, IsRV64] in
588526def C_SDSP : CStackStore<0b111, "c.sdsp", GPR, uimm9_lsb000>,
589527             Sched<[WriteSTD, ReadStoreData, ReadMemBase]> {
@@ -600,6 +538,61 @@ def C_UNIMP : RVInst16<(outs), (ins), "c.unimp", "", [], InstFormatOther>,
600538
601539} // Predicates = [HasStdExtZca]
602540
541+ let DecoderNamespace = "RV32Only",
542+     Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32] in {
543+   def C_FLW  : CLoad_ri<0b011, "c.flw", FPR32C, uimm7_lsb00>,
544+                Sched<[WriteFLD32, ReadFMemBase]> {
545+     bits<7> imm;
546+     let Inst{12-10} = imm{5-3};
547+     let Inst{6} = imm{2};
548+     let Inst{5} = imm{6};
549+   }
550+ 
551+   def C_FSW  : CStore_rri<0b111, "c.fsw", FPR32C, uimm7_lsb00>,
552+                Sched<[WriteFST32, ReadFStoreData, ReadFMemBase]> {
553+     bits<7> imm;
554+     let Inst{12-10} = imm{5-3};
555+     let Inst{6} = imm{2};
556+     let Inst{5} = imm{6};
557+   }
558+ 
559+   def C_FLWSP  : CStackLoad<0b011, "c.flwsp", FPR32, uimm8_lsb00>,
560+                  Sched<[WriteFLD32, ReadFMemBase]> {
561+     let Inst{3-2} = imm{7-6};
562+   }
563+ 
564+   def C_FSWSP  : CStackStore<0b111, "c.fswsp", FPR32, uimm8_lsb00>,
565+                  Sched<[WriteFST32, ReadFStoreData, ReadFMemBase]> {
566+     let Inst{8-7}  = imm{7-6};
567+   }
568+ } // DecoderNamespace = "RV32Only", Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32]
569+ 
570+ let Predicates = [HasStdExtCOrZcd, HasStdExtD] in {
571+   def C_FLD  : CLoad_ri<0b001, "c.fld", FPR64C, uimm8_lsb000>,
572+                Sched<[WriteFLD64, ReadFMemBase]> {
573+     bits<8> imm;
574+     let Inst{12-10} = imm{5-3};
575+     let Inst{6-5} = imm{7-6};
576+   }
577+ 
578+   def C_FSD  : CStore_rri<0b101, "c.fsd", FPR64C, uimm8_lsb000>,
579+                Sched<[WriteFST64, ReadFStoreData, ReadFMemBase]> {
580+     bits<8> imm;
581+     let Inst{12-10} = imm{5-3};
582+     let Inst{6-5} = imm{7-6};
583+   }
584+ 
585+   def C_FLDSP  : CStackLoad<0b001, "c.fldsp", FPR64, uimm9_lsb000>,
586+                  Sched<[WriteFLD64, ReadFMemBase]> {
587+     let Inst{4-2} = imm{8-6};
588+   }
589+ 
590+   def C_FSDSP  : CStackStore<0b101, "c.fsdsp", FPR64, uimm9_lsb000>,
591+                  Sched<[WriteFST64, ReadFStoreData, ReadFMemBase]> {
592+     let Inst{9-7}   = imm{8-6};
593+   }
594+ } // Predicates = [HasStdExtCOrZcd, HasStdExtD] in {
595+ 
603596//===----------------------------------------------------------------------===//
604597// HINT Instructions
605598//===----------------------------------------------------------------------===//
@@ -767,20 +760,17 @@ def : InstAlias<".insn_cj $opcode, $funct3, $imm11",
767760// Compress Instruction tablegen backend.
768761//===----------------------------------------------------------------------===//
769762
770- // Patterns  are defined in the same order the compressed instructions appear
763+ // Zca patterns  are defined in the same order the compressed instructions appear
771764// under the "RVC Instruction Set Listings" section of the ISA manual.
772765
766+ // Zca Instructions
767+ 
773768// Quadrant 0
774769let Predicates = [HasStdExtZca] in {
775770def : CompressPat<(ADDI GPRC:$rd, SP:$rs1, uimm10_lsb00nonzero:$imm),
776771                  (C_ADDI4SPN GPRC:$rd, SP:$rs1, uimm10_lsb00nonzero:$imm)>;
777772} // Predicates = [HasStdExtZca]
778773
779- let Predicates = [HasStdExtCOrZcd, HasStdExtD] in {
780- def : CompressPat<(FLD FPR64C:$rd, GPRCMem:$rs1, uimm8_lsb000:$imm),
781-                   (C_FLD FPR64C:$rd, GPRCMem:$rs1, uimm8_lsb000:$imm)>;
782- } // Predicates = [HasStdExtCOrZcd, HasStdExtD]
783- 
784774let Predicates = [HasStdExtZca] in {
785775def : CompressPat<(LW GPRC:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm),
786776                  (C_LW GPRC:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm)>;
@@ -790,21 +780,11 @@ def : CompressPat<(LW_INX GPRF32C:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm),
790780                  (C_LW_INX GPRF32C:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm)>;
791781} // Predicates = [HasStdExtZca]
792782
793- let Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32] in {
794- def : CompressPat<(FLW FPR32C:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm),
795-                   (C_FLW FPR32C:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm)>;
796- } // Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32]
797- 
798783let Predicates = [HasStdExtZca, IsRV64] in {
799784def : CompressPat<(LD GPRC:$rd, GPRCMem:$rs1, uimm8_lsb000:$imm),
800785                  (C_LD GPRC:$rd, GPRCMem:$rs1, uimm8_lsb000:$imm)>;
801786} // Predicates = [HasStdExtZca, IsRV64]
802787
803- let Predicates = [HasStdExtCOrZcd, HasStdExtD] in {
804- def : CompressPat<(FSD FPR64C:$rs2, GPRCMem:$rs1, uimm8_lsb000:$imm),
805-                   (C_FSD FPR64C:$rs2, GPRCMem:$rs1, uimm8_lsb000:$imm)>;
806- } // Predicates = [HasStdExtCOrZcd, HasStdExtD]
807- 
808788let Predicates = [HasStdExtZca] in {
809789def : CompressPat<(SW GPRC:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm),
810790                  (C_SW GPRC:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm)>;
@@ -814,11 +794,6 @@ def : CompressPat<(SW_INX GPRF32C:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm),
814794                  (C_SW_INX GPRF32C:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm)>;
815795} // Predicates = [HasStdExtZca]
816796
817- let Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32] in {
818- def : CompressPat<(FSW FPR32C:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm),
819-                   (C_FSW FPR32C:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm)>;
820- } // Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32]
821- 
822797let Predicates = [HasStdExtZca, IsRV64] in {
823798def : CompressPat<(SD GPRC:$rs2, GPRCMem:$rs1, uimm8_lsb000:$imm),
824799                  (C_SD GPRC:$rs2, GPRCMem:$rs1, uimm8_lsb000:$imm)>;
@@ -907,11 +882,6 @@ def : CompressPat<(SLLI GPRNoX0:$rs1, GPRNoX0:$rs1, uimmlog2xlennonzero:$imm),
907882                  (C_SLLI GPRNoX0:$rs1, uimmlog2xlennonzero:$imm)>;
908883} // Predicates = [HasStdExtZca]
909884
910- let Predicates = [HasStdExtCOrZcd, HasStdExtD] in {
911- def : CompressPat<(FLD FPR64:$rd, SPMem:$rs1, uimm9_lsb000:$imm),
912-                   (C_FLDSP FPR64:$rd, SPMem:$rs1, uimm9_lsb000:$imm)>;
913- } // Predicates = [HasStdExtCOrZcd, HasStdExtD]
914- 
915885let Predicates = [HasStdExtZca] in {
916886def : CompressPat<(LW GPRNoX0:$rd, SPMem:$rs1,  uimm8_lsb00:$imm),
917887                  (C_LWSP GPRNoX0:$rd, SPMem:$rs1, uimm8_lsb00:$imm)>;
@@ -921,11 +891,6 @@ def : CompressPat<(LW_INX GPRF32NoX0:$rd, SPMem:$rs1,  uimm8_lsb00:$imm),
921891                  (C_LWSP_INX GPRF32NoX0:$rd, SPMem:$rs1, uimm8_lsb00:$imm)>;
922892} // Predicates = [HasStdExtZca]
923893
924- let Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32] in {
925- def : CompressPat<(FLW FPR32:$rd, SPMem:$rs1, uimm8_lsb00:$imm),
926-                   (C_FLWSP FPR32:$rd, SPMem:$rs1, uimm8_lsb00:$imm)>;
927- } // Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32]
928- 
929894let Predicates = [HasStdExtZca, IsRV64] in {
930895def : CompressPat<(LD GPRNoX0:$rd, SPMem:$rs1, uimm9_lsb000:$imm),
931896                  (C_LDSP GPRNoX0:$rd, SPMem:$rs1, uimm9_lsb000:$imm)>;
@@ -953,11 +918,6 @@ def : CompressPat<(ADD GPRNoX0:$rs1, GPRNoX0:$rs2, GPRNoX0:$rs1),
953918                  (C_ADD GPRNoX0:$rs1, GPRNoX0:$rs2)>;
954919} // Predicates = [HasStdExtZca]
955920
956- let Predicates = [HasStdExtCOrZcd, HasStdExtD] in {
957- def : CompressPat<(FSD FPR64:$rs2, SPMem:$rs1, uimm9_lsb000:$imm),
958-                   (C_FSDSP FPR64:$rs2, SPMem:$rs1, uimm9_lsb000:$imm)>;
959- } // Predicates = [HasStdExtCOrZcd, HasStdExtD]
960- 
961921let Predicates = [HasStdExtZca] in {
962922def : CompressPat<(SW GPR:$rs2, SPMem:$rs1, uimm8_lsb00:$imm),
963923                  (C_SWSP GPR:$rs2, SPMem:$rs1, uimm8_lsb00:$imm)>;
@@ -967,12 +927,38 @@ def : CompressPat<(SW_INX GPRF32:$rs2, SPMem:$rs1, uimm8_lsb00:$imm),
967927                  (C_SWSP_INX GPRF32:$rs2, SPMem:$rs1, uimm8_lsb00:$imm)>;
968928} // Predicates = [HasStdExtZca]
969929
970- let Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32] in {
971- def : CompressPat<(FSW FPR32:$rs2, SPMem:$rs1, uimm8_lsb00:$imm),
972-                   (C_FSWSP FPR32:$rs2, SPMem:$rs1, uimm8_lsb00:$imm)>;
973- } // Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32]
974- 
975930let Predicates = [HasStdExtZca, IsRV64] in {
976931def : CompressPat<(SD GPR:$rs2, SPMem:$rs1, uimm9_lsb000:$imm),
977932                  (C_SDSP GPR:$rs2, SPMem:$rs1, uimm9_lsb000:$imm)>;
978933} // Predicates = [HasStdExtZca, IsRV64]
934+ 
935+ // Zcf Instructions
936+ let Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32] in {
937+   // Quadrant 0
938+   def : CompressPat<(FLW FPR32C:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm),
939+                     (C_FLW FPR32C:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm)>;
940+   def : CompressPat<(FSW FPR32C:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm),
941+                     (C_FSW FPR32C:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm)>;
942+ 
943+   // Quadrant 2
944+   def : CompressPat<(FLW FPR32:$rd, SPMem:$rs1, uimm8_lsb00:$imm),
945+                     (C_FLWSP FPR32:$rd, SPMem:$rs1, uimm8_lsb00:$imm)>;
946+   def : CompressPat<(FSW FPR32:$rs2, SPMem:$rs1, uimm8_lsb00:$imm),
947+                     (C_FSWSP FPR32:$rs2, SPMem:$rs1, uimm8_lsb00:$imm)>;
948+ } // Predicates = [HasStdExtCOrZcfOrZce, HasStdExtF, IsRV32]
949+ 
950+ // Zcd Instructions
951+ let Predicates = [HasStdExtCOrZcd, HasStdExtD] in {
952+   // Quadrant 0
953+   def : CompressPat<(FLD FPR64C:$rd, GPRCMem:$rs1, uimm8_lsb000:$imm),
954+                     (C_FLD FPR64C:$rd, GPRCMem:$rs1, uimm8_lsb000:$imm)>;
955+   def : CompressPat<(FSD FPR64C:$rs2, GPRCMem:$rs1, uimm8_lsb000:$imm),
956+                     (C_FSD FPR64C:$rs2, GPRCMem:$rs1, uimm8_lsb000:$imm)>;
957+ 
958+   // Quadrant 2
959+   def : CompressPat<(FLD FPR64:$rd, SPMem:$rs1, uimm9_lsb000:$imm),
960+                     (C_FLDSP FPR64:$rd, SPMem:$rs1, uimm9_lsb000:$imm)>;
961+   def : CompressPat<(FSD FPR64:$rs2, SPMem:$rs1, uimm9_lsb000:$imm),
962+                     (C_FSDSP FPR64:$rs2, SPMem:$rs1, uimm9_lsb000:$imm)>;
963+ } // Predicates = [HasStdExtCOrZcd, HasStdExtD]
964+ 
0 commit comments