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:
Richard Henderson 2019-11-18 21:19:11 -05:00 committed by Lioncash
parent 14b401f0bf
commit 6e2358ab60
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -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)