diff -r 8b4148f5c356 -r 013bee06b0b9 src/arch/arm/isa/insts/misc.isa --- a/src/arch/arm/isa/insts/misc.isa Fri Aug 13 11:59:07 2010 -0500 +++ b/src/arch/arm/isa/insts/misc.isa Fri Aug 13 11:59:29 2010 -0500 @@ -673,9 +673,11 @@ 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 = ''' ''' diff -r 8b4148f5c356 -r 013bee06b0b9 src/arch/arm/isa/templates/misc.isa --- a/src/arch/arm/isa/templates/misc.isa Fri Aug 13 11:59:07 2010 -0500 +++ b/src/arch/arm/isa/templates/misc.isa Fri Aug 13 11:59:29 2010 -0500 @@ -336,3 +336,67 @@ %(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->setPredicatedFalse(true); + 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; + } +}}; +