Generate the opcode translator table instead of listing it in genptr.c. Skip empty translators and inline the helper slot value.
Signed-off-by: Marco Liebel <[email protected]> Signed-off-by: Brian Cain <[email protected]> --- target/hexagon/gen_tcg_func_table.py | 29 ++++++++++++++++++++++++++++ target/hexagon/gen_tcg_funcs.py | 4 ---- target/hexagon/genptr.c | 15 +------------- target/hexagon/hex_common.py | 3 ++- target/hexagon/meson.build | 11 +++++++++++ 5 files changed, 43 insertions(+), 19 deletions(-) create mode 100755 target/hexagon/gen_tcg_func_table.py diff --git a/target/hexagon/gen_tcg_func_table.py b/target/hexagon/gen_tcg_func_table.py new file mode 100755 index 0000000000..ba56ede568 --- /dev/null +++ b/target/hexagon/gen_tcg_func_table.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +# +# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. +# SPDX-License-Identifier: GPL-2.0-or-later + +import hex_common + + +def main(): + args = hex_common.parse_common_args( + "Emit the table of instruction translation functions" + ) + + with open(args.out, "w") as f: + f.write("#ifndef HEXAGON_FUNC_TABLE_H\n") + f.write("#define HEXAGON_FUNC_TABLE_H\n\n") + f.write("const SemanticInsn opcode_genptr[XX_LAST_OPCODE] = {\n") + + for tag in hex_common.tags: + if hex_common.tag_ignore(tag): + continue + f.write(f" [{tag}] = generate_{tag},\n") + + f.write("};\n\n") + f.write("#endif /* HEXAGON_FUNC_TABLE_H */\n") + + +if __name__ == "__main__": + main() diff --git a/target/hexagon/gen_tcg_funcs.py b/target/hexagon/gen_tcg_funcs.py index 61effa38cf..4305eda996 100755 --- a/target/hexagon/gen_tcg_funcs.py +++ b/target/hexagon/gen_tcg_funcs.py @@ -173,11 +173,7 @@ def main(): for tag in hex_common.tags: if hex_common.tag_ignore(tag): - f.write(f"static void generate_{tag}" - f"(DisasContext *ctx)\n") - f.write("{\n}\n\n") continue - gen_def_tcg_func(f, tag, tagregs, tagimms) f.write("#endif /* HEXAGON_TCG_FUNCS_H */\n") diff --git a/target/hexagon/genptr.c b/target/hexagon/genptr.c index d0aabacf35..fd3f6a1edf 100644 --- a/target/hexagon/genptr.c +++ b/target/hexagon/genptr.c @@ -752,15 +752,6 @@ void gen_vframecheck(DisasContext *ctx, TCGv vsp) tcg_gen_mov_tl(hex_gpr[HEX_REG_VSP], vsp); } -#ifndef CONFIG_HEXAGON_IDEF_PARSER -static TCGv gen_slotval(DisasContext *ctx) -{ - int slotval = - (ctx->pkt.pkt_has_scalar_store_s1 & 1) | (ctx->insn->slot << 1); - return tcg_constant_tl(slotval); -} -#endif - void gen_store32(TCGv vaddr, TCGv src, uint32_t width, uint32_t slot) { tcg_gen_mov_tl(hex_store_addr[slot], vaddr); @@ -1855,8 +1846,4 @@ void gen_add_sat_i64(DisasContext *ctx, TCGv_i64 ret, TCGv_i64 a, TCGv_i64 b) } #include "tcg_funcs_generated.c.inc" -const SemanticInsn opcode_genptr[XX_LAST_OPCODE] = { -#define OPCODE(X) [X] = generate_##X -#include "opcodes_def_generated.h.inc" -#undef OPCODE -}; +#include "tcg_func_table_generated.c.inc" diff --git a/target/hexagon/hex_common.py b/target/hexagon/hex_common.py index 94e70b8657..a4807bed7b 100755 --- a/target/hexagon/hex_common.py +++ b/target/hexagon/hex_common.py @@ -1520,7 +1520,8 @@ def helper_args(tag, regs, imms): if need_slot(tag): args.append(HelperArg( "i32", - "gen_slotval(ctx)", + "tcg_constant_i32((ctx->pkt.pkt_has_scalar_store_s1 & 1) | " + "(ctx->insn->slot << 1))", "uint32_t slotval" )) if need_part1(tag): diff --git a/target/hexagon/meson.build b/target/hexagon/meson.build index 0633852321..429317a658 100644 --- a/target/hexagon/meson.build +++ b/target/hexagon/meson.build @@ -42,10 +42,21 @@ hexagon_ss.add(semantics_generated) # # Step 2 # We use Python scripts to generate the following files +# tcg_func_table_generated.c.inc # printinsn_generated.h.inc # op_attribs_generated.h.inc # opcodes_def_generated.h.inc # +tcg_func_table_generated = custom_target( + 'tcg_func_table_generated.c.inc', + output: 'tcg_func_table_generated.c.inc', + depends: [semantics_generated], + depend_files: [hex_common_py, gen_tcg_h, gen_tcg_hvx_h, gen_tcg_sys_h], + command: [python, files('gen_tcg_func_table.py'), semantics_generated, + gen_tcg_h, gen_tcg_hvx_h, gen_tcg_sys_h, '@OUTPUT@'], +) +hexagon_ss.add(tcg_func_table_generated) + printinsn_generated = custom_target( 'printinsn_generated.h.inc', output: 'printinsn_generated.h.inc', -- 2.43.0
