@@ -74,7 +74,10 @@ def sub_gpr_odd : SubRegIndex<32, 32> {
7474}
7575} // Namespace = "RISCV"
7676
77- // Integer registers
77+ //===----------------------------------------------------------------------===//
78+ // General Purpose Registers (aka Integer Registers)
79+ //===----------------------------------------------------------------------===//
80+
7881// CostPerUse is set higher for registers that may not be compressible as they
7982// are not part of GPRC, the most restrictive register class used by the
8083// compressed instruction set. This will influence the greedy register
@@ -279,7 +282,68 @@ def SR07 : GPRRegisterClass<(add (sequence "X%u", 8, 9),
279282
280283def GPRX1X5 : GPRRegisterClass<(add X1, X5)>;
281284
282- // Floating point registers
285+ //===----------------------------------------------------------------------===//
286+ // Even-Odd GPR Pairs
287+ //===----------------------------------------------------------------------===//
288+
289+ def XLenPairRI : RegInfoByHwMode<
290+ [RV32, RV64],
291+ [RegInfo<64, 64, 32>, RegInfo<128, 128, 64>]>;
292+
293+ // Dummy zero register for use in the register pair containing X0 (as X1 is
294+ // not read to or written when the X0 register pair is used).
295+ def DUMMY_REG_PAIR_WITH_X0 : RISCVReg<0, "0">;
296+
297+ // Must add DUMMY_REG_PAIR_WITH_X0 to a separate register class to prevent the
298+ // register's existence from changing codegen (due to the regPressureSetLimit
299+ // for the GPR register class being altered).
300+ def GPRAll : GPRRegisterClass<(add GPR, DUMMY_REG_PAIR_WITH_X0)>;
301+
302+ let RegAltNameIndices = [ABIRegAltName] in {
303+ def X0_Pair : RISCVRegWithSubRegs<0, X0.AsmName,
304+ [X0, DUMMY_REG_PAIR_WITH_X0],
305+ X0.AltNames> {
306+ let SubRegIndices = [sub_gpr_even, sub_gpr_odd];
307+ let CoveredBySubRegs = 1;
308+ }
309+ foreach I = 1-15 in {
310+ defvar Index = !shl(I, 1);
311+ defvar IndexP1 = !add(Index, 1);
312+ defvar Reg = !cast<Register>("X"#Index);
313+ defvar RegP1 = !cast<Register>("X"#IndexP1);
314+ def "X" # Index #"_X" # IndexP1 : RISCVRegWithSubRegs<Index,
315+ Reg.AsmName,
316+ [Reg, RegP1],
317+ Reg.AltNames> {
318+ let SubRegIndices = [sub_gpr_even, sub_gpr_odd];
319+ let CoveredBySubRegs = 1;
320+ }
321+ }
322+ }
323+
324+ let RegInfos = XLenPairRI,
325+ DecoderMethod = "DecodeGPRPairRegisterClass" in {
326+ def GPRPair : RISCVRegisterClass<[XLenPairFVT], 64, (add
327+ X10_X11, X12_X13, X14_X15, X16_X17,
328+ X6_X7,
329+ X28_X29, X30_X31,
330+ X8_X9,
331+ X18_X19, X20_X21, X22_X23, X24_X25, X26_X27,
332+ X0_Pair, X2_X3, X4_X5
333+ )>;
334+
335+ def GPRPairNoX0 : RISCVRegisterClass<[XLenPairFVT], 64, (sub GPRPair, X0_Pair)>;
336+ } // let RegInfos = XLenPairRI, DecoderMethod = "DecodeGPRPairRegisterClass"
337+
338+ let RegInfos = XLenPairRI in
339+ def GPRPairC : RISCVRegisterClass<[XLenPairFVT], 64, (add
340+ X10_X11, X12_X13, X14_X15, X8_X9
341+ )>;
342+
343+ //===----------------------------------------------------------------------===//
344+ // Floating Point registers
345+ //===----------------------------------------------------------------------===//
346+
283347let RegAltNameIndices = [ABIRegAltName] in {
284348 def F0_H : RISCVReg16<0, "f0", ["ft0"]>, DwarfRegNum<[32]>;
285349 def F1_H : RISCVReg16<1, "f1", ["ft1"]>, DwarfRegNum<[33]>;
@@ -373,8 +437,36 @@ def FPR64C : RISCVRegisterClass<[f64], 64, (add
373437 (sequence "F%u_D", 8, 9)
374438)>;
375439
440+ //===----------------------------------------------------------------------===//
441+ // GPR Classes for "H/F/D in X"
442+ //===----------------------------------------------------------------------===//
443+
444+ // 16-bit GPR sub-register class used by Zhinx instructions.
445+ def GPRF16 : RISCVRegisterClass<[f16], 16, (add (sequence "X%u_H", 10, 17),
446+ (sequence "X%u_H", 5, 7),
447+ (sequence "X%u_H", 28, 31),
448+ (sequence "X%u_H", 8, 9),
449+ (sequence "X%u_H", 18, 27),
450+ (sequence "X%u_H", 0, 4))>;
451+ def GPRF16C : RISCVRegisterClass<[f16], 16, (add (sequence "X%u_H", 10, 15),
452+ (sequence "X%u_H", 8, 9))>;
453+ def GPRF16NoX0 : RISCVRegisterClass<[f16], 16, (sub GPRF16, X0_H)>;
454+
455+ def GPRF32 : RISCVRegisterClass<[f32], 32, (add (sequence "X%u_W", 10, 17),
456+ (sequence "X%u_W", 5, 7),
457+ (sequence "X%u_W", 28, 31),
458+ (sequence "X%u_W", 8, 9),
459+ (sequence "X%u_W", 18, 27),
460+ (sequence "X%u_W", 0, 4))>;
461+ def GPRF32C : RISCVRegisterClass<[f32], 32, (add (sequence "X%u_W", 10, 15),
462+ (sequence "X%u_W", 8, 9))>;
463+ def GPRF32NoX0 : RISCVRegisterClass<[f32], 32, (sub GPRF32, X0_W)>;
464+
465+
466+ //===----------------------------------------------------------------------===//
376467// Vector type mapping to LLVM types.
377- //
468+ //===----------------------------------------------------------------------===//
469+
378470// The V vector extension requires that VLEN >= 128 and <= 65536.
379471// Additionally, the only supported ELEN values are 32 and 64,
380472// thus `vscale` can be defined as VLEN/64,
@@ -534,7 +626,10 @@ class VRegList<list<dag> LIn, int start, int nf, int lmul, bit isV0> {
534626 !foreach(i, IndexSet<start, nf, lmul, isV0>.R, "v" # i));
535627}
536628
629+ //===----------------------------------------------------------------------===//
537630// Vector registers
631+ //===----------------------------------------------------------------------===//
632+
538633foreach Index = !range(0, 32, 1) in {
539634 def V#Index : RISCVReg<Index, "v"#Index>, DwarfRegNum<[!add(Index, 96)]>;
540635}
@@ -652,80 +747,6 @@ def VRM8NoV0 : VReg<VM8VTs, (sub VRM8, V0M8), 8>;
652747
653748def VMV0 : VReg<VMaskVTs, (add V0), 1>;
654749
655- // 16-bit GPR sub-register class used by Zhinx instructions.
656- def GPRF16 : RISCVRegisterClass<[f16], 16, (add (sequence "X%u_H", 10, 17),
657- (sequence "X%u_H", 5, 7),
658- (sequence "X%u_H", 28, 31),
659- (sequence "X%u_H", 8, 9),
660- (sequence "X%u_H", 18, 27),
661- (sequence "X%u_H", 0, 4))>;
662- def GPRF16C : RISCVRegisterClass<[f16], 16, (add (sequence "X%u_H", 10, 15),
663- (sequence "X%u_H", 8, 9))>;
664- def GPRF16NoX0 : RISCVRegisterClass<[f16], 16, (sub GPRF16, X0_H)>;
665-
666- def GPRF32 : RISCVRegisterClass<[f32], 32, (add (sequence "X%u_W", 10, 17),
667- (sequence "X%u_W", 5, 7),
668- (sequence "X%u_W", 28, 31),
669- (sequence "X%u_W", 8, 9),
670- (sequence "X%u_W", 18, 27),
671- (sequence "X%u_W", 0, 4))>;
672- def GPRF32C : RISCVRegisterClass<[f32], 32, (add (sequence "X%u_W", 10, 15),
673- (sequence "X%u_W", 8, 9))>;
674- def GPRF32NoX0 : RISCVRegisterClass<[f32], 32, (sub GPRF32, X0_W)>;
675-
676- def XLenPairRI : RegInfoByHwMode<
677- [RV32, RV64],
678- [RegInfo<64, 64, 32>, RegInfo<128, 128, 64>]>;
679-
680- // Dummy zero register for use in the register pair containing X0 (as X1 is
681- // not read to or written when the X0 register pair is used).
682- def DUMMY_REG_PAIR_WITH_X0 : RISCVReg<0, "0">;
683-
684- // Must add DUMMY_REG_PAIR_WITH_X0 to a separate register class to prevent the
685- // register's existence from changing codegen (due to the regPressureSetLimit
686- // for the GPR register class being altered).
687- def GPRAll : GPRRegisterClass<(add GPR, DUMMY_REG_PAIR_WITH_X0)>;
688-
689- let RegAltNameIndices = [ABIRegAltName] in {
690- def X0_Pair : RISCVRegWithSubRegs<0, X0.AsmName,
691- [X0, DUMMY_REG_PAIR_WITH_X0],
692- X0.AltNames> {
693- let SubRegIndices = [sub_gpr_even, sub_gpr_odd];
694- let CoveredBySubRegs = 1;
695- }
696- foreach I = 1-15 in {
697- defvar Index = !shl(I, 1);
698- defvar IndexP1 = !add(Index, 1);
699- defvar Reg = !cast<Register>("X"#Index);
700- defvar RegP1 = !cast<Register>("X"#IndexP1);
701- def "X" # Index #"_X" # IndexP1 : RISCVRegWithSubRegs<Index,
702- Reg.AsmName,
703- [Reg, RegP1],
704- Reg.AltNames> {
705- let SubRegIndices = [sub_gpr_even, sub_gpr_odd];
706- let CoveredBySubRegs = 1;
707- }
708- }
709- }
710-
711- let RegInfos = XLenPairRI,
712- DecoderMethod = "DecodeGPRPairRegisterClass" in {
713- def GPRPair : RISCVRegisterClass<[XLenPairFVT], 64, (add
714- X10_X11, X12_X13, X14_X15, X16_X17,
715- X6_X7,
716- X28_X29, X30_X31,
717- X8_X9,
718- X18_X19, X20_X21, X22_X23, X24_X25, X26_X27,
719- X0_Pair, X2_X3, X4_X5
720- )>;
721-
722- def GPRPairC : RISCVRegisterClass<[XLenPairFVT], 64, (add
723- X10_X11, X12_X13, X14_X15, X8_X9
724- )>;
725-
726- def GPRPairNoX0 : RISCVRegisterClass<[XLenPairFVT], 64, (sub GPRPair, X0_Pair)>;
727- } // let RegInfos = XLenPairRI, DecoderMethod = "DecodeGPRPairRegisterClass"
728-
729750// The register class is added for inline assembly for vector mask types.
730751def VM : VReg<VMaskVTs, (add VR), 1>;
731752
@@ -770,7 +791,10 @@ foreach m = LMULList in {
770791 }
771792}
772793
794+ //===----------------------------------------------------------------------===//
773795// Special registers
796+ //===----------------------------------------------------------------------===//
797+
774798def FFLAGS : RISCVReg<0, "fflags">;
775799def FRM : RISCVReg<0, "frm">;
776800
0 commit comments