* [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up
@ 2012-10-23 6:21 Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 1/7] tcg/tcg.h: Duplicate global TCG variables in TCGContext Evgeny Voevodin
` (9 more replies)
0 siblings, 10 replies; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-23 6:21 UTC (permalink / raw)
To: qemu-devel
Cc: Evgeny Voevodin, blauwirbel, kyungmin.park, edgar.iglesias,
aurelien, rth
This set of patches moves global variables to tcg_ctx:
gen_opc_ptr
gen_opparam_ptr
gen_opc_buf
gen_opparam_buf
Build tested for all targets.
Execution tested on ARM.
I didn't notice any slow-down of kernel boot after this set was applied.
Changelog:
v1->v2:
Introduced TCGContext *tcg_cur_ctx global to use in those places where we don't
have an interface to pass pointer to tcg_ctx.
Code style clean-up
Evgeny (2):
tcg/tcg.h: Duplicate global TCG variables in TCGContext
TCG: Remove unused global variables
Evgeny Voevodin (5):
translate-all.c: Introduce TCGContext *tcg_cur_ctx
TCG: Use gen_opc_ptr from context instead of global variable.
TCG: Use gen_opparam_ptr from context instead of global variable.
TCG: Use gen_opc_buf from context instead of global variable.
TCG: Use gen_opparam_buf from context instead of global variable.
gen-icount.h | 2 +-
target-alpha/translate.c | 10 +-
target-arm/translate.c | 10 +-
target-cris/translate.c | 13 +-
target-i386/translate.c | 10 +-
target-lm32/translate.c | 13 +-
target-m68k/translate.c | 10 +-
target-microblaze/translate.c | 13 +-
target-mips/translate.c | 11 +-
target-openrisc/translate.c | 13 +-
target-ppc/translate.c | 11 +-
target-s390x/translate.c | 11 +-
target-sh4/translate.c | 10 +-
target-sparc/translate.c | 10 +-
target-unicore32/translate.c | 10 +-
target-xtensa/translate.c | 8 +-
tcg/optimize.c | 62 ++++----
tcg/tcg-op.h | 324 ++++++++++++++++++++---------------------
tcg/tcg.c | 85 ++++++-----
tcg/tcg.h | 11 +-
translate-all.c | 4 +-
21 files changed, 328 insertions(+), 323 deletions(-)
--
1.7.9.5
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH v2 1/7] tcg/tcg.h: Duplicate global TCG variables in TCGContext
2012-10-23 6:21 [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
@ 2012-10-23 6:21 ` Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 2/7] translate-all.c: Introduce TCGContext *tcg_cur_ctx Evgeny Voevodin
` (8 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-23 6:21 UTC (permalink / raw)
To: qemu-devel
Cc: Evgeny, blauwirbel, kyungmin.park, edgar.iglesias, aurelien, rth
From: Evgeny <e.voevodin@samsung.com>
Signed-off-by: Evgeny <e.voevodin@samsung.com>
Signed-off-by: Evgeny Voevodin <e.voevodin@samsung.com>
---
tcg/tcg.h | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/tcg/tcg.h b/tcg/tcg.h
index 45e94f5..43b4317 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -422,6 +422,12 @@ struct TCGContext {
int temps_in_use;
int goto_tb_issue_mask;
#endif
+
+ uint16_t gen_opc_buf[OPC_BUF_SIZE];
+ TCGArg gen_opparam_buf[OPPARAM_BUF_SIZE];
+
+ uint16_t *gen_opc_ptr;
+ TCGArg *gen_opparam_ptr;
};
extern TCGContext tcg_ctx;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH v2 2/7] translate-all.c: Introduce TCGContext *tcg_cur_ctx
2012-10-23 6:21 [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 1/7] tcg/tcg.h: Duplicate global TCG variables in TCGContext Evgeny Voevodin
@ 2012-10-23 6:21 ` Evgeny Voevodin
2012-10-23 21:18 ` Richard Henderson
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 3/7] TCG: Use gen_opc_ptr from context instead of global variable Evgeny Voevodin
` (7 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-23 6:21 UTC (permalink / raw)
To: qemu-devel
Cc: Evgeny Voevodin, blauwirbel, kyungmin.park, edgar.iglesias,
aurelien, rth
We will use this pointer from functions where we don't have an
interface to pass tcg_ctx as a parameter.
Signed-off-by: Evgeny Voevodin <e.voevodin@samsung.com>
---
tcg/tcg.h | 1 +
translate-all.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/tcg/tcg.h b/tcg/tcg.h
index 43b4317..d326b36 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -431,6 +431,7 @@ struct TCGContext {
};
extern TCGContext tcg_ctx;
+extern TCGContext *tcg_cur_ctx;
extern uint16_t *gen_opc_ptr;
extern TCGArg *gen_opparam_ptr;
extern uint16_t gen_opc_buf[];
diff --git a/translate-all.c b/translate-all.c
index 5bd2d37..ccdcddf 100644
--- a/translate-all.c
+++ b/translate-all.c
@@ -32,6 +32,7 @@
/* code generation context */
TCGContext tcg_ctx;
+TCGContext *tcg_cur_ctx = &tcg_ctx;
uint16_t gen_opc_buf[OPC_BUF_SIZE];
TCGArg gen_opparam_buf[OPPARAM_BUF_SIZE];
--
1.7.9.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH v2 3/7] TCG: Use gen_opc_ptr from context instead of global variable.
2012-10-23 6:21 [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 1/7] tcg/tcg.h: Duplicate global TCG variables in TCGContext Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 2/7] translate-all.c: Introduce TCGContext *tcg_cur_ctx Evgeny Voevodin
@ 2012-10-23 6:21 ` Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 4/7] TCG: Use gen_opparam_ptr " Evgeny Voevodin
` (6 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-23 6:21 UTC (permalink / raw)
To: qemu-devel
Cc: Evgeny Voevodin, blauwirbel, kyungmin.park, edgar.iglesias,
aurelien, rth
Signed-off-by: Evgeny Voevodin <e.voevodin@samsung.com>
---
target-alpha/translate.c | 8 ++---
target-arm/translate.c | 8 ++---
target-cris/translate.c | 10 +++---
target-i386/translate.c | 8 ++---
target-lm32/translate.c | 10 +++---
target-m68k/translate.c | 8 ++---
target-microblaze/translate.c | 10 +++---
target-mips/translate.c | 9 +++---
target-openrisc/translate.c | 10 +++---
target-ppc/translate.c | 9 +++---
target-s390x/translate.c | 9 +++---
target-sh4/translate.c | 8 ++---
target-sparc/translate.c | 8 ++---
target-unicore32/translate.c | 8 ++---
target-xtensa/translate.c | 6 ++--
tcg/tcg-op.h | 70 ++++++++++++++++++++---------------------
tcg/tcg.c | 16 +++++-----
17 files changed, 109 insertions(+), 106 deletions(-)
diff --git a/target-alpha/translate.c b/target-alpha/translate.c
index f707d8d..751d457 100644
--- a/target-alpha/translate.c
+++ b/target-alpha/translate.c
@@ -3406,7 +3406,7 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env,
}
}
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -3432,7 +3432,7 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env,
or exhaust instruction count, stop generation. */
if (ret == NO_EXIT
&& ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0
- || gen_opc_ptr >= gen_opc_end
+ || tcg_cur_ctx->gen_opc_ptr >= gen_opc_end
|| num_insns >= max_insns
|| singlestep
|| env->singlestep_enabled)) {
@@ -3463,9 +3463,9 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env,
}
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-arm/translate.c b/target-arm/translate.c
index daccb15..41b1671 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -9825,7 +9825,7 @@ static inline void gen_intermediate_code_internal(CPUARMState *env,
}
}
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -9872,7 +9872,7 @@ static inline void gen_intermediate_code_internal(CPUARMState *env,
* Also stop translation when a page boundary is reached. This
* ensures prefetch aborts occur at the right place. */
num_insns ++;
- } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
+ } while (!dc->is_jmp && tcg_cur_ctx->gen_opc_ptr < gen_opc_end &&
!env->singlestep_enabled &&
!singlestep &&
dc->pc < next_page_start &&
@@ -9953,7 +9953,7 @@ static inline void gen_intermediate_code_internal(CPUARMState *env,
done_generating:
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
#ifdef DEBUG_DISAS
if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
@@ -9965,7 +9965,7 @@ done_generating:
}
#endif
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-cris/translate.c b/target-cris/translate.c
index 755de65..9bec8b5 100644
--- a/target-cris/translate.c
+++ b/target-cris/translate.c
@@ -3266,7 +3266,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
check_breakpoint(env, dc);
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -3348,7 +3348,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
if (!(tb->pc & 1) && env->singlestep_enabled)
break;
} while (!dc->is_jmp && !dc->cpustate_changed
- && gen_opc_ptr < gen_opc_end
+ && tcg_cur_ctx->gen_opc_ptr < gen_opc_end
&& !singlestep
&& (dc->pc < next_page_start)
&& num_insns < max_insns);
@@ -3399,9 +3399,9 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
}
}
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
@@ -3416,7 +3416,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
log_target_disas(pc_start, dc->pc - pc_start,
dc->env->pregs[PR_VR]);
qemu_log("\nisize=%d osize=%td\n",
- dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
+ dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr - gen_opc_buf);
}
#endif
#endif
diff --git a/target-i386/translate.c b/target-i386/translate.c
index ee75850..b28bfb3 100644
--- a/target-i386/translate.c
+++ b/target-i386/translate.c
@@ -7980,7 +7980,7 @@ static inline void gen_intermediate_code_internal(CPUX86State *env,
}
}
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -8011,7 +8011,7 @@ static inline void gen_intermediate_code_internal(CPUX86State *env,
break;
}
/* if too long translation, stop generation too */
- if (gen_opc_ptr >= gen_opc_end ||
+ if (tcg_cur_ctx->gen_opc_ptr >= gen_opc_end ||
(pc_ptr - pc_start) >= (TARGET_PAGE_SIZE - 32) ||
num_insns >= max_insns) {
gen_jmp_im(pc_ptr - dc->cs_base);
@@ -8027,10 +8027,10 @@ static inline void gen_intermediate_code_internal(CPUX86State *env,
if (tb->cflags & CF_LAST_IO)
gen_io_end();
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
/* we don't forget to fill the last values */
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-lm32/translate.c b/target-lm32/translate.c
index 77c2866..4a17ec1 100644
--- a/target-lm32/translate.c
+++ b/target-lm32/translate.c
@@ -1047,7 +1047,7 @@ static void gen_intermediate_code_internal(CPULM32State *env,
check_breakpoint(env, dc);
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j) {
@@ -1071,7 +1071,7 @@ static void gen_intermediate_code_internal(CPULM32State *env,
num_insns++;
} while (!dc->is_jmp
- && gen_opc_ptr < gen_opc_end
+ && tcg_cur_ctx->gen_opc_ptr < gen_opc_end
&& !env->singlestep_enabled
&& !singlestep
&& (dc->pc < next_page_start)
@@ -1105,9 +1105,9 @@ static void gen_intermediate_code_internal(CPULM32State *env,
}
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j) {
gen_opc_instr_start[lj++] = 0;
@@ -1122,7 +1122,7 @@ static void gen_intermediate_code_internal(CPULM32State *env,
qemu_log("\n");
log_target_disas(pc_start, dc->pc - pc_start, 0);
qemu_log("\nisize=%d osize=%td\n",
- dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
+ dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr - gen_opc_buf);
}
#endif
}
diff --git a/target-m68k/translate.c b/target-m68k/translate.c
index 451ef74..9fa82d4 100644
--- a/target-m68k/translate.c
+++ b/target-m68k/translate.c
@@ -3015,7 +3015,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
break;
}
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -3030,7 +3030,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
dc->insn_pc = dc->pc;
disas_m68k_insn(env, dc);
num_insns++;
- } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
+ } while (!dc->is_jmp && tcg_cur_ctx->gen_opc_ptr < gen_opc_end &&
!env->singlestep_enabled &&
!singlestep &&
(pc_offset) < (TARGET_PAGE_SIZE - 32) &&
@@ -3064,7 +3064,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
}
}
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
#ifdef DEBUG_DISAS
if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
@@ -3075,7 +3075,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
}
#endif
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c
index 7d864b1..aeffed0 100644
--- a/target-microblaze/translate.c
+++ b/target-microblaze/translate.c
@@ -1784,7 +1784,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
check_breakpoint(env, dc);
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -1846,7 +1846,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
if (env->singlestep_enabled)
break;
} while (!dc->is_jmp && !dc->cpustate_changed
- && gen_opc_ptr < gen_opc_end
+ && tcg_cur_ctx->gen_opc_ptr < gen_opc_end
&& !singlestep
&& (dc->pc < next_page_start)
&& num_insns < max_insns);
@@ -1897,9 +1897,9 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
}
}
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
@@ -1916,7 +1916,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
log_target_disas(pc_start, dc->pc - pc_start, 0);
#endif
qemu_log("\nisize=%d osize=%td\n",
- dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
+ dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr - gen_opc_buf);
}
#endif
#endif
diff --git a/target-mips/translate.c b/target-mips/translate.c
index 454e5cc..10690b0 100644
--- a/target-mips/translate.c
+++ b/target-mips/translate.c
@@ -12845,7 +12845,7 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
}
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -12892,8 +12892,9 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
break;
- if (gen_opc_ptr >= gen_opc_end)
+ if (tcg_cur_ctx->gen_opc_ptr >= gen_opc_end) {
break;
+ }
if (num_insns >= max_insns)
break;
@@ -12925,9 +12926,9 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
}
done_generating:
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c
index e2cad3a..1c4017a 100644
--- a/target-openrisc/translate.c
+++ b/target-openrisc/translate.c
@@ -1703,7 +1703,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
do {
check_breakpoint(cpu, dc);
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (k < j) {
k++;
while (k < j) {
@@ -1744,7 +1744,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
}
}
} while (!dc->is_jmp
- && gen_opc_ptr < gen_opc_end
+ && tcg_cur_ctx->gen_opc_ptr < gen_opc_end
&& !cpu->env.singlestep_enabled
&& !singlestep
&& (dc->pc < next_page_start)
@@ -1782,9 +1782,9 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
}
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
k++;
while (k <= j) {
gen_opc_instr_start[k++] = 0;
@@ -1799,7 +1799,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
qemu_log("\n");
log_target_disas(pc_start, dc->pc - pc_start, 0);
qemu_log("\nisize=%d osize=%td\n",
- dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
+ dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr - gen_opc_buf);
}
#endif
}
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 1042268..f9cfea5 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -9657,7 +9657,8 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env,
gen_icount_start();
/* Set env in case of segfault during code fetch */
- while (ctx.exception == POWERPC_EXCP_NONE && gen_opc_ptr < gen_opc_end) {
+ while (ctx.exception == POWERPC_EXCP_NONE
+ && tcg_cur_ctx->gen_opc_ptr < gen_opc_end) {
if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
if (bp->pc == ctx.nip) {
@@ -9667,7 +9668,7 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env,
}
}
if (unlikely(search_pc)) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -9767,9 +9768,9 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env,
tcg_gen_exit_tb(0);
}
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (unlikely(search_pc)) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-s390x/translate.c b/target-s390x/translate.c
index db464cc..c5f6af2 100644
--- a/target-s390x/translate.c
+++ b/target-s390x/translate.c
@@ -5156,7 +5156,7 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env,
}
}
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j) {
@@ -5182,7 +5182,8 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env,
if (env->singlestep_enabled) {
gen_debug(&dc);
}
- } while (!dc.is_jmp && gen_opc_ptr < gen_opc_end && dc.pc < next_page_start
+ } while (!dc.is_jmp && tcg_cur_ctx->gen_opc_ptr < gen_opc_end
+ && dc.pc < next_page_start
&& num_insns < max_insns && !env->singlestep_enabled
&& !singlestep);
@@ -5206,9 +5207,9 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env,
tcg_gen_exit_tb(0);
}
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j) {
gen_opc_instr_start[lj++] = 0;
diff --git a/target-sh4/translate.c b/target-sh4/translate.c
index 9d955eb..4d89b3d 100644
--- a/target-sh4/translate.c
+++ b/target-sh4/translate.c
@@ -1986,7 +1986,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
if (max_insns == 0)
max_insns = CF_COUNT_MASK;
gen_icount_start();
- while (ctx.bstate == BS_NONE && gen_opc_ptr < gen_opc_end) {
+ while (ctx.bstate == BS_NONE && tcg_cur_ctx->gen_opc_ptr < gen_opc_end) {
if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
if (ctx.pc == bp->pc) {
@@ -1999,7 +1999,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
}
}
if (search_pc) {
- i = gen_opc_ptr - gen_opc_buf;
+ i = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (ii < i) {
ii++;
while (ii < i)
@@ -2056,9 +2056,9 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
}
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- i = gen_opc_ptr - gen_opc_buf;
+ i = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
ii++;
while (ii <= i)
gen_opc_instr_start[ii++] = 0;
diff --git a/target-sparc/translate.c b/target-sparc/translate.c
index 4321393..daa4c5d 100644
--- a/target-sparc/translate.c
+++ b/target-sparc/translate.c
@@ -5279,7 +5279,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
}
if (spc) {
qemu_log("Search PC...\n");
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -5312,7 +5312,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
if (dc->singlestep) {
break;
}
- } while ((gen_opc_ptr < gen_opc_end) &&
+ } while ((tcg_cur_ctx->gen_opc_ptr < gen_opc_end) &&
(dc->pc - pc_start) < (TARGET_PAGE_SIZE - 32) &&
num_insns < max_insns);
@@ -5334,9 +5334,9 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
}
}
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (spc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c
index c3cdafa..3575c7e 100644
--- a/target-unicore32/translate.c
+++ b/target-unicore32/translate.c
@@ -1999,7 +1999,7 @@ static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
}
}
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j) {
@@ -2031,7 +2031,7 @@ static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
* Also stop translation when a page boundary is reached. This
* ensures prefetch aborts occur at the right place. */
num_insns++;
- } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
+ } while (!dc->is_jmp && tcg_cur_ctx->gen_opc_ptr < gen_opc_end &&
!env->singlestep_enabled &&
!singlestep &&
dc->pc < next_page_start &&
@@ -2103,7 +2103,7 @@ static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
done_generating:
gen_icount_end(tb, num_insns);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
#ifdef DEBUG_DISAS
if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
@@ -2114,7 +2114,7 @@ done_generating:
}
#endif
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
lj++;
while (lj <= j) {
gen_opc_instr_start[lj++] = 0;
diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
index 82e8ccc..e14f1a2 100644
--- a/target-xtensa/translate.c
+++ b/target-xtensa/translate.c
@@ -2893,7 +2893,7 @@ static void gen_intermediate_code_internal(
check_breakpoint(env, &dc);
if (search_pc) {
- j = gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j) {
@@ -2944,7 +2944,7 @@ static void gen_intermediate_code_internal(
} while (dc.is_jmp == DISAS_NEXT &&
insn_count < max_insns &&
dc.pc < next_page_start &&
- gen_opc_ptr < gen_opc_end);
+ tcg_cur_ctx->gen_opc_ptr < gen_opc_end);
reset_litbase(&dc);
reset_sar_tracker(&dc);
@@ -2960,7 +2960,7 @@ static void gen_intermediate_code_internal(
gen_jumpi(&dc, dc.pc, 0);
}
gen_icount_end(tb, insn_count);
- *gen_opc_ptr = INDEX_op_end;
+ *tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (!search_pc) {
tb->size = dc.pc - pc_start;
diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h
index 8100a5a..4793909 100644
--- a/tcg/tcg-op.h
+++ b/tcg/tcg-op.h
@@ -27,58 +27,58 @@ int gen_new_label(void);
static inline void tcg_gen_op0(TCGOpcode opc)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
}
static inline void tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 arg1)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
}
static inline void tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 arg1)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
}
static inline void tcg_gen_op1i(TCGOpcode opc, TCGArg arg1)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = arg1;
}
static inline void tcg_gen_op2_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
}
static inline void tcg_gen_op2_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
}
static inline void tcg_gen_op2i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGArg arg2)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = arg2;
}
static inline void tcg_gen_op2i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGArg arg2)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = arg2;
}
static inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg arg1, TCGArg arg2)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = arg1;
*gen_opparam_ptr++ = arg2;
}
@@ -86,7 +86,7 @@ static inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg arg1, TCGArg arg2)
static inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
*gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -95,7 +95,7 @@ static inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
static inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
*gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -104,7 +104,7 @@ static inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
static inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 arg1,
TCGv_i32 arg2, TCGArg arg3)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
*gen_opparam_ptr++ = arg3;
@@ -113,7 +113,7 @@ static inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 arg1,
static inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 arg1,
TCGv_i64 arg2, TCGArg arg3)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
*gen_opparam_ptr++ = arg3;
@@ -122,7 +122,7 @@ static inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 arg1,
static inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
TCGv_ptr base, TCGArg offset)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(val);
*gen_opparam_ptr++ = GET_TCGV_PTR(base);
*gen_opparam_ptr++ = offset;
@@ -131,7 +131,7 @@ static inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
static inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
TCGv_ptr base, TCGArg offset)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(val);
*gen_opparam_ptr++ = GET_TCGV_PTR(base);
*gen_opparam_ptr++ = offset;
@@ -140,7 +140,7 @@ static inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
static inline void tcg_gen_qemu_ldst_op_i64_i32(TCGOpcode opc, TCGv_i64 val,
TCGv_i32 addr, TCGArg mem_index)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(val);
*gen_opparam_ptr++ = GET_TCGV_I32(addr);
*gen_opparam_ptr++ = mem_index;
@@ -149,7 +149,7 @@ static inline void tcg_gen_qemu_ldst_op_i64_i32(TCGOpcode opc, TCGv_i64 val,
static inline void tcg_gen_qemu_ldst_op_i64_i64(TCGOpcode opc, TCGv_i64 val,
TCGv_i64 addr, TCGArg mem_index)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(val);
*gen_opparam_ptr++ = GET_TCGV_I64(addr);
*gen_opparam_ptr++ = mem_index;
@@ -158,7 +158,7 @@ static inline void tcg_gen_qemu_ldst_op_i64_i64(TCGOpcode opc, TCGv_i64 val,
static inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3, TCGv_i32 arg4)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
*gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -168,7 +168,7 @@ static inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
static inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3, TCGv_i64 arg4)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
*gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -178,7 +178,7 @@ static inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
static inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3, TCGArg arg4)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
*gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -188,7 +188,7 @@ static inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
static inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3, TCGArg arg4)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
*gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -198,7 +198,7 @@ static inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
static inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGArg arg3, TCGArg arg4)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
*gen_opparam_ptr++ = arg3;
@@ -208,7 +208,7 @@ static inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2
static inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGArg arg3, TCGArg arg4)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
*gen_opparam_ptr++ = arg3;
@@ -218,7 +218,7 @@ static inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2
static inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
*gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -229,7 +229,7 @@ static inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
static inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
*gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -240,7 +240,7 @@ static inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
static inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
*gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -251,7 +251,7 @@ static inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
static inline void tcg_gen_op5i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
*gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -263,7 +263,7 @@ static inline void tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 arg1,
TCGv_i32 arg2, TCGv_i32 arg3,
TCGArg arg4, TCGArg arg5)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
*gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -275,7 +275,7 @@ static inline void tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 arg1,
TCGv_i64 arg2, TCGv_i64 arg3,
TCGArg arg4, TCGArg arg5)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
*gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -287,7 +287,7 @@ static inline void tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5,
TCGv_i32 arg6)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
*gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -300,7 +300,7 @@ static inline void tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5,
TCGv_i64 arg6)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
*gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -313,7 +313,7 @@ static inline void tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3, TCGv_i32 arg4,
TCGv_i32 arg5, TCGArg arg6)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
*gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -326,7 +326,7 @@ static inline void tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3, TCGv_i64 arg4,
TCGv_i64 arg5, TCGArg arg6)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
*gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -339,7 +339,7 @@ static inline void tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 arg1,
TCGv_i32 arg2, TCGv_i32 arg3,
TCGv_i32 arg4, TCGArg arg5, TCGArg arg6)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I32(arg1);
*gen_opparam_ptr++ = GET_TCGV_I32(arg2);
*gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -352,7 +352,7 @@ static inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 arg1,
TCGv_i64 arg2, TCGv_i64 arg3,
TCGv_i64 arg4, TCGArg arg5, TCGArg arg6)
{
- *gen_opc_ptr++ = opc;
+ *tcg_cur_ctx->gen_opc_ptr++ = opc;
*gen_opparam_ptr++ = GET_TCGV_I64(arg1);
*gen_opparam_ptr++ = GET_TCGV_I64(arg2);
*gen_opparam_ptr++ = GET_TCGV_I64(arg3);
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 5faaca5..2dfc481 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -297,7 +297,7 @@ void tcg_func_start(TCGContext *s)
s->goto_tb_issue_mask = 0;
#endif
- gen_opc_ptr = gen_opc_buf;
+ s->gen_opc_ptr = gen_opc_buf;
gen_opparam_ptr = gen_opparam_buf;
}
@@ -633,7 +633,7 @@ void tcg_gen_callN(TCGContext *s, TCGv_ptr func, unsigned int flags,
}
#endif /* TCG_TARGET_EXTEND_ARGS */
- *gen_opc_ptr++ = INDEX_op_call;
+ *s->gen_opc_ptr++ = INDEX_op_call;
nparam = gen_opparam_ptr++;
if (ret != TCG_CALL_DUMMY_ARG) {
#if TCG_TARGET_REG_BITS < 64
@@ -886,7 +886,7 @@ void tcg_dump_ops(TCGContext *s)
first_insn = 1;
opc_ptr = gen_opc_buf;
args = gen_opparam_buf;
- while (opc_ptr < gen_opc_ptr) {
+ while (opc_ptr < s->gen_opc_ptr) {
c = *opc_ptr++;
def = &tcg_op_defs[c];
if (c == INDEX_op_debug_insn_start) {
@@ -1220,9 +1220,9 @@ static void tcg_liveness_analysis(TCGContext *s)
uint8_t *dead_temps;
unsigned int dead_args;
- gen_opc_ptr++; /* skip end */
+ s->gen_opc_ptr++; /* skip end */
- nb_ops = gen_opc_ptr - gen_opc_buf;
+ nb_ops = s->gen_opc_ptr - gen_opc_buf;
s->op_dead_args = tcg_malloc(nb_ops * sizeof(uint16_t));
@@ -1417,7 +1417,7 @@ static void tcg_liveness_analysis(TCGContext *s)
static void tcg_liveness_analysis(TCGContext *s)
{
int nb_ops;
- nb_ops = gen_opc_ptr - gen_opc_buf;
+ nb_ops = s->gen_opc_ptr - gen_opc_buf;
s->op_dead_args = tcg_malloc(nb_ops * sizeof(uint16_t));
memset(s->op_dead_args, 0, nb_ops * sizeof(uint16_t));
@@ -2104,7 +2104,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
#ifdef USE_TCG_OPTIMIZATIONS
gen_opparam_ptr =
- tcg_optimize(s, gen_opc_ptr, gen_opparam_buf, tcg_op_defs);
+ tcg_optimize(s, s->gen_opc_ptr, gen_opparam_buf, tcg_op_defs);
#endif
#ifdef CONFIG_PROFILER
@@ -2219,7 +2219,7 @@ int tcg_gen_code(TCGContext *s, uint8_t *gen_code_buf)
#ifdef CONFIG_PROFILER
{
int n;
- n = (gen_opc_ptr - gen_opc_buf);
+ n = (s->gen_opc_ptr - gen_opc_buf);
s->op_count += n;
if (n > s->op_count_max)
s->op_count_max = n;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH v2 4/7] TCG: Use gen_opparam_ptr from context instead of global variable.
2012-10-23 6:21 [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
` (2 preceding siblings ...)
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 3/7] TCG: Use gen_opc_ptr from context instead of global variable Evgeny Voevodin
@ 2012-10-23 6:21 ` Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 5/7] TCG: Use gen_opc_buf " Evgeny Voevodin
` (5 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-23 6:21 UTC (permalink / raw)
To: qemu-devel
Cc: Evgeny Voevodin, blauwirbel, kyungmin.park, edgar.iglesias,
aurelien, rth
Signed-off-by: Evgeny Voevodin <e.voevodin@samsung.com>
---
gen-icount.h | 2 +-
tcg/tcg-op.h | 254 +++++++++++++++++++++++++++++-----------------------------
tcg/tcg.c | 36 ++++-----
3 files changed, 146 insertions(+), 146 deletions(-)
diff --git a/gen-icount.h b/gen-icount.h
index 430cb44..be0bd7e 100644
--- a/gen-icount.h
+++ b/gen-icount.h
@@ -16,7 +16,7 @@ static inline void gen_icount_start(void)
count = tcg_temp_local_new_i32();
tcg_gen_ld_i32(count, cpu_env, offsetof(CPUArchState, icount_decr.u32));
/* This is a horrid hack to allow fixing up the value later. */
- icount_arg = gen_opparam_ptr + 1;
+ icount_arg = tcg_cur_ctx->gen_opparam_ptr + 1;
tcg_gen_subi_i32(count, count, 0xdeadbeef);
tcg_gen_brcondi_i32(TCG_COND_LT, count, 0, icount_label);
diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h
index 4793909..39ce9de 100644
--- a/tcg/tcg-op.h
+++ b/tcg/tcg-op.h
@@ -33,230 +33,230 @@ static inline void tcg_gen_op0(TCGOpcode opc)
static inline void tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 arg1)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
}
static inline void tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 arg1)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
}
static inline void tcg_gen_op1i(TCGOpcode opc, TCGArg arg1)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = arg1;
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg1;
}
static inline void tcg_gen_op2_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
}
static inline void tcg_gen_op2_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
}
static inline void tcg_gen_op2i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGArg arg2)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = arg2;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg2;
}
static inline void tcg_gen_op2i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGArg arg2)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = arg2;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg2;
}
static inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg arg1, TCGArg arg2)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = arg1;
- *gen_opparam_ptr++ = arg2;
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg1;
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg2;
}
static inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg3);
}
static inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg3);
}
static inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 arg1,
TCGv_i32 arg2, TCGArg arg3)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
- *gen_opparam_ptr++ = arg3;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg3;
}
static inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 arg1,
TCGv_i64 arg2, TCGArg arg3)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
- *gen_opparam_ptr++ = arg3;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg3;
}
static inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
TCGv_ptr base, TCGArg offset)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(val);
- *gen_opparam_ptr++ = GET_TCGV_PTR(base);
- *gen_opparam_ptr++ = offset;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(val);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_PTR(base);
+ *tcg_cur_ctx->gen_opparam_ptr++ = offset;
}
static inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
TCGv_ptr base, TCGArg offset)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(val);
- *gen_opparam_ptr++ = GET_TCGV_PTR(base);
- *gen_opparam_ptr++ = offset;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(val);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_PTR(base);
+ *tcg_cur_ctx->gen_opparam_ptr++ = offset;
}
static inline void tcg_gen_qemu_ldst_op_i64_i32(TCGOpcode opc, TCGv_i64 val,
TCGv_i32 addr, TCGArg mem_index)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(val);
- *gen_opparam_ptr++ = GET_TCGV_I32(addr);
- *gen_opparam_ptr++ = mem_index;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(val);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(addr);
+ *tcg_cur_ctx->gen_opparam_ptr++ = mem_index;
}
static inline void tcg_gen_qemu_ldst_op_i64_i64(TCGOpcode opc, TCGv_i64 val,
TCGv_i64 addr, TCGArg mem_index)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(val);
- *gen_opparam_ptr++ = GET_TCGV_I64(addr);
- *gen_opparam_ptr++ = mem_index;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(val);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(addr);
+ *tcg_cur_ctx->gen_opparam_ptr++ = mem_index;
}
static inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3, TCGv_i32 arg4)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg4);
}
static inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3, TCGv_i64 arg4)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg4);
}
static inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3, TCGArg arg4)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
- *gen_opparam_ptr++ = arg4;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg4;
}
static inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3, TCGArg arg4)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
- *gen_opparam_ptr++ = arg4;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg4;
}
static inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGArg arg3, TCGArg arg4)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
- *gen_opparam_ptr++ = arg3;
- *gen_opparam_ptr++ = arg4;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg3;
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg4;
}
static inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGArg arg3, TCGArg arg4)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
- *gen_opparam_ptr++ = arg3;
- *gen_opparam_ptr++ = arg4;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg3;
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg4;
}
static inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg5);
}
static inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg5);
}
static inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
- *gen_opparam_ptr++ = arg5;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg5;
}
static inline void tcg_gen_op5i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
- *gen_opparam_ptr++ = arg5;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg5;
}
static inline void tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 arg1,
@@ -264,11 +264,11 @@ static inline void tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 arg1,
TCGArg arg4, TCGArg arg5)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
- *gen_opparam_ptr++ = arg4;
- *gen_opparam_ptr++ = arg5;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg4;
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg5;
}
static inline void tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 arg1,
@@ -276,11 +276,11 @@ static inline void tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 arg1,
TCGArg arg4, TCGArg arg5)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
- *gen_opparam_ptr++ = arg4;
- *gen_opparam_ptr++ = arg5;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg4;
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg5;
}
static inline void tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
@@ -288,12 +288,12 @@ static inline void tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg6)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg6);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg5);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg6);
}
static inline void tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
@@ -301,12 +301,12 @@ static inline void tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg6)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg6);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg5);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg6);
}
static inline void tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
@@ -314,12 +314,12 @@ static inline void tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
TCGv_i32 arg5, TCGArg arg6)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg5);
- *gen_opparam_ptr++ = arg6;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg5);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg6;
}
static inline void tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
@@ -327,12 +327,12 @@ static inline void tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
TCGv_i64 arg5, TCGArg arg6)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg5);
- *gen_opparam_ptr++ = arg6;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg5);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg6;
}
static inline void tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 arg1,
@@ -340,12 +340,12 @@ static inline void tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 arg1,
TCGv_i32 arg4, TCGArg arg5, TCGArg arg6)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I32(arg4);
- *gen_opparam_ptr++ = arg5;
- *gen_opparam_ptr++ = arg6;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I32(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg5;
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg6;
}
static inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 arg1,
@@ -353,12 +353,12 @@ static inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 arg1,
TCGv_i64 arg4, TCGArg arg5, TCGArg arg6)
{
*tcg_cur_ctx->gen_opc_ptr++ = opc;
- *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
- *gen_opparam_ptr++ = GET_TCGV_I64(arg4);
- *gen_opparam_ptr++ = arg5;
- *gen_opparam_ptr++ = arg6;
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg1);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg2);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg3);
+ *tcg_cur_ctx->gen_opparam_ptr++ = GET_TCGV_I64(arg4);
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg5;
+ *tcg_cur_ctx->gen_opparam_ptr++ = arg6;
}
static inline void gen_set_label(int n)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 2dfc481..2c8669b 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -298,7 +298,7 @@ void tcg_func_start(TCGContext *s)
#endif
s->gen_opc_ptr = gen_opc_buf;
- gen_opparam_ptr = gen_opparam_buf;
+ s->gen_opparam_ptr = gen_opparam_buf;
}
static inline void tcg_temp_alloc(TCGContext *s, int n)
@@ -634,22 +634,22 @@ void tcg_gen_callN(TCGContext *s, TCGv_ptr func, unsigned int flags,
#endif /* TCG_TARGET_EXTEND_ARGS */
*s->gen_opc_ptr++ = INDEX_op_call;
- nparam = gen_opparam_ptr++;
+ nparam = s->gen_opparam_ptr++;
if (ret != TCG_CALL_DUMMY_ARG) {
#if TCG_TARGET_REG_BITS < 64
if (sizemask & 1) {
#ifdef TCG_TARGET_WORDS_BIGENDIAN
- *gen_opparam_ptr++ = ret + 1;
- *gen_opparam_ptr++ = ret;
+ *s->gen_opparam_ptr++ = ret + 1;
+ *s->gen_opparam_ptr++ = ret;
#else
- *gen_opparam_ptr++ = ret;
- *gen_opparam_ptr++ = ret + 1;
+ *s->gen_opparam_ptr++ = ret;
+ *s->gen_opparam_ptr++ = ret + 1;
#endif
nb_rets = 2;
} else
#endif
{
- *gen_opparam_ptr++ = ret;
+ *s->gen_opparam_ptr++ = ret;
nb_rets = 1;
}
} else {
@@ -663,7 +663,7 @@ void tcg_gen_callN(TCGContext *s, TCGv_ptr func, unsigned int flags,
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
/* some targets want aligned 64 bit args */
if (real_args & 1) {
- *gen_opparam_ptr++ = TCG_CALL_DUMMY_ARG;
+ *s->gen_opparam_ptr++ = TCG_CALL_DUMMY_ARG;
real_args++;
}
#endif
@@ -678,28 +678,28 @@ void tcg_gen_callN(TCGContext *s, TCGv_ptr func, unsigned int flags,
have to get more complicated to differentiate between
stack arguments and register arguments. */
#if defined(TCG_TARGET_WORDS_BIGENDIAN) != defined(TCG_TARGET_STACK_GROWSUP)
- *gen_opparam_ptr++ = args[i] + 1;
- *gen_opparam_ptr++ = args[i];
+ *s->gen_opparam_ptr++ = args[i] + 1;
+ *s->gen_opparam_ptr++ = args[i];
#else
- *gen_opparam_ptr++ = args[i];
- *gen_opparam_ptr++ = args[i] + 1;
+ *s->gen_opparam_ptr++ = args[i];
+ *s->gen_opparam_ptr++ = args[i] + 1;
#endif
real_args += 2;
continue;
}
#endif /* TCG_TARGET_REG_BITS < 64 */
- *gen_opparam_ptr++ = args[i];
+ *s->gen_opparam_ptr++ = args[i];
real_args++;
}
- *gen_opparam_ptr++ = GET_TCGV_PTR(func);
+ *s->gen_opparam_ptr++ = GET_TCGV_PTR(func);
- *gen_opparam_ptr++ = flags;
+ *s->gen_opparam_ptr++ = flags;
*nparam = (nb_rets << 16) | (real_args + 1);
/* total parameters, needed to go backward in the instruction stream */
- *gen_opparam_ptr++ = 1 + nb_rets + real_args + 3;
+ *s->gen_opparam_ptr++ = 1 + nb_rets + real_args + 3;
#if defined(TCG_TARGET_EXTEND_ARGS) && TCG_TARGET_REG_BITS == 64
for (i = 0; i < nargs; ++i) {
@@ -1229,7 +1229,7 @@ static void tcg_liveness_analysis(TCGContext *s)
dead_temps = tcg_malloc(s->nb_temps);
memset(dead_temps, 1, s->nb_temps);
- args = gen_opparam_ptr;
+ args = s->gen_opparam_ptr;
op_index = nb_ops - 1;
while (op_index >= 0) {
op = gen_opc_buf[op_index];
@@ -2103,7 +2103,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
#endif
#ifdef USE_TCG_OPTIMIZATIONS
- gen_opparam_ptr =
+ s->gen_opparam_ptr =
tcg_optimize(s, s->gen_opc_ptr, gen_opparam_buf, tcg_op_defs);
#endif
--
1.7.9.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH v2 5/7] TCG: Use gen_opc_buf from context instead of global variable.
2012-10-23 6:21 [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
` (3 preceding siblings ...)
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 4/7] TCG: Use gen_opparam_ptr " Evgeny Voevodin
@ 2012-10-23 6:21 ` Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 6/7] TCG: Use gen_opparam_buf " Evgeny Voevodin
` (4 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-23 6:21 UTC (permalink / raw)
To: qemu-devel
Cc: Evgeny Voevodin, blauwirbel, kyungmin.park, edgar.iglesias,
aurelien, rth
Signed-off-by: Evgeny Voevodin <e.voevodin@samsung.com>
---
target-alpha/translate.c | 6 ++--
target-arm/translate.c | 6 ++--
target-cris/translate.c | 9 +++---
target-i386/translate.c | 6 ++--
target-lm32/translate.c | 9 +++---
target-m68k/translate.c | 6 ++--
target-microblaze/translate.c | 9 +++---
target-mips/translate.c | 6 ++--
target-openrisc/translate.c | 9 +++---
target-ppc/translate.c | 6 ++--
target-s390x/translate.c | 6 ++--
target-sh4/translate.c | 6 ++--
target-sparc/translate.c | 6 ++--
target-unicore32/translate.c | 6 ++--
target-xtensa/translate.c | 4 +--
tcg/optimize.c | 62 ++++++++++++++++++++---------------------
tcg/tcg.c | 30 ++++++++++----------
17 files changed, 98 insertions(+), 94 deletions(-)
diff --git a/target-alpha/translate.c b/target-alpha/translate.c
index 751d457..7454ebd 100644
--- a/target-alpha/translate.c
+++ b/target-alpha/translate.c
@@ -3373,7 +3373,7 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env,
int max_insns;
pc_start = tb->pc;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
ctx.tb = tb;
ctx.env = env;
@@ -3406,7 +3406,7 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env,
}
}
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -3465,7 +3465,7 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env,
gen_icount_end(tb, num_insns);
*tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-arm/translate.c b/target-arm/translate.c
index 41b1671..3c82a0d 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -9718,7 +9718,7 @@ static inline void gen_intermediate_code_internal(CPUARMState *env,
dc->tb = tb;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
dc->is_jmp = DISAS_NEXT;
dc->pc = pc_start;
@@ -9825,7 +9825,7 @@ static inline void gen_intermediate_code_internal(CPUARMState *env,
}
}
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -9965,7 +9965,7 @@ done_generating:
}
#endif
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-cris/translate.c b/target-cris/translate.c
index 9bec8b5..587df16 100644
--- a/target-cris/translate.c
+++ b/target-cris/translate.c
@@ -3202,7 +3202,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
dc->env = env;
dc->tb = tb;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
dc->is_jmp = DISAS_NEXT;
dc->ppc = pc_start;
@@ -3266,7 +3266,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
check_breakpoint(env, dc);
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -3401,7 +3401,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
gen_icount_end(tb, num_insns);
*tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
@@ -3416,7 +3416,8 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
log_target_disas(pc_start, dc->pc - pc_start,
dc->env->pregs[PR_VR]);
qemu_log("\nisize=%d osize=%td\n",
- dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr - gen_opc_buf);
+ dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr -
+ tcg_cur_ctx->gen_opc_buf);
}
#endif
#endif
diff --git a/target-i386/translate.c b/target-i386/translate.c
index b28bfb3..c4fdff9 100644
--- a/target-i386/translate.c
+++ b/target-i386/translate.c
@@ -7958,7 +7958,7 @@ static inline void gen_intermediate_code_internal(CPUX86State *env,
cpu_ptr0 = tcg_temp_new_ptr();
cpu_ptr1 = tcg_temp_new_ptr();
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
dc->is_jmp = DISAS_NEXT;
pc_ptr = pc_start;
@@ -7980,7 +7980,7 @@ static inline void gen_intermediate_code_internal(CPUX86State *env,
}
}
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -8030,7 +8030,7 @@ static inline void gen_intermediate_code_internal(CPUX86State *env,
*tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
/* we don't forget to fill the last values */
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-lm32/translate.c b/target-lm32/translate.c
index 4a17ec1..6a70096 100644
--- a/target-lm32/translate.c
+++ b/target-lm32/translate.c
@@ -1018,7 +1018,7 @@ static void gen_intermediate_code_internal(CPULM32State *env,
dc->env = env;
dc->tb = tb;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
dc->is_jmp = DISAS_NEXT;
dc->pc = pc_start;
@@ -1047,7 +1047,7 @@ static void gen_intermediate_code_internal(CPULM32State *env,
check_breakpoint(env, dc);
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j) {
@@ -1107,7 +1107,7 @@ static void gen_intermediate_code_internal(CPULM32State *env,
gen_icount_end(tb, num_insns);
*tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j) {
gen_opc_instr_start[lj++] = 0;
@@ -1122,7 +1122,8 @@ static void gen_intermediate_code_internal(CPULM32State *env,
qemu_log("\n");
log_target_disas(pc_start, dc->pc - pc_start, 0);
qemu_log("\nisize=%d osize=%td\n",
- dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr - gen_opc_buf);
+ dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr -
+ tcg_cur_ctx->gen_opc_buf);
}
#endif
}
diff --git a/target-m68k/translate.c b/target-m68k/translate.c
index 9fa82d4..8d22391 100644
--- a/target-m68k/translate.c
+++ b/target-m68k/translate.c
@@ -2982,7 +2982,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
dc->tb = tb;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
dc->env = env;
dc->is_jmp = DISAS_NEXT;
@@ -3015,7 +3015,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
break;
}
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -3075,7 +3075,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
}
#endif
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c
index aeffed0..b84cd3b 100644
--- a/target-microblaze/translate.c
+++ b/target-microblaze/translate.c
@@ -1741,7 +1741,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
dc->tb = tb;
org_flags = dc->synced_flags = dc->tb_flags = tb->flags;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
dc->is_jmp = DISAS_NEXT;
dc->jmp = 0;
@@ -1784,7 +1784,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
check_breakpoint(env, dc);
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -1899,7 +1899,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
gen_icount_end(tb, num_insns);
*tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
@@ -1916,7 +1916,8 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
log_target_disas(pc_start, dc->pc - pc_start, 0);
#endif
qemu_log("\nisize=%d osize=%td\n",
- dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr - gen_opc_buf);
+ dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr -
+ tcg_cur_ctx->gen_opc_buf);
}
#endif
#endif
diff --git a/target-mips/translate.c b/target-mips/translate.c
index 10690b0..1fea036 100644
--- a/target-mips/translate.c
+++ b/target-mips/translate.c
@@ -12809,7 +12809,7 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
qemu_log("search pc %d\n", search_pc);
pc_start = tb->pc;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
ctx.pc = pc_start;
ctx.saved_pc = -1;
ctx.singlestep_enabled = env->singlestep_enabled;
@@ -12845,7 +12845,7 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
}
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -12928,7 +12928,7 @@ done_generating:
gen_icount_end(tb, num_insns);
*tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c
index 1c4017a..3394cb0 100644
--- a/target-openrisc/translate.c
+++ b/target-openrisc/translate.c
@@ -1675,7 +1675,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
pc_start = tb->pc;
dc->tb = tb;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
dc->is_jmp = DISAS_NEXT;
dc->ppc = pc_start;
dc->pc = pc_start;
@@ -1703,7 +1703,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
do {
check_breakpoint(cpu, dc);
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (k < j) {
k++;
while (k < j) {
@@ -1784,7 +1784,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
gen_icount_end(tb, num_insns);
*tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
k++;
while (k <= j) {
gen_opc_instr_start[k++] = 0;
@@ -1799,7 +1799,8 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
qemu_log("\n");
log_target_disas(pc_start, dc->pc - pc_start, 0);
qemu_log("\nisize=%d osize=%td\n",
- dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr - gen_opc_buf);
+ dc->pc - pc_start, tcg_cur_ctx->gen_opc_ptr -
+ tcg_cur_ctx->gen_opc_buf);
}
#endif
}
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index f9cfea5..08aafd3 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -9617,7 +9617,7 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env,
int max_insns;
pc_start = tb->pc;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
ctx.nip = pc_start;
ctx.tb = tb;
ctx.exception = POWERPC_EXCP_NONE;
@@ -9668,7 +9668,7 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env,
}
}
if (unlikely(search_pc)) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -9770,7 +9770,7 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env,
gen_icount_end(tb, num_insns);
*tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (unlikely(search_pc)) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-s390x/translate.c b/target-s390x/translate.c
index c5f6af2..87b6eb8 100644
--- a/target-s390x/translate.c
+++ b/target-s390x/translate.c
@@ -5134,7 +5134,7 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env,
dc.tb = tb;
dc.cc_op = CC_OP_DYNAMIC;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE;
@@ -5156,7 +5156,7 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env,
}
}
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j) {
@@ -5209,7 +5209,7 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env,
gen_icount_end(tb, num_insns);
*tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j) {
gen_opc_instr_start[lj++] = 0;
diff --git a/target-sh4/translate.c b/target-sh4/translate.c
index 4d89b3d..ab2fa8d 100644
--- a/target-sh4/translate.c
+++ b/target-sh4/translate.c
@@ -1967,7 +1967,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
int max_insns;
pc_start = tb->pc;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
ctx.pc = pc_start;
ctx.flags = (uint32_t)tb->flags;
ctx.bstate = BS_NONE;
@@ -1999,7 +1999,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
}
}
if (search_pc) {
- i = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ i = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (ii < i) {
ii++;
while (ii < i)
@@ -2058,7 +2058,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
gen_icount_end(tb, num_insns);
*tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (search_pc) {
- i = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ i = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
ii++;
while (ii <= i)
gen_opc_instr_start[ii++] = 0;
diff --git a/target-sparc/translate.c b/target-sparc/translate.c
index daa4c5d..62669bd 100644
--- a/target-sparc/translate.c
+++ b/target-sparc/translate.c
@@ -5257,7 +5257,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
dc->fpu_enabled = tb_fpu_enabled(tb->flags);
dc->address_mask_32bit = tb_am_enabled(tb->flags);
dc->singlestep = (env->singlestep_enabled || singlestep);
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
num_insns = 0;
max_insns = tb->cflags & CF_COUNT_MASK;
@@ -5279,7 +5279,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
}
if (spc) {
qemu_log("Search PC...\n");
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j)
@@ -5336,7 +5336,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
gen_icount_end(tb, num_insns);
*tcg_cur_ctx->gen_opc_ptr = INDEX_op_end;
if (spc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j)
gen_opc_instr_start[lj++] = 0;
diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c
index 3575c7e..c8cd686 100644
--- a/target-unicore32/translate.c
+++ b/target-unicore32/translate.c
@@ -1956,7 +1956,7 @@ static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
dc->tb = tb;
- gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
dc->is_jmp = DISAS_NEXT;
dc->pc = pc_start;
@@ -1999,7 +1999,7 @@ static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
}
}
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j) {
@@ -2114,7 +2114,7 @@ done_generating:
}
#endif
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
lj++;
while (lj <= j) {
gen_opc_instr_start[lj++] = 0;
diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
index e14f1a2..38c6e6e 100644
--- a/target-xtensa/translate.c
+++ b/target-xtensa/translate.c
@@ -2849,7 +2849,7 @@ static void gen_intermediate_code_internal(
DisasContext dc;
int insn_count = 0;
int j, lj = -1;
- uint16_t *gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
+ uint16_t *gen_opc_end = tcg_cur_ctx->gen_opc_buf + OPC_MAX_SIZE;
int max_insns = tb->cflags & CF_COUNT_MASK;
uint32_t pc_start = tb->pc;
uint32_t next_page_start =
@@ -2893,7 +2893,7 @@ static void gen_intermediate_code_internal(
check_breakpoint(env, &dc);
if (search_pc) {
- j = tcg_cur_ctx->gen_opc_ptr - gen_opc_buf;
+ j = tcg_cur_ctx->gen_opc_ptr - tcg_cur_ctx->gen_opc_buf;
if (lj < j) {
lj++;
while (lj < j) {
diff --git a/tcg/optimize.c b/tcg/optimize.c
index a06c8eb..fffa682 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -484,10 +484,10 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
nb_globals = s->nb_globals;
memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info));
- nb_ops = tcg_opc_ptr - gen_opc_buf;
+ nb_ops = tcg_opc_ptr - s->gen_opc_buf;
gen_args = args;
for (op_index = 0; op_index < nb_ops; op_index++) {
- op = gen_opc_buf[op_index];
+ op = s->gen_opc_buf[op_index];
def = &tcg_op_defs[op];
/* Do copy propagation */
if (op == INDEX_op_call) {
@@ -569,7 +569,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
CASE_OP_32_64(rotr):
if (temps[args[1]].state == TCG_TEMP_CONST
&& temps[args[1]].val == 0) {
- gen_opc_buf[op_index] = op_to_movi(op);
+ s->gen_opc_buf[op_index] = op_to_movi(op);
tcg_opt_gen_movi(gen_args, args[0], 0);
args += 3;
gen_args += 2;
@@ -598,9 +598,9 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
if (temps[args[2]].state == TCG_TEMP_CONST
&& temps[args[2]].val == 0) {
if (temps_are_copies(args[0], args[1])) {
- gen_opc_buf[op_index] = INDEX_op_nop;
+ s->gen_opc_buf[op_index] = INDEX_op_nop;
} else {
- gen_opc_buf[op_index] = op_to_mov(op);
+ s->gen_opc_buf[op_index] = op_to_mov(op);
tcg_opt_gen_mov(s, gen_args, args[0], args[1]);
gen_args += 2;
}
@@ -618,7 +618,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
CASE_OP_32_64(mul):
if ((temps[args[2]].state == TCG_TEMP_CONST
&& temps[args[2]].val == 0)) {
- gen_opc_buf[op_index] = op_to_movi(op);
+ s->gen_opc_buf[op_index] = op_to_movi(op);
tcg_opt_gen_movi(gen_args, args[0], 0);
args += 3;
gen_args += 2;
@@ -635,9 +635,9 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
CASE_OP_32_64(and):
if (temps_are_copies(args[1], args[2])) {
if (temps_are_copies(args[0], args[1])) {
- gen_opc_buf[op_index] = INDEX_op_nop;
+ s->gen_opc_buf[op_index] = INDEX_op_nop;
} else {
- gen_opc_buf[op_index] = op_to_mov(op);
+ s->gen_opc_buf[op_index] = op_to_mov(op);
tcg_opt_gen_mov(s, gen_args, args[0], args[1]);
gen_args += 2;
}
@@ -654,7 +654,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
CASE_OP_32_64(sub):
CASE_OP_32_64(xor):
if (temps_are_copies(args[1], args[2])) {
- gen_opc_buf[op_index] = op_to_movi(op);
+ s->gen_opc_buf[op_index] = op_to_movi(op);
tcg_opt_gen_movi(gen_args, args[0], 0);
gen_args += 2;
args += 3;
@@ -672,7 +672,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
CASE_OP_32_64(mov):
if (temps_are_copies(args[0], args[1])) {
args += 2;
- gen_opc_buf[op_index] = INDEX_op_nop;
+ s->gen_opc_buf[op_index] = INDEX_op_nop;
break;
}
if (temps[args[1]].state != TCG_TEMP_CONST) {
@@ -684,7 +684,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
/* Source argument is constant. Rewrite the operation and
let movi case handle it. */
op = op_to_movi(op);
- gen_opc_buf[op_index] = op;
+ s->gen_opc_buf[op_index] = op;
args[1] = temps[args[1]].val;
/* fallthrough */
CASE_OP_32_64(movi):
@@ -702,7 +702,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
case INDEX_op_ext32s_i64:
case INDEX_op_ext32u_i64:
if (temps[args[1]].state == TCG_TEMP_CONST) {
- gen_opc_buf[op_index] = op_to_movi(op);
+ s->gen_opc_buf[op_index] = op_to_movi(op);
tmp = do_constant_folding(op, temps[args[1]].val, 0);
tcg_opt_gen_movi(gen_args, args[0], tmp);
gen_args += 2;
@@ -729,7 +729,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
CASE_OP_32_64(nor):
if (temps[args[1]].state == TCG_TEMP_CONST
&& temps[args[2]].state == TCG_TEMP_CONST) {
- gen_opc_buf[op_index] = op_to_movi(op);
+ s->gen_opc_buf[op_index] = op_to_movi(op);
tmp = do_constant_folding(op, temps[args[1]].val,
temps[args[2]].val);
tcg_opt_gen_movi(gen_args, args[0], tmp);
@@ -742,7 +742,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
CASE_OP_32_64(deposit):
if (temps[args[1]].state == TCG_TEMP_CONST
&& temps[args[2]].state == TCG_TEMP_CONST) {
- gen_opc_buf[op_index] = op_to_movi(op);
+ s->gen_opc_buf[op_index] = op_to_movi(op);
tmp = ((1ull << args[4]) - 1);
tmp = (temps[args[1]].val & ~(tmp << args[3]))
| ((temps[args[2]].val & tmp) << args[3]);
@@ -756,7 +756,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
CASE_OP_32_64(setcond):
tmp = do_constant_folding_cond(op, args[1], args[2], args[3]);
if (tmp != 2) {
- gen_opc_buf[op_index] = op_to_movi(op);
+ s->gen_opc_buf[op_index] = op_to_movi(op);
tcg_opt_gen_movi(gen_args, args[0], tmp);
gen_args += 2;
args += 4;
@@ -769,11 +769,11 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
if (tmp != 2) {
if (tmp) {
memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info));
- gen_opc_buf[op_index] = INDEX_op_br;
+ s->gen_opc_buf[op_index] = INDEX_op_br;
gen_args[0] = args[3];
gen_args += 1;
} else {
- gen_opc_buf[op_index] = INDEX_op_nop;
+ s->gen_opc_buf[op_index] = INDEX_op_nop;
}
args += 4;
break;
@@ -784,13 +784,13 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
tmp = do_constant_folding_cond(op, args[1], args[2], args[5]);
if (tmp != 2) {
if (temps_are_copies(args[0], args[4-tmp])) {
- gen_opc_buf[op_index] = INDEX_op_nop;
+ s->gen_opc_buf[op_index] = INDEX_op_nop;
} else if (temps[args[4-tmp]].state == TCG_TEMP_CONST) {
- gen_opc_buf[op_index] = op_to_movi(op);
+ s->gen_opc_buf[op_index] = op_to_movi(op);
tcg_opt_gen_movi(gen_args, args[0], temps[args[4-tmp]].val);
gen_args += 2;
} else {
- gen_opc_buf[op_index] = op_to_mov(op);
+ s->gen_opc_buf[op_index] = op_to_mov(op);
tcg_opt_gen_mov(s, gen_args, args[0], args[4-tmp]);
gen_args += 2;
}
@@ -820,12 +820,12 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
}
/* We emit the extra nop when we emit the add2/sub2. */
- assert(gen_opc_buf[op_index + 1] == INDEX_op_nop);
+ assert(s->gen_opc_buf[op_index + 1] == INDEX_op_nop);
rl = args[0];
rh = args[1];
- gen_opc_buf[op_index] = INDEX_op_movi_i32;
- gen_opc_buf[++op_index] = INDEX_op_movi_i32;
+ s->gen_opc_buf[op_index] = INDEX_op_movi_i32;
+ s->gen_opc_buf[++op_index] = INDEX_op_movi_i32;
tcg_opt_gen_movi(&gen_args[0], rl, (uint32_t)a);
tcg_opt_gen_movi(&gen_args[2], rh, (uint32_t)(a >> 32));
gen_args += 4;
@@ -843,12 +843,12 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
TCGArg rl, rh;
/* We emit the extra nop when we emit the mulu2. */
- assert(gen_opc_buf[op_index + 1] == INDEX_op_nop);
+ assert(s->gen_opc_buf[op_index + 1] == INDEX_op_nop);
rl = args[0];
rh = args[1];
- gen_opc_buf[op_index] = INDEX_op_movi_i32;
- gen_opc_buf[++op_index] = INDEX_op_movi_i32;
+ s->gen_opc_buf[op_index] = INDEX_op_movi_i32;
+ s->gen_opc_buf[++op_index] = INDEX_op_movi_i32;
tcg_opt_gen_movi(&gen_args[0], rl, (uint32_t)r);
tcg_opt_gen_movi(&gen_args[2], rh, (uint32_t)(r >> 32));
gen_args += 4;
@@ -862,11 +862,11 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
if (tmp != 2) {
if (tmp) {
memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info));
- gen_opc_buf[op_index] = INDEX_op_br;
+ s->gen_opc_buf[op_index] = INDEX_op_br;
gen_args[0] = args[5];
gen_args += 1;
} else {
- gen_opc_buf[op_index] = INDEX_op_nop;
+ s->gen_opc_buf[op_index] = INDEX_op_nop;
}
} else if ((args[4] == TCG_COND_LT || args[4] == TCG_COND_GE)
&& temps[args[2]].state == TCG_TEMP_CONST
@@ -876,7 +876,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
/* Simplify LT/GE comparisons vs zero to a single compare
vs the high word of the input. */
memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info));
- gen_opc_buf[op_index] = INDEX_op_brcond_i32;
+ s->gen_opc_buf[op_index] = INDEX_op_brcond_i32;
gen_args[0] = args[1];
gen_args[1] = args[3];
gen_args[2] = args[4];
@@ -891,7 +891,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
case INDEX_op_setcond2_i32:
tmp = do_constant_folding_cond2(&args[1], &args[3], args[5]);
if (tmp != 2) {
- gen_opc_buf[op_index] = INDEX_op_movi_i32;
+ s->gen_opc_buf[op_index] = INDEX_op_movi_i32;
tcg_opt_gen_movi(gen_args, args[0], tmp);
gen_args += 2;
} else if ((args[5] == TCG_COND_LT || args[5] == TCG_COND_GE)
@@ -901,7 +901,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
&& temps[args[4]].val == 0) {
/* Simplify LT/GE comparisons vs zero to a single compare
vs the high word of the input. */
- gen_opc_buf[op_index] = INDEX_op_setcond_i32;
+ s->gen_opc_buf[op_index] = INDEX_op_setcond_i32;
gen_args[0] = args[0];
gen_args[1] = args[2];
gen_args[2] = args[4];
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 2c8669b..c4e663b 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -297,7 +297,7 @@ void tcg_func_start(TCGContext *s)
s->goto_tb_issue_mask = 0;
#endif
- s->gen_opc_ptr = gen_opc_buf;
+ s->gen_opc_ptr = s->gen_opc_buf;
s->gen_opparam_ptr = gen_opparam_buf;
}
@@ -884,7 +884,7 @@ void tcg_dump_ops(TCGContext *s)
char buf[128];
first_insn = 1;
- opc_ptr = gen_opc_buf;
+ opc_ptr = s->gen_opc_buf;
args = gen_opparam_buf;
while (opc_ptr < s->gen_opc_ptr) {
c = *opc_ptr++;
@@ -1222,7 +1222,7 @@ static void tcg_liveness_analysis(TCGContext *s)
s->gen_opc_ptr++; /* skip end */
- nb_ops = s->gen_opc_ptr - gen_opc_buf;
+ nb_ops = s->gen_opc_ptr - s->gen_opc_buf;
s->op_dead_args = tcg_malloc(nb_ops * sizeof(uint16_t));
@@ -1232,7 +1232,7 @@ static void tcg_liveness_analysis(TCGContext *s)
args = s->gen_opparam_ptr;
op_index = nb_ops - 1;
while (op_index >= 0) {
- op = gen_opc_buf[op_index];
+ op = s->gen_opc_buf[op_index];
def = &tcg_op_defs[op];
switch(op) {
case INDEX_op_call:
@@ -1254,7 +1254,7 @@ static void tcg_liveness_analysis(TCGContext *s)
if (!dead_temps[arg])
goto do_not_remove_call;
}
- tcg_set_nop(s, gen_opc_buf + op_index,
+ tcg_set_nop(s, s->gen_opc_buf + op_index,
args - 1, nb_args);
} else {
do_not_remove_call:
@@ -1323,11 +1323,11 @@ static void tcg_liveness_analysis(TCGContext *s)
} else {
op = INDEX_op_sub_i32;
}
- gen_opc_buf[op_index] = op;
+ s->gen_opc_buf[op_index] = op;
args[1] = args[2];
args[2] = args[4];
- assert(gen_opc_buf[op_index + 1] == INDEX_op_nop);
- tcg_set_nop(s, gen_opc_buf + op_index + 1, args + 3, 3);
+ assert(s->gen_opc_buf[op_index + 1] == INDEX_op_nop);
+ tcg_set_nop(s, s->gen_opc_buf + op_index + 1, args + 3, 3);
/* Fall through and mark the single-word operation live. */
nb_iargs = 2;
nb_oargs = 1;
@@ -1343,11 +1343,11 @@ static void tcg_liveness_analysis(TCGContext *s)
if (dead_temps[args[0]]) {
goto do_remove;
}
- gen_opc_buf[op_index] = op = INDEX_op_mul_i32;
+ s->gen_opc_buf[op_index] = op = INDEX_op_mul_i32;
args[1] = args[2];
args[2] = args[3];
- assert(gen_opc_buf[op_index + 1] == INDEX_op_nop);
- tcg_set_nop(s, gen_opc_buf + op_index + 1, args + 3, 1);
+ assert(s->gen_opc_buf[op_index + 1] == INDEX_op_nop);
+ tcg_set_nop(s, s->gen_opc_buf + op_index + 1, args + 3, 1);
/* Fall through and mark the single-word operation live. */
nb_oargs = 1;
}
@@ -1369,7 +1369,7 @@ static void tcg_liveness_analysis(TCGContext *s)
goto do_not_remove;
}
do_remove:
- tcg_set_nop(s, gen_opc_buf + op_index, args, def->nb_args);
+ tcg_set_nop(s, s->gen_opc_buf + op_index, args, def->nb_args);
#ifdef CONFIG_PROFILER
s->del_op_count++;
#endif
@@ -1417,7 +1417,7 @@ static void tcg_liveness_analysis(TCGContext *s)
static void tcg_liveness_analysis(TCGContext *s)
{
int nb_ops;
- nb_ops = s->gen_opc_ptr - gen_opc_buf;
+ nb_ops = s->gen_opc_ptr - s->gen_opc_buf;
s->op_dead_args = tcg_malloc(nb_ops * sizeof(uint16_t));
memset(s->op_dead_args, 0, nb_ops * sizeof(uint16_t));
@@ -2135,7 +2135,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
op_index = 0;
for(;;) {
- opc = gen_opc_buf[op_index];
+ opc = s->gen_opc_buf[op_index];
#ifdef CONFIG_PROFILER
tcg_table_op_count[opc]++;
#endif
@@ -2219,7 +2219,7 @@ int tcg_gen_code(TCGContext *s, uint8_t *gen_code_buf)
#ifdef CONFIG_PROFILER
{
int n;
- n = (s->gen_opc_ptr - gen_opc_buf);
+ n = (s->gen_opc_ptr - s->gen_opc_buf);
s->op_count += n;
if (n > s->op_count_max)
s->op_count_max = n;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH v2 6/7] TCG: Use gen_opparam_buf from context instead of global variable.
2012-10-23 6:21 [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
` (4 preceding siblings ...)
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 5/7] TCG: Use gen_opc_buf " Evgeny Voevodin
@ 2012-10-23 6:21 ` Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 7/7] TCG: Remove unused global variables Evgeny Voevodin
` (3 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-23 6:21 UTC (permalink / raw)
To: qemu-devel
Cc: Evgeny Voevodin, blauwirbel, kyungmin.park, edgar.iglesias,
aurelien, rth
Signed-off-by: Evgeny Voevodin <e.voevodin@samsung.com>
---
tcg/tcg.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index c4e663b..f332463 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -298,7 +298,7 @@ void tcg_func_start(TCGContext *s)
#endif
s->gen_opc_ptr = s->gen_opc_buf;
- s->gen_opparam_ptr = gen_opparam_buf;
+ s->gen_opparam_ptr = s->gen_opparam_buf;
}
static inline void tcg_temp_alloc(TCGContext *s, int n)
@@ -885,7 +885,7 @@ void tcg_dump_ops(TCGContext *s)
first_insn = 1;
opc_ptr = s->gen_opc_buf;
- args = gen_opparam_buf;
+ args = s->gen_opparam_buf;
while (opc_ptr < s->gen_opc_ptr) {
c = *opc_ptr++;
def = &tcg_op_defs[c];
@@ -1409,8 +1409,9 @@ static void tcg_liveness_analysis(TCGContext *s)
op_index--;
}
- if (args != gen_opparam_buf)
+ if (args != s->gen_opparam_buf) {
tcg_abort();
+ }
}
#else
/* dummy liveness analysis */
@@ -2104,7 +2105,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
#ifdef USE_TCG_OPTIMIZATIONS
s->gen_opparam_ptr =
- tcg_optimize(s, s->gen_opc_ptr, gen_opparam_buf, tcg_op_defs);
+ tcg_optimize(s, s->gen_opc_ptr, s->gen_opparam_buf, tcg_op_defs);
#endif
#ifdef CONFIG_PROFILER
@@ -2131,7 +2132,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
s->code_buf = gen_code_buf;
s->code_ptr = gen_code_buf;
- args = gen_opparam_buf;
+ args = s->gen_opparam_buf;
op_index = 0;
for(;;) {
--
1.7.9.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Qemu-devel] [PATCH v2 7/7] TCG: Remove unused global variables
2012-10-23 6:21 [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
` (5 preceding siblings ...)
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 6/7] TCG: Use gen_opparam_buf " Evgeny Voevodin
@ 2012-10-23 6:21 ` Evgeny Voevodin
2012-10-23 8:38 ` [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
` (2 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-23 6:21 UTC (permalink / raw)
To: qemu-devel
Cc: Evgeny, blauwirbel, kyungmin.park, edgar.iglesias, aurelien, rth
From: Evgeny <e.voevodin@samsung.com>
Signed-off-by: Evgeny Voevodin <e.voevodin@samsung.com>
---
tcg/tcg.c | 4 ----
tcg/tcg.h | 4 ----
translate-all.c | 3 ---
3 files changed, 11 deletions(-)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index f332463..53bf109 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -96,10 +96,6 @@ const size_t tcg_op_defs_max = ARRAY_SIZE(tcg_op_defs);
static TCGRegSet tcg_target_available_regs[2];
static TCGRegSet tcg_target_call_clobber_regs;
-/* XXX: move that inside the context */
-uint16_t *gen_opc_ptr;
-TCGArg *gen_opparam_ptr;
-
static inline void tcg_out8(TCGContext *s, uint8_t v)
{
*s->code_ptr++ = v;
diff --git a/tcg/tcg.h b/tcg/tcg.h
index d326b36..19426f9 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -432,10 +432,6 @@ struct TCGContext {
extern TCGContext tcg_ctx;
extern TCGContext *tcg_cur_ctx;
-extern uint16_t *gen_opc_ptr;
-extern TCGArg *gen_opparam_ptr;
-extern uint16_t gen_opc_buf[];
-extern TCGArg gen_opparam_buf[];
/* pool based memory allocation */
diff --git a/translate-all.c b/translate-all.c
index ccdcddf..3351012 100644
--- a/translate-all.c
+++ b/translate-all.c
@@ -34,9 +34,6 @@
TCGContext tcg_ctx;
TCGContext *tcg_cur_ctx = &tcg_ctx;
-uint16_t gen_opc_buf[OPC_BUF_SIZE];
-TCGArg gen_opparam_buf[OPPARAM_BUF_SIZE];
-
target_ulong gen_opc_pc[OPC_BUF_SIZE];
uint16_t gen_opc_icount[OPC_BUF_SIZE];
uint8_t gen_opc_instr_start[OPC_BUF_SIZE];
--
1.7.9.5
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up
2012-10-23 6:21 [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
` (6 preceding siblings ...)
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 7/7] TCG: Remove unused global variables Evgeny Voevodin
@ 2012-10-23 8:38 ` Evgeny Voevodin
2012-10-25 3:06 ` Evgeny Voevodin
2012-10-25 6:45 ` Evgeny Voevodin
9 siblings, 0 replies; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-23 8:38 UTC (permalink / raw)
Cc: qemu-devel, blauwirbel, kyungmin.park, edgar.iglesias, aurelien,
rth
On 10/23/2012 10:21 AM, Evgeny Voevodin wrote:
> This set of patches moves global variables to tcg_ctx:
> gen_opc_ptr
> gen_opparam_ptr
> gen_opc_buf
> gen_opparam_buf
>
> Build tested for all targets.
> Execution tested on ARM.
>
> I didn't notice any slow-down of kernel boot after this set was applied.
>
> Changelog:
> v1->v2:
> Introduced TCGContext *tcg_cur_ctx global to use in those places where we don't
> have an interface to pass pointer to tcg_ctx.
> Code style clean-up
>
> Evgeny (2):
> tcg/tcg.h: Duplicate global TCG variables in TCGContext
> TCG: Remove unused global variables
>
It seems that I cherry-picked commits that were made before I correctly
set a user name. Hope I don't need to generate v3 because of that.
> Evgeny Voevodin (5):
> translate-all.c: Introduce TCGContext *tcg_cur_ctx
> TCG: Use gen_opc_ptr from context instead of global variable.
> TCG: Use gen_opparam_ptr from context instead of global variable.
> TCG: Use gen_opc_buf from context instead of global variable.
> TCG: Use gen_opparam_buf from context instead of global variable.
>
> gen-icount.h | 2 +-
> target-alpha/translate.c | 10 +-
> target-arm/translate.c | 10 +-
> target-cris/translate.c | 13 +-
> target-i386/translate.c | 10 +-
> target-lm32/translate.c | 13 +-
> target-m68k/translate.c | 10 +-
> target-microblaze/translate.c | 13 +-
> target-mips/translate.c | 11 +-
> target-openrisc/translate.c | 13 +-
> target-ppc/translate.c | 11 +-
> target-s390x/translate.c | 11 +-
> target-sh4/translate.c | 10 +-
> target-sparc/translate.c | 10 +-
> target-unicore32/translate.c | 10 +-
> target-xtensa/translate.c | 8 +-
> tcg/optimize.c | 62 ++++----
> tcg/tcg-op.h | 324 ++++++++++++++++++++---------------------
> tcg/tcg.c | 85 ++++++-----
> tcg/tcg.h | 11 +-
> translate-all.c | 4 +-
> 21 files changed, 328 insertions(+), 323 deletions(-)
>
--
Kind regards,
Evgeny Voevodin,
Technical Leader,
Mobile Group,
Samsung Moscow Research Center,
e-mail: e.voevodin@samsung.com
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 2/7] translate-all.c: Introduce TCGContext *tcg_cur_ctx
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 2/7] translate-all.c: Introduce TCGContext *tcg_cur_ctx Evgeny Voevodin
@ 2012-10-23 21:18 ` Richard Henderson
2012-10-24 4:07 ` Evgeny Voevodin
0 siblings, 1 reply; 18+ messages in thread
From: Richard Henderson @ 2012-10-23 21:18 UTC (permalink / raw)
To: Evgeny Voevodin
Cc: qemu-devel, blauwirbel, kyungmin.park, edgar.iglesias, aurelien
On 2012-10-23 16:21, Evgeny Voevodin wrote:
> We will use this pointer from functions where we don't have an
> interface to pass tcg_ctx as a parameter.
I don't think this is worthwhile. It'll just make the whole thing slower,
passing around unnecessary pointers.
r~
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 2/7] translate-all.c: Introduce TCGContext *tcg_cur_ctx
2012-10-23 21:18 ` Richard Henderson
@ 2012-10-24 4:07 ` Evgeny Voevodin
0 siblings, 0 replies; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-24 4:07 UTC (permalink / raw)
To: Richard Henderson
Cc: qemu-devel, blauwirbel, kyungmin.park, edgar.iglesias, aurelien
On 10/24/2012 01:18 AM, Richard Henderson wrote:
> On 2012-10-23 16:21, Evgeny Voevodin wrote:
>> We will use this pointer from functions where we don't have an
>> interface to pass tcg_ctx as a parameter.
> I don't think this is worthwhile. It'll just make the whole thing slower,
> passing around unnecessary pointers.
>
>
> r~
>
1. I didn't noticed any slow-down of kernel boot process. Maybe it's
worth to make more
tests with self modifying code but I don't think so, because
2. The most intensive usage of tcg_cur_ctx is in tcg/tcg-op.h functions.
If we look carefully at
them then we will see that there are only few functions for which single
excessive dereferencing
of a pointer leads to any significant slow-down. These functions are
those which make just one
or two operations and exit. And we should keep in mind that there is
only single dereference of
a pointer since it is stored in the register for further operations.
Of course some slow-down should present but I found it negligible
(actually I didn't find it at all).
If there are some common tests for TCG generation speed I can try to run
them and report results.
Also we can specify tcg_cur_ctx as const and in that case I guess that
dereferencing of tcg_cur_ctx
should not lead to any slow-down.
Also I can drop tcg_cur_ctx and use tcg_ctx.xxx instead as was in the
first series.
What about the rest patches?
--
Kind regards,
Evgeny Voevodin,
Technical Leader,
Mobile Group,
Samsung Moscow Research Center,
e-mail: e.voevodin@samsung.com
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up
2012-10-23 6:21 [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
` (7 preceding siblings ...)
2012-10-23 8:38 ` [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
@ 2012-10-25 3:06 ` Evgeny Voevodin
2012-10-25 3:17 ` 陳韋任 (Wei-Ren Chen)
2012-10-25 6:45 ` Evgeny Voevodin
9 siblings, 1 reply; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-25 3:06 UTC (permalink / raw)
Cc: qemu-devel, blauwirbel, kyungmin.park, edgar.iglesias, aurelien,
rth
Any other comments on the patches?
I didn't get the consensus. Do we need a pointer to tcg context?
As I said before, I didn't notice any slow-down with it.
On 10/23/2012 10:21 AM, Evgeny Voevodin wrote:
> This set of patches moves global variables to tcg_ctx:
> gen_opc_ptr
> gen_opparam_ptr
> gen_opc_buf
> gen_opparam_buf
>
> Build tested for all targets.
> Execution tested on ARM.
>
> I didn't notice any slow-down of kernel boot after this set was applied.
>
> Changelog:
> v1->v2:
> Introduced TCGContext *tcg_cur_ctx global to use in those places where we don't
> have an interface to pass pointer to tcg_ctx.
> Code style clean-up
>
> Evgeny (2):
> tcg/tcg.h: Duplicate global TCG variables in TCGContext
> TCG: Remove unused global variables
>
> Evgeny Voevodin (5):
> translate-all.c: Introduce TCGContext *tcg_cur_ctx
> TCG: Use gen_opc_ptr from context instead of global variable.
> TCG: Use gen_opparam_ptr from context instead of global variable.
> TCG: Use gen_opc_buf from context instead of global variable.
> TCG: Use gen_opparam_buf from context instead of global variable.
>
> gen-icount.h | 2 +-
> target-alpha/translate.c | 10 +-
> target-arm/translate.c | 10 +-
> target-cris/translate.c | 13 +-
> target-i386/translate.c | 10 +-
> target-lm32/translate.c | 13 +-
> target-m68k/translate.c | 10 +-
> target-microblaze/translate.c | 13 +-
> target-mips/translate.c | 11 +-
> target-openrisc/translate.c | 13 +-
> target-ppc/translate.c | 11 +-
> target-s390x/translate.c | 11 +-
> target-sh4/translate.c | 10 +-
> target-sparc/translate.c | 10 +-
> target-unicore32/translate.c | 10 +-
> target-xtensa/translate.c | 8 +-
> tcg/optimize.c | 62 ++++----
> tcg/tcg-op.h | 324 ++++++++++++++++++++---------------------
> tcg/tcg.c | 85 ++++++-----
> tcg/tcg.h | 11 +-
> translate-all.c | 4 +-
> 21 files changed, 328 insertions(+), 323 deletions(-)
>
--
Kind regards,
Evgeny Voevodin,
Technical Leader,
Mobile Group,
Samsung Moscow Research Center,
e-mail: e.voevodin@samsung.com
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up
2012-10-25 3:06 ` Evgeny Voevodin
@ 2012-10-25 3:17 ` 陳韋任 (Wei-Ren Chen)
2012-10-25 3:41 ` Evgeny Voevodin
0 siblings, 1 reply; 18+ messages in thread
From: 陳韋任 (Wei-Ren Chen) @ 2012-10-25 3:17 UTC (permalink / raw)
To: Evgeny Voevodin
Cc: qemu-devel, blauwirbel, kyungmin.park, edgar.iglesias, aurelien,
rth
On Thu, Oct 25, 2012 at 07:06:37AM +0400, Evgeny Voevodin wrote:
> Any other comments on the patches?
> I didn't get the consensus. Do we need a pointer to tcg context?
> As I said before, I didn't notice any slow-down with it.
>
> On 10/23/2012 10:21 AM, Evgeny Voevodin wrote:
> > This set of patches moves global variables to tcg_ctx:
> > gen_opc_ptr
> > gen_opparam_ptr
> > gen_opc_buf
> > gen_opparam_buf
> >
> > Build tested for all targets.
> > Execution tested on ARM.
> >
> > I didn't notice any slow-down of kernel boot after this set was applied.
Would you like to try to run some benchmark after the kernel booting? Like
Yeongkyoon Lee done with his qemu_ld/qemu_st work [1], EEMBC, nbench
, or even SPEC. ;)
Regards,
chenwj
[1] http://lists.gnu.org/archive/html/qemu-devel/2012-10/msg03630.html
--
Wei-Ren Chen (陳韋任)
Computer Systems Lab, Institute of Information Science,
Academia Sinica, Taiwan (R.O.C.)
Tel:886-2-2788-3799 #1667
Homepage: http://people.cs.nctu.edu.tw/~chenwj
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up
2012-10-25 3:17 ` 陳韋任 (Wei-Ren Chen)
@ 2012-10-25 3:41 ` Evgeny Voevodin
0 siblings, 0 replies; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-25 3:41 UTC (permalink / raw)
To: "陳韋任 (Wei-Ren Chen)"
Cc: qemu-devel, blauwirbel, kyungmin.park, edgar.iglesias, aurelien,
rth
On 10/25/2012 07:17 AM, 陳韋任 (Wei-Ren Chen) wrote:
> On Thu, Oct 25, 2012 at 07:06:37AM +0400, Evgeny Voevodin wrote:
>> Any other comments on the patches?
>> I didn't get the consensus. Do we need a pointer to tcg context?
>> As I said before, I didn't notice any slow-down with it.
>>
>> On 10/23/2012 10:21 AM, Evgeny Voevodin wrote:
>>> This set of patches moves global variables to tcg_ctx:
>>> gen_opc_ptr
>>> gen_opparam_ptr
>>> gen_opc_buf
>>> gen_opparam_buf
>>>
>>> Build tested for all targets.
>>> Execution tested on ARM.
>>>
>>> I didn't notice any slow-down of kernel boot after this set was applied.
> Would you like to try to run some benchmark after the kernel booting? Like
> Yeongkyoon Lee done with his qemu_ld/qemu_st work [1], EEMBC, nbench
> , or even SPEC. ;)
>
> Regards,
> chenwj
>
> [1] http://lists.gnu.org/archive/html/qemu-devel/2012-10/msg03630.html
>
Sure.
--
Kind regards,
Evgeny Voevodin,
Technical Leader,
Mobile Group,
Samsung Moscow Research Center,
e-mail: e.voevodin@samsung.com
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up
2012-10-23 6:21 [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
` (8 preceding siblings ...)
2012-10-25 3:06 ` Evgeny Voevodin
@ 2012-10-25 6:45 ` Evgeny Voevodin
2012-10-26 6:32 ` Evgeny Voevodin
9 siblings, 1 reply; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-25 6:45 UTC (permalink / raw)
To: qemu-devel
Cc: Evgeny Voevodin, blauwirbel, kyungmin.park, edgar.iglesias,
aurelien, rth
Here are the results of tests before and after this patch series was
applied:
* EEMBC CoreMark (before -> after)
- Guest: Exynos4210 ARMv7, Linux (Custom buildroot image)
- Host: Intel(R) Core(TM) i5 CPU 750 @ 2.67GHz, 4GB RAM, Linux
- Results: 1148.105626 -> 1161.440186 (+1.16%)
* nbench (before -> after)
- Guest: Exynos4210 ARMv7, Linux (Custom buildroot image)
- Host: Intel(R) Core(TM) i5 CPU 750 @ 2.67GHz, 4GB RAM, Linux
- Results
. MEMORY INDEX: 1.864 -> 1.862 (-0.11%)
. INTEGER INDEX: 2.518 -> 2.523 (+0.2%)
. FLOATING-POINT INDEX: 0.385 -> 0.394 (+2.34%)
Those tests show that it became even faster :))
But I'm quite sceptical about such results.
The thing is that in case of nbench it prints the warning if results are
not 95% statistically accurate.
So we can be sure that nbench result is 95% accurate.
And it's obvious that result shown above are in the scope of this accuracy.
I don't know the accuracy of CoreMark.
So, the main decision we can make that this patch series didn't
introduce any slow-down comparable to inaccuracy of the measurement.
Is this enough?
On 10/23/2012 10:21 AM, Evgeny Voevodin wrote:
> This set of patches moves global variables to tcg_ctx:
> gen_opc_ptr
> gen_opparam_ptr
> gen_opc_buf
> gen_opparam_buf
>
> Build tested for all targets.
> Execution tested on ARM.
>
> I didn't notice any slow-down of kernel boot after this set was applied.
>
> Changelog:
> v1->v2:
> Introduced TCGContext *tcg_cur_ctx global to use in those places where we don't
> have an interface to pass pointer to tcg_ctx.
> Code style clean-up
>
> Evgeny (2):
> tcg/tcg.h: Duplicate global TCG variables in TCGContext
> TCG: Remove unused global variables
>
> Evgeny Voevodin (5):
> translate-all.c: Introduce TCGContext *tcg_cur_ctx
> TCG: Use gen_opc_ptr from context instead of global variable.
> TCG: Use gen_opparam_ptr from context instead of global variable.
> TCG: Use gen_opc_buf from context instead of global variable.
> TCG: Use gen_opparam_buf from context instead of global variable.
>
> gen-icount.h | 2 +-
> target-alpha/translate.c | 10 +-
> target-arm/translate.c | 10 +-
> target-cris/translate.c | 13 +-
> target-i386/translate.c | 10 +-
> target-lm32/translate.c | 13 +-
> target-m68k/translate.c | 10 +-
> target-microblaze/translate.c | 13 +-
> target-mips/translate.c | 11 +-
> target-openrisc/translate.c | 13 +-
> target-ppc/translate.c | 11 +-
> target-s390x/translate.c | 11 +-
> target-sh4/translate.c | 10 +-
> target-sparc/translate.c | 10 +-
> target-unicore32/translate.c | 10 +-
> target-xtensa/translate.c | 8 +-
> tcg/optimize.c | 62 ++++----
> tcg/tcg-op.h | 324 ++++++++++++++++++++---------------------
> tcg/tcg.c | 85 ++++++-----
> tcg/tcg.h | 11 +-
> translate-all.c | 4 +-
> 21 files changed, 328 insertions(+), 323 deletions(-)
>
--
Kind regards,
Evgeny Voevodin,
Technical Leader,
Mobile Group,
Samsung Moscow Research Center,
e-mail: e.voevodin@samsung.com
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up
2012-10-25 6:45 ` Evgeny Voevodin
@ 2012-10-26 6:32 ` Evgeny Voevodin
2012-10-27 14:34 ` Blue Swirl
0 siblings, 1 reply; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-26 6:32 UTC (permalink / raw)
Cc: qemu-devel, blauwirbel, kyungmin.park, edgar.iglesias, aurelien,
rth
Today I made more precise testing with usage of --enable-profiler.
Here is the test procedure:
1. Boot Linux Kernel 5 times.
2. For each iteration wait while "JIT cycles" is stable for ~10 seconds
3. Write down the "cycles/op"
Here are the results:
Before clean-up:
min: 731.9
max: 735.8
avg: 734.3
standard deviation: ~2 = 0.3%
Avarage cycles/op = 734 +- 2
After clean-up:
min: 747.2
max: 751.7
avg: 750.5
standard deviation: ~2 = 0.3%
Avarage cycles/op = 750 +- 2
Slow-down of TCG code generation = 2.2%
After clean-up with TCGContext *const tcg_cur_ctx:
min: 730.6
max: 733.2
avg: 728.7
standard deviation: ~2 = 0.3%
Avarage cycles/op = 729 +- 2
Slow-down of TCG code generation = 0%
I suggest to define tcg_cur_ctx as TCGContext *const.
Then we will get rid of TCG code generation slow-down and also
will have no usage of global variables.
On 10/25/2012 10:45 AM, Evgeny Voevodin wrote:
> Here are the results of tests before and after this patch series was
> applied:
>
> * EEMBC CoreMark (before -> after)
> - Guest: Exynos4210 ARMv7, Linux (Custom buildroot image)
> - Host: Intel(R) Core(TM) i5 CPU 750 @ 2.67GHz, 4GB RAM, Linux
> - Results: 1148.105626 -> 1161.440186 (+1.16%)
>
> * nbench (before -> after)
> - Guest: Exynos4210 ARMv7, Linux (Custom buildroot image)
> - Host: Intel(R) Core(TM) i5 CPU 750 @ 2.67GHz, 4GB RAM, Linux
> - Results
> . MEMORY INDEX: 1.864 -> 1.862 (-0.11%)
> . INTEGER INDEX: 2.518 -> 2.523 (+0.2%)
> . FLOATING-POINT INDEX: 0.385 -> 0.394 (+2.34%)
>
>
> Those tests show that it became even faster :))
>
> But I'm quite sceptical about such results.
> The thing is that in case of nbench it prints the warning if results are
> not 95% statistically accurate.
> So we can be sure that nbench result is 95% accurate.
> And it's obvious that result shown above are in the scope of this accuracy.
> I don't know the accuracy of CoreMark.
>
> So, the main decision we can make that this patch series didn't
> introduce any slow-down comparable to inaccuracy of the measurement.
>
> Is this enough?
>
> On 10/23/2012 10:21 AM, Evgeny Voevodin wrote:
>> This set of patches moves global variables to tcg_ctx:
>> gen_opc_ptr
>> gen_opparam_ptr
>> gen_opc_buf
>> gen_opparam_buf
>>
>> Build tested for all targets.
>> Execution tested on ARM.
>>
>> I didn't notice any slow-down of kernel boot after this set was applied.
>>
>> Changelog:
>> v1->v2:
>> Introduced TCGContext *tcg_cur_ctx global to use in those places where
>> we don't
>> have an interface to pass pointer to tcg_ctx.
>> Code style clean-up
>>
>> Evgeny (2):
>> tcg/tcg.h: Duplicate global TCG variables in TCGContext
>> TCG: Remove unused global variables
>>
>> Evgeny Voevodin (5):
>> translate-all.c: Introduce TCGContext *tcg_cur_ctx
>> TCG: Use gen_opc_ptr from context instead of global variable.
>> TCG: Use gen_opparam_ptr from context instead of global variable.
>> TCG: Use gen_opc_buf from context instead of global variable.
>> TCG: Use gen_opparam_buf from context instead of global variable.
>>
>> gen-icount.h | 2 +-
>> target-alpha/translate.c | 10 +-
>> target-arm/translate.c | 10 +-
>> target-cris/translate.c | 13 +-
>> target-i386/translate.c | 10 +-
>> target-lm32/translate.c | 13 +-
>> target-m68k/translate.c | 10 +-
>> target-microblaze/translate.c | 13 +-
>> target-mips/translate.c | 11 +-
>> target-openrisc/translate.c | 13 +-
>> target-ppc/translate.c | 11 +-
>> target-s390x/translate.c | 11 +-
>> target-sh4/translate.c | 10 +-
>> target-sparc/translate.c | 10 +-
>> target-unicore32/translate.c | 10 +-
>> target-xtensa/translate.c | 8 +-
>> tcg/optimize.c | 62 ++++----
>> tcg/tcg-op.h | 324
>> ++++++++++++++++++++---------------------
>> tcg/tcg.c | 85 ++++++-----
>> tcg/tcg.h | 11 +-
>> translate-all.c | 4 +-
>> 21 files changed, 328 insertions(+), 323 deletions(-)
>>
>
>
--
Kind regards,
Evgeny Voevodin,
Technical Leader,
Mobile Group,
Samsung Moscow Research Center,
e-mail: e.voevodin@samsung.com
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up
2012-10-26 6:32 ` Evgeny Voevodin
@ 2012-10-27 14:34 ` Blue Swirl
2012-10-29 6:27 ` Evgeny Voevodin
0 siblings, 1 reply; 18+ messages in thread
From: Blue Swirl @ 2012-10-27 14:34 UTC (permalink / raw)
To: Evgeny Voevodin; +Cc: edgar.iglesias, kyungmin.park, qemu-devel, aurelien, rth
On Fri, Oct 26, 2012 at 6:32 AM, Evgeny Voevodin <e.voevodin@samsung.com> wrote:
> Today I made more precise testing with usage of --enable-profiler.
>
> Here is the test procedure:
> 1. Boot Linux Kernel 5 times.
> 2. For each iteration wait while "JIT cycles" is stable for ~10 seconds
> 3. Write down the "cycles/op"
>
> Here are the results:
>
> Before clean-up:
> min: 731.9
> max: 735.8
> avg: 734.3
> standard deviation: ~2 = 0.3%
> Avarage cycles/op = 734 +- 2
>
> After clean-up:
> min: 747.2
> max: 751.7
> avg: 750.5
> standard deviation: ~2 = 0.3%
> Avarage cycles/op = 750 +- 2
> Slow-down of TCG code generation = 2.2%
>
>
> After clean-up with TCGContext *const tcg_cur_ctx:
> min: 730.6
> max: 733.2
> avg: 728.7
> standard deviation: ~2 = 0.3%
> Avarage cycles/op = 729 +- 2
> Slow-down of TCG code generation = 0%
>
> I suggest to define tcg_cur_ctx as TCGContext *const.
> Then we will get rid of TCG code generation slow-down and also
> will have no usage of global variables.
How does this compare with the original version without pointers? I
think that version may be safer to be assumed to be optimized by the
compiler.
>
>
> On 10/25/2012 10:45 AM, Evgeny Voevodin wrote:
>>
>> Here are the results of tests before and after this patch series was
>> applied:
>>
>> * EEMBC CoreMark (before -> after)
>> - Guest: Exynos4210 ARMv7, Linux (Custom buildroot image)
>> - Host: Intel(R) Core(TM) i5 CPU 750 @ 2.67GHz, 4GB RAM, Linux
>> - Results: 1148.105626 -> 1161.440186 (+1.16%)
>>
>> * nbench (before -> after)
>> - Guest: Exynos4210 ARMv7, Linux (Custom buildroot image)
>> - Host: Intel(R) Core(TM) i5 CPU 750 @ 2.67GHz, 4GB RAM, Linux
>> - Results
>> . MEMORY INDEX: 1.864 -> 1.862 (-0.11%)
>> . INTEGER INDEX: 2.518 -> 2.523 (+0.2%)
>> . FLOATING-POINT INDEX: 0.385 -> 0.394 (+2.34%)
>>
>>
>> Those tests show that it became even faster :))
>>
>> But I'm quite sceptical about such results.
>> The thing is that in case of nbench it prints the warning if results are
>> not 95% statistically accurate.
>> So we can be sure that nbench result is 95% accurate.
>> And it's obvious that result shown above are in the scope of this
>> accuracy.
>> I don't know the accuracy of CoreMark.
>>
>> So, the main decision we can make that this patch series didn't
>> introduce any slow-down comparable to inaccuracy of the measurement.
>>
>> Is this enough?
>>
>> On 10/23/2012 10:21 AM, Evgeny Voevodin wrote:
>>>
>>> This set of patches moves global variables to tcg_ctx:
>>> gen_opc_ptr
>>> gen_opparam_ptr
>>> gen_opc_buf
>>> gen_opparam_buf
>>>
>>> Build tested for all targets.
>>> Execution tested on ARM.
>>>
>>> I didn't notice any slow-down of kernel boot after this set was applied.
>>>
>>> Changelog:
>>> v1->v2:
>>> Introduced TCGContext *tcg_cur_ctx global to use in those places where
>>> we don't
>>> have an interface to pass pointer to tcg_ctx.
>>> Code style clean-up
>>>
>>> Evgeny (2):
>>> tcg/tcg.h: Duplicate global TCG variables in TCGContext
>>> TCG: Remove unused global variables
>>>
>>> Evgeny Voevodin (5):
>>> translate-all.c: Introduce TCGContext *tcg_cur_ctx
>>> TCG: Use gen_opc_ptr from context instead of global variable.
>>> TCG: Use gen_opparam_ptr from context instead of global variable.
>>> TCG: Use gen_opc_buf from context instead of global variable.
>>> TCG: Use gen_opparam_buf from context instead of global variable.
>>>
>>> gen-icount.h | 2 +-
>>> target-alpha/translate.c | 10 +-
>>> target-arm/translate.c | 10 +-
>>> target-cris/translate.c | 13 +-
>>> target-i386/translate.c | 10 +-
>>> target-lm32/translate.c | 13 +-
>>> target-m68k/translate.c | 10 +-
>>> target-microblaze/translate.c | 13 +-
>>> target-mips/translate.c | 11 +-
>>> target-openrisc/translate.c | 13 +-
>>> target-ppc/translate.c | 11 +-
>>> target-s390x/translate.c | 11 +-
>>> target-sh4/translate.c | 10 +-
>>> target-sparc/translate.c | 10 +-
>>> target-unicore32/translate.c | 10 +-
>>> target-xtensa/translate.c | 8 +-
>>> tcg/optimize.c | 62 ++++----
>>> tcg/tcg-op.h | 324
>>> ++++++++++++++++++++---------------------
>>> tcg/tcg.c | 85 ++++++-----
>>> tcg/tcg.h | 11 +-
>>> translate-all.c | 4 +-
>>> 21 files changed, 328 insertions(+), 323 deletions(-)
>>>
>>
>>
>
>
> --
> Kind regards,
> Evgeny Voevodin,
> Technical Leader,
> Mobile Group,
> Samsung Moscow Research Center,
> e-mail: e.voevodin@samsung.com
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up
2012-10-27 14:34 ` Blue Swirl
@ 2012-10-29 6:27 ` Evgeny Voevodin
0 siblings, 0 replies; 18+ messages in thread
From: Evgeny Voevodin @ 2012-10-29 6:27 UTC (permalink / raw)
To: Blue Swirl; +Cc: edgar.iglesias, kyungmin.park, qemu-devel, aurelien, rth
On 10/27/2012 06:34 PM, Blue Swirl wrote:
> On Fri, Oct 26, 2012 at 6:32 AM, Evgeny Voevodin <e.voevodin@samsung.com> wrote:
>> Today I made more precise testing with usage of --enable-profiler.
>>
>> Here is the test procedure:
>> 1. Boot Linux Kernel 5 times.
>> 2. For each iteration wait while "JIT cycles" is stable for ~10 seconds
>> 3. Write down the "cycles/op"
>>
>> Here are the results:
>>
>> Before clean-up:
>> min: 731.9
>> max: 735.8
>> avg: 734.3
>> standard deviation: ~2 = 0.3%
>> Avarage cycles/op = 734 +- 2
>>
>> After clean-up:
>> min: 747.2
>> max: 751.7
>> avg: 750.5
>> standard deviation: ~2 = 0.3%
>> Avarage cycles/op = 750 +- 2
>> Slow-down of TCG code generation = 2.2%
>>
>>
>> After clean-up with TCGContext *const tcg_cur_ctx:
>> min: 730.6
>> max: 733.2
>> avg: 728.7
>> standard deviation: ~2 = 0.3%
>> Avarage cycles/op = 729 +- 2
>> Slow-down of TCG code generation = 0%
>>
>> I suggest to define tcg_cur_ctx as TCGContext *const.
>> Then we will get rid of TCG code generation slow-down and also
>> will have no usage of global variables.
> How does this compare with the original version without pointers? I
> think that version may be safer to be assumed to be optimized by the
> compiler.
I did more testing with different gcc versions and different patch series:
gcc verion v1 clean-up, no pointer v2 clean-up, const pointer
master
gcc-4.4 754.3 752.1
769.8
gcc-4.5 770.8 779.8
774.8
gcc-4.6 731.8 729.8
737
Conclusion:
- First clean-up series without pointer operates faster than master in
all cases. It's probably because
data is cached more efficiently.
- Second clean-up series with constant pointer operates faster than
master in the case of gcc-4.4 and gcc-4.6.
In the case of gcc-4.5 it seems that const pointer is not optimised
as I assumed.
I think that it's worth to generate third series without pointer and
with code clean-up included in second.
How do you think?
>>
>> On 10/25/2012 10:45 AM, Evgeny Voevodin wrote:
>>> Here are the results of tests before and after this patch series was
>>> applied:
>>>
>>> * EEMBC CoreMark (before -> after)
>>> - Guest: Exynos4210 ARMv7, Linux (Custom buildroot image)
>>> - Host: Intel(R) Core(TM) i5 CPU 750 @ 2.67GHz, 4GB RAM, Linux
>>> - Results: 1148.105626 -> 1161.440186 (+1.16%)
>>>
>>> * nbench (before -> after)
>>> - Guest: Exynos4210 ARMv7, Linux (Custom buildroot image)
>>> - Host: Intel(R) Core(TM) i5 CPU 750 @ 2.67GHz, 4GB RAM, Linux
>>> - Results
>>> . MEMORY INDEX: 1.864 -> 1.862 (-0.11%)
>>> . INTEGER INDEX: 2.518 -> 2.523 (+0.2%)
>>> . FLOATING-POINT INDEX: 0.385 -> 0.394 (+2.34%)
>>>
>>>
>>> Those tests show that it became even faster :))
>>>
>>> But I'm quite sceptical about such results.
>>> The thing is that in case of nbench it prints the warning if results are
>>> not 95% statistically accurate.
>>> So we can be sure that nbench result is 95% accurate.
>>> And it's obvious that result shown above are in the scope of this
>>> accuracy.
>>> I don't know the accuracy of CoreMark.
>>>
>>> So, the main decision we can make that this patch series didn't
>>> introduce any slow-down comparable to inaccuracy of the measurement.
>>>
>>> Is this enough?
>>>
>>> On 10/23/2012 10:21 AM, Evgeny Voevodin wrote:
>>>> This set of patches moves global variables to tcg_ctx:
>>>> gen_opc_ptr
>>>> gen_opparam_ptr
>>>> gen_opc_buf
>>>> gen_opparam_buf
>>>>
>>>> Build tested for all targets.
>>>> Execution tested on ARM.
>>>>
>>>> I didn't notice any slow-down of kernel boot after this set was applied.
>>>>
>>>> Changelog:
>>>> v1->v2:
>>>> Introduced TCGContext *tcg_cur_ctx global to use in those places where
>>>> we don't
>>>> have an interface to pass pointer to tcg_ctx.
>>>> Code style clean-up
>>>>
>>>> Evgeny (2):
>>>> tcg/tcg.h: Duplicate global TCG variables in TCGContext
>>>> TCG: Remove unused global variables
>>>>
>>>> Evgeny Voevodin (5):
>>>> translate-all.c: Introduce TCGContext *tcg_cur_ctx
>>>> TCG: Use gen_opc_ptr from context instead of global variable.
>>>> TCG: Use gen_opparam_ptr from context instead of global variable.
>>>> TCG: Use gen_opc_buf from context instead of global variable.
>>>> TCG: Use gen_opparam_buf from context instead of global variable.
>>>>
>>>> gen-icount.h | 2 +-
>>>> target-alpha/translate.c | 10 +-
>>>> target-arm/translate.c | 10 +-
>>>> target-cris/translate.c | 13 +-
>>>> target-i386/translate.c | 10 +-
>>>> target-lm32/translate.c | 13 +-
>>>> target-m68k/translate.c | 10 +-
>>>> target-microblaze/translate.c | 13 +-
>>>> target-mips/translate.c | 11 +-
>>>> target-openrisc/translate.c | 13 +-
>>>> target-ppc/translate.c | 11 +-
>>>> target-s390x/translate.c | 11 +-
>>>> target-sh4/translate.c | 10 +-
>>>> target-sparc/translate.c | 10 +-
>>>> target-unicore32/translate.c | 10 +-
>>>> target-xtensa/translate.c | 8 +-
>>>> tcg/optimize.c | 62 ++++----
>>>> tcg/tcg-op.h | 324
>>>> ++++++++++++++++++++---------------------
>>>> tcg/tcg.c | 85 ++++++-----
>>>> tcg/tcg.h | 11 +-
>>>> translate-all.c | 4 +-
>>>> 21 files changed, 328 insertions(+), 323 deletions(-)
>>>>
>>>
>>
>> --
>> Kind regards,
>> Evgeny Voevodin,
>> Technical Leader,
>> Mobile Group,
>> Samsung Moscow Research Center,
>> e-mail: e.voevodin@samsung.com
--
Kind regards,
Evgeny Voevodin,
Technical Leader,
Mobile Group,
Samsung Moscow Research Center,
e-mail: e.voevodin@samsung.com
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2012-10-29 6:27 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-23 6:21 [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 1/7] tcg/tcg.h: Duplicate global TCG variables in TCGContext Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 2/7] translate-all.c: Introduce TCGContext *tcg_cur_ctx Evgeny Voevodin
2012-10-23 21:18 ` Richard Henderson
2012-10-24 4:07 ` Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 3/7] TCG: Use gen_opc_ptr from context instead of global variable Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 4/7] TCG: Use gen_opparam_ptr " Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 5/7] TCG: Use gen_opc_buf " Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 6/7] TCG: Use gen_opparam_buf " Evgeny Voevodin
2012-10-23 6:21 ` [Qemu-devel] [PATCH v2 7/7] TCG: Remove unused global variables Evgeny Voevodin
2012-10-23 8:38 ` [Qemu-devel] [PATCH v2 0/7] TCG global variables clean-up Evgeny Voevodin
2012-10-25 3:06 ` Evgeny Voevodin
2012-10-25 3:17 ` 陳韋任 (Wei-Ren Chen)
2012-10-25 3:41 ` Evgeny Voevodin
2012-10-25 6:45 ` Evgeny Voevodin
2012-10-26 6:32 ` Evgeny Voevodin
2012-10-27 14:34 ` Blue Swirl
2012-10-29 6:27 ` Evgeny Voevodin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).