From 765b842adec4c5a359e69ca08785553599f71496 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 29 Aug 2015 12:37:33 -0700 Subject: tcg: Rename debug_insn_start to insn_start With an eye toward making it mandatory. Reviewed-by: Aurelien Jarno Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- target-s390x/translate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'target-s390x') diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 2bca33a..a87d83c 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -5375,7 +5375,7 @@ static inline void gen_intermediate_code_internal(S390CPU *cpu, } if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) { - tcg_gen_debug_insn_start(dc.pc); + tcg_gen_insn_start(dc.pc); } status = NO_EXIT; -- cgit v1.1 From 667b8e29c5b1d8c5b4e6ad5f780ca60914eb6e96 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 29 Aug 2015 12:59:29 -0700 Subject: target-*: Unconditionally emit tcg_gen_insn_start While we're at it, emit the opcode adjacent to where we currently record data for search_pc. This puts gen_io_start et al on the "correct" side of the marker. Reviewed-by: Aurelien Jarno Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- target-s390x/translate.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'target-s390x') diff --git a/target-s390x/translate.c b/target-s390x/translate.c index a87d83c..2767f6a 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -5370,14 +5370,12 @@ static inline void gen_intermediate_code_internal(S390CPU *cpu, tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } + tcg_gen_insn_start(dc.pc); + if (++num_insns == max_insns && (tb->cflags & CF_LAST_IO)) { gen_io_start(); } - if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) { - tcg_gen_insn_start(dc.pc); - } - status = NO_EXIT; if (unlikely(!QTAILQ_EMPTY(&cs->breakpoints))) { QTAILQ_FOREACH(bp, &cs->breakpoints, entry) { -- cgit v1.1 From 959082fc4a93a016a6b697e1e0c2b373d8a3a373 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 17 Sep 2015 14:25:46 -0700 Subject: target-*: Increment num_insns immediately after tcg_gen_insn_start This does tidy the icount test common to all targets. Reviewed-by: Aurelien Jarno Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- target-s390x/translate.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'target-s390x') diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 2767f6a..58cf365 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -5371,8 +5371,9 @@ static inline void gen_intermediate_code_internal(S390CPU *cpu, tcg_ctx.gen_opc_icount[lj] = num_insns; } tcg_gen_insn_start(dc.pc); + num_insns++; - if (++num_insns == max_insns && (tb->cflags & CF_LAST_IO)) { + if (num_insns == max_insns && (tb->cflags & CF_LAST_IO)) { gen_io_start(); } -- cgit v1.1 From b933066ae03d924a92b2616b4a24e7d91cd5b841 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 17 Sep 2015 15:58:10 -0700 Subject: target-*: Introduce and use cpu_breakpoint_test Reduce the boilerplate required for each target. At the same time, move the test for breakpoint after calling tcg_gen_insn_start. Note that arm and aarch64 do not use cpu_breakpoint_test, but still move the inline test down after tcg_gen_insn_start. Reviewed-by: Aurelien Jarno Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- target-s390x/translate.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) (limited to 'target-s390x') diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 58cf365..4959828 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -5330,7 +5330,6 @@ static inline void gen_intermediate_code_internal(S390CPU *cpu, uint64_t next_page_start; int j, lj = -1; int num_insns, max_insns; - CPUBreakpoint *bp; ExitStatus status; bool do_debug; @@ -5373,20 +5372,17 @@ static inline void gen_intermediate_code_internal(S390CPU *cpu, tcg_gen_insn_start(dc.pc); num_insns++; + if (unlikely(cpu_breakpoint_test(cs, dc.pc, BP_ANY))) { + status = EXIT_PC_STALE; + do_debug = true; + break; + } + if (num_insns == max_insns && (tb->cflags & CF_LAST_IO)) { gen_io_start(); } status = NO_EXIT; - if (unlikely(!QTAILQ_EMPTY(&cs->breakpoints))) { - QTAILQ_FOREACH(bp, &cs->breakpoints, entry) { - if (bp->pc == dc.pc) { - status = EXIT_PC_STALE; - do_debug = true; - break; - } - } - } if (status == NO_EXIT) { status = translate_one(env, &dc); } -- cgit v1.1 From a3fd522048f6728d8259e14596c9632c7c67305a Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sun, 30 Aug 2015 09:26:10 -0700 Subject: target-s390x: Add cc_op state to insn_start Reviewed-by: Aurelien Jarno Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- target-s390x/cpu.h | 1 + target-s390x/translate.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'target-s390x') diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h index 5acd54c..b927c66 100644 --- a/target-s390x/cpu.h +++ b/target-s390x/cpu.h @@ -42,6 +42,7 @@ #include "fpu/softfloat.h" #define NB_MMU_MODES 3 +#define TARGET_INSN_START_EXTRA_WORDS 1 #define MMU_MODE0_SUFFIX _primary #define MMU_MODE1_SUFFIX _secondary diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 4959828..6bbc760 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -5369,7 +5369,7 @@ static inline void gen_intermediate_code_internal(S390CPU *cpu, tcg_ctx.gen_opc_instr_start[lj] = 1; tcg_ctx.gen_opc_icount[lj] = num_insns; } - tcg_gen_insn_start(dc.pc); + tcg_gen_insn_start(dc.pc, dc.cc_op); num_insns++; if (unlikely(cpu_breakpoint_test(cs, dc.pc, BP_ANY))) { -- cgit v1.1 From dc03246cc377268db63abc8c5663ef571aec2eea Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 27 Aug 2015 18:18:09 -0700 Subject: target-*: Drop cpu_gen_code define This symbol no longer exists. Reviewed-by: Aurelien Jarno Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- target-s390x/cpu.h | 1 - 1 file changed, 1 deletion(-) (limited to 'target-s390x') diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h index b927c66..da0adf6 100644 --- a/target-s390x/cpu.h +++ b/target-s390x/cpu.h @@ -598,7 +598,6 @@ bool css_present(uint8_t cssid); #define cpu_init(model) CPU(cpu_s390x_init(model)) #define cpu_exec cpu_s390x_exec -#define cpu_gen_code cpu_s390x_gen_code #define cpu_signal_handler cpu_s390x_signal_handler void s390_cpu_list(FILE *f, fprintf_function cpu_fprintf); -- cgit v1.1 From 190ce7fbc79fd0883a6170d7f30da59d366e6830 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 31 Aug 2015 14:34:41 -0700 Subject: tcg: Add TCG_MAX_INSNS Adjust all translators to respect it. Reviewed-by: Aurelien Jarno Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- target-s390x/translate.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'target-s390x') diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 6bbc760..b1aa139 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -5352,6 +5352,9 @@ static inline void gen_intermediate_code_internal(S390CPU *cpu, if (max_insns == 0) { max_insns = CF_COUNT_MASK; } + if (max_insns > TCG_MAX_INSNS) { + max_insns = TCG_MAX_INSNS; + } gen_tb_start(tb); -- cgit v1.1 From bad729e272387de7dbfa3ec4319036552fc6c107 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 1 Sep 2015 15:51:12 -0700 Subject: tcg: Pass data argument to restore_state_to_opc The gen_opc_* arrays are already redundant with the data stored in the insn_start arguments. Transition restore_state_to_opc to use data from the latter. Reviewed-by: Aurelien Jarno Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- target-s390x/translate.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'target-s390x') diff --git a/target-s390x/translate.c b/target-s390x/translate.c index b1aa139..104265d 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -5460,11 +5460,11 @@ void gen_intermediate_code_pc (CPUS390XState *env, struct TranslationBlock *tb) gen_intermediate_code_internal(s390_env_get_cpu(env), tb, true); } -void restore_state_to_opc(CPUS390XState *env, TranslationBlock *tb, int pc_pos) +void restore_state_to_opc(CPUS390XState *env, TranslationBlock *tb, + target_ulong *data) { - int cc_op; - env->psw.addr = tcg_ctx.gen_opc_pc[pc_pos]; - cc_op = gen_opc_cc_op[pc_pos]; + int cc_op = data[1]; + env->psw.addr = data[0]; if ((cc_op != CC_OP_DYNAMIC) && (cc_op != CC_OP_STATIC)) { env->cc_op = cc_op; } -- cgit v1.1 From 4e5e1215156662b2b153255c49d4640d82c5568b Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 1 Sep 2015 20:01:40 -0700 Subject: tcg: Remove gen_intermediate_code_pc It is no longer used, so tidy up everything reached by it. This includes the gen_opc_* arrays, the search_pc parameter and the inline gen_intermediate_code_internal functions. Reviewed-by: Aurelien Jarno Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson --- target-s390x/translate.c | 44 ++++---------------------------------------- 1 file changed, 4 insertions(+), 40 deletions(-) (limited to 'target-s390x') diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 104265d..d4d7c73 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -161,8 +161,6 @@ static char cpu_reg_names[32][4]; static TCGv_i64 regs[16]; static TCGv_i64 fregs[16]; -static uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; - void s390x_translate_init(void) { int i; @@ -5319,16 +5317,13 @@ static ExitStatus translate_one(CPUS390XState *env, DisasContext *s) return ret; } -static inline void gen_intermediate_code_internal(S390CPU *cpu, - TranslationBlock *tb, - bool search_pc) +void gen_intermediate_code(CPUS390XState *env, struct TranslationBlock *tb) { + S390CPU *cpu = s390_env_get_cpu(env); CPUState *cs = CPU(cpu); - CPUS390XState *env = &cpu->env; DisasContext dc; target_ulong pc_start; uint64_t next_page_start; - int j, lj = -1; int num_insns, max_insns; ExitStatus status; bool do_debug; @@ -5359,19 +5354,6 @@ static inline void gen_intermediate_code_internal(S390CPU *cpu, gen_tb_start(tb); do { - if (search_pc) { - j = tcg_op_buf_count(); - if (lj < j) { - lj++; - while (lj < j) { - tcg_ctx.gen_opc_instr_start[lj++] = 0; - } - } - tcg_ctx.gen_opc_pc[lj] = dc.pc; - gen_opc_cc_op[lj] = dc.cc_op; - tcg_ctx.gen_opc_instr_start[lj] = 1; - tcg_ctx.gen_opc_icount[lj] = num_insns; - } tcg_gen_insn_start(dc.pc, dc.cc_op); num_insns++; @@ -5430,16 +5412,8 @@ static inline void gen_intermediate_code_internal(S390CPU *cpu, gen_tb_end(tb, num_insns); - if (search_pc) { - j = tcg_op_buf_count(); - lj++; - while (lj <= j) { - tcg_ctx.gen_opc_instr_start[lj++] = 0; - } - } else { - tb->size = dc.pc - pc_start; - tb->icount = num_insns; - } + tb->size = dc.pc - pc_start; + tb->icount = num_insns; #if defined(S390X_DEBUG_DISAS) if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) { @@ -5450,16 +5424,6 @@ static inline void gen_intermediate_code_internal(S390CPU *cpu, #endif } -void gen_intermediate_code (CPUS390XState *env, struct TranslationBlock *tb) -{ - gen_intermediate_code_internal(s390_env_get_cpu(env), tb, false); -} - -void gen_intermediate_code_pc (CPUS390XState *env, struct TranslationBlock *tb) -{ - gen_intermediate_code_internal(s390_env_get_cpu(env), tb, true); -} - void restore_state_to_opc(CPUS390XState *env, TranslationBlock *tb, target_ulong *data) { -- cgit v1.1