macroop.isa (4601:38c989d15fef) | macroop.isa (4746:7960a6867f55) |
---|---|
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: --- 182 unchanged lines hidden (view full) --- 191 192let {{ 193 class EmulEnv(object): 194 def __init__(self): 195 self.reg = "0" 196 self.regUsed = False 197 self.regm = "0" 198 self.regmUsed = False | 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: --- 182 unchanged lines hidden (view full) --- 191 192let {{ 193 class EmulEnv(object): 194 def __init__(self): 195 self.reg = "0" 196 self.regUsed = False 197 self.regm = "0" 198 self.regmUsed = False |
199 self.size = None |
|
199 self.addressSize = "ADDRSIZE" 200 self.dataSize = "OPSIZE" 201 self.stackSize = "STACKSIZE" 202 self.doModRM = False 203 204 def getAllocator(self): | 200 self.addressSize = "ADDRSIZE" 201 self.dataSize = "OPSIZE" 202 self.stackSize = "STACKSIZE" 203 self.doModRM = False 204 205 def getAllocator(self): |
206 if self.size == 'b': 207 self.dataSize = 1 208 elif self.size == 'd': 209 self.dataSize = 4 210 elif self.size == 'q': 211 self.dataSize = 8 212 elif self.size == 'v': 213 self.dataSize = "OPSIZE" 214 elif self.size == 'w': 215 self.dataSize = 2 216 elif self.size == 'z': 217 self.dataSize = "((OPSIZE == 8) ? 4 : OPSIZE)" 218 elif self.size: 219 raise Exception, "Unrecognized size type %s!" % self.size |
|
205 return '''EmulEnv(%(reg)s, 206 %(regm)s, 207 %(dataSize)s, 208 %(addressSize)s, 209 %(stackSize)s)''' % \ 210 self.__dict__ | 220 return '''EmulEnv(%(reg)s, 221 %(regm)s, 222 %(dataSize)s, 223 %(addressSize)s, 224 %(stackSize)s)''' % \ 225 self.__dict__ |
226 |
|
211 def addReg(self, reg): 212 if not self.regUsed: 213 self.reg = reg 214 self.regUsed = True 215 elif not self.regmUsed: 216 self.regm = reg 217 self.regmUsed = True 218 else: 219 raise Exception, "EmulEnv is out of register specialization spots." | 227 def addReg(self, reg): 228 if not self.regUsed: 229 self.reg = reg 230 self.regUsed = True 231 elif not self.regmUsed: 232 self.regm = reg 233 self.regmUsed = True 234 else: 235 raise Exception, "EmulEnv is out of register specialization spots." |
236 def setSize(self, size): 237 if not self.size: 238 self.size = size 239 else: 240 if self.size is not size: 241 raise Exception, "Conflicting register sizes %s and %s!" %\ 242 (self.size, size) |
|
220}}; 221 222let {{ 223 doModRMString = "env.doModRM(machInst);\n" 224 def genMacroop(Name, env): 225 blocks = OutputBlocks() 226 if not macroopDict.has_key(Name): 227 raise Exception, "Unrecognized instruction: %s" % Name 228 macroop = macroopDict[Name] 229 if not macroop.declared: 230 if env.doModRM: 231 macroop.doModRM = doModRMString 232 blocks.header_output = macroop.getDeclaration() 233 blocks.decoder_output = macroop.getDefinition() 234 macroop.declared = True 235 blocks.decode_block = "return %s;\n" % macroop.getAllocator(env) 236 return blocks 237}}; | 243}}; 244 245let {{ 246 doModRMString = "env.doModRM(machInst);\n" 247 def genMacroop(Name, env): 248 blocks = OutputBlocks() 249 if not macroopDict.has_key(Name): 250 raise Exception, "Unrecognized instruction: %s" % Name 251 macroop = macroopDict[Name] 252 if not macroop.declared: 253 if env.doModRM: 254 macroop.doModRM = doModRMString 255 blocks.header_output = macroop.getDeclaration() 256 blocks.decoder_output = macroop.getDefinition() 257 macroop.declared = True 258 blocks.decode_block = "return %s;\n" % macroop.getAllocator(env) 259 return blocks 260}}; |