diff options
author | Nilay Vaish <nilay@cs.wisc.edu> | 2013-05-21 11:34:41 -0500 |
---|---|---|
committer | Nilay Vaish <nilay@cs.wisc.edu> | 2013-05-21 11:34:41 -0500 |
commit | 30fe807316ebc4b6c37ca522b3cfd6c592ca9003 (patch) | |
tree | 12f5e529771617cf5c1ce93ea0200a5cf4a4a45e /src/arch | |
parent | fba40864aab3015009efe4ade7599c07bc28ab1a (diff) | |
download | gem5-30fe807316ebc4b6c37ca522b3cfd6c592ca9003.tar.xz |
x86: mark instructions for being function call/return
Currently call and return instructions are marked as IsCall and IsReturn. Thus, the
branch predictor does not use RAS for these instructions. Similarly, the number of
function calls that took place is recorded as 0. This patch marks these instructions
as they should be.
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/x86/isa/insts/general_purpose/control_transfer/call.py | 4 | ||||
-rw-r--r-- | src/arch/x86/isa/insts/general_purpose/control_transfer/xreturn.py | 9 | ||||
-rw-r--r-- | src/arch/x86/isa/macroop.isa | 19 |
3 files changed, 28 insertions, 4 deletions
diff --git a/src/arch/x86/isa/insts/general_purpose/control_transfer/call.py b/src/arch/x86/isa/insts/general_purpose/control_transfer/call.py index f18a062a6..eaaa18208 100644 --- a/src/arch/x86/isa/insts/general_purpose/control_transfer/call.py +++ b/src/arch/x86/isa/insts/general_purpose/control_transfer/call.py @@ -40,6 +40,7 @@ def macroop CALL_NEAR_I { # Make the default data size of calls 64 bits in 64 bit mode .adjust_env oszIn64Override + .function_call limm t1, imm rdip t7 @@ -53,6 +54,7 @@ def macroop CALL_NEAR_R { # Make the default data size of calls 64 bits in 64 bit mode .adjust_env oszIn64Override + .function_call rdip t1 # Check target of call @@ -65,6 +67,7 @@ def macroop CALL_NEAR_M { # Make the default data size of calls 64 bits in 64 bit mode .adjust_env oszIn64Override + .function_call rdip t7 ld t1, seg, sib, disp @@ -78,6 +81,7 @@ def macroop CALL_NEAR_P { # Make the default data size of calls 64 bits in 64 bit mode .adjust_env oszIn64Override + .function_call rdip t7 ld t1, seg, riprel, disp diff --git a/src/arch/x86/isa/insts/general_purpose/control_transfer/xreturn.py b/src/arch/x86/isa/insts/general_purpose/control_transfer/xreturn.py index 7ebe22e78..f24b9d70e 100644 --- a/src/arch/x86/isa/insts/general_purpose/control_transfer/xreturn.py +++ b/src/arch/x86/isa/insts/general_purpose/control_transfer/xreturn.py @@ -40,6 +40,7 @@ def macroop RET_NEAR { # Make the default data size of rets 64 bits in 64 bit mode .adjust_env oszIn64Override + .function_return ld t1, ss, [1, t0, rsp] # Check address of return @@ -51,6 +52,7 @@ def macroop RET_NEAR_I { # Make the default data size of rets 64 bits in 64 bit mode .adjust_env oszIn64Override + .function_return limm t2, imm ld t1, ss, [1, t0, rsp] @@ -62,6 +64,7 @@ def macroop RET_NEAR_I def macroop RET_FAR { .adjust_env oszIn64Override + .function_return # Get the return RIP ld t1, ss, [1, t0, rsp] @@ -99,10 +102,10 @@ processDescriptor: wrdl cs, t3, t2 wrsel cs, t2 wrip t0, t1 - br label("end") +# br label("end") # Do other stuff if they're not. -end: - fault "NoFault" +#end: +# fault "NoFault" }; ''' diff --git a/src/arch/x86/isa/macroop.isa b/src/arch/x86/isa/macroop.isa index 94b17ff4c..d510a0c7c 100644 --- a/src/arch/x86/isa/macroop.isa +++ b/src/arch/x86/isa/macroop.isa @@ -141,13 +141,21 @@ let {{ self.adjust_disp += val def serializing(self): self.serializing = True + + def function_call(self): + self.function_call = True + def function_return(self): + self.function_return = True + def __init__(self, name): super(X86Macroop, self).__init__(name) self.directives = { "adjust_env" : self.setAdjustEnv, "adjust_imm" : self.adjustImm, "adjust_disp" : self.adjustDisp, - "serializing" : self.serializing + "serializing" : self.serializing, + "function_call" : self.function_call, + "function_return" : self.function_return } self.declared = False self.adjust_env = "" @@ -163,6 +171,9 @@ let {{ adjustedDisp = adjustedDisp; ''' self.serializing = False + self.function_call = False + self.function_return = False + def getAllocator(self, env): return "new X86Macroop::%s(machInst, %s)" % \ (self.name, env.getAllocator()) @@ -192,9 +203,15 @@ let {{ flags = ["IsMicroop"] if micropc == numMicroops - 1: flags.append("IsLastMicroop") + if self.serializing: flags.append("IsSerializing") flags.append("IsSerializeAfter") + + if self.function_call: + flags.append("IsCall") + if self.function_return: + flags.append("IsReturn") else: flags.append("IsDelayedCommit") if micropc == 0: |