summaryrefslogtreecommitdiff
path: root/src/arch/arm/insts/static_inst.hh
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:02 -0500
committerGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:02 -0500
commit769f3406fe6264353be1d3f61291c5aba6328534 (patch)
tree4627469fa354546f81306ddc54cc8cb015812d08 /src/arch/arm/insts/static_inst.hh
parentb6e7029dd59fa9508835a5af7696c93785a00d87 (diff)
downloadgem5-769f3406fe6264353be1d3f61291c5aba6328534.tar.xz
ARM: Replace the interworking branch base class with a special operand.
Diffstat (limited to 'src/arch/arm/insts/static_inst.hh')
-rw-r--r--src/arch/arm/insts/static_inst.hh52
1 files changed, 22 insertions, 30 deletions
diff --git a/src/arch/arm/insts/static_inst.hh b/src/arch/arm/insts/static_inst.hh
index 59d7fe705..485d6997e 100644
--- a/src/arch/arm/insts/static_inst.hh
+++ b/src/arch/arm/insts/static_inst.hh
@@ -47,7 +47,7 @@
namespace ArmISA
{
-class ArmStaticInstBase : public StaticInst
+class ArmStaticInst : public StaticInst
{
protected:
int32_t shift_rm_imm(uint32_t base, uint32_t shamt,
@@ -61,8 +61,8 @@ class ArmStaticInstBase : public StaticInst
uint32_t type, uint32_t cfval) const;
// Constructor
- ArmStaticInstBase(const char *mnem, ExtMachInst _machInst,
- OpClass __opClass)
+ ArmStaticInst(const char *mnem, ExtMachInst _machInst,
+ OpClass __opClass)
: StaticInst(mnem, _machInst, __opClass)
{
}
@@ -151,6 +151,7 @@ class ArmStaticInstBase : public StaticInst
return pc + 8;
}
+ // Perform an regular branch.
template<class XC>
static void
setNextPC(XC *xc, Addr val)
@@ -158,36 +159,11 @@ class ArmStaticInstBase : public StaticInst
xc->setNextPC((xc->readNextPC() & PcModeMask) |
(val & ~PcModeMask));
}
-};
-
-class ArmStaticInst : public ArmStaticInstBase
-{
- protected:
- ArmStaticInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
- : ArmStaticInstBase(mnem, _machInst, __opClass)
- {
- }
+ // Perform an interworking branch.
template<class XC>
static void
- setNextPC(XC *xc, Addr val)
- {
- xc->setNextPC((xc->readNextPC() & PcModeMask) |
- (val & ~PcModeMask));
- }
-};
-
-class ArmInterWorking : public ArmStaticInstBase
-{
- protected:
- ArmInterWorking(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
- : ArmStaticInstBase(mnem, _machInst, __opClass)
- {
- }
-
- template<class XC>
- static void
- setNextPC(XC *xc, Addr val)
+ setIWNextPC(XC *xc, Addr val)
{
Addr stateBits = xc->readPC() & PcModeMask;
Addr jBit = (ULL(1) << PcJBitShift);
@@ -214,6 +190,22 @@ class ArmInterWorking : public ArmStaticInstBase
newPc = newPc | stateBits;
xc->setNextPC(newPc);
}
+
+ // Perform an interworking branch in ARM mode, a regular branch
+ // otherwise.
+ template<class XC>
+ static void
+ setAIWNextPC(XC *xc, Addr val)
+ {
+ Addr stateBits = xc->readPC() & PcModeMask;
+ Addr jBit = (ULL(1) << PcJBitShift);
+ Addr tBit = (ULL(1) << PcTBitShift);
+ if (!jBit && !tBit) {
+ setIWNextPC(xc, val);
+ } else {
+ setNextPC(xc, val);
+ }
+ }
};
}