specialize.isa (5294:7222bdaed33b) | specialize.isa (5788:6d4161a36ca1) |
---|---|
1// -*- mode:c++ -*- 2 3// Copyright (c) 2007 The Hewlett-Packard Development Company 4// All rights reserved. 5// 6// Redistribution and use of this software in source and binary forms, 7// with or without modification, are permitted provided that the 8// following conditions are met: --- 72 unchanged lines hidden (view full) --- 81 blocks.append(new_blocks) 82 blocks.decode_block += '}\n' 83 return blocks 84}}; 85 86let {{ 87 def doRipRelativeDecode(Name, opTypes, env): 88 # print "RIPing %s with opTypes %s" % (Name, opTypes) | 1// -*- mode:c++ -*- 2 3// Copyright (c) 2007 The Hewlett-Packard Development Company 4// All rights reserved. 5// 6// Redistribution and use of this software in source and binary forms, 7// with or without modification, are permitted provided that the 8// following conditions are met: --- 72 unchanged lines hidden (view full) --- 81 blocks.append(new_blocks) 82 blocks.decode_block += '}\n' 83 return blocks 84}}; 85 86let {{ 87 def doRipRelativeDecode(Name, opTypes, env): 88 # print "RIPing %s with opTypes %s" % (Name, opTypes) |
89 normBlocks = specializeInst(Name + "_M", copy.copy(opTypes), copy.copy(env)) 90 ripBlocks = specializeInst(Name + "_P", copy.copy(opTypes), copy.copy(env)) | 89 env.memoryInst = True 90 normEnv = copy.copy(env) 91 normEnv.addToDisassembly( 92 '''printMem(out, env.seg, env.scale, env.index, env.base, 93 machInst.displacement, env.addressSize, false);''') 94 normBlocks = specializeInst(Name + "_M", copy.copy(opTypes), normEnv) 95 ripEnv = copy.copy(env) 96 ripEnv.addToDisassembly( 97 '''printMem(out, env.seg, 1, 0, 0, 98 machInst.displacement, env.addressSize, true);''') 99 ripBlocks = specializeInst(Name + "_P", copy.copy(opTypes), ripEnv) |
91 92 blocks = OutputBlocks() 93 blocks.append(normBlocks) 94 blocks.append(ripBlocks) 95 96 blocks.decode_block = ''' 97 if(machInst.modRM.mod == 0 && 98 machInst.modRM.rm == 5 && --- 34 unchanged lines hidden (view full) --- 133 if opType.tag not in ("I", "J"): 134 if opType.size: 135 env.setSize(opType.size) 136 137 if opType.reg: 138 #Figure out what to do with fixed register operands 139 #This is the index to use, so we should stick it some place. 140 if opType.reg in ("A", "B", "C", "D"): | 100 101 blocks = OutputBlocks() 102 blocks.append(normBlocks) 103 blocks.append(ripBlocks) 104 105 blocks.decode_block = ''' 106 if(machInst.modRM.mod == 0 && 107 machInst.modRM.rm == 5 && --- 34 unchanged lines hidden (view full) --- 142 if opType.tag not in ("I", "J"): 143 if opType.size: 144 env.setSize(opType.size) 145 146 if opType.reg: 147 #Figure out what to do with fixed register operands 148 #This is the index to use, so we should stick it some place. 149 if opType.reg in ("A", "B", "C", "D"): |
141 env.addReg("INTREG_R%sX" % opType.reg) | 150 regString = "INTREG_R%sX" % opType.reg |
142 else: | 151 else: |
143 env.addReg("INTREG_R%s" % opType.reg) | 152 regString = "INTREG_R%s" % opType.reg 153 env.addReg(regString) 154 env.addToDisassembly( 155 "printReg(out, %s, regSize);\n" % regString) |
144 Name += "_R" 145 elif opType.tag == "B": 146 # This refers to registers whose index is encoded as part of the opcode | 156 Name += "_R" 157 elif opType.tag == "B": 158 # This refers to registers whose index is encoded as part of the opcode |
159 env.addToDisassembly( 160 "printReg(out, %s, regSize);\n" % InstRegIndex) |
|
147 Name += "_R" 148 env.addReg(InstRegIndex) 149 elif opType.tag == "M": 150 # This refers to memory. The macroop constructor sets up modrm 151 # addressing. Non memory modrm settings should cause an error. 152 env.doModRM = True 153 return doRipRelativeDecode(Name, opTypes, env) 154 elif opType.tag == None or opType.size == None: 155 raise Exception, "Problem parsing operand tag: %s" % opType.tag 156 elif opType.tag == "C": 157 # A control register indexed by the "reg" field 158 env.addReg(ModRMRegIndex) | 161 Name += "_R" 162 env.addReg(InstRegIndex) 163 elif opType.tag == "M": 164 # This refers to memory. The macroop constructor sets up modrm 165 # addressing. Non memory modrm settings should cause an error. 166 env.doModRM = True 167 return doRipRelativeDecode(Name, opTypes, env) 168 elif opType.tag == None or opType.size == None: 169 raise Exception, "Problem parsing operand tag: %s" % opType.tag 170 elif opType.tag == "C": 171 # A control register indexed by the "reg" field 172 env.addReg(ModRMRegIndex) |
173 env.addToDisassembly( 174 "ccprintf(out, \"CR%%d\", %s);\n" % ModRMRegIndex) |
|
159 Name += "_C" 160 elif opType.tag == "D": 161 # A debug register indexed by the "reg" field 162 env.addReg(ModRMRegIndex) | 175 Name += "_C" 176 elif opType.tag == "D": 177 # A debug register indexed by the "reg" field 178 env.addReg(ModRMRegIndex) |
179 env.addToDisassembly( 180 "ccprintf(out, \"DR%%d\", %s);\n" % ModRMRegIndex) |
|
163 Name += "_D" 164 elif opType.tag == "S": 165 # A segment selector register indexed by the "reg" field 166 env.addReg(ModRMRegIndex) | 181 Name += "_D" 182 elif opType.tag == "S": 183 # A segment selector register indexed by the "reg" field 184 env.addReg(ModRMRegIndex) |
185 env.addToDisassembly( 186 "printSegment(out, %s);\n" % ModRMRegIndex) |
|
167 Name += "_S" 168 elif opType.tag in ("G", "P", "T", "V"): 169 # Use the "reg" field of the ModRM byte to select the register 170 env.addReg(ModRMRegIndex) | 187 Name += "_S" 188 elif opType.tag in ("G", "P", "T", "V"): 189 # Use the "reg" field of the ModRM byte to select the register 190 env.addReg(ModRMRegIndex) |
191 env.addToDisassembly( 192 "printReg(out, %s, regSize);\n" % ModRMRegIndex) |
|
171 Name += "_R" 172 elif opType.tag in ("E", "Q", "W"): 173 # This might refer to memory or to a register. We need to 174 # divide it up farther. 175 regEnv = copy.copy(env) 176 regEnv.addReg(ModRMRMIndex) | 193 Name += "_R" 194 elif opType.tag in ("E", "Q", "W"): 195 # This might refer to memory or to a register. We need to 196 # divide it up farther. 197 regEnv = copy.copy(env) 198 regEnv.addReg(ModRMRMIndex) |
199 regEnv.addToDisassembly( 200 "printReg(out, %s, regSize);\n" % ModRMRMIndex) |
|
177 # This refers to memory. The macroop constructor should set up 178 # modrm addressing. 179 memEnv = copy.copy(env) 180 memEnv.doModRM = True 181 return doSplitDecode("MODRM_MOD", 182 {"3" : (specializeInst, Name + "_R", copy.copy(opTypes), regEnv)}, 183 (doRipRelativeDecode, Name, copy.copy(opTypes), memEnv)) 184 elif opType.tag in ("I", "J"): 185 # Immediates | 201 # This refers to memory. The macroop constructor should set up 202 # modrm addressing. 203 memEnv = copy.copy(env) 204 memEnv.doModRM = True 205 return doSplitDecode("MODRM_MOD", 206 {"3" : (specializeInst, Name + "_R", copy.copy(opTypes), regEnv)}, 207 (doRipRelativeDecode, Name, copy.copy(opTypes), memEnv)) 208 elif opType.tag in ("I", "J"): 209 # Immediates |
210 env.addToDisassembly( 211 "ccprintf(out, \"%#x\", machInst.immediate);\n") |
|
186 Name += "_I" 187 elif opType.tag == "O": 188 # Immediate containing a memory offset 189 Name += "_MI" 190 elif opType.tag in ("PR", "R", "VR"): 191 # Non register modrm settings should cause an error 192 env.addReg(ModRMRMIndex) | 212 Name += "_I" 213 elif opType.tag == "O": 214 # Immediate containing a memory offset 215 Name += "_MI" 216 elif opType.tag in ("PR", "R", "VR"): 217 # Non register modrm settings should cause an error 218 env.addReg(ModRMRMIndex) |
219 env.addToDisassembly( 220 "printReg(out, %s, regSize);\n" % ModRMRMIndex) |
|
193 Name += "_R" 194 elif opType.tag in ("X", "Y"): 195 # This type of memory addressing is for string instructions. 196 # They'll use the right index and segment internally. | 221 Name += "_R" 222 elif opType.tag in ("X", "Y"): 223 # This type of memory addressing is for string instructions. 224 # They'll use the right index and segment internally. |
225 if opType.tag == "X": 226 env.addToDisassembly( 227 '''printMem(out, env.seg, 228 1, X86ISA::ZeroReg, X86ISA::INTREG_RSI, 0, 229 env.addressSize, false);''') 230 else: 231 env.addToDisassembly( 232 '''printMem(out, SEGMENT_REG_ES, 233 1, X86ISA::ZeroReg, X86ISA::INTREG_RDI, 0, 234 env.addressSize, false);''') |
|
197 Name += "_M" 198 else: 199 raise Exception, "Unrecognized tag %s." % opType.tag 200 201 # Generate code to return a macroop of the given name which will 202 # operate in the "emulation environment" env 203 return genMacroop(Name, env) 204}}; | 235 Name += "_M" 236 else: 237 raise Exception, "Unrecognized tag %s." % opType.tag 238 239 # Generate code to return a macroop of the given name which will 240 # operate in the "emulation environment" env 241 return genMacroop(Name, env) 242}}; |