mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-27 13:30:52 +00:00
tcg: Hoist max_insns computation to tb_gen_code
In order to handle TB's that translate to too much code, we need to place the control of the length of the translation in the hands of the code gen master loop. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
464c2969d5
commit
8b86d6d258
@ -1674,7 +1674,7 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
|
|||||||
tb_page_addr_t phys_pc, phys_page2;
|
tb_page_addr_t phys_pc, phys_page2;
|
||||||
target_ulong virt_page2;
|
target_ulong virt_page2;
|
||||||
tcg_insn_unit *gen_code_buf;
|
tcg_insn_unit *gen_code_buf;
|
||||||
int gen_code_size, search_size;
|
int gen_code_size, search_size, max_insns;
|
||||||
#ifdef CONFIG_PROFILER
|
#ifdef CONFIG_PROFILER
|
||||||
TCGProfile *prof = &tcg_ctx->prof;
|
TCGProfile *prof = &tcg_ctx->prof;
|
||||||
int64_t ti;
|
int64_t ti;
|
||||||
@ -1692,6 +1692,17 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
|
|||||||
cflags &= ~CF_CLUSTER_MASK;
|
cflags &= ~CF_CLUSTER_MASK;
|
||||||
cflags |= cpu->cluster_index << CF_CLUSTER_SHIFT;
|
cflags |= cpu->cluster_index << CF_CLUSTER_SHIFT;
|
||||||
|
|
||||||
|
max_insns = cflags & CF_COUNT_MASK;
|
||||||
|
if (max_insns == 0) {
|
||||||
|
max_insns = CF_COUNT_MASK;
|
||||||
|
}
|
||||||
|
if (max_insns > TCG_MAX_INSNS) {
|
||||||
|
max_insns = TCG_MAX_INSNS;
|
||||||
|
}
|
||||||
|
if (cpu->singlestep_enabled || singlestep) {
|
||||||
|
max_insns = 1;
|
||||||
|
}
|
||||||
|
|
||||||
buffer_overflow:
|
buffer_overflow:
|
||||||
tb = tb_alloc(pc);
|
tb = tb_alloc(pc);
|
||||||
if (unlikely(!tb)) {
|
if (unlikely(!tb)) {
|
||||||
@ -1721,7 +1732,7 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
|
|||||||
tcg_func_start(tcg_ctx);
|
tcg_func_start(tcg_ctx);
|
||||||
|
|
||||||
tcg_ctx->cpu = ENV_GET_CPU(env);
|
tcg_ctx->cpu = ENV_GET_CPU(env);
|
||||||
gen_intermediate_code(cpu, tb);
|
gen_intermediate_code(cpu, tb, max_insns);
|
||||||
tcg_ctx->cpu = NULL;
|
tcg_ctx->cpu = NULL;
|
||||||
|
|
||||||
trace_translate_block(tb, tb->pc, tb->tc.ptr);
|
trace_translate_block(tb, tb->pc, tb->tc.ptr);
|
||||||
|
@ -32,7 +32,7 @@ void translator_loop_temp_check(DisasContextBase *db)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
|
void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
|
||||||
CPUState *cpu, TranslationBlock *tb)
|
CPUState *cpu, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
int bp_insn = 0;
|
int bp_insn = 0;
|
||||||
|
|
||||||
@ -42,20 +42,9 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
|
|||||||
db->pc_next = db->pc_first;
|
db->pc_next = db->pc_first;
|
||||||
db->is_jmp = DISAS_NEXT;
|
db->is_jmp = DISAS_NEXT;
|
||||||
db->num_insns = 0;
|
db->num_insns = 0;
|
||||||
|
db->max_insns = max_insns;
|
||||||
db->singlestep_enabled = cpu->singlestep_enabled;
|
db->singlestep_enabled = cpu->singlestep_enabled;
|
||||||
|
|
||||||
/* Instruction counting */
|
|
||||||
db->max_insns = tb_cflags(db->tb) & CF_COUNT_MASK;
|
|
||||||
if (db->max_insns == 0) {
|
|
||||||
db->max_insns = CF_COUNT_MASK;
|
|
||||||
}
|
|
||||||
if (db->max_insns > TCG_MAX_INSNS) {
|
|
||||||
db->max_insns = TCG_MAX_INSNS;
|
|
||||||
}
|
|
||||||
if (db->singlestep_enabled || singlestep) {
|
|
||||||
db->max_insns = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ops->init_disas_context(db, cpu);
|
ops->init_disas_context(db, cpu);
|
||||||
tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
|
tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
|
||||||
|
|
||||||
|
@ -40,8 +40,8 @@ typedef ram_addr_t tb_page_addr_t;
|
|||||||
|
|
||||||
#include "qemu/log.h"
|
#include "qemu/log.h"
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cpu, struct TranslationBlock *tb);
|
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int max_insns);
|
||||||
void restore_state_to_opc(CPUArchState *env, struct TranslationBlock *tb,
|
void restore_state_to_opc(CPUArchState *env, TranslationBlock *tb,
|
||||||
target_ulong *data);
|
target_ulong *data);
|
||||||
|
|
||||||
void cpu_gen_init(void);
|
void cpu_gen_init(void);
|
||||||
|
@ -123,6 +123,7 @@ typedef struct TranslatorOps {
|
|||||||
* @db: Disassembly context.
|
* @db: Disassembly context.
|
||||||
* @cpu: Target vCPU.
|
* @cpu: Target vCPU.
|
||||||
* @tb: Translation block.
|
* @tb: Translation block.
|
||||||
|
* @max_insns: Maximum number of insns to translate.
|
||||||
*
|
*
|
||||||
* Generic translator loop.
|
* Generic translator loop.
|
||||||
*
|
*
|
||||||
@ -137,7 +138,7 @@ typedef struct TranslatorOps {
|
|||||||
* - When too many instructions have been translated.
|
* - When too many instructions have been translated.
|
||||||
*/
|
*/
|
||||||
void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
|
void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
|
||||||
CPUState *cpu, TranslationBlock *tb);
|
CPUState *cpu, TranslationBlock *tb, int max_insns);
|
||||||
|
|
||||||
void translator_loop_temp_check(DisasContextBase *db);
|
void translator_loop_temp_check(DisasContextBase *db);
|
||||||
|
|
||||||
|
@ -3049,10 +3049,10 @@ static const TranslatorOps alpha_tr_ops = {
|
|||||||
.disas_log = alpha_tr_disas_log,
|
.disas_log = alpha_tr_disas_log,
|
||||||
};
|
};
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext dc;
|
DisasContext dc;
|
||||||
translator_loop(&alpha_tr_ops, &dc.base, cpu, tb);
|
translator_loop(&alpha_tr_ops, &dc.base, cpu, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void restore_state_to_opc(CPUAlphaState *env, TranslationBlock *tb,
|
void restore_state_to_opc(CPUAlphaState *env, TranslationBlock *tb,
|
||||||
|
@ -13756,7 +13756,7 @@ static const TranslatorOps thumb_translator_ops = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* generate intermediate code for basic block 'tb'. */
|
/* generate intermediate code for basic block 'tb'. */
|
||||||
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext dc;
|
DisasContext dc;
|
||||||
const TranslatorOps *ops = &arm_translator_ops;
|
const TranslatorOps *ops = &arm_translator_ops;
|
||||||
@ -13770,7 +13770,7 @@ void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
translator_loop(ops, &dc.base, cpu, tb);
|
translator_loop(ops, &dc.base, cpu, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void arm_cpu_dump_state(CPUState *cs, FILE *f, int flags)
|
void arm_cpu_dump_state(CPUState *cs, FILE *f, int flags)
|
||||||
|
@ -3081,7 +3081,7 @@ static unsigned int crisv32_decoder(CPUCRISState *env, DisasContext *dc)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* generate intermediate code for basic block 'tb'. */
|
/* generate intermediate code for basic block 'tb'. */
|
||||||
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
CPUCRISState *env = cs->env_ptr;
|
CPUCRISState *env = cs->env_ptr;
|
||||||
uint32_t pc_start;
|
uint32_t pc_start;
|
||||||
@ -3091,7 +3091,6 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
|||||||
uint32_t page_start;
|
uint32_t page_start;
|
||||||
target_ulong npc;
|
target_ulong npc;
|
||||||
int num_insns;
|
int num_insns;
|
||||||
int max_insns;
|
|
||||||
|
|
||||||
if (env->pregs[PR_VR] == 32) {
|
if (env->pregs[PR_VR] == 32) {
|
||||||
dc->decoder = crisv32_decoder;
|
dc->decoder = crisv32_decoder;
|
||||||
@ -3137,13 +3136,6 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
|||||||
|
|
||||||
page_start = pc_start & TARGET_PAGE_MASK;
|
page_start = pc_start & TARGET_PAGE_MASK;
|
||||||
num_insns = 0;
|
num_insns = 0;
|
||||||
max_insns = tb_cflags(tb) & CF_COUNT_MASK;
|
|
||||||
if (max_insns == 0) {
|
|
||||||
max_insns = CF_COUNT_MASK;
|
|
||||||
}
|
|
||||||
if (max_insns > TCG_MAX_INSNS) {
|
|
||||||
max_insns = TCG_MAX_INSNS;
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_tb_start(tb);
|
gen_tb_start(tb);
|
||||||
do {
|
do {
|
||||||
|
@ -4312,11 +4312,10 @@ static const TranslatorOps hppa_tr_ops = {
|
|||||||
.disas_log = hppa_tr_disas_log,
|
.disas_log = hppa_tr_disas_log,
|
||||||
};
|
};
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
|
|
||||||
{
|
{
|
||||||
DisasContext ctx;
|
DisasContext ctx;
|
||||||
translator_loop(&hppa_tr_ops, &ctx.base, cs, tb);
|
translator_loop(&hppa_tr_ops, &ctx.base, cs, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void restore_state_to_opc(CPUHPPAState *env, TranslationBlock *tb,
|
void restore_state_to_opc(CPUHPPAState *env, TranslationBlock *tb,
|
||||||
|
@ -8590,11 +8590,11 @@ static const TranslatorOps i386_tr_ops = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* generate intermediate code for basic block 'tb'. */
|
/* generate intermediate code for basic block 'tb'. */
|
||||||
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext dc;
|
DisasContext dc;
|
||||||
|
|
||||||
translator_loop(&i386_tr_ops, &dc.base, cpu, tb);
|
translator_loop(&i386_tr_ops, &dc.base, cpu, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void restore_state_to_opc(CPUX86State *env, TranslationBlock *tb,
|
void restore_state_to_opc(CPUX86State *env, TranslationBlock *tb,
|
||||||
|
@ -1050,7 +1050,7 @@ static inline void decode(DisasContext *dc, uint32_t ir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* generate intermediate code for basic block 'tb'. */
|
/* generate intermediate code for basic block 'tb'. */
|
||||||
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
CPULM32State *env = cs->env_ptr;
|
CPULM32State *env = cs->env_ptr;
|
||||||
LM32CPU *cpu = lm32_env_get_cpu(env);
|
LM32CPU *cpu = lm32_env_get_cpu(env);
|
||||||
@ -1058,7 +1058,6 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
|||||||
uint32_t pc_start;
|
uint32_t pc_start;
|
||||||
uint32_t page_start;
|
uint32_t page_start;
|
||||||
int num_insns;
|
int num_insns;
|
||||||
int max_insns;
|
|
||||||
|
|
||||||
pc_start = tb->pc;
|
pc_start = tb->pc;
|
||||||
dc->features = cpu->features;
|
dc->features = cpu->features;
|
||||||
@ -1078,13 +1077,6 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
|||||||
|
|
||||||
page_start = pc_start & TARGET_PAGE_MASK;
|
page_start = pc_start & TARGET_PAGE_MASK;
|
||||||
num_insns = 0;
|
num_insns = 0;
|
||||||
max_insns = tb_cflags(tb) & CF_COUNT_MASK;
|
|
||||||
if (max_insns == 0) {
|
|
||||||
max_insns = CF_COUNT_MASK;
|
|
||||||
}
|
|
||||||
if (max_insns > TCG_MAX_INSNS) {
|
|
||||||
max_insns = TCG_MAX_INSNS;
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_tb_start(tb);
|
gen_tb_start(tb);
|
||||||
do {
|
do {
|
||||||
|
@ -6170,10 +6170,10 @@ static const TranslatorOps m68k_tr_ops = {
|
|||||||
.disas_log = m68k_tr_disas_log,
|
.disas_log = m68k_tr_disas_log,
|
||||||
};
|
};
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext dc;
|
DisasContext dc;
|
||||||
translator_loop(&m68k_tr_ops, &dc.base, cpu, tb);
|
translator_loop(&m68k_tr_ops, &dc.base, cpu, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
static double floatx80_to_double(CPUM68KState *env, uint16_t high, uint64_t low)
|
static double floatx80_to_double(CPUM68KState *env, uint16_t high, uint64_t low)
|
||||||
|
@ -1601,7 +1601,7 @@ static inline void decode(DisasContext *dc, uint32_t ir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* generate intermediate code for basic block 'tb'. */
|
/* generate intermediate code for basic block 'tb'. */
|
||||||
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
CPUMBState *env = cs->env_ptr;
|
CPUMBState *env = cs->env_ptr;
|
||||||
MicroBlazeCPU *cpu = mb_env_get_cpu(env);
|
MicroBlazeCPU *cpu = mb_env_get_cpu(env);
|
||||||
@ -1611,7 +1611,6 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
|||||||
uint32_t page_start, org_flags;
|
uint32_t page_start, org_flags;
|
||||||
uint32_t npc;
|
uint32_t npc;
|
||||||
int num_insns;
|
int num_insns;
|
||||||
int max_insns;
|
|
||||||
|
|
||||||
pc_start = tb->pc;
|
pc_start = tb->pc;
|
||||||
dc->cpu = cpu;
|
dc->cpu = cpu;
|
||||||
@ -1635,13 +1634,6 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
|||||||
|
|
||||||
page_start = pc_start & TARGET_PAGE_MASK;
|
page_start = pc_start & TARGET_PAGE_MASK;
|
||||||
num_insns = 0;
|
num_insns = 0;
|
||||||
max_insns = tb_cflags(tb) & CF_COUNT_MASK;
|
|
||||||
if (max_insns == 0) {
|
|
||||||
max_insns = CF_COUNT_MASK;
|
|
||||||
}
|
|
||||||
if (max_insns > TCG_MAX_INSNS) {
|
|
||||||
max_insns = TCG_MAX_INSNS;
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_tb_start(tb);
|
gen_tb_start(tb);
|
||||||
do
|
do
|
||||||
|
@ -29721,11 +29721,11 @@ static const TranslatorOps mips_tr_ops = {
|
|||||||
.disas_log = mips_tr_disas_log,
|
.disas_log = mips_tr_disas_log,
|
||||||
};
|
};
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext ctx;
|
DisasContext ctx;
|
||||||
|
|
||||||
translator_loop(&mips_tr_ops, &ctx.base, cs, tb);
|
translator_loop(&mips_tr_ops, &ctx.base, cs, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fpu_dump_state(CPUMIPSState *env, FILE *f, int flags)
|
static void fpu_dump_state(CPUMIPSState *env, FILE *f, int flags)
|
||||||
|
@ -813,13 +813,13 @@ static int decode_opc(MoxieCPU *cpu, DisasContext *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* generate intermediate code for basic block 'tb'. */
|
/* generate intermediate code for basic block 'tb'. */
|
||||||
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
CPUMoxieState *env = cs->env_ptr;
|
CPUMoxieState *env = cs->env_ptr;
|
||||||
MoxieCPU *cpu = moxie_env_get_cpu(env);
|
MoxieCPU *cpu = moxie_env_get_cpu(env);
|
||||||
DisasContext ctx;
|
DisasContext ctx;
|
||||||
target_ulong pc_start;
|
target_ulong pc_start;
|
||||||
int num_insns, max_insns;
|
int num_insns;
|
||||||
|
|
||||||
pc_start = tb->pc;
|
pc_start = tb->pc;
|
||||||
ctx.pc = pc_start;
|
ctx.pc = pc_start;
|
||||||
@ -829,13 +829,6 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
|||||||
ctx.singlestep_enabled = 0;
|
ctx.singlestep_enabled = 0;
|
||||||
ctx.bstate = BS_NONE;
|
ctx.bstate = BS_NONE;
|
||||||
num_insns = 0;
|
num_insns = 0;
|
||||||
max_insns = tb_cflags(tb) & CF_COUNT_MASK;
|
|
||||||
if (max_insns == 0) {
|
|
||||||
max_insns = CF_COUNT_MASK;
|
|
||||||
}
|
|
||||||
if (max_insns > TCG_MAX_INSNS) {
|
|
||||||
max_insns = TCG_MAX_INSNS;
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_tb_start(tb);
|
gen_tb_start(tb);
|
||||||
do {
|
do {
|
||||||
|
@ -806,12 +806,11 @@ static void gen_exception(DisasContext *dc, uint32_t excp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* generate intermediate code for basic block 'tb'. */
|
/* generate intermediate code for basic block 'tb'. */
|
||||||
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
CPUNios2State *env = cs->env_ptr;
|
CPUNios2State *env = cs->env_ptr;
|
||||||
DisasContext dc1, *dc = &dc1;
|
DisasContext dc1, *dc = &dc1;
|
||||||
int num_insns;
|
int num_insns;
|
||||||
int max_insns;
|
|
||||||
|
|
||||||
/* Initialize DC */
|
/* Initialize DC */
|
||||||
dc->cpu_env = cpu_env;
|
dc->cpu_env = cpu_env;
|
||||||
@ -824,20 +823,11 @@ void gen_intermediate_code(CPUState *cs, TranslationBlock *tb)
|
|||||||
|
|
||||||
/* Set up instruction counts */
|
/* Set up instruction counts */
|
||||||
num_insns = 0;
|
num_insns = 0;
|
||||||
if (cs->singlestep_enabled || singlestep) {
|
if (max_insns > 1) {
|
||||||
max_insns = 1;
|
|
||||||
} else {
|
|
||||||
int page_insns = (TARGET_PAGE_SIZE - (tb->pc & TARGET_PAGE_MASK)) / 4;
|
int page_insns = (TARGET_PAGE_SIZE - (tb->pc & TARGET_PAGE_MASK)) / 4;
|
||||||
max_insns = tb_cflags(tb) & CF_COUNT_MASK;
|
|
||||||
if (max_insns == 0) {
|
|
||||||
max_insns = CF_COUNT_MASK;
|
|
||||||
}
|
|
||||||
if (max_insns > page_insns) {
|
if (max_insns > page_insns) {
|
||||||
max_insns = page_insns;
|
max_insns = page_insns;
|
||||||
}
|
}
|
||||||
if (max_insns > TCG_MAX_INSNS) {
|
|
||||||
max_insns = TCG_MAX_INSNS;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gen_tb_start(tb);
|
gen_tb_start(tb);
|
||||||
|
@ -1409,11 +1409,11 @@ static const TranslatorOps openrisc_tr_ops = {
|
|||||||
.disas_log = openrisc_tr_disas_log,
|
.disas_log = openrisc_tr_disas_log,
|
||||||
};
|
};
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext ctx;
|
DisasContext ctx;
|
||||||
|
|
||||||
translator_loop(&openrisc_tr_ops, &ctx.base, cs, tb);
|
translator_loop(&openrisc_tr_ops, &ctx.base, cs, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void openrisc_cpu_dump_state(CPUState *cs, FILE *f, int flags)
|
void openrisc_cpu_dump_state(CPUState *cs, FILE *f, int flags)
|
||||||
|
@ -7862,11 +7862,11 @@ static const TranslatorOps ppc_tr_ops = {
|
|||||||
.disas_log = ppc_tr_disas_log,
|
.disas_log = ppc_tr_disas_log,
|
||||||
};
|
};
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext ctx;
|
DisasContext ctx;
|
||||||
|
|
||||||
translator_loop(&ppc_tr_ops, &ctx.base, cs, tb);
|
translator_loop(&ppc_tr_ops, &ctx.base, cs, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void restore_state_to_opc(CPUPPCState *env, TranslationBlock *tb,
|
void restore_state_to_opc(CPUPPCState *env, TranslationBlock *tb,
|
||||||
|
@ -783,11 +783,11 @@ static const TranslatorOps riscv_tr_ops = {
|
|||||||
.disas_log = riscv_tr_disas_log,
|
.disas_log = riscv_tr_disas_log,
|
||||||
};
|
};
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext ctx;
|
DisasContext ctx;
|
||||||
|
|
||||||
translator_loop(&riscv_tr_ops, &ctx.base, cs, tb);
|
translator_loop(&riscv_tr_ops, &ctx.base, cs, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void riscv_translate_init(void)
|
void riscv_translate_init(void)
|
||||||
|
@ -6552,11 +6552,11 @@ static const TranslatorOps s390x_tr_ops = {
|
|||||||
.disas_log = s390x_tr_disas_log,
|
.disas_log = s390x_tr_disas_log,
|
||||||
};
|
};
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext dc;
|
DisasContext dc;
|
||||||
|
|
||||||
translator_loop(&s390x_tr_ops, &dc.base, cs, tb);
|
translator_loop(&s390x_tr_ops, &dc.base, cs, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void restore_state_to_opc(CPUS390XState *env, TranslationBlock *tb,
|
void restore_state_to_opc(CPUS390XState *env, TranslationBlock *tb,
|
||||||
|
@ -2383,11 +2383,11 @@ static const TranslatorOps sh4_tr_ops = {
|
|||||||
.disas_log = sh4_tr_disas_log,
|
.disas_log = sh4_tr_disas_log,
|
||||||
};
|
};
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext ctx;
|
DisasContext ctx;
|
||||||
|
|
||||||
translator_loop(&sh4_tr_ops, &ctx.base, cs, tb);
|
translator_loop(&sh4_tr_ops, &ctx.base, cs, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void restore_state_to_opc(CPUSH4State *env, TranslationBlock *tb,
|
void restore_state_to_opc(CPUSH4State *env, TranslationBlock *tb,
|
||||||
|
@ -5962,11 +5962,11 @@ static const TranslatorOps sparc_tr_ops = {
|
|||||||
.disas_log = sparc_tr_disas_log,
|
.disas_log = sparc_tr_disas_log,
|
||||||
};
|
};
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext dc = {};
|
DisasContext dc = {};
|
||||||
|
|
||||||
translator_loop(&sparc_tr_ops, &dc.base, cs, tb);
|
translator_loop(&sparc_tr_ops, &dc.base, cs, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sparc_tcg_init(void)
|
void sparc_tcg_init(void)
|
||||||
|
@ -2369,7 +2369,7 @@ static void translate_one_bundle(DisasContext *dc, uint64_t bundle)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
CPUTLGState *env = cs->env_ptr;
|
CPUTLGState *env = cs->env_ptr;
|
||||||
DisasContext ctx;
|
DisasContext ctx;
|
||||||
@ -2377,7 +2377,6 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
|||||||
uint64_t pc_start = tb->pc;
|
uint64_t pc_start = tb->pc;
|
||||||
uint64_t page_start = pc_start & TARGET_PAGE_MASK;
|
uint64_t page_start = pc_start & TARGET_PAGE_MASK;
|
||||||
int num_insns = 0;
|
int num_insns = 0;
|
||||||
int max_insns = tb_cflags(tb) & CF_COUNT_MASK;
|
|
||||||
|
|
||||||
dc->pc = pc_start;
|
dc->pc = pc_start;
|
||||||
dc->mmuidx = 0;
|
dc->mmuidx = 0;
|
||||||
@ -2392,15 +2391,6 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
|||||||
qemu_log_lock();
|
qemu_log_lock();
|
||||||
qemu_log("IN: %s\n", lookup_symbol(pc_start));
|
qemu_log("IN: %s\n", lookup_symbol(pc_start));
|
||||||
}
|
}
|
||||||
if (!max_insns) {
|
|
||||||
max_insns = CF_COUNT_MASK;
|
|
||||||
}
|
|
||||||
if (cs->singlestep_enabled || singlestep) {
|
|
||||||
max_insns = 1;
|
|
||||||
}
|
|
||||||
if (max_insns > TCG_MAX_INSNS) {
|
|
||||||
max_insns = TCG_MAX_INSNS;
|
|
||||||
}
|
|
||||||
gen_tb_start(tb);
|
gen_tb_start(tb);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -8807,24 +8807,12 @@ static void decode_opc(CPUTriCoreState *env, DisasContext *ctx, int *is_branch)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
CPUTriCoreState *env = cs->env_ptr;
|
CPUTriCoreState *env = cs->env_ptr;
|
||||||
DisasContext ctx;
|
DisasContext ctx;
|
||||||
target_ulong pc_start;
|
target_ulong pc_start;
|
||||||
int num_insns, max_insns;
|
int num_insns = 0;
|
||||||
|
|
||||||
num_insns = 0;
|
|
||||||
max_insns = tb_cflags(tb) & CF_COUNT_MASK;
|
|
||||||
if (max_insns == 0) {
|
|
||||||
max_insns = CF_COUNT_MASK;
|
|
||||||
}
|
|
||||||
if (singlestep) {
|
|
||||||
max_insns = 1;
|
|
||||||
}
|
|
||||||
if (max_insns > TCG_MAX_INSNS) {
|
|
||||||
max_insns = TCG_MAX_INSNS;
|
|
||||||
}
|
|
||||||
|
|
||||||
pc_start = tb->pc;
|
pc_start = tb->pc;
|
||||||
ctx.pc = pc_start;
|
ctx.pc = pc_start;
|
||||||
|
@ -1871,14 +1871,13 @@ static void disas_uc32_insn(CPUUniCore32State *env, DisasContext *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* generate intermediate code for basic block 'tb'. */
|
/* generate intermediate code for basic block 'tb'. */
|
||||||
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
CPUUniCore32State *env = cs->env_ptr;
|
CPUUniCore32State *env = cs->env_ptr;
|
||||||
DisasContext dc1, *dc = &dc1;
|
DisasContext dc1, *dc = &dc1;
|
||||||
target_ulong pc_start;
|
target_ulong pc_start;
|
||||||
uint32_t page_start;
|
uint32_t page_start;
|
||||||
int num_insns;
|
int num_insns;
|
||||||
int max_insns;
|
|
||||||
|
|
||||||
/* generate intermediate code */
|
/* generate intermediate code */
|
||||||
num_temps = 0;
|
num_temps = 0;
|
||||||
@ -1897,13 +1896,6 @@ void gen_intermediate_code(CPUState *cs, TranslationBlock *tb)
|
|||||||
cpu_F1d = tcg_temp_new_i64();
|
cpu_F1d = tcg_temp_new_i64();
|
||||||
page_start = pc_start & TARGET_PAGE_MASK;
|
page_start = pc_start & TARGET_PAGE_MASK;
|
||||||
num_insns = 0;
|
num_insns = 0;
|
||||||
max_insns = tb_cflags(tb) & CF_COUNT_MASK;
|
|
||||||
if (max_insns == 0) {
|
|
||||||
max_insns = CF_COUNT_MASK;
|
|
||||||
}
|
|
||||||
if (max_insns > TCG_MAX_INSNS) {
|
|
||||||
max_insns = TCG_MAX_INSNS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
if ((env->uncached_asr & ASR_M) == ASR_MODE_USER) {
|
if ((env->uncached_asr & ASR_M) == ASR_MODE_USER) {
|
||||||
|
@ -1635,10 +1635,10 @@ static const TranslatorOps xtensa_translator_ops = {
|
|||||||
.disas_log = xtensa_tr_disas_log,
|
.disas_log = xtensa_tr_disas_log,
|
||||||
};
|
};
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb)
|
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int max_insns)
|
||||||
{
|
{
|
||||||
DisasContext dc = {};
|
DisasContext dc = {};
|
||||||
translator_loop(&xtensa_translator_ops, &dc.base, cpu, tb);
|
translator_loop(&xtensa_translator_ops, &dc.base, cpu, tb, max_insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
void xtensa_cpu_dump_state(CPUState *cs, FILE *f, int flags)
|
void xtensa_cpu_dump_state(CPUState *cs, FILE *f, int flags)
|
||||||
|
Loading…
Reference in New Issue
Block a user