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}};