tcg: Move TLB_FLAGS_MASK check out of get_alignment_bits
The replacement isn't ideal, as the raw count of bits is not easily synced with exec/cpu-all.h, but it does remove from tcg.h the target dependency on TARGET_PAGE_BITS_MIN which is built into TLB_FLAGS_MASK. Reviewed-by: Anton Johansson <anjo@rev.ng> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
28ea568a03
commit
3a80bde37b
@ -314,6 +314,9 @@ CPUArchState *cpu_copy(CPUArchState *env);
|
||||
*
|
||||
* Use TARGET_PAGE_BITS_MIN so that these bits are constant
|
||||
* when TARGET_PAGE_BITS_VARY is in effect.
|
||||
*
|
||||
* The count, if not the placement of these bits is known
|
||||
* to tcg/tcg-op-ldst.c, check_max_alignment().
|
||||
*/
|
||||
/* Zero if TLB entry is valid. */
|
||||
#define TLB_INVALID_MASK (1 << (TARGET_PAGE_BITS_MIN - 1))
|
||||
|
@ -305,10 +305,6 @@ static inline unsigned get_alignment_bits(MemOp memop)
|
||||
/* A specific alignment requirement. */
|
||||
a = a >> MO_ASHIFT;
|
||||
}
|
||||
#if defined(CONFIG_SOFTMMU)
|
||||
/* The requested alignment cannot overlap the TLB flags. */
|
||||
tcg_debug_assert((TLB_FLAGS_MASK & ((1 << a) - 1)) == 0);
|
||||
#endif
|
||||
return a;
|
||||
}
|
||||
|
||||
|
@ -32,11 +32,23 @@
|
||||
#include "tcg-internal.h"
|
||||
|
||||
|
||||
static inline MemOp tcg_canonicalize_memop(MemOp op, bool is64, bool st)
|
||||
static void check_max_alignment(unsigned a_bits)
|
||||
{
|
||||
#if defined(CONFIG_SOFTMMU)
|
||||
/*
|
||||
* The requested alignment cannot overlap the TLB flags.
|
||||
* FIXME: Must keep the count up-to-date with "exec/cpu-all.h".
|
||||
*/
|
||||
tcg_debug_assert(a_bits + 6 <= tcg_ctx->page_bits);
|
||||
#endif
|
||||
}
|
||||
|
||||
static MemOp tcg_canonicalize_memop(MemOp op, bool is64, bool st)
|
||||
{
|
||||
/* Trigger the asserts within as early as possible. */
|
||||
unsigned a_bits = get_alignment_bits(op);
|
||||
|
||||
check_max_alignment(a_bits);
|
||||
|
||||
/* Prefer MO_ALIGN+MO_XX over MO_ALIGN_XX+MO_XX */
|
||||
if (a_bits == (op & MO_SIZE)) {
|
||||
op = (op & ~MO_AMASK) | MO_ALIGN;
|
||||
@ -491,6 +503,7 @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr,
|
||||
TCGv_i64 ext_addr = NULL;
|
||||
TCGOpcode opc;
|
||||
|
||||
check_max_alignment(get_alignment_bits(memop));
|
||||
tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD);
|
||||
|
||||
/* TODO: For now, force 32-bit hosts to use the helper. */
|
||||
@ -599,6 +612,7 @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr,
|
||||
TCGv_i64 ext_addr = NULL;
|
||||
TCGOpcode opc;
|
||||
|
||||
check_max_alignment(get_alignment_bits(memop));
|
||||
tcg_gen_req_mo(TCG_MO_ST_LD | TCG_MO_ST_ST);
|
||||
|
||||
/* TODO: For now, force 32-bit hosts to use the helper. */
|
||||
|
Loading…
Reference in New Issue
Block a user