aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/Hexagon/HexagonRegisterInfo.td
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/Hexagon/HexagonRegisterInfo.td')
-rw-r--r--lib/Target/Hexagon/HexagonRegisterInfo.td143
1 files changed, 109 insertions, 34 deletions
diff --git a/lib/Target/Hexagon/HexagonRegisterInfo.td b/lib/Target/Hexagon/HexagonRegisterInfo.td
index 1d1e85e7ac7e..1fe1ef4ac572 100644
--- a/lib/Target/Hexagon/HexagonRegisterInfo.td
+++ b/lib/Target/Hexagon/HexagonRegisterInfo.td
@@ -67,6 +67,17 @@ let Namespace = "Hexagon" in {
let HWEncoding{0} = num;
}
+ // Rg - Guest/Hypervisor registers
+ class Rg<bits<5> num, string n,
+ list<string> alt = [], list<Register> alias = []> :
+ HexagonReg<num, n, alt, alias>;
+
+ // Rgg - 64-bit Guest/Hypervisor registers
+ class Rgg<bits<5> num, string n, list<Register> subregs> :
+ HexagonDoubleReg<num, n, subregs> {
+ let SubRegs = subregs;
+ }
+
def isub_lo : SubRegIndex<32>;
def isub_hi : SubRegIndex<32, 32>;
def vsub_lo : SubRegIndex<512>;
@@ -200,40 +211,87 @@ let Namespace = "Hexagon" in {
def Q1 : Rq<1, "q1">, DwarfRegNum<[132]>;
def Q2 : Rq<2, "q2">, DwarfRegNum<[133]>;
def Q3 : Rq<3, "q3">, DwarfRegNum<[134]>;
+
+ // Guest Registers
+ def GELR: Rg<0, "gelr", ["g0"]>, DwarfRegNum<[220]>;
+ def GSR: Rg<1, "gsr", ["g1"]>, DwarfRegNum<[221]>;
+ def GOSP: Rg<2, "gosp", ["g2"]>, DwarfRegNum<[222]>;
+ def G3: Rg<3, "gbadva", ["g3"]>, DwarfRegNum<[223]>;
+ def G4: Rg<4, "g4">, DwarfRegNum<[224]>;
+ def G5: Rg<5, "g5">, DwarfRegNum<[225]>;
+ def G6: Rg<6, "g6">, DwarfRegNum<[226]>;
+ def G7: Rg<7, "g7">, DwarfRegNum<[227]>;
+ def G8: Rg<8, "g8">, DwarfRegNum<[228]>;
+ def G9: Rg<9, "g9">, DwarfRegNum<[229]>;
+ def G10: Rg<10, "g10">, DwarfRegNum<[230]>;
+ def G11: Rg<11, "g11">, DwarfRegNum<[231]>;
+ def G12: Rg<12, "g12">, DwarfRegNum<[232]>;
+ def G13: Rg<13, "g13">, DwarfRegNum<[233]>;
+ def G14: Rg<14, "g14">, DwarfRegNum<[234]>;
+ def G15: Rg<15, "g15">, DwarfRegNum<[235]>;
+ def GPMUCNT4: Rg<16, "gpmucnt4", ["g16"]>, DwarfRegNum<[236]>;
+ def GPMUCNT5: Rg<17, "gpmucnt5", ["g17"]>, DwarfRegNum<[237]>;
+ def GPMUCNT6: Rg<18, "gpmucnt6", ["g18"]>, DwarfRegNum<[238]>;
+ def GPMUCNT7: Rg<19, "gpmucnt7", ["g19"]>, DwarfRegNum<[239]>;
+ def G20: Rg<20, "g20">, DwarfRegNum<[240]>;
+ def G21: Rg<21, "g21">, DwarfRegNum<[241]>;
+ def G22: Rg<22, "g22">, DwarfRegNum<[242]>;
+ def G23: Rg<23, "g23">, DwarfRegNum<[243]>;
+ def GPCYCLELO: Rg<24, "gpcyclelo", ["g24"]>, DwarfRegNum<[244]>;
+ def GPCYCLEHI: Rg<25, "gpcyclehi", ["g25"]>, DwarfRegNum<[245]>;
+ def GPMUCNT0: Rg<26, "gpmucnt0", ["g26"]>, DwarfRegNum<[246]>;
+ def GPMUCNT1: Rg<27, "gpmucnt1", ["g27"]>, DwarfRegNum<[247]>;
+ def GPMUCNT2: Rg<28, "gpmucnt2", ["g28"]>, DwarfRegNum<[248]>;
+ def GPMUCNT3: Rg<29, "gpmucnt3", ["g29"]>, DwarfRegNum<[249]>;
+ def G30: Rg<30, "g30">, DwarfRegNum<[250]>;
+ def G31: Rg<31, "g31">, DwarfRegNum<[251]>;
+
+ // Guest Register Pairs
+ let SubRegIndices = [isub_lo, isub_hi], CoveredBySubRegs = 1 in {
+ def G1_0 : Rgg<0, "g1:0", [GELR, GSR]>, DwarfRegNum<[220]>;
+ def G3_2 : Rgg<2, "g3:2", [GOSP, G3]>, DwarfRegNum<[222]>;
+ def G5_4 : Rgg<4, "g5:4", [G4, G5]>, DwarfRegNum<[224]>;
+ def G7_6 : Rgg<6, "g7:6", [G6, G7]>, DwarfRegNum<[226]>;
+ def G9_8 : Rgg<8, "g9:8", [G8, G9]>, DwarfRegNum<[228]>;
+ def G11_10 : Rgg<10, "g11:10", [G10, G11]>, DwarfRegNum<[230]>;
+ def G13_12 : Rgg<12, "g13:12", [G12, G13]>, DwarfRegNum<[232]>;
+ def G15_14 : Rgg<14, "g15:14", [G14, G15]>, DwarfRegNum<[234]>;
+ def G17_16 : Rgg<16, "g17:16", [GPMUCNT4, GPMUCNT5]>, DwarfRegNum<[236]>;
+ def G19_18 : Rgg<18, "g19:18", [GPMUCNT6, GPMUCNT7]>, DwarfRegNum<[238]>;
+ def G21_20 : Rgg<20, "g21:20", [G20, G21]>, DwarfRegNum<[240]>;
+ def G23_22 : Rgg<22, "g23:22", [G22, G23]>, DwarfRegNum<[242]>;
+ def G25_24 : Rgg<24, "g25:24", [GPCYCLELO, GPCYCLEHI]>, DwarfRegNum<[244]>;
+ def G27_26 : Rgg<26, "g27:26", [GPMUCNT0, GPMUCNT1]>, DwarfRegNum<[246]>;
+ def G29_28 : Rgg<28, "g29:28", [GPMUCNT2, GPMUCNT3]>, DwarfRegNum<[248]>;
+ def G31_30 : Rgg<30, "g31:30", [G30, G31]>, DwarfRegNum<[250]>;
+ }
+
}
// HVX types
-def VecI1
- : ValueTypeByHwMode<[Hvx64, Hvx64old, Hvx128, Hvx128old, DefaultMode],
- [v512i1, v512i1, v1024i1, v1024i1, v512i1]>;
-def VecI8
- : ValueTypeByHwMode<[Hvx64, Hvx64old, Hvx128, Hvx128old, DefaultMode],
- [v64i8, v64i8, v128i8, v128i8, v64i8]>;
-def VecI16
- : ValueTypeByHwMode<[Hvx64, Hvx64old, Hvx128, Hvx128old, DefaultMode],
- [v32i16, v32i16, v64i16, v64i16, v32i16]>;
-def VecI32
- : ValueTypeByHwMode<[Hvx64, Hvx64old, Hvx128, Hvx128old, DefaultMode],
- [v16i32, v16i32, v32i32, v32i32, v16i32]>;
-def VecPI8
- : ValueTypeByHwMode<[Hvx64, Hvx64old, Hvx128, Hvx128old, DefaultMode],
- [v128i8, v128i8, v256i8, v256i8, v128i8]>;
-def VecPI16
- : ValueTypeByHwMode<[Hvx64, Hvx64old, Hvx128, Hvx128old, DefaultMode],
- [v64i16, v64i16, v128i16, v128i16, v64i16]>;
-def VecPI32
- : ValueTypeByHwMode<[Hvx64, Hvx64old, Hvx128, Hvx128old, DefaultMode],
- [v32i32, v32i32, v64i32, v64i32, v32i32]>;
-def VecQ8
- : ValueTypeByHwMode<[Hvx64, Hvx64old, Hvx128, Hvx128old, DefaultMode],
- [v64i1, v64i1, v128i1, v128i1, v64i1]>;
-def VecQ16
- : ValueTypeByHwMode<[Hvx64, Hvx64old, Hvx128, Hvx128old, DefaultMode],
- [v32i1, v32i1, v64i1, v64i1, v32i1]>;
-def VecQ32
- : ValueTypeByHwMode<[Hvx64, Hvx64old, Hvx128, Hvx128old, DefaultMode],
- [v16i1, v16i1, v32i1, v32i1, v16i1]>;
+def VecI1: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode],
+ [v512i1, v1024i1, v512i1]>;
+def VecI8: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode],
+ [v64i8, v128i8, v64i8]>;
+def VecI16: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode],
+ [v32i16, v64i16, v32i16]>;
+def VecI32: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode],
+ [v16i32, v32i32, v16i32]>;
+
+def VecPI8: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode],
+ [v128i8, v256i8, v128i8]>;
+def VecPI16: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode],
+ [v64i16, v128i16, v64i16]>;
+def VecPI32: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode],
+ [v32i32, v64i32, v32i32]>;
+
+def VecQ8: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode],
+ [v64i1, v128i1, v64i1]>;
+def VecQ16: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode],
+ [v32i1, v64i1, v32i1]>;
+def VecQ32: ValueTypeByHwMode<[Hvx64, Hvx128, DefaultMode],
+ [v16i1, v32i1, v16i1]>;
// HVX register classes
@@ -242,7 +300,7 @@ def VecQ32
// FIXME: the register order should be defined in terms of the preferred
// allocation order...
//
-def IntRegs : RegisterClass<"Hexagon", [i32, f32, v32i1, v4i8, v2i16], 32,
+def IntRegs : RegisterClass<"Hexagon", [i32, f32, v4i8, v2i16], 32,
(add (sequence "R%u", 0, 9), (sequence "R%u", 12, 28),
R10, R11, R29, R30, R31)>;
@@ -254,8 +312,7 @@ def GeneralSubRegs : RegisterClass<"Hexagon", [i32], 32,
def IntRegsLow8 : RegisterClass<"Hexagon", [i32], 32,
(add R7, R6, R5, R4, R3, R2, R1, R0)> ;
-def DoubleRegs : RegisterClass<"Hexagon",
- [i64, f64, v64i1, v8i8, v4i16, v2i32], 64,
+def DoubleRegs : RegisterClass<"Hexagon", [i64, f64, v8i8, v4i16, v2i32], 64,
(add (sequence "D%u", 0, 4), (sequence "D%u", 6, 13), D5, D14, D15)>;
def GeneralDoubleLow8Regs : RegisterClass<"Hexagon", [i64], 64,
@@ -301,6 +358,25 @@ def CtrRegs64 : RegisterClass<"Hexagon", [i64], 64,
(add C1_0, C3_2, C5_4, C7_6, C9_8, C11_10, CS, UPCYCLE, C17_16,
PKTCOUNT, UTIMER)>;
+let Size = 32, isAllocatable = 0 in
+def GuestRegs : RegisterClass<"Hexagon", [i32], 32,
+ (add GELR, GSR, GOSP,
+ (sequence "G%u", 3, 15),
+ GPMUCNT4, GPMUCNT5, GPMUCNT6, GPMUCNT7,
+ G20, G21, G22, G23,
+ GPCYCLELO, GPCYCLEHI, GPMUCNT0, GPMUCNT1,
+ GPMUCNT2, GPMUCNT3,
+ G30, G31)>;
+
+let Size = 64, isAllocatable = 0 in
+def GuestRegs64 : RegisterClass<"Hexagon", [i64], 64,
+ (add G1_0, G3_2,
+ G5_4, G7_6, G9_8, G11_10, G13_12, G15_14,
+ G17_16, G19_18,
+ G21_20, G23_22,
+ G25_24, G27_26, G29_28,
+ G31_30)>;
+
// These registers are new for v62 and onward.
// The function RegisterMatchesArch() uses this list for validation.
let isAllocatable = 0 in
@@ -313,7 +389,6 @@ let Size = 32, isAllocatable = 0 in
def V65Regs : RegisterClass<"Hexagon", [i32], 32, (add VTMP)>;
-
def HexagonCSR
: CalleeSavedRegs<(add R16, R17, R18, R19, R20, R21, R22, R23,
R24, R25, R26, R27)>;