mirror of
https://git.proxmox.com/git/qemu
synced 2025-06-14 10:44:57 +00:00
target-alpha: Consider the superpage when threading and ending TBs
This allows significantly more threading, and occasionally larger TBs, when processing code for the kernel and PALcode. Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
a9ead83261
commit
b114b68adf
@ -379,13 +379,26 @@ static ExitStatus gen_store_conditional(DisasContext *ctx, int ra, int rb,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int use_goto_tb(DisasContext *ctx, uint64_t dest)
|
static bool in_superpage(DisasContext *ctx, int64_t addr)
|
||||||
{
|
{
|
||||||
/* Check for the dest on the same page as the start of the TB. We
|
return ((ctx->tb->flags & TB_FLAGS_USER_MODE) == 0
|
||||||
also want to suppress goto_tb in the case of single-steping and IO. */
|
&& addr < 0
|
||||||
return (((ctx->tb->pc ^ dest) & TARGET_PAGE_MASK) == 0
|
&& ((addr >> 41) & 3) == 2
|
||||||
&& !ctx->singlestep_enabled
|
&& addr >> TARGET_VIRT_ADDR_SPACE_BITS == addr >> 63);
|
||||||
&& !(ctx->tb->cflags & CF_LAST_IO));
|
}
|
||||||
|
|
||||||
|
static bool use_goto_tb(DisasContext *ctx, uint64_t dest)
|
||||||
|
{
|
||||||
|
/* Suppress goto_tb in the case of single-steping and IO. */
|
||||||
|
if (ctx->singlestep_enabled || (ctx->tb->cflags & CF_LAST_IO)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
/* If the destination is in the superpage, the page perms can't change. */
|
||||||
|
if (in_superpage(ctx, dest)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
/* Check for the dest on the same page as the start of the TB. */
|
||||||
|
return ((ctx->tb->pc ^ dest) & TARGET_PAGE_MASK) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ExitStatus gen_bdirect(DisasContext *ctx, int ra, int32_t disp)
|
static ExitStatus gen_bdirect(DisasContext *ctx, int ra, int32_t disp)
|
||||||
@ -3431,6 +3444,7 @@ static inline void gen_intermediate_code_internal(AlphaCPU *cpu,
|
|||||||
CPUAlphaState *env = &cpu->env;
|
CPUAlphaState *env = &cpu->env;
|
||||||
DisasContext ctx, *ctxp = &ctx;
|
DisasContext ctx, *ctxp = &ctx;
|
||||||
target_ulong pc_start;
|
target_ulong pc_start;
|
||||||
|
target_ulong pc_mask;
|
||||||
uint32_t insn;
|
uint32_t insn;
|
||||||
uint16_t *gen_opc_end;
|
uint16_t *gen_opc_end;
|
||||||
CPUBreakpoint *bp;
|
CPUBreakpoint *bp;
|
||||||
@ -3460,8 +3474,15 @@ static inline void gen_intermediate_code_internal(AlphaCPU *cpu,
|
|||||||
|
|
||||||
num_insns = 0;
|
num_insns = 0;
|
||||||
max_insns = tb->cflags & CF_COUNT_MASK;
|
max_insns = tb->cflags & CF_COUNT_MASK;
|
||||||
if (max_insns == 0)
|
if (max_insns == 0) {
|
||||||
max_insns = CF_COUNT_MASK;
|
max_insns = CF_COUNT_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_superpage(&ctx, pc_start)) {
|
||||||
|
pc_mask = (1ULL << 41) - 1;
|
||||||
|
} else {
|
||||||
|
pc_mask = ~TARGET_PAGE_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
gen_tb_start();
|
gen_tb_start();
|
||||||
do {
|
do {
|
||||||
@ -3499,7 +3520,7 @@ static inline void gen_intermediate_code_internal(AlphaCPU *cpu,
|
|||||||
/* If we reach a page boundary, are single stepping,
|
/* If we reach a page boundary, are single stepping,
|
||||||
or exhaust instruction count, stop generation. */
|
or exhaust instruction count, stop generation. */
|
||||||
if (ret == NO_EXIT
|
if (ret == NO_EXIT
|
||||||
&& ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0
|
&& ((ctx.pc & pc_mask) == 0
|
||||||
|| tcg_ctx.gen_opc_ptr >= gen_opc_end
|
|| tcg_ctx.gen_opc_ptr >= gen_opc_end
|
||||||
|| num_insns >= max_insns
|
|| num_insns >= max_insns
|
||||||
|| singlestep
|
|| singlestep
|
||||||
|
Loading…
Reference in New Issue
Block a user