mirror of
https://github.com/qemu/qemu.git
synced 2026-05-19 22:58:03 +00:00
tcg: Add insn_start_words to TCGContext
This will enable replacement of TARGET_INSN_START_WORDS in tcg.c. Split out "tcg/insn-start-words.h" and use it in target/. Reviewed-by: Anton Johansson <anjo@rev.ng> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
17
include/tcg/insn-start-words.h
Normal file
17
include/tcg/insn-start-words.h
Normal file
@@ -0,0 +1,17 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Define TARGET_INSN_START_WORDS
|
||||
* Copyright (c) 2008 Fabrice Bellard
|
||||
*/
|
||||
|
||||
#ifndef TARGET_INSN_START_WORDS
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
#ifndef TARGET_INSN_START_EXTRA_WORDS
|
||||
# define TARGET_INSN_START_WORDS 1
|
||||
#else
|
||||
# define TARGET_INSN_START_WORDS (1 + TARGET_INSN_START_EXTRA_WORDS)
|
||||
#endif
|
||||
|
||||
#endif /* TARGET_INSN_START_WORDS */
|
||||
@@ -22,20 +22,20 @@
|
||||
# error
|
||||
#endif
|
||||
|
||||
#if TARGET_INSN_START_WORDS == 1
|
||||
#ifndef TARGET_INSN_START_EXTRA_WORDS
|
||||
static inline void tcg_gen_insn_start(target_ulong pc)
|
||||
{
|
||||
TCGOp *op = tcg_emit_op(INDEX_op_insn_start, 64 / TCG_TARGET_REG_BITS);
|
||||
tcg_set_insn_start_param(op, 0, pc);
|
||||
}
|
||||
#elif TARGET_INSN_START_WORDS == 2
|
||||
#elif TARGET_INSN_START_EXTRA_WORDS == 1
|
||||
static inline void tcg_gen_insn_start(target_ulong pc, target_ulong a1)
|
||||
{
|
||||
TCGOp *op = tcg_emit_op(INDEX_op_insn_start, 2 * 64 / TCG_TARGET_REG_BITS);
|
||||
tcg_set_insn_start_param(op, 0, pc);
|
||||
tcg_set_insn_start_param(op, 1, a1);
|
||||
}
|
||||
#elif TARGET_INSN_START_WORDS == 3
|
||||
#elif TARGET_INSN_START_EXTRA_WORDS == 2
|
||||
static inline void tcg_gen_insn_start(target_ulong pc, target_ulong a1,
|
||||
target_ulong a2)
|
||||
{
|
||||
@@ -45,7 +45,7 @@ static inline void tcg_gen_insn_start(target_ulong pc, target_ulong a1,
|
||||
tcg_set_insn_start_param(op, 2, a2);
|
||||
}
|
||||
#else
|
||||
# error "Unhandled number of operands to insn_start"
|
||||
#error Unhandled TARGET_INSN_START_EXTRA_WORDS value
|
||||
#endif
|
||||
|
||||
#if TARGET_LONG_BITS == 32
|
||||
|
||||
@@ -188,9 +188,9 @@ DEF(mulsh_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_mulsh_i64))
|
||||
|
||||
#define DATA64_ARGS (TCG_TARGET_REG_BITS == 64 ? 1 : 2)
|
||||
|
||||
/* QEMU specific */
|
||||
DEF(insn_start, 0, 0, DATA64_ARGS * TARGET_INSN_START_WORDS,
|
||||
TCG_OPF_NOT_PRESENT)
|
||||
/* There are tcg_ctx->insn_start_words here, not just one. */
|
||||
DEF(insn_start, 0, 0, DATA64_ARGS, TCG_OPF_NOT_PRESENT)
|
||||
|
||||
DEF(exit_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
|
||||
DEF(goto_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
|
||||
DEF(goto_ptr, 0, 1, 0, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
|
||||
|
||||
@@ -173,12 +173,6 @@ typedef uint64_t TCGRegSet;
|
||||
#define TCG_TARGET_HAS_v256 0
|
||||
#endif
|
||||
|
||||
#ifndef TARGET_INSN_START_EXTRA_WORDS
|
||||
# define TARGET_INSN_START_WORDS 1
|
||||
#else
|
||||
# define TARGET_INSN_START_WORDS (1 + TARGET_INSN_START_EXTRA_WORDS)
|
||||
#endif
|
||||
|
||||
typedef enum TCGOpcode {
|
||||
#define DEF(name, oargs, iargs, cargs, flags) INDEX_op_ ## name,
|
||||
#include "tcg/tcg-opc.h"
|
||||
@@ -526,6 +520,7 @@ struct TCGContext {
|
||||
uint8_t page_bits;
|
||||
uint8_t tlb_dyn_max_bits;
|
||||
#endif
|
||||
uint8_t insn_start_words;
|
||||
|
||||
TCGRegSet reserved_regs;
|
||||
intptr_t current_frame_offset;
|
||||
@@ -597,7 +592,7 @@ struct TCGContext {
|
||||
TCGTemp *reg_to_temp[TCG_TARGET_NB_REGS];
|
||||
|
||||
uint16_t gen_insn_end_off[TCG_MAX_INSNS];
|
||||
uint64_t gen_insn_data[TCG_MAX_INSNS][TARGET_INSN_START_WORDS];
|
||||
uint64_t *gen_insn_data;
|
||||
|
||||
/* Exit to translator on overflow. */
|
||||
sigjmp_buf jmp_trans;
|
||||
|
||||
Reference in New Issue
Block a user