ARM: Fixed register flattening logic (FP_Base_DepTag was set too low)
When decoding a srs instruction, invalid mode encoding returns invalid instruction. This can happen when garbage instructions are fetched from mispredicted path
This commit is contained in:
parent
edca5f7da6
commit
e1168e72ca
7 changed files with 28 additions and 6 deletions
|
@ -101,7 +101,8 @@ enum DependenceTags {
|
|||
// 0..31 are the integer regs 0..31
|
||||
// 32..63 are the FP regs 0..31, i.e. use (reg + FP_Base_DepTag)
|
||||
FP_Base_DepTag = 40,
|
||||
Ctrl_Base_DepTag = 72
|
||||
Ctrl_Base_DepTag = 72,
|
||||
Max_DepTag = Ctrl_Base_DepTag + NumMiscRegs + NumInternalProcRegs
|
||||
};
|
||||
|
||||
} // namespace AlphaISA
|
||||
|
|
|
@ -1,4 +1,16 @@
|
|||
/*
|
||||
* Copyright (c) 2010 ARM Limited
|
||||
* All rights reserved
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
* not be construed as granting a license to any other intellectual
|
||||
* property including but not limited to intellectual property relating
|
||||
* to a hardware implementation of the functionality of the software
|
||||
* licensed hereunder. You may use the software subject to the license
|
||||
* terms below provided that you ensure that this notice is replicated
|
||||
* unmodified and in its entirety in all distributions of the software,
|
||||
* modified or unmodified, in source code or in binary form.
|
||||
*
|
||||
* Copyright (c) 2007-2008 The Florida State University
|
||||
* All rights reserved.
|
||||
*
|
||||
|
@ -59,9 +71,9 @@ const int NumFloatSpecialRegs = 8;
|
|||
|
||||
const int NumIntRegs = NUM_INTREGS;
|
||||
const int NumFloatRegs = NumFloatArchRegs + NumFloatSpecialRegs;
|
||||
|
||||
const int NumMiscRegs = NUM_MISCREGS;
|
||||
|
||||
const int TotalNumRegs = NumIntRegs + NumFloatRegs + NumMiscRegs;
|
||||
|
||||
// semantically meaningful register indices
|
||||
const int ReturnValueReg = 0;
|
||||
|
@ -85,6 +97,7 @@ const int SyscallSuccessReg = ReturnValueReg;
|
|||
// These help enumerate all the registers for dependence tracking.
|
||||
const int FP_Base_DepTag = NumIntRegs * (MODE_MAXMODE + 1);
|
||||
const int Ctrl_Base_DepTag = FP_Base_DepTag + NumFloatRegs;
|
||||
const int Max_DepTag = Ctrl_Base_DepTag + NumMiscRegs;
|
||||
|
||||
typedef union {
|
||||
IntReg intreg;
|
||||
|
|
|
@ -283,6 +283,7 @@ enum MiscRegIndex{
|
|||
const int TotalDataRegs = NumIntRegs + NumFloatRegs;
|
||||
|
||||
const int NumMiscRegs = MISCREG_NUMREGS;
|
||||
const int Max_DepTag = Ctrl_Base_DepTag + NumMiscRegs;
|
||||
|
||||
const int TotalNumRegs = NumIntRegs + NumFloatRegs + NumMiscRegs;
|
||||
|
||||
|
|
|
@ -82,6 +82,7 @@ const int SyscallSuccessReg = 3;
|
|||
// These help enumerate all the registers for dependence tracking.
|
||||
const int FP_Base_DepTag = NumIntRegs;
|
||||
const int Ctrl_Base_DepTag = FP_Base_DepTag + NumFloatRegs;
|
||||
const int Max_DepTag = Ctrl_Base_DepTag + NumMiscRegs;
|
||||
|
||||
typedef union {
|
||||
IntReg intreg;
|
||||
|
|
|
@ -58,7 +58,8 @@ namespace SparcISA
|
|||
// These enumerate all the registers for dependence tracking.
|
||||
enum DependenceTags {
|
||||
FP_Base_DepTag = 32*3+9,
|
||||
Ctrl_Base_DepTag = FP_Base_DepTag + 64
|
||||
Ctrl_Base_DepTag = FP_Base_DepTag + 64,
|
||||
Max_DepTag = Ctrl_Base_DepTag + NumMiscRegs
|
||||
};
|
||||
|
||||
// semantically meaningful register indices
|
||||
|
|
|
@ -76,7 +76,8 @@ enum DependenceTags {
|
|||
//The microcode fp registers
|
||||
8 +
|
||||
//The indices that are mapped over the fp stack
|
||||
8
|
||||
8,
|
||||
Max_DepTag = Ctrl_Base_DepTag + NumMiscRegs
|
||||
};
|
||||
|
||||
// semantically meaningful register indices
|
||||
|
|
|
@ -966,9 +966,11 @@ DefaultRename<Impl>::renameSrcRegs(DynInstPtr &inst, ThreadID tid)
|
|||
src_reg = src_reg - TheISA::FP_Base_DepTag;
|
||||
flat_src_reg = inst->tcBase()->flattenFloatIndex(src_reg);
|
||||
flat_src_reg += TheISA::NumIntRegs;
|
||||
} else {
|
||||
} else if (src_reg < TheISA::Max_DepTag) {
|
||||
flat_src_reg = src_reg - TheISA::FP_Base_DepTag + TheISA::NumIntRegs;
|
||||
DPRINTF(Rename, "Adjusting reg index from %d to %d.\n", src_reg, flat_src_reg);
|
||||
} else {
|
||||
panic("Reg index is out of bound: %d.", src_reg);
|
||||
}
|
||||
|
||||
inst->flattenSrcReg(src_idx, flat_src_reg);
|
||||
|
@ -1012,11 +1014,13 @@ DefaultRename<Impl>::renameDestRegs(DynInstPtr &inst, ThreadID tid)
|
|||
// Integer registers are flattened.
|
||||
flat_dest_reg = inst->tcBase()->flattenIntIndex(dest_reg);
|
||||
DPRINTF(Rename, "Flattening index %d to %d.\n", (int)dest_reg, (int)flat_dest_reg);
|
||||
} else {
|
||||
} else if (dest_reg < TheISA::Max_DepTag) {
|
||||
// Floating point and Miscellaneous registers need their indexes
|
||||
// adjusted to account for the expanded number of flattened int regs.
|
||||
flat_dest_reg = dest_reg - TheISA::FP_Base_DepTag + TheISA::NumIntRegs;
|
||||
DPRINTF(Rename, "Adjusting reg index from %d to %d.\n", dest_reg, flat_dest_reg);
|
||||
} else {
|
||||
panic("Reg index is out of bound: %d.", dest_reg);
|
||||
}
|
||||
|
||||
inst->flattenDestReg(dest_idx, flat_dest_reg);
|
||||
|
|
Loading…
Reference in a new issue