summaryrefslogtreecommitdiff
path: root/src/arch/arm/isa/insts
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:05 -0500
committerGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:05 -0500
commitf0811eb208d7791c6dd8e0fb2239f75c555bcdc5 (patch)
tree0f4c82e1c03ea15e3d746e59c88ef94249f94f1c /src/arch/arm/isa/insts
parentf61bb9adb95e704ced44ea4efefa3fe6630de371 (diff)
downloadgem5-f0811eb208d7791c6dd8e0fb2239f75c555bcdc5.tar.xz
ARM: Define versions of MSR and MRS outside the decoder.
Diffstat (limited to 'src/arch/arm/isa/insts')
-rw-r--r--src/arch/arm/isa/insts/misc.isa63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/arch/arm/isa/insts/misc.isa b/src/arch/arm/isa/insts/misc.isa
index df5fa2ad7..fafbc197d 100644
--- a/src/arch/arm/isa/insts/misc.isa
+++ b/src/arch/arm/isa/insts/misc.isa
@@ -55,3 +55,66 @@ let {{
exec_output = PredOpExecute.subst(svcIop)
}};
+
+let {{
+
+ header_output = decoder_output = exec_output = ""
+
+ mrsCpsrCode = "Dest = (Cpsr | CondCodes) & 0xF8FF03DF"
+ mrsCpsrIop = InstObjParams("mrs", "MrsCpsr", "MrsOp",
+ { "code": mrsCpsrCode,
+ "predicate_test": predicateTest }, [])
+ header_output += MrsDeclare.subst(mrsCpsrIop)
+ decoder_output += MrsConstructor.subst(mrsCpsrIop)
+ exec_output += PredOpExecute.subst(mrsCpsrIop)
+
+ mrsSpsrCode = "Dest = Spsr"
+ mrsSpsrIop = InstObjParams("mrs", "MrsSpsr", "MrsOp",
+ { "code": mrsSpsrCode,
+ "predicate_test": predicateTest }, [])
+ header_output += MrsDeclare.subst(mrsSpsrIop)
+ decoder_output += MrsConstructor.subst(mrsSpsrIop)
+ exec_output += PredOpExecute.subst(mrsSpsrIop)
+
+ msrCpsrRegCode = '''
+ uint32_t newCpsr =
+ cpsrWriteByInstr(Cpsr | CondCodes, Op1, byteMask, false);
+ Cpsr = ~CondCodesMask & newCpsr;
+ CondCodes = CondCodesMask & newCpsr;
+ '''
+ msrCpsrRegIop = InstObjParams("msr", "MsrCpsrReg", "MsrRegOp",
+ { "code": msrCpsrRegCode,
+ "predicate_test": predicateTest }, [])
+ header_output += MsrRegDeclare.subst(msrCpsrRegIop)
+ decoder_output += MsrRegConstructor.subst(msrCpsrRegIop)
+ exec_output += PredOpExecute.subst(msrCpsrRegIop)
+
+ msrSpsrRegCode = "Spsr = spsrWriteByInstr(Spsr, Op1, byteMask, false);"
+ msrSpsrRegIop = InstObjParams("msr", "MsrSpsrReg", "MsrRegOp",
+ { "code": msrSpsrRegCode,
+ "predicate_test": predicateTest }, [])
+ header_output += MsrRegDeclare.subst(msrSpsrRegIop)
+ decoder_output += MsrRegConstructor.subst(msrSpsrRegIop)
+ exec_output += PredOpExecute.subst(msrSpsrRegIop)
+
+ msrCpsrImmCode = '''
+ uint32_t newCpsr =
+ cpsrWriteByInstr(Cpsr | CondCodes, imm, byteMask, false);
+ Cpsr = ~CondCodesMask & newCpsr;
+ CondCodes = CondCodesMask & newCpsr;
+ '''
+ msrCpsrImmIop = InstObjParams("msr", "MsrCpsrImm", "MsrImmOp",
+ { "code": msrCpsrImmCode,
+ "predicate_test": predicateTest }, [])
+ header_output += MsrImmDeclare.subst(msrCpsrImmIop)
+ decoder_output += MsrImmConstructor.subst(msrCpsrImmIop)
+ exec_output += PredOpExecute.subst(msrCpsrImmIop)
+
+ msrSpsrImmCode = "Spsr = spsrWriteByInstr(Spsr, imm, byteMask, false);"
+ msrSpsrImmIop = InstObjParams("msr", "MsrSpsrImm", "MsrImmOp",
+ { "code": msrSpsrImmCode,
+ "predicate_test": predicateTest }, [])
+ header_output += MsrImmDeclare.subst(msrSpsrImmIop)
+ decoder_output += MsrImmConstructor.subst(msrSpsrImmIop)
+ exec_output += PredOpExecute.subst(msrSpsrImmIop)
+}};