arch-x86: Convert the int register constants from RegIndex to RegId.
This will let them be used in APIs which expect either, and will help
transition between the two.
Change-Id: I73fc9e55418ad3ab9e08406f0928aa4b1ef30a49
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/49754
Reviewed-by: Gabe Black <gabe.black@gmail.com>
Maintainer: Gabe Black <gabe.black@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
diff --git a/src/arch/x86/emulenv.cc b/src/arch/x86/emulenv.cc
index 317be12..71413d6 100644
--- a/src/arch/x86/emulenv.cc
+++ b/src/arch/x86/emulenv.cc
@@ -52,8 +52,8 @@
//Use the SIB byte for addressing if the modrm byte calls for it.
if (machInst.modRM.rm == 4 && machInst.addrSize != 2) {
scale = 1 << machInst.sib.scale;
- index = machInst.sib.index | (machInst.rex.x << 3);
- base = machInst.sib.base | (machInst.rex.b << 3);
+ index = RegId(IntRegClass, machInst.sib.index | (machInst.rex.x << 3));
+ base = RegId(IntRegClass, machInst.sib.base | (machInst.rex.b << 3));
//In this special case, we don't use a base. The displacement also
//changes, but that's managed by the decoder.
if (machInst.sib.base == (RegIndex)int_reg::Rbp &&
@@ -72,7 +72,8 @@
} else {
base = int_reg::Rbp;
}
- index = (rm % 2) ? int_reg::Rdi : int_reg::Rsi;
+ index = RegId(IntRegClass,
+ (rm % 2) ? int_reg::Rdi : int_reg::Rsi);
} else {
scale = 0;
switch (rm) {
@@ -94,7 +95,8 @@
}
} else {
scale = 0;
- base = machInst.modRM.rm | (machInst.rex.b << 3);
+ base = RegId(IntRegClass,
+ machInst.modRM.rm | (machInst.rex.b << 3));
if (machInst.modRM.mod == 0 && machInst.modRM.rm == 5) {
//Since we need to use a different encoding of this
//instruction anyway, just ignore the base in those cases
diff --git a/src/arch/x86/emulenv.hh b/src/arch/x86/emulenv.hh
index b097f95..f62d8f0 100644
--- a/src/arch/x86/emulenv.hh
+++ b/src/arch/x86/emulenv.hh
@@ -53,8 +53,8 @@
RegIndex regm;
SegmentRegIndex seg;
uint8_t scale;
- RegIndex index;
- RegIndex base;
+ RegId index;
+ RegId base;
int dataSize;
int addressSize;
int stackSize;
diff --git a/src/arch/x86/regs/int.hh b/src/arch/x86/regs/int.hh
index a7d9fd6..445e6a8 100644
--- a/src/arch/x86/regs/int.hh
+++ b/src/arch/x86/regs/int.hh
@@ -41,6 +41,7 @@
#include "arch/x86/x86_traits.hh"
#include "base/bitunion.hh"
#include "base/logging.hh"
+#include "cpu/reg_class.hh"
namespace gem5
{
@@ -66,129 +67,99 @@
enum : RegIndex
{
- Rax,
- Eax = Rax,
- Ax = Rax,
- Al = Rax,
-
- Rcx,
- Ecx = Rcx,
- Cx = Rcx,
- Cl = Rcx,
-
- Rdx,
- Edx = Rdx,
- Dx = Rdx,
- Dl = Rdx,
-
- Rbx,
- Ebx = Rbx,
- Bx = Rbx,
- Bl = Rbx,
-
- Rsp,
- Esp = Rsp,
- Sp = Rsp,
- Spl = Rsp,
- Ah = Rsp,
-
- Rbp,
- Ebp = Rbp,
- Bp = Rbp,
- Bpl = Rbp,
- Ch = Rbp,
-
- Rsi,
- Esi = Rsi,
- Si = Rsi,
- Sil = Rsi,
- Dh = Rsi,
-
- Rdi,
- Edi = Rdi,
- Di = Rdi,
- Dil = Rdi,
- Bh = Rdi,
-
- R8,
- R8d = R8,
- R8w = R8,
- R8b = R8,
-
- R9,
- R9d = R9,
- R9w = R9,
- R9b = R9,
-
- R10,
- R10d = R10,
- R10w = R10,
- R10b = R10,
-
- R11,
- R11d = R11,
- R11w = R11,
- R11b = R11,
-
- R12,
- R12d = R12,
- R12w = R12,
- R12b = R12,
-
- R13,
- R13d = R13,
- R13w = R13,
- R13b = R13,
-
- R14,
- R14d = R14,
- R14w = R14,
- R14b = R14,
-
- R15,
- R15d = R15,
- R15w = R15,
- R15b = R15,
+ _RaxIdx,
+ _RcxIdx,
+ _RdxIdx,
+ _RbxIdx,
+ _RspIdx,
+ _RbpIdx,
+ _RsiIdx,
+ _RdiIdx,
+ _R8Idx,
+ _R9Idx,
+ _R10Idx,
+ _R11Idx,
+ _R12Idx,
+ _R13Idx,
+ _R14Idx,
+ _R15Idx,
NumArchRegs,
-
MicroBegin = NumArchRegs,
- T0 = MicroBegin,
+ _T0Idx = MicroBegin,
MicroEnd = MicroBegin + NumMicroIntRegs,
- // The lower part of the result of multiplication.
- Prodlow,
- // The upper part of the result of multiplication.
- Prodhi,
- // The quotient from division.
- Quotient,
- // The remainder from division.
- Remainder,
- // The divisor for division.
- Divisor,
- // The register to use for shift doubles.
- Doublebits,
+ _ProdlowIdx,
+ _ProdhiIdx,
+ _QuotientIdx,
+ _RemainderIdx,
+ _DivisorIdx,
+ _DoublebitsIdx,
- NumRegs,
+ NumRegs
};
+inline constexpr RegId
+ Rax(IntRegClass, _RaxIdx),
+ Rcx(IntRegClass, _RcxIdx),
+ Rdx(IntRegClass, _RdxIdx),
+ Rbx(IntRegClass, _RbxIdx),
+ Rsp(IntRegClass, _RspIdx),
+ Rbp(IntRegClass, _RbpIdx),
+ Rsi(IntRegClass, _RsiIdx),
+ Rdi(IntRegClass, _RdiIdx),
+ R8(IntRegClass, _R8Idx),
+ R9(IntRegClass, _R9Idx),
+ R10(IntRegClass, _R10Idx),
+ R11(IntRegClass, _R11Idx),
+ R12(IntRegClass, _R12Idx),
+ R13(IntRegClass, _R13Idx),
+ R14(IntRegClass, _R14Idx),
+ R15(IntRegClass, _R15Idx),
+ T0(IntRegClass, _T0Idx),
+ Prodlow(IntRegClass, _ProdlowIdx),
+ Prodhi(IntRegClass, _ProdhiIdx),
+ Quotient(IntRegClass, _QuotientIdx),
+ Remainder(IntRegClass, _RemainderIdx),
+ Divisor(IntRegClass, _DivisorIdx),
+ Doublebits(IntRegClass, _DoublebitsIdx);
+
+// Aliases for other register sizes.
+inline constexpr auto
+ &Eax = Rax, &Ax = Rax, &Al = Rax,
+ &Ecx = Rcx, &Cx = Rcx, &Cl = Rcx,
+ &Edx = Rdx, &Dx = Rdx, &Dl = Rdx,
+ &Ebx = Rbx, &Bx = Rbx, &Bl = Rbx,
+ &Esp = Rsp, &Sp = Rsp, &Spl = Rsp, &Ah = Rsp,
+ &Ebp = Rbp, &Bp = Rbp, &Bpl = Rbp, &Ch = Rbp,
+ &Esi = Rsi, &Si = Rsi, &Sil = Rsi, &Dh = Rsi,
+ &Edi = Rdi, &Di = Rdi, &Dil = Rdi, &Bh = Rdi,
+ &R8d = R8, &R8w = R8, &R8b = R8,
+ &R9d = R9, &R9w = R9, &R9b = R9,
+ &R10d = R10, &R10w = R10, &R10b = R10,
+ &R11d = R11, &R11w = R11, &R11b = R11,
+ &R12d = R12, &R12w = R12, &R12b = R12,
+ &R13d = R13, &R13w = R13, &R13b = R13,
+ &R14d = R14, &R14w = R14, &R14b = R14,
+ &R15d = R15, &R15w = R15, &R15b = R15;
+
} // namespace int_reg
// This needs to be large enough to miss all the other bits of an index.
inline constexpr RegIndex IntFoldBit = 1 << 6;
-inline static constexpr RegIndex
+inline static constexpr RegId
intRegMicro(int index)
{
- return int_reg::MicroBegin + index;
+ return RegId(IntRegClass, int_reg::MicroBegin + index);
}
-inline static constexpr RegIndex
+inline static constexpr RegId
intRegFolded(RegIndex index, RegIndex foldBit)
{
if ((index & 0x1C) == 4 && foldBit)
index = (index - 4) | foldBit;
- return index;
+ return RegId(IntRegClass, index);
}
} // namespace X86ISA