Hexagon (target/hexagon) Use QEMU decodetree (16-bit instructions)

Section 10.3 of the Hexagon V73 Programmer's Reference Manual

A duplex is encoded as a 32-bit instruction with bits [15:14] set to 00.
The sub-instructions that comprise a duplex are encoded as 13-bit fields
in the duplex.

Create a decoder for each subinstruction class (a, l1, l2, s1, s2).

Extend gen_trans_funcs.py to handle all instructions rather than
filter by instruction class.

There is a g_assert_not_reached() in decode_insns() in decode.c to
verify we never try to use the old decoder on 16-bit instructions.

Signed-off-by: Taylor Simpson <ltaylorsimpson@gmail.com>
Reviewed-by: Brian Cain <bcain@quicinc.com>
Message-Id: <20240115221443.365287-3-ltaylorsimpson@gmail.com>
Signed-off-by: Brian Cain <bcain@quicinc.com>
This commit is contained in:
Taylor Simpson 2024-01-15 15:14:42 -07:00 committed by Brian Cain
parent 1547a2d339
commit f6c01009b5
5 changed files with 188 additions and 12 deletions

View file

@ -154,6 +154,51 @@ hvx_decode_generated = custom_target(
)
hexagon_ss.add(hvx_decode_generated)
subinsn_a_decode_generated = custom_target(
'subinsn_a_decode_generated',
output: 'subinsn_a_decode_generated',
depends: [iset_py, semantics_generated],
env: {'PYTHONPATH': meson.current_build_dir()},
command: [python, files('gen_decodetree.py'), semantics_generated, 'SUBINSN_A', '@OUTPUT@'],
)
hexagon_ss.add(subinsn_a_decode_generated)
subinsn_l1_decode_generated = custom_target(
'subinsn_l1_decode_generated',
output: 'subinsn_l1_decode_generated',
depends: [iset_py, semantics_generated],
env: {'PYTHONPATH': meson.current_build_dir()},
command: [python, files('gen_decodetree.py'), semantics_generated, 'SUBINSN_L1', '@OUTPUT@'],
)
hexagon_ss.add(subinsn_l1_decode_generated)
subinsn_l2_decode_generated = custom_target(
'subinsn_l2_decode_generated',
output: 'subinsn_l2_decode_generated',
depends: [iset_py, semantics_generated],
env: {'PYTHONPATH': meson.current_build_dir()},
command: [python, files('gen_decodetree.py'), semantics_generated, 'SUBINSN_L2', '@OUTPUT@'],
)
hexagon_ss.add(subinsn_l2_decode_generated)
subinsn_s1_decode_generated = custom_target(
'subinsn_s1_decode_generated',
output: 'subinsn_s1_decode_generated',
depends: [iset_py, semantics_generated],
env: {'PYTHONPATH': meson.current_build_dir()},
command: [python, files('gen_decodetree.py'), semantics_generated, 'SUBINSN_S1', '@OUTPUT@'],
)
hexagon_ss.add(subinsn_s1_decode_generated)
subinsn_s2_decode_generated = custom_target(
'subinsn_s2_decode_generated',
output: 'subinsn_s2_decode_generated',
depends: [iset_py, semantics_generated],
env: {'PYTHONPATH': meson.current_build_dir()},
command: [python, files('gen_decodetree.py'), semantics_generated, 'SUBINSN_S2', '@OUTPUT@'],
)
hexagon_ss.add(subinsn_s2_decode_generated)
#
# Run the QEMU decodetree.py script to produce the instruction decoder
#
@ -176,6 +221,51 @@ decode_hvx_generated = custom_target(
)
hexagon_ss.add(decode_hvx_generated)
decode_subinsn_a_generated = custom_target(
'decode_subinsn_a_generated.c.inc',
output: 'decode_subinsn_a_generated.c.inc',
input: subinsn_a_decode_generated,
env: {'PYTHONPATH': meson.current_build_dir()},
command: [python, files(decodetree_py), subinsn_a_decode_generated, ['--static-decode=decode_subinsn_a', '--insnwidth=16'], '-o', '@OUTPUT@'],
)
hexagon_ss.add(decode_subinsn_a_generated)
decode_subinsn_l1_generated = custom_target(
'decode_subinsn_l1_generated.c.inc',
output: 'decode_subinsn_l1_generated.c.inc',
input: subinsn_l1_decode_generated,
env: {'PYTHONPATH': meson.current_build_dir()},
command: [python, files(decodetree_py), subinsn_l1_decode_generated, ['--static-decode=decode_subinsn_l1', '--insnwidth=16'], '-o', '@OUTPUT@'],
)
hexagon_ss.add(decode_subinsn_l1_generated)
decode_subinsn_l2_generated = custom_target(
'decode_subinsn_l2_generated.c.inc',
output: 'decode_subinsn_l2_generated.c.inc',
input: subinsn_l2_decode_generated,
env: {'PYTHONPATH': meson.current_build_dir()},
command: [python, files(decodetree_py), subinsn_l2_decode_generated, ['--static-decode=decode_subinsn_l2', '--insnwidth=16'], '-o', '@OUTPUT@'],
)
hexagon_ss.add(decode_subinsn_l2_generated)
decode_subinsn_s1_generated = custom_target(
'decode_subinsn_s1_generated.c.inc',
output: 'decode_subinsn_s1_generated.c.inc',
input: subinsn_s1_decode_generated,
env: {'PYTHONPATH': meson.current_build_dir()},
command: [python, files(decodetree_py), subinsn_s1_decode_generated, ['--static-decode=decode_subinsn_s1', '--insnwidth=16'], '-o', '@OUTPUT@'],
)
hexagon_ss.add(decode_subinsn_s1_generated)
decode_subinsn_s2_generated = custom_target(
'decode_subinsn_s2_generated.c.inc',
output: 'decode_subinsn_s2_generated.c.inc',
input: subinsn_s2_decode_generated,
env: {'PYTHONPATH': meson.current_build_dir()},
command: [python, files(decodetree_py), subinsn_s2_decode_generated, ['--static-decode=decode_subinsn_s2', '--insnwidth=16'], '-o', '@OUTPUT@'],
)
hexagon_ss.add(decode_subinsn_s2_generated)
#
# Generate the trans_* functions that the decoder will use
#