accel/tcg: Precompute curr_cflags into cpu->tcg_cflags
The primary motivation is to remove a dozen insns along the fast-path in tb_lookup. As a byproduct, this allows us to completely remove parallel_cpus. Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
872ebd884d
commit
6cc9d67c6f
11 changed files with 30 additions and 27 deletions
|
|
@ -205,6 +205,7 @@ CPUArchState *cpu_copy(CPUArchState *env)
|
|||
/* Reset non arch specific state */
|
||||
cpu_reset(new_cpu);
|
||||
|
||||
new_cpu->tcg_cflags = cpu->tcg_cflags;
|
||||
memcpy(new_env, env, sizeof(CPUArchState));
|
||||
|
||||
/* Clone all break/watchpoints.
|
||||
|
|
|
|||
|
|
@ -82,9 +82,11 @@ static abi_ulong get_sigframe(struct target_sigaction *ka,
|
|||
return (sp - frame_size) & -8ul;
|
||||
}
|
||||
|
||||
/* Notice when we're in the middle of a gUSA region and reset.
|
||||
Note that this will only occur for !parallel_cpus, as we will
|
||||
translate such sequences differently in a parallel context. */
|
||||
/*
|
||||
* Notice when we're in the middle of a gUSA region and reset.
|
||||
* Note that this will only occur when #CF_PARALLEL is unset, as we
|
||||
* will translate such sequences differently in a parallel context.
|
||||
*/
|
||||
static void unwind_gusa(CPUSH4State *regs)
|
||||
{
|
||||
/* If the stack pointer is sufficiently negative, and we haven't
|
||||
|
|
|
|||
|
|
@ -6481,6 +6481,16 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
|
|||
/* Grab a mutex so that thread setup appears atomic. */
|
||||
pthread_mutex_lock(&clone_lock);
|
||||
|
||||
/*
|
||||
* If this is our first additional thread, we need to ensure we
|
||||
* generate code for parallel execution and flush old translations.
|
||||
* Do this now so that the copy gets CF_PARALLEL too.
|
||||
*/
|
||||
if (!(cpu->tcg_cflags & CF_PARALLEL)) {
|
||||
cpu->tcg_cflags |= CF_PARALLEL;
|
||||
tb_flush(cpu);
|
||||
}
|
||||
|
||||
/* we create a new CPU instance. */
|
||||
new_env = cpu_copy(env);
|
||||
/* Init regs that differ from the parent. */
|
||||
|
|
@ -6521,14 +6531,6 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
|
|||
sigprocmask(SIG_BLOCK, &sigmask, &info.sigmask);
|
||||
cpu->random_seed = qemu_guest_random_seed_thread_part1();
|
||||
|
||||
/* If this is our first additional thread, we need to ensure we
|
||||
* generate code for parallel execution and flush old translations.
|
||||
*/
|
||||
if (!parallel_cpus) {
|
||||
parallel_cpus = true;
|
||||
tb_flush(cpu);
|
||||
}
|
||||
|
||||
ret = pthread_create(&info.thread, &attr, clone_func, &info);
|
||||
/* TODO: Free new CPU state if thread creation failed. */
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue