470a471,518
> 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)
>