diff options
Diffstat (limited to 'src/arch/arm/isa/insts/misc.isa')
-rw-r--r-- | src/arch/arm/isa/insts/misc.isa | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/arch/arm/isa/insts/misc.isa b/src/arch/arm/isa/insts/misc.isa index 64bff6cb1..7f9a5c171 100644 --- a/src/arch/arm/isa/insts/misc.isa +++ b/src/arch/arm/isa/insts/misc.isa @@ -468,6 +468,54 @@ let {{ decoder_output += BasicConstructor.subst(nopIop) exec_output += PredOpExecute.subst(nopIop) + yieldIop = InstObjParams("yield", "YieldInst", "PredOp", \ + { "code" : "", "predicate_test" : predicateTest }) + header_output += BasicDeclare.subst(yieldIop) + decoder_output += BasicConstructor.subst(yieldIop) + exec_output += PredOpExecute.subst(yieldIop) + + wfeCode = ''' +#if FULL_SYSTEM + if (SevMailbox) + SevMailbox = 0; + else + PseudoInst::quiesce(xc->tcBase()); +#endif + ''' + wfeIop = InstObjParams("wfe", "WfeInst", "PredOp", \ + { "code" : wfeCode, "predicate_test" : predicateTest }, + ["IsNonSpeculative", "IsQuiesce"]) + header_output += BasicDeclare.subst(wfeIop) + decoder_output += BasicConstructor.subst(wfeIop) + exec_output += PredOpExecute.subst(wfeIop) + + wfiCode = ''' +#if FULL_SYSTEM + PseudoInst::quiesce(xc->tcBase()); +#endif + ''' + wfiIop = InstObjParams("wfi", "WfiInst", "PredOp", \ + { "code" : wfiCode, "predicate_test" : predicateTest }, + ["IsNonSpeculative", "IsQuiesce"]) + header_output += BasicDeclare.subst(wfiIop) + decoder_output += BasicConstructor.subst(wfiIop) + exec_output += PredOpExecute.subst(wfiIop) + + sevCode = ''' + // Need a way for O3 to not scoreboard these accesses as pipe flushes. + System *sys = xc->tcBase()->getSystemPtr(); + for (int x = 0; x < sys->numContexts(); x++) { + ThreadContext *oc = sys->getThreadContext(x); + oc->setMiscReg(MISCREG_SEV_MAILBOX, 1); + } + ''' + sevIop = InstObjParams("sev", "SevInst", "PredOp", \ + { "code" : sevCode, "predicate_test" : predicateTest }, + ["IsNonSpeculative", "IsQuiesce"]) + header_output += BasicDeclare.subst(sevIop) + decoder_output += BasicConstructor.subst(sevIop) + exec_output += PredOpExecute.subst(sevIop) + itIop = InstObjParams("it", "ItInst", "PredOp", \ { "code" : "Itstate = machInst.newItstate;", "predicate_test" : predicateTest }) |