67,69c67,69
< # builder is called on the exploded contents of "vals" values to generate
< # whatever code should be used.
< def doSplitDecode(builder, switchVal, vals, default = None):
---
> # Each element of the dict is a list containing a function and then the
> # arguments to pass to it.
> def doSplitDecode(switchVal, vals, default = None):
73c73
< new_blocks = builder(*todo)
---
> new_blocks = todo[0](*todo[1:])
78c78
< new_blocks = builder(*default)
---
> new_blocks = default[0](*default[1:])
86a87,107
> def doRipRelativeDecode(Name, opTypes, env):
> # print "RIPing %s with opTypes %s" % (Name, opTypes)
> normBlocks = specializeInst(Name + "_M", copy.copy(opTypes), copy.copy(env))
> ripBlocks = specializeInst(Name + "_P", copy.copy(opTypes), copy.copy(env))
>
> blocks = OutputBlocks()
> blocks.append(normBlocks)
> blocks.append(ripBlocks)
>
> blocks.decode_block = '''
> if(machInst.modRM.mod == 0 &&
> machInst.modRM.rm == 5 &&
> machInst.mode.submode == SixtyFourBitMode)
> { %s }
> else
> { %s }''' % \
> (ripBlocks.decode_block, normBlocks.decode_block)
> return blocks
> }};
>
> let {{
145,147c166,168
< return doSplitDecode(specializeInst, "MODRM_MOD",
< {"3" : (Name + "_R", copy.copy(opTypes), regEnv)},
< (Name + "_M", copy.copy(opTypes), memEnv))
---
> return doSplitDecode("MODRM_MOD",
> {"3" : (specializeInst, Name + "_R", copy.copy(opTypes), regEnv)},
> (doRipRelativeDecode, Name, copy.copy(opTypes), memEnv))