mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-08 22:45:43 +00:00
decodetree: Allow !function with no input bits
Call this form a "parameter", returning a value extracted from the DisasContext. Backports commit 94597b6146f30f949f2c454f424082a2b0f55a0e from qemu
This commit is contained in:
parent
14b401f0bf
commit
6e2358ab60
|
@ -379,7 +379,7 @@ class ConstField:
|
|||
|
||||
|
||||
class FunctionField:
|
||||
"""Class representing a field passed through an expander"""
|
||||
"""Class representing a field passed through a function"""
|
||||
def __init__(self, func, base):
|
||||
self.mask = base.mask
|
||||
self.sign = base.sign
|
||||
|
@ -400,6 +400,27 @@ class FunctionField:
|
|||
# end FunctionField
|
||||
|
||||
|
||||
class ParameterField:
|
||||
"""Class representing a pseudo-field read from a function"""
|
||||
def __init__(self, func):
|
||||
self.mask = 0
|
||||
self.sign = 0
|
||||
self.func = func
|
||||
|
||||
def __str__(self):
|
||||
return self.func
|
||||
|
||||
def str_extract(self):
|
||||
return self.func + '(ctx)'
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.func == other.func
|
||||
|
||||
def __ne__(self, other):
|
||||
return not self.__eq__(other)
|
||||
# end ParameterField
|
||||
|
||||
|
||||
class Arguments:
|
||||
"""Class representing the extracted fields of a format"""
|
||||
def __init__(self, nm, flds, extern):
|
||||
|
@ -567,17 +588,23 @@ def parse_field(lineno, name, toks):
|
|||
|
||||
if width > insnwidth:
|
||||
error(lineno, 'field too large')
|
||||
if len(subs) == 1:
|
||||
f = subs[0]
|
||||
if len(subs) == 0:
|
||||
if func:
|
||||
f = ParameterField(func)
|
||||
else:
|
||||
error(lineno, 'field with no value')
|
||||
else:
|
||||
mask = 0
|
||||
for s in subs:
|
||||
if mask & s.mask:
|
||||
error(lineno, 'field components overlap')
|
||||
mask |= s.mask
|
||||
f = MultiField(subs, mask)
|
||||
if func:
|
||||
f = FunctionField(func, f)
|
||||
if len(subs) == 1:
|
||||
f = subs[0]
|
||||
else:
|
||||
mask = 0
|
||||
for s in subs:
|
||||
if mask & s.mask:
|
||||
error(lineno, 'field components overlap')
|
||||
mask |= s.mask
|
||||
f = MultiField(subs, mask)
|
||||
if func:
|
||||
f = FunctionField(func, f)
|
||||
|
||||
if name in fields:
|
||||
error(lineno, 'duplicate field', name)
|
||||
|
|
Loading…
Reference in a new issue