tcg/tci: Push const down through bytecode reading
Reviewed-by: Joelle van Dyne <j@getutm.app> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
f06176be76
commit
305daaedf6
60
tcg/tci.c
60
tcg/tci.c
|
@ -164,34 +164,34 @@ static uint64_t tci_uint64(uint32_t high, uint32_t low)
|
|||
#endif
|
||||
|
||||
/* Read constant (native size) from bytecode. */
|
||||
static tcg_target_ulong tci_read_i(uint8_t **tb_ptr)
|
||||
static tcg_target_ulong tci_read_i(const uint8_t **tb_ptr)
|
||||
{
|
||||
tcg_target_ulong value = *(tcg_target_ulong *)(*tb_ptr);
|
||||
tcg_target_ulong value = *(const tcg_target_ulong *)(*tb_ptr);
|
||||
*tb_ptr += sizeof(value);
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Read unsigned constant (32 bit) from bytecode. */
|
||||
static uint32_t tci_read_i32(uint8_t **tb_ptr)
|
||||
static uint32_t tci_read_i32(const uint8_t **tb_ptr)
|
||||
{
|
||||
uint32_t value = *(uint32_t *)(*tb_ptr);
|
||||
uint32_t value = *(const uint32_t *)(*tb_ptr);
|
||||
*tb_ptr += sizeof(value);
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Read signed constant (32 bit) from bytecode. */
|
||||
static int32_t tci_read_s32(uint8_t **tb_ptr)
|
||||
static int32_t tci_read_s32(const uint8_t **tb_ptr)
|
||||
{
|
||||
int32_t value = *(int32_t *)(*tb_ptr);
|
||||
int32_t value = *(const int32_t *)(*tb_ptr);
|
||||
*tb_ptr += sizeof(value);
|
||||
return value;
|
||||
}
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 64
|
||||
/* Read constant (64 bit) from bytecode. */
|
||||
static uint64_t tci_read_i64(uint8_t **tb_ptr)
|
||||
static uint64_t tci_read_i64(const uint8_t **tb_ptr)
|
||||
{
|
||||
uint64_t value = *(uint64_t *)(*tb_ptr);
|
||||
uint64_t value = *(const uint64_t *)(*tb_ptr);
|
||||
*tb_ptr += sizeof(value);
|
||||
return value;
|
||||
}
|
||||
|
@ -199,7 +199,7 @@ static uint64_t tci_read_i64(uint8_t **tb_ptr)
|
|||
|
||||
/* Read indexed register (native size) from bytecode. */
|
||||
static tcg_target_ulong
|
||||
tci_read_r(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
tci_read_r(const tcg_target_ulong *regs, const uint8_t **tb_ptr)
|
||||
{
|
||||
tcg_target_ulong value = tci_read_reg(regs, **tb_ptr);
|
||||
*tb_ptr += 1;
|
||||
|
@ -207,7 +207,7 @@ tci_read_r(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
}
|
||||
|
||||
/* Read indexed register (8 bit) from bytecode. */
|
||||
static uint8_t tci_read_r8(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
static uint8_t tci_read_r8(const tcg_target_ulong *regs, const uint8_t **tb_ptr)
|
||||
{
|
||||
uint8_t value = tci_read_reg8(regs, **tb_ptr);
|
||||
*tb_ptr += 1;
|
||||
|
@ -216,7 +216,7 @@ static uint8_t tci_read_r8(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
|
||||
#if TCG_TARGET_HAS_ext8s_i32 || TCG_TARGET_HAS_ext8s_i64
|
||||
/* Read indexed register (8 bit signed) from bytecode. */
|
||||
static int8_t tci_read_r8s(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
static int8_t tci_read_r8s(const tcg_target_ulong *regs, const uint8_t **tb_ptr)
|
||||
{
|
||||
int8_t value = tci_read_reg8s(regs, **tb_ptr);
|
||||
*tb_ptr += 1;
|
||||
|
@ -225,7 +225,8 @@ static int8_t tci_read_r8s(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
#endif
|
||||
|
||||
/* Read indexed register (16 bit) from bytecode. */
|
||||
static uint16_t tci_read_r16(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
static uint16_t tci_read_r16(const tcg_target_ulong *regs,
|
||||
const uint8_t **tb_ptr)
|
||||
{
|
||||
uint16_t value = tci_read_reg16(regs, **tb_ptr);
|
||||
*tb_ptr += 1;
|
||||
|
@ -234,7 +235,8 @@ static uint16_t tci_read_r16(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
|
||||
#if TCG_TARGET_HAS_ext16s_i32 || TCG_TARGET_HAS_ext16s_i64
|
||||
/* Read indexed register (16 bit signed) from bytecode. */
|
||||
static int16_t tci_read_r16s(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
static int16_t tci_read_r16s(const tcg_target_ulong *regs,
|
||||
const uint8_t **tb_ptr)
|
||||
{
|
||||
int16_t value = tci_read_reg16s(regs, **tb_ptr);
|
||||
*tb_ptr += 1;
|
||||
|
@ -243,7 +245,8 @@ static int16_t tci_read_r16s(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
#endif
|
||||
|
||||
/* Read indexed register (32 bit) from bytecode. */
|
||||
static uint32_t tci_read_r32(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
static uint32_t tci_read_r32(const tcg_target_ulong *regs,
|
||||
const uint8_t **tb_ptr)
|
||||
{
|
||||
uint32_t value = tci_read_reg32(regs, **tb_ptr);
|
||||
*tb_ptr += 1;
|
||||
|
@ -252,14 +255,16 @@ static uint32_t tci_read_r32(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
/* Read two indexed registers (2 * 32 bit) from bytecode. */
|
||||
static uint64_t tci_read_r64(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
static uint64_t tci_read_r64(const tcg_target_ulong *regs,
|
||||
const uint8_t **tb_ptr)
|
||||
{
|
||||
uint32_t low = tci_read_r32(regs, tb_ptr);
|
||||
return tci_uint64(tci_read_r32(regs, tb_ptr), low);
|
||||
}
|
||||
#elif TCG_TARGET_REG_BITS == 64
|
||||
/* Read indexed register (32 bit signed) from bytecode. */
|
||||
static int32_t tci_read_r32s(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
static int32_t tci_read_r32s(const tcg_target_ulong *regs,
|
||||
const uint8_t **tb_ptr)
|
||||
{
|
||||
int32_t value = tci_read_reg32s(regs, **tb_ptr);
|
||||
*tb_ptr += 1;
|
||||
|
@ -267,7 +272,8 @@ static int32_t tci_read_r32s(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
}
|
||||
|
||||
/* Read indexed register (64 bit) from bytecode. */
|
||||
static uint64_t tci_read_r64(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
static uint64_t tci_read_r64(const tcg_target_ulong *regs,
|
||||
const uint8_t **tb_ptr)
|
||||
{
|
||||
uint64_t value = tci_read_reg64(regs, **tb_ptr);
|
||||
*tb_ptr += 1;
|
||||
|
@ -277,7 +283,7 @@ static uint64_t tci_read_r64(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
|
||||
/* Read indexed register(s) with target address from bytecode. */
|
||||
static target_ulong
|
||||
tci_read_ulong(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
tci_read_ulong(const tcg_target_ulong *regs, const uint8_t **tb_ptr)
|
||||
{
|
||||
target_ulong taddr = tci_read_r(regs, tb_ptr);
|
||||
#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
|
||||
|
@ -288,7 +294,7 @@ tci_read_ulong(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
|
||||
/* Read indexed register or constant (native size) from bytecode. */
|
||||
static tcg_target_ulong
|
||||
tci_read_ri(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
tci_read_ri(const tcg_target_ulong *regs, const uint8_t **tb_ptr)
|
||||
{
|
||||
tcg_target_ulong value;
|
||||
TCGReg r = **tb_ptr;
|
||||
|
@ -302,7 +308,8 @@ tci_read_ri(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
}
|
||||
|
||||
/* Read indexed register or constant (32 bit) from bytecode. */
|
||||
static uint32_t tci_read_ri32(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
static uint32_t tci_read_ri32(const tcg_target_ulong *regs,
|
||||
const uint8_t **tb_ptr)
|
||||
{
|
||||
uint32_t value;
|
||||
TCGReg r = **tb_ptr;
|
||||
|
@ -317,14 +324,16 @@ static uint32_t tci_read_ri32(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
/* Read two indexed registers or constants (2 * 32 bit) from bytecode. */
|
||||
static uint64_t tci_read_ri64(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
static uint64_t tci_read_ri64(const tcg_target_ulong *regs,
|
||||
const uint8_t **tb_ptr)
|
||||
{
|
||||
uint32_t low = tci_read_ri32(regs, tb_ptr);
|
||||
return tci_uint64(tci_read_ri32(regs, tb_ptr), low);
|
||||
}
|
||||
#elif TCG_TARGET_REG_BITS == 64
|
||||
/* Read indexed register or constant (64 bit) from bytecode. */
|
||||
static uint64_t tci_read_ri64(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
||||
static uint64_t tci_read_ri64(const tcg_target_ulong *regs,
|
||||
const uint8_t **tb_ptr)
|
||||
{
|
||||
uint64_t value;
|
||||
TCGReg r = **tb_ptr;
|
||||
|
@ -338,7 +347,7 @@ static uint64_t tci_read_ri64(const tcg_target_ulong *regs, uint8_t **tb_ptr)
|
|||
}
|
||||
#endif
|
||||
|
||||
static tcg_target_ulong tci_read_label(uint8_t **tb_ptr)
|
||||
static tcg_target_ulong tci_read_label(const uint8_t **tb_ptr)
|
||||
{
|
||||
tcg_target_ulong label = tci_read_i(tb_ptr);
|
||||
tci_assert(label != 0);
|
||||
|
@ -484,8 +493,7 @@ static bool tci_compare64(uint64_t u0, uint64_t u1, TCGCond condition)
|
|||
uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
|
||||
const void *v_tb_ptr)
|
||||
{
|
||||
/* TODO: Propagate const through this file. */
|
||||
uint8_t *tb_ptr = (uint8_t *)v_tb_ptr;
|
||||
const uint8_t *tb_ptr = v_tb_ptr;
|
||||
tcg_target_ulong regs[TCG_TARGET_NB_REGS];
|
||||
long tcg_temps[CPU_TEMP_BUF_NLONGS];
|
||||
uintptr_t sp_value = (uintptr_t)(tcg_temps + CPU_TEMP_BUF_NLONGS);
|
||||
|
@ -499,7 +507,7 @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
|
|||
TCGOpcode opc = tb_ptr[0];
|
||||
#if defined(CONFIG_DEBUG_TCG) && !defined(NDEBUG)
|
||||
uint8_t op_size = tb_ptr[1];
|
||||
uint8_t *old_code_ptr = tb_ptr;
|
||||
const uint8_t *old_code_ptr = tb_ptr;
|
||||
#endif
|
||||
tcg_target_ulong t0;
|
||||
tcg_target_ulong t1;
|
||||
|
|
Loading…
Reference in New Issue