X86: When decoding a memory only inst, fault on reg encodings, don't assert.
authorGabe Black <gblack@eecs.umich.edu>
Sat, 23 Apr 2011 22:02:29 +0000 (15:02 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Sat, 23 Apr 2011 22:02:29 +0000 (15:02 -0700)
This change makes the decoder figure out if an instruction that only supports
memory is using a register encoding and decodes directly to "Unknown" which will
behave appropriately. This prevents other parts of the instruction creation
process from seeing the mismatch and asserting.

src/arch/x86/isa/specialize.isa

index 779abefc7f59db329869b2b5119b29056c166197..5a21c09449b1c3261d9996e0f52a0234791a13cb 100644 (file)
@@ -95,6 +95,15 @@ let {{
         return blocks
 }};
 
+let {{
+    def doBadInstDecode():
+        blocks = OutputBlocks()
+        blocks.decode_block = '''
+        return new Unknown(machInst);
+        '''
+        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]*))")
@@ -146,7 +155,9 @@ let {{
                 # This refers to memory. The macroop constructor sets up modrm
                 # addressing. Non memory modrm settings should cause an error.
                 env.doModRM = True
-                return doRipRelativeDecode(Name, opTypes, env)
+                return doSplitDecode("MODRM_MOD",
+                        {"3" : (doBadInstDecode,) },
+                        (doRipRelativeDecode, Name, opTypes, env))
             elif opType.tag == None or opType.size == None:
                 raise Exception, "Problem parsing operand tag: %s" % opType.tag
             elif opType.tag == "C":