diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2008-10-12 15:53:04 -0700 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2008-10-12 15:53:04 -0700 |
commit | 6fd4eff68f53ec1cd9194581bfa223bfbaa2d83d (patch) | |
tree | c7cde083a711fb3429f6c6d499c7894507c5acf1 | |
parent | 4aa18aa80022d9e4125faab8ff1f5123e159137d (diff) | |
download | gem5-6fd4eff68f53ec1cd9194581bfa223bfbaa2d83d.tar.xz |
X86: Create an eret microop which returns from ROM to combinational decoding.
-rw-r--r-- | src/arch/x86/isa/microops/seqop.isa | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/arch/x86/isa/microops/seqop.isa b/src/arch/x86/isa/microops/seqop.isa index 603f4458b..d3c7bf096 100644 --- a/src/arch/x86/isa/microops/seqop.isa +++ b/src/arch/x86/isa/microops/seqop.isa @@ -198,6 +198,25 @@ let {{ microFlags = (is_micro, is_delayed, is_first, is_last) return super(Br, self).getAllocator(*microFlags) + class Eret(SeqOp): + target = "normalMicroPC(0)" + className = "Eret" + + def __init__(self, flags=None): + if flags: + if not isinstance(flags, (list, tuple)): + raise Exception, "flags must be a list or tuple of flags" + self.cond = " | ".join(flags) + self.className += "Flags" + else: + self.cond = "0" + + def getAllocator(self, *microFlags): + (is_micro, is_delayed, is_first, is_last) = microFlags + is_last = True + microFlags = (is_micro, is_delayed, is_first, is_last) + return super(Eret, self).getAllocator(*microFlags) + iop = InstObjParams("br", "MicroBranchFlags", "SeqOpBase", {"code": "nuIP = target", "else_code": "nuIP = nuIP", @@ -213,4 +232,18 @@ let {{ header_output += SeqOpDeclare.subst(iop) decoder_output += SeqOpConstructor.subst(iop) microopClasses["br"] = Br + + iop = InstObjParams("eret", "EretFlags", "SeqOpBase", + {"code": "", "else_code": "", + "cond_test": "checkCondition(ccFlagBits, cc)"}) + exec_output += SeqOpExecute.subst(iop) + header_output += SeqOpDeclare.subst(iop) + decoder_output += SeqOpConstructor.subst(iop) + iop = InstObjParams("eret", "Eret", "SeqOpBase", + {"code": "", "else_code": "", + "cond_test": "true"}) + exec_output += SeqOpExecute.subst(iop) + header_output += SeqOpDeclare.subst(iop) + decoder_output += SeqOpConstructor.subst(iop) + microopClasses["eret"] = Eret }}; |