Add a parameter type to read a register index from the opcode itself.
authorGabe Black <gblack@eecs.umich.edu>
Fri, 20 Jul 2007 21:55:16 +0000 (14:55 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Fri, 20 Jul 2007 21:55:16 +0000 (14:55 -0700)
--HG--
extra : convert_revision : d2b5468ebf5df5a6ccadb57a30c52c8d16417b9a

src/arch/x86/isa/specialize.isa

index 3183f32ba97a5ecf344b69e9de3fe1f6c1da6222..5165ea206cfbc39e78351c84fa90d5b87ac098d6 100644 (file)
@@ -118,6 +118,7 @@ let {{
 
     ModRMRegIndex = "(MODRM_REG | (REX_R << 3))"
     ModRMRMIndex = "(MODRM_RM | (REX_B << 3))"
+    InstRegIndex = "(OPCODE_OP_BOTTOM3 | (REX_B << 3))"
 
     # This function specializes the given piece of code to use a particular
     # set of argument types described by "opTypes".
@@ -143,6 +144,10 @@ let {{
                     else:
                         print "Didn't recognize fixed register size %s!" % opType.rsize
                 Name += "_R"
+            elif opType.tag == "B":
+                # This refers to registers whose index is encoded as part of the opcode
+                Name += "_R"
+                env.addReg(InstRegIndex)
             elif opType.tag == "M":
                 # This refers to memory. The macroop constructor sets up modrm
                 # addressing. Non memory modrm settings should cause an error.