Skip to content

Commit 4a0c307

Browse files
committed
[RISCV][NFCI] Reorder RISCVRegsiterInfo.td
Also adds some headers so different sections are easier to identify.
1 parent 69879ff commit 4a0c307

File tree

1 file changed

+101
-77
lines changed

1 file changed

+101
-77
lines changed

llvm/lib/Target/RISCV/RISCVRegisterInfo.td

Lines changed: 101 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -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

280283
def 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+
283347
let 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+
538633
foreach 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

653748
def 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.
730751
def VM : VReg<VMaskVTs, (add VR), 1>;
731752

@@ -770,7 +791,10 @@ foreach m = LMULList in {
770791
}
771792
}
772793

794+
//===----------------------------------------------------------------------===//
773795
// Special registers
796+
//===----------------------------------------------------------------------===//
797+
774798
def FFLAGS : RISCVReg<0, "fflags">;
775799
def FRM : RISCVReg<0, "frm">;
776800

0 commit comments

Comments
 (0)