specialize.isa (4542:f6ca2384b304) | specialize.isa (4548:1738b4f7bac8) |
---|---|
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: --- 81 unchanged lines hidden (view full) --- 90 match = OpType.parser.search(opTypeString) 91 if match == None: 92 raise Exception, "Problem parsing operand type %s" % opTypeString 93 self.reg = match.group("reg") 94 self.tag = match.group("tag") 95 self.size = match.group("size") 96 self.rsize = match.group("rsize") 97 | 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: --- 81 unchanged lines hidden (view full) --- 90 match = OpType.parser.search(opTypeString) 91 if match == None: 92 raise Exception, "Problem parsing operand type %s" % opTypeString 93 self.reg = match.group("reg") 94 self.tag = match.group("tag") 95 self.size = match.group("size") 96 self.rsize = match.group("rsize") 97 |
98 ModRMRegIndex = "(MODRM_REG | (REX_R << 3))" 99 ModRMRMIndex = "(MODRM_RM | (REX_B << 3))" 100 |
|
98 # This function specializes the given piece of code to use a particular 99 # set of argument types described by "opTypes". 100 def specializeInst(Name, opTypes, env): 101 print "Specializing %s with opTypes %s" % (Name, opTypes) 102 while len(opTypes): 103 # Parse the operand type string we're working with 104 opType = OpType(opTypes[0]) 105 --- 10 unchanged lines hidden (view full) --- 116 elif opType.rsize == "x": 117 print "word" 118 else: 119 print "Didn't recognize fixed register size %s!" % opType.rsize 120 elif opType.tag == None or opType.size == None: 121 raise Exception, "Problem parsing operand tag: %s" % opType.tag 122 elif opType.tag in ("C", "D", "G", "P", "S", "T", "V"): 123 # Use the "reg" field of the ModRM byte to select the register | 101 # This function specializes the given piece of code to use a particular 102 # set of argument types described by "opTypes". 103 def specializeInst(Name, opTypes, env): 104 print "Specializing %s with opTypes %s" % (Name, opTypes) 105 while len(opTypes): 106 # Parse the operand type string we're working with 107 opType = OpType(opTypes[0]) 108 --- 10 unchanged lines hidden (view full) --- 119 elif opType.rsize == "x": 120 print "word" 121 else: 122 print "Didn't recognize fixed register size %s!" % opType.rsize 123 elif opType.tag == None or opType.size == None: 124 raise Exception, "Problem parsing operand tag: %s" % opType.tag 125 elif opType.tag in ("C", "D", "G", "P", "S", "T", "V"): 126 # Use the "reg" field of the ModRM byte to select the register |
124 env.addReg("(uint8_t)MODRM_REG") | 127 env.addReg(ModRMRegIndex) |
125 elif opType.tag in ("E", "Q", "W"): 126 # This might refer to memory or to a register. We need to 127 # divide it up farther. 128 regTypes = copy.copy(opTypes) 129 regTypes.pop(0) 130 regEnv = copy.copy(env) | 128 elif opType.tag in ("E", "Q", "W"): 129 # This might refer to memory or to a register. We need to 130 # divide it up farther. 131 regTypes = copy.copy(opTypes) 132 regTypes.pop(0) 133 regEnv = copy.copy(env) |
131 regEnv.addReg("(uint8_t)MODRM_RM") | 134 regEnv.addReg(ModRMRMIndex) |
132 # This needs to refer to memory, but we'll fill in the details 133 # later. It needs to take into account unaligned memory 134 # addresses. 135 memTypes = copy.copy(opTypes) 136 memTypes.pop(0) 137 memEnv = copy.copy(env) 138 print "%0" 139 return doSplitDecode(Name, specializeInst, "MODRM_MOD", --- 4 unchanged lines hidden (view full) --- 144 elif opType.tag == "M": 145 # This needs to refer to memory, but we'll fill in the details 146 # later. It needs to take into account unaligned memory 147 # addresses. 148 print "%0" 149 elif opType.tag in ("PR", "R", "VR"): 150 # There should probably be a check here to verify that mod 151 # is equal to 11b | 135 # This needs to refer to memory, but we'll fill in the details 136 # later. It needs to take into account unaligned memory 137 # addresses. 138 memTypes = copy.copy(opTypes) 139 memTypes.pop(0) 140 memEnv = copy.copy(env) 141 print "%0" 142 return doSplitDecode(Name, specializeInst, "MODRM_MOD", --- 4 unchanged lines hidden (view full) --- 147 elif opType.tag == "M": 148 # This needs to refer to memory, but we'll fill in the details 149 # later. It needs to take into account unaligned memory 150 # addresses. 151 print "%0" 152 elif opType.tag in ("PR", "R", "VR"): 153 # There should probably be a check here to verify that mod 154 # is equal to 11b |
152 env.addReg("(uint8_t)MODRM_RM") | 155 env.addReg(ModRMRMIndex) |
153 else: 154 raise Exception, "Unrecognized tag %s." % opType.tag 155 opTypes.pop(0) 156 157 # Generate code to return a macroop of the given name which will 158 # operate in the given "emulation environment" 159 return genMacroop(Name, env) 160}}; | 156 else: 157 raise Exception, "Unrecognized tag %s." % opType.tag 158 opTypes.pop(0) 159 160 # Generate code to return a macroop of the given name which will 161 # operate in the given "emulation environment" 162 return genMacroop(Name, env) 163}}; |