summaryrefslogtreecommitdiff
path: root/src/arch/arm/isa/insts
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:17 -0500
committerGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:17 -0500
commit22d1a84509dec6544bd91e63597b1b2274c590cc (patch)
treebd525d9bee85a3732a3ab31b8d6c7dd8f801cf4a /src/arch/arm/isa/insts
parent0e556e9dfbd9a3b3f06a023d4edf3b3678fd0a40 (diff)
downloadgem5-22d1a84509dec6544bd91e63597b1b2274c590cc.tar.xz
ARM: Move some miscellaneous instructions out of the decoder to share with thumb.
Diffstat (limited to 'src/arch/arm/isa/insts')
-rw-r--r--src/arch/arm/isa/insts/misc.isa48
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 })