69,71c69,70
< def doSplitDecode(name, Name, builder, switchVal, vals, default = None):
< blocks = OutputBlocks()
< blocks.decode_block += 'switch(%s) {\n' % switchVal
---
> def doSplitDecode(Name, builder, switchVal, vals, default = None):
> decode_block = 'switch(%s) {\n' % switchVal
73,75c72,74
< built = builder(name, Name, *todo)
< built.decode_block = '\tcase %s: %s\n' % (val, built.decode_block)
< blocks.append(built)
---
> new_block = builder(Name, *todo)
> new_block = '\tcase %s: %s\n' % (val, new_block)
> decode_block += new_block
77,81c76,80
< built = builder(name, Name, *default)
< built.decode_block = '\tdefault: %s\n' % built.decode_block
< blocks.append(built)
< blocks.decode_block += '}\n'
< return blocks
---
> new_block = builder(Name, *default)
> new_block = '\tdefault: %s\n' % new_block
> decode_block += new_block
> decode_block += '}\n'
> return decode_block
86c85
< parser = re.compile(r"(?P<tag>[A-Z][A-Z]*)(?P<size>[a-z][a-z]*)|(r(?P<reg>[A-Za-z0-9][A-Za-z0-9]*))")
---
> parser = re.compile(r"(?P<tag>[A-Z][A-Z]*)(?P<size>[a-z][a-z]*)|(r(?P<reg>[A-Z0-9])(?P<rsize>[a-z]*))")
93a93
> self.rsize = match.group("rsize")
96,99c96,97
< # set of argument types described by "opTypes". These are "implemented"
< # in reverse order.
< def specializeInst(name, Name, code, opTypes):
< opNum = len(opTypes) - 1
---
> # set of argument types described by "opTypes".
> def specializeInst(Name, opTypes, env):
104,106d101
< # A regular expression to find the operand placeholders we're
< # interested in.
< opRe = re.compile("\\^(?P<operandNum>%d)(?=[^0-9]|$)" % opNum)
108c103
< # Parse the operand type strign we're working with
---
> # Parse the operand type string we're working with
113,119c108,116
< if opType.reg in ("Ax", "Bx", "Cx", "Dx"):
< code = opRe.sub("%%{INTREG_R%s}" % opType.reg.upper(), code)
< elif opType.reg == "Al":
< # We need a way to specify register width
< code = opRe.sub("%{INTREG_RAX}", code)
< else:
< print "Didn't know how to encode fixed register %s!" % opType.reg
---
> #This is the index to use, so we should stick it some place.
> print "INTREG_R%s" % (opType.reg + opType.size.upper())
> if opType.size:
> if opType.rsize in ("l", "h", "b"):
> print "byte"
> elif opType.rsize == "x":
> print "word"
> else:
> print "Didn't recognize fixed register size %s!" % opType.rsize
124c121
< code = opRe.sub("%{(uint8_t)MODRM_REG}", code)
---
> print "(uint8_t)MODRM_REG"
128c125
< regCode = opRe.sub("%{(uint8_t)MODRM_RM}", code)
---
> print "(uint8_t)MODRM_RM"
130c127,128
< regTypes.pop(-1)
---
> regTypes.pop(0)
> regEnv = copy.copy(env)
134,135c132,133
< code = "GenFault ${new UnimpInstFault}\n" + code
< memCode = opRe.sub("%0", code)
---
> # code = "GenFault #${new UnimpInstFault}#\n" + code
> print "%0"
137,139c135,138
< memTypes.pop(-1)
< return doSplitDecode(name, Name, specializeInst, "MODRM_MOD",
< {"3" : (regCode, regTypes)}, (memCode, memTypes))
---
> memTypes.pop(0)
> memEnv = copy.copy(env)
> return doSplitDecode(Name, specializeInst, "MODRM_MOD",
> {"3" : (regTypes, memEnv)}, (memTypes, memEnv))
143c142
< code = opRe.sub("${IMMEDIATE}", code)
---
> print "IMMEDIATE"
148,149c147,148
< code = "GenFault ${new UnimpInstFault}\n" + code
< code = opRe.sub("%0", code)
---
> #code = "GenFault #${new UnimpInstFault}#\n" + code
> print "%0"
153c152
< code = opRe.sub("%{(uint8_t)MODRM_RM}", code)
---
> print "(uint8_t)MODRM_RM"
156c155
< opTypes.pop(-1)
---
> opTypes.pop(0)
161,163c160
< blocks = OutputBlocks()
< blocks.append(assembleMicro(name, Name, code))
< return blocks
---
> return genMacroop(Name, env)