mirror of
https://github.com/qemu/qemu.git
synced 2024-11-26 12:23:36 +08:00
tcg/tci: Merge identical cases in generation (arithmetic opcodes)
Use CASE_32_64 and CASE_64 to reduce ifdefs and merge cases that are identical between 32-bit and 64-bit hosts. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20210217202036.1724901-5-richard.henderson@linaro.org> [PMD: Split patch as 1/5] Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20210218232840.1760806-2-f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
0610067ec0
commit
c764f8cc2c
@ -380,6 +380,18 @@ static inline void tcg_out_call(TCGContext *s, const tcg_insn_unit *arg)
|
||||
old_code_ptr[1] = s->code_ptr - old_code_ptr;
|
||||
}
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 64
|
||||
# define CASE_32_64(x) \
|
||||
case glue(glue(INDEX_op_, x), _i64): \
|
||||
case glue(glue(INDEX_op_, x), _i32):
|
||||
# define CASE_64(x) \
|
||||
case glue(glue(INDEX_op_, x), _i64):
|
||||
#else
|
||||
# define CASE_32_64(x) \
|
||||
case glue(glue(INDEX_op_, x), _i32):
|
||||
# define CASE_64(x)
|
||||
#endif
|
||||
|
||||
static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
|
||||
const int *const_args)
|
||||
{
|
||||
@ -391,6 +403,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
|
||||
case INDEX_op_exit_tb:
|
||||
tcg_out64(s, args[0]);
|
||||
break;
|
||||
|
||||
case INDEX_op_goto_tb:
|
||||
if (s->tb_jmp_insn_offset) {
|
||||
/* Direct jump method. */
|
||||
@ -456,22 +469,27 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
|
||||
tcg_debug_assert(args[2] == (int32_t)args[2]);
|
||||
tcg_out32(s, args[2]);
|
||||
break;
|
||||
case INDEX_op_add_i32:
|
||||
case INDEX_op_sub_i32:
|
||||
case INDEX_op_mul_i32:
|
||||
case INDEX_op_and_i32:
|
||||
case INDEX_op_andc_i32: /* Optional (TCG_TARGET_HAS_andc_i32). */
|
||||
case INDEX_op_eqv_i32: /* Optional (TCG_TARGET_HAS_eqv_i32). */
|
||||
case INDEX_op_nand_i32: /* Optional (TCG_TARGET_HAS_nand_i32). */
|
||||
case INDEX_op_nor_i32: /* Optional (TCG_TARGET_HAS_nor_i32). */
|
||||
case INDEX_op_or_i32:
|
||||
case INDEX_op_orc_i32: /* Optional (TCG_TARGET_HAS_orc_i32). */
|
||||
case INDEX_op_xor_i32:
|
||||
case INDEX_op_shl_i32:
|
||||
case INDEX_op_shr_i32:
|
||||
case INDEX_op_sar_i32:
|
||||
case INDEX_op_rotl_i32: /* Optional (TCG_TARGET_HAS_rot_i32). */
|
||||
case INDEX_op_rotr_i32: /* Optional (TCG_TARGET_HAS_rot_i32). */
|
||||
|
||||
CASE_32_64(add)
|
||||
CASE_32_64(sub)
|
||||
CASE_32_64(mul)
|
||||
CASE_32_64(and)
|
||||
CASE_32_64(or)
|
||||
CASE_32_64(xor)
|
||||
CASE_32_64(andc) /* Optional (TCG_TARGET_HAS_andc_*). */
|
||||
CASE_32_64(orc) /* Optional (TCG_TARGET_HAS_orc_*). */
|
||||
CASE_32_64(eqv) /* Optional (TCG_TARGET_HAS_eqv_*). */
|
||||
CASE_32_64(nand) /* Optional (TCG_TARGET_HAS_nand_*). */
|
||||
CASE_32_64(nor) /* Optional (TCG_TARGET_HAS_nor_*). */
|
||||
CASE_32_64(shl)
|
||||
CASE_32_64(shr)
|
||||
CASE_32_64(sar)
|
||||
CASE_32_64(rotl) /* Optional (TCG_TARGET_HAS_rot_*). */
|
||||
CASE_32_64(rotr) /* Optional (TCG_TARGET_HAS_rot_*). */
|
||||
CASE_32_64(div) /* Optional (TCG_TARGET_HAS_div_*). */
|
||||
CASE_32_64(divu) /* Optional (TCG_TARGET_HAS_div_*). */
|
||||
CASE_32_64(rem) /* Optional (TCG_TARGET_HAS_div_*). */
|
||||
CASE_32_64(remu) /* Optional (TCG_TARGET_HAS_div_*). */
|
||||
tcg_out_r(s, args[0]);
|
||||
tcg_out_r(s, args[1]);
|
||||
tcg_out_r(s, args[2]);
|
||||
@ -487,30 +505,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
|
||||
break;
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 64
|
||||
case INDEX_op_add_i64:
|
||||
case INDEX_op_sub_i64:
|
||||
case INDEX_op_mul_i64:
|
||||
case INDEX_op_and_i64:
|
||||
case INDEX_op_andc_i64: /* Optional (TCG_TARGET_HAS_andc_i64). */
|
||||
case INDEX_op_eqv_i64: /* Optional (TCG_TARGET_HAS_eqv_i64). */
|
||||
case INDEX_op_nand_i64: /* Optional (TCG_TARGET_HAS_nand_i64). */
|
||||
case INDEX_op_nor_i64: /* Optional (TCG_TARGET_HAS_nor_i64). */
|
||||
case INDEX_op_or_i64:
|
||||
case INDEX_op_orc_i64: /* Optional (TCG_TARGET_HAS_orc_i64). */
|
||||
case INDEX_op_xor_i64:
|
||||
case INDEX_op_shl_i64:
|
||||
case INDEX_op_shr_i64:
|
||||
case INDEX_op_sar_i64:
|
||||
case INDEX_op_rotl_i64: /* Optional (TCG_TARGET_HAS_rot_i64). */
|
||||
case INDEX_op_rotr_i64: /* Optional (TCG_TARGET_HAS_rot_i64). */
|
||||
case INDEX_op_div_i64: /* Optional (TCG_TARGET_HAS_div_i64). */
|
||||
case INDEX_op_divu_i64: /* Optional (TCG_TARGET_HAS_div_i64). */
|
||||
case INDEX_op_rem_i64: /* Optional (TCG_TARGET_HAS_div_i64). */
|
||||
case INDEX_op_remu_i64: /* Optional (TCG_TARGET_HAS_div_i64). */
|
||||
tcg_out_r(s, args[0]);
|
||||
tcg_out_r(s, args[1]);
|
||||
tcg_out_r(s, args[2]);
|
||||
break;
|
||||
case INDEX_op_deposit_i64: /* Optional (TCG_TARGET_HAS_deposit_i64). */
|
||||
tcg_out_r(s, args[0]);
|
||||
tcg_out_r(s, args[1]);
|
||||
@ -551,14 +545,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
|
||||
tcg_out_r(s, args[0]);
|
||||
tcg_out_r(s, args[1]);
|
||||
break;
|
||||
case INDEX_op_div_i32: /* Optional (TCG_TARGET_HAS_div_i32). */
|
||||
case INDEX_op_divu_i32: /* Optional (TCG_TARGET_HAS_div_i32). */
|
||||
case INDEX_op_rem_i32: /* Optional (TCG_TARGET_HAS_div_i32). */
|
||||
case INDEX_op_remu_i32: /* Optional (TCG_TARGET_HAS_div_i32). */
|
||||
tcg_out_r(s, args[0]);
|
||||
tcg_out_r(s, args[1]);
|
||||
tcg_out_r(s, args[2]);
|
||||
break;
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
case INDEX_op_add2_i32:
|
||||
case INDEX_op_sub2_i32:
|
||||
@ -628,8 +615,10 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
|
||||
}
|
||||
tcg_out_i(s, *args++);
|
||||
break;
|
||||
|
||||
case INDEX_op_mb:
|
||||
break;
|
||||
|
||||
case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */
|
||||
case INDEX_op_mov_i64:
|
||||
case INDEX_op_call: /* Always emitted via tcg_out_call. */
|
||||
|
Loading…
Reference in New Issue
Block a user