summaryrefslogtreecommitdiff
path: root/src/arch/x86/isa/specialize.isa
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2007-06-20 19:08:04 +0000
committerGabe Black <gblack@eecs.umich.edu>2007-06-20 19:08:04 +0000
commit77aa98d0f84343445588b3c137463e4eba4c2909 (patch)
treeb041ed55b4c999edfdb37fa383f1f821e62869a4 /src/arch/x86/isa/specialize.isa
parentc4ebfa850e141ae7b33184f061874f9576bf5a54 (diff)
downloadgem5-77aa98d0f84343445588b3c137463e4eba4c2909.tar.xz
Implement rip relative addressing and put in some missing loads and stores.
--HG-- extra : convert_revision : 99053414cef40f13c5226871a72909b2622d8c26
Diffstat (limited to 'src/arch/x86/isa/specialize.isa')
-rw-r--r--src/arch/x86/isa/specialize.isa37
1 files changed, 29 insertions, 8 deletions
diff --git a/src/arch/x86/isa/specialize.isa b/src/arch/x86/isa/specialize.isa
index 10e57ba18..3183f32ba 100644
--- a/src/arch/x86/isa/specialize.isa
+++ b/src/arch/x86/isa/specialize.isa
@@ -64,18 +64,18 @@
let {{
# This code builds up a decode block which decodes based on switchval.
# vals is a dict which matches case values with what should be decoded to.
- # builder is called on the exploded contents of "vals" values to generate
- # whatever code should be used.
- def doSplitDecode(builder, switchVal, vals, default = None):
+ # Each element of the dict is a list containing a function and then the
+ # arguments to pass to it.
+ def doSplitDecode(switchVal, vals, default = None):
blocks = OutputBlocks()
blocks.decode_block = 'switch(%s) {\n' % switchVal
for (val, todo) in vals.items():
- new_blocks = builder(*todo)
+ new_blocks = todo[0](*todo[1:])
new_blocks.decode_block = \
'\tcase %s: %s\n' % (val, new_blocks.decode_block)
blocks.append(new_blocks)
if default:
- new_blocks = builder(*default)
+ new_blocks = default[0](*default[1:])
new_blocks.decode_block = \
'\tdefault: %s\n' % new_blocks.decode_block
blocks.append(new_blocks)
@@ -84,6 +84,27 @@ let {{
}};
let {{
+ def doRipRelativeDecode(Name, opTypes, env):
+ # print "RIPing %s with opTypes %s" % (Name, opTypes)
+ normBlocks = specializeInst(Name + "_M", copy.copy(opTypes), copy.copy(env))
+ ripBlocks = specializeInst(Name + "_P", copy.copy(opTypes), copy.copy(env))
+
+ blocks = OutputBlocks()
+ blocks.append(normBlocks)
+ blocks.append(ripBlocks)
+
+ blocks.decode_block = '''
+ if(machInst.modRM.mod == 0 &&
+ machInst.modRM.rm == 5 &&
+ machInst.mode.submode == SixtyFourBitMode)
+ { %s }
+ else
+ { %s }''' % \
+ (ripBlocks.decode_block, normBlocks.decode_block)
+ return blocks
+}};
+
+let {{
class OpType(object):
parser = re.compile(r"(?P<tag>[A-Z]+)(?P<size>[a-z]*)|(r(?P<reg>[A-Z0-9]+)(?P<rsize>[a-z]*))")
def __init__(self, opTypeString):
@@ -142,9 +163,9 @@ let {{
# modrm addressing.
memEnv = copy.copy(env)
memEnv.doModRM = True
- return doSplitDecode(specializeInst, "MODRM_MOD",
- {"3" : (Name + "_R", copy.copy(opTypes), regEnv)},
- (Name + "_M", copy.copy(opTypes), memEnv))
+ return doSplitDecode("MODRM_MOD",
+ {"3" : (specializeInst, Name + "_R", copy.copy(opTypes), regEnv)},
+ (doRipRelativeDecode, Name, copy.copy(opTypes), memEnv))
elif opType.tag in ("I", "J"):
# Immediates
Name += "_I"