Allow '64' to be specified for the instruction width command line params and use the appropriate insn/field data types, mask, extract and deposit functions in that case.
This will be used to implement the new 64-bit Power ISA 3.1 instructions. Signed-off-by: Luis Pires <luis.pi...@eldorado.org.br> --- docs/devel/decodetree.rst | 5 +++-- scripts/decodetree.py | 25 ++++++++++++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/docs/devel/decodetree.rst b/docs/devel/decodetree.rst index 74f66bf46e..d776dae14f 100644 --- a/docs/devel/decodetree.rst +++ b/docs/devel/decodetree.rst @@ -40,8 +40,9 @@ and returns an integral value extracted from there. A field with no ``unnamed_fields`` and no ``!function`` is in error. -FIXME: the fields of the structure into which this result will be stored -is restricted to ``int``. Which means that we cannot expand 64-bit items. +The fields of the structure into which this result will be stored are +defined as ``int`` when the instruction size is set to 16 or 32 bits +and as ``int64_t`` when the instruction size is set to 64 bits. Field examples: diff --git a/scripts/decodetree.py b/scripts/decodetree.py index 4637b633e7..3450a2a08d 100644 --- a/scripts/decodetree.py +++ b/scripts/decodetree.py @@ -42,6 +42,10 @@ output_fd = None insntype = 'uint32_t' decode_function = 'decode' +field_data_type = 'int' +extract_function = 'extract32' +sextract_function = 'sextract32' +deposit_function = 'deposit32' # An identifier for C. re_C_ident = '[a-zA-Z][a-zA-Z0-9_]*' @@ -185,9 +189,9 @@ def __str__(self): def str_extract(self): if self.sign: - extr = 'sextract32' + extr = sextract_function else: - extr = 'extract32' + extr = extract_function return '{0}(insn, {1}, {2})'.format(extr, self.pos, self.len) def __eq__(self, other): @@ -215,8 +219,8 @@ def str_extract(self): if pos == 0: ret = f.str_extract() else: - ret = 'deposit32({0}, {1}, {2}, {3})' \ - .format(ret, pos, 32 - pos, f.str_extract()) + ret = '{4}({0}, {1}, {2}, {3})' \ + .format(ret, pos, insnwidth - pos, f.str_extract(), deposit_function) pos += f.len return ret @@ -311,7 +315,7 @@ def output_def(self): if not self.extern: output('typedef struct {\n') for n in self.fields: - output(' int ', n, ';\n') + output(' ', field_data_type, ' ', n, ';\n') output('} ', self.struct_name(), ';\n\n') # end Arguments @@ -1264,6 +1268,10 @@ def main(): global insntype global insnmask global decode_function + global extract_function + global sextract_function + global deposit_function + global field_data_type global variablewidth global anyextern @@ -1293,6 +1301,13 @@ def main(): if insnwidth == 16: insntype = 'uint16_t' insnmask = 0xffff + elif insnwidth == 64: + insntype = 'uint64_t' + insnmask = 0xffffffffffffffff + field_data_type = 'int64_t' + extract_function = 'extract64' + sextract_function = 'sextract64' + deposit_function = 'deposit64' elif insnwidth != 32: error(0, 'cannot handle insns of width', insnwidth) else: -- 2.25.1