@@ -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