ARM: Implement CLREX init/complete acc methods

This commit is contained in:
Gene Wu
2010-08-23 11:18:41 -05:00
parent f29e09746a
commit 9db2ab8a62
2 changed files with 67 additions and 1 deletions

View File

@@ -675,9 +675,11 @@ let {{
clrexIop = InstObjParams("clrex", "Clrex","PredOp",
{ "code": clrexCode,
"predicate_test": predicateTest },[])
header_output += BasicDeclare.subst(clrexIop)
header_output += ClrexDeclare.subst(clrexIop)
decoder_output += BasicConstructor.subst(clrexIop)
exec_output += PredOpExecute.subst(clrexIop)
exec_output += ClrexInitiateAcc.subst(clrexIop)
exec_output += ClrexCompleteAcc.subst(clrexIop)
isbCode = '''
'''

View File

@@ -336,3 +336,67 @@ def template RegImmRegShiftOpConstructor {{
%(constructor)s;
}
}};
def template ClrexDeclare {{
/**
* Static instruction class for "%(mnemonic)s".
*/
class %(class_name)s : public %(base_class)s
{
public:
/// Constructor.
%(class_name)s(ExtMachInst machInst);
%(BasicExecDeclare)s
%(InitiateAccDeclare)s
%(CompleteAccDeclare)s
};
}};
def template ClrexInitiateAcc {{
Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc,
Trace::InstRecord *traceData) const
{
Fault fault = NoFault;
%(op_decl)s;
%(op_rd)s;
if (%(predicate_test)s)
{
if (fault == NoFault) {
unsigned memAccessFlags = ArmISA::TLB::Clrex|3|Request::LLSC;
fault = xc->read(0, (uint32_t&)Mem, memAccessFlags);
}
} else {
xc->setPredicate(false);
if (fault == NoFault && machInst.itstateMask != 0) {
xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
}
}
return fault;
}
}};
def template ClrexCompleteAcc {{
Fault %(class_name)s::completeAcc(PacketPtr pkt,
%(CPU_exec_context)s *xc,
Trace::InstRecord *traceData) const
{
Fault fault = NoFault;
%(op_decl)s;
%(op_rd)s;
if (fault == NoFault && machInst.itstateMask != 0) {
xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
}
return fault;
}
}};