tcg: Add TCGHelperInfo argument to tcg_out_call
This eliminates an ifdef for TCI, and will be required for expanding the call for TCGv_i128. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
fa3cb9f9ff
commit
cee44b037b
@ -1336,7 +1336,7 @@ static void tcg_out_goto_long(TCGContext *s, const tcg_insn_unit *target)
|
||||
}
|
||||
}
|
||||
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *target)
|
||||
static void tcg_out_call_int(TCGContext *s, const tcg_insn_unit *target)
|
||||
{
|
||||
ptrdiff_t offset = tcg_pcrel_diff(s, target) >> 2;
|
||||
if (offset == sextract64(offset, 0, 26)) {
|
||||
@ -1347,6 +1347,12 @@ static void tcg_out_call(TCGContext *s, const tcg_insn_unit *target)
|
||||
}
|
||||
}
|
||||
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *target,
|
||||
const TCGHelperInfo *info)
|
||||
{
|
||||
tcg_out_call_int(s, target);
|
||||
}
|
||||
|
||||
void tb_target_set_jmp_target(uintptr_t tc_ptr, uintptr_t jmp_rx,
|
||||
uintptr_t jmp_rw, uintptr_t addr)
|
||||
{
|
||||
@ -1594,7 +1600,7 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||
tcg_out_mov(s, TARGET_LONG_BITS == 64, TCG_REG_X1, lb->addrlo_reg);
|
||||
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X2, oi);
|
||||
tcg_out_adr(s, TCG_REG_X3, lb->raddr);
|
||||
tcg_out_call(s, qemu_ld_helpers[opc & MO_SIZE]);
|
||||
tcg_out_call_int(s, qemu_ld_helpers[opc & MO_SIZE]);
|
||||
if (opc & MO_SIGN) {
|
||||
tcg_out_sxt(s, lb->type, size, lb->datalo_reg, TCG_REG_X0);
|
||||
} else {
|
||||
@ -1620,7 +1626,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||
tcg_out_mov(s, size == MO_64, TCG_REG_X2, lb->datalo_reg);
|
||||
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X3, oi);
|
||||
tcg_out_adr(s, TCG_REG_X4, lb->raddr);
|
||||
tcg_out_call(s, qemu_st_helpers[opc & MO_SIZE]);
|
||||
tcg_out_call_int(s, qemu_st_helpers[opc & MO_SIZE]);
|
||||
tcg_out_goto(s, lb->raddr);
|
||||
return true;
|
||||
}
|
||||
|
@ -1131,7 +1131,7 @@ static void tcg_out_goto(TCGContext *s, ARMCond cond, const tcg_insn_unit *addr)
|
||||
* The call case is mostly used for helpers - so it's not unreasonable
|
||||
* for them to be beyond branch range.
|
||||
*/
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *addr)
|
||||
static void tcg_out_call_int(TCGContext *s, const tcg_insn_unit *addr)
|
||||
{
|
||||
intptr_t addri = (intptr_t)addr;
|
||||
ptrdiff_t disp = tcg_pcrel_diff(s, addr);
|
||||
@ -1150,6 +1150,12 @@ static void tcg_out_call(TCGContext *s, const tcg_insn_unit *addr)
|
||||
tcg_out_blx_reg(s, COND_AL, TCG_REG_TMP);
|
||||
}
|
||||
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *addr,
|
||||
const TCGHelperInfo *info)
|
||||
{
|
||||
tcg_out_call_int(s, addr);
|
||||
}
|
||||
|
||||
static void tcg_out_goto_label(TCGContext *s, ARMCond cond, TCGLabel *l)
|
||||
{
|
||||
if (l->has_value) {
|
||||
@ -1515,7 +1521,7 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||
argreg = tcg_out_arg_reg32(s, argreg, TCG_REG_R14);
|
||||
|
||||
/* Use the canonical unsigned helpers and minimize icache usage. */
|
||||
tcg_out_call(s, qemu_ld_helpers[opc & MO_SIZE]);
|
||||
tcg_out_call_int(s, qemu_ld_helpers[opc & MO_SIZE]);
|
||||
|
||||
datalo = lb->datalo_reg;
|
||||
datahi = lb->datahi_reg;
|
||||
|
@ -1661,7 +1661,8 @@ static void tcg_out_branch(TCGContext *s, int call, const tcg_insn_unit *dest)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void tcg_out_call(TCGContext *s, const tcg_insn_unit *dest)
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *dest,
|
||||
const TCGHelperInfo *info)
|
||||
{
|
||||
tcg_out_branch(s, 1, dest);
|
||||
}
|
||||
@ -1885,7 +1886,7 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
|
||||
(uintptr_t)l->raddr);
|
||||
}
|
||||
|
||||
tcg_out_call(s, qemu_ld_helpers[opc & (MO_BSWAP | MO_SIZE)]);
|
||||
tcg_out_branch(s, 1, qemu_ld_helpers[opc & (MO_BSWAP | MO_SIZE)]);
|
||||
|
||||
data_reg = l->datalo_reg;
|
||||
switch (opc & MO_SSIZE) {
|
||||
|
@ -567,7 +567,8 @@ static void tcg_out_call_int(TCGContext *s, const tcg_insn_unit *arg, bool tail)
|
||||
}
|
||||
}
|
||||
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *arg)
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *arg,
|
||||
const TCGHelperInfo *info)
|
||||
{
|
||||
tcg_out_call_int(s, arg, false);
|
||||
}
|
||||
@ -760,7 +761,7 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
|
||||
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_A2, oi);
|
||||
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_A3, (tcg_target_long)l->raddr);
|
||||
|
||||
tcg_out_call(s, qemu_ld_helpers[size]);
|
||||
tcg_out_call_int(s, qemu_ld_helpers[size], false);
|
||||
|
||||
switch (opc & MO_SSIZE) {
|
||||
case MO_SB:
|
||||
@ -821,7 +822,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
|
||||
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_A3, oi);
|
||||
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_A4, (tcg_target_long)l->raddr);
|
||||
|
||||
tcg_out_call(s, qemu_st_helpers[size]);
|
||||
tcg_out_call_int(s, qemu_st_helpers[size], false);
|
||||
|
||||
return tcg_out_goto(s, l->raddr);
|
||||
}
|
||||
|
@ -1020,7 +1020,8 @@ static void tcg_out_call_int(TCGContext *s, const tcg_insn_unit *arg, bool tail)
|
||||
}
|
||||
}
|
||||
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *arg)
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *arg,
|
||||
const TCGHelperInfo *info)
|
||||
{
|
||||
tcg_out_call_int(s, arg, false);
|
||||
tcg_out_nop(s);
|
||||
|
@ -2002,7 +2002,8 @@ static void tcg_out_call_int(TCGContext *s, int lk,
|
||||
#endif
|
||||
}
|
||||
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *target)
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *target,
|
||||
const TCGHelperInfo *info)
|
||||
{
|
||||
tcg_out_call_int(s, LK, target);
|
||||
}
|
||||
@ -2221,7 +2222,7 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||
tcg_out_movi(s, TCG_TYPE_I32, arg++, oi);
|
||||
tcg_out32(s, MFSPR | RT(arg) | LR);
|
||||
|
||||
tcg_out_call(s, qemu_ld_helpers[opc & (MO_BSWAP | MO_SIZE)]);
|
||||
tcg_out_call_int(s, LK, qemu_ld_helpers[opc & (MO_BSWAP | MO_SIZE)]);
|
||||
|
||||
lo = lb->datalo_reg;
|
||||
hi = lb->datahi_reg;
|
||||
@ -2290,7 +2291,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||
tcg_out_movi(s, TCG_TYPE_I32, arg++, oi);
|
||||
tcg_out32(s, MFSPR | RT(arg) | LR);
|
||||
|
||||
tcg_out_call(s, qemu_st_helpers[opc & (MO_BSWAP | MO_SIZE)]);
|
||||
tcg_out_call_int(s, LK, qemu_st_helpers[opc & (MO_BSWAP | MO_SIZE)]);
|
||||
|
||||
tcg_out_b(s, 0, lb->raddr);
|
||||
return true;
|
||||
|
@ -819,7 +819,8 @@ static void tcg_out_call_int(TCGContext *s, const tcg_insn_unit *arg, bool tail)
|
||||
}
|
||||
}
|
||||
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *arg)
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *arg,
|
||||
const TCGHelperInfo *info)
|
||||
{
|
||||
tcg_out_call_int(s, arg, false);
|
||||
}
|
||||
@ -1002,7 +1003,7 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
|
||||
tcg_out_movi(s, TCG_TYPE_PTR, a2, oi);
|
||||
tcg_out_movi(s, TCG_TYPE_PTR, a3, (tcg_target_long)l->raddr);
|
||||
|
||||
tcg_out_call(s, qemu_ld_helpers[opc & MO_SSIZE]);
|
||||
tcg_out_call_int(s, qemu_ld_helpers[opc & MO_SSIZE], false);
|
||||
tcg_out_mov(s, (opc & MO_SIZE) == MO_64, l->datalo_reg, a0);
|
||||
|
||||
tcg_out_goto(s, l->raddr);
|
||||
@ -1047,7 +1048,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
|
||||
tcg_out_movi(s, TCG_TYPE_PTR, a3, oi);
|
||||
tcg_out_movi(s, TCG_TYPE_PTR, a4, (tcg_target_long)l->raddr);
|
||||
|
||||
tcg_out_call(s, qemu_st_helpers[opc & MO_SIZE]);
|
||||
tcg_out_call_int(s, qemu_st_helpers[opc & MO_SIZE], false);
|
||||
|
||||
tcg_out_goto(s, l->raddr);
|
||||
return true;
|
||||
|
@ -1691,7 +1691,7 @@ static void tgen_brcond(TCGContext *s, TCGType type, TCGCond c,
|
||||
tgen_branch(s, cc, l);
|
||||
}
|
||||
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *dest)
|
||||
static void tcg_out_call_int(TCGContext *s, const tcg_insn_unit *dest)
|
||||
{
|
||||
ptrdiff_t off = tcg_pcrel_diff(s, dest) >> 1;
|
||||
if (off == (int32_t)off) {
|
||||
@ -1702,6 +1702,12 @@ static void tcg_out_call(TCGContext *s, const tcg_insn_unit *dest)
|
||||
}
|
||||
}
|
||||
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *dest,
|
||||
const TCGHelperInfo *info)
|
||||
{
|
||||
tcg_out_call_int(s, dest);
|
||||
}
|
||||
|
||||
static void tcg_out_qemu_ld_direct(TCGContext *s, MemOp opc, TCGReg data,
|
||||
TCGReg base, TCGReg index, int disp)
|
||||
{
|
||||
@ -1897,7 +1903,7 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||
}
|
||||
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_R4, oi);
|
||||
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R5, (uintptr_t)lb->raddr);
|
||||
tcg_out_call(s, qemu_ld_helpers[opc & (MO_BSWAP | MO_SSIZE)]);
|
||||
tcg_out_call_int(s, qemu_ld_helpers[opc & (MO_BSWAP | MO_SSIZE)]);
|
||||
tcg_out_mov(s, TCG_TYPE_I64, data_reg, TCG_REG_R2);
|
||||
|
||||
tgen_gotoi(s, S390_CC_ALWAYS, lb->raddr);
|
||||
@ -1938,7 +1944,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||
}
|
||||
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_R5, oi);
|
||||
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R6, (uintptr_t)lb->raddr);
|
||||
tcg_out_call(s, qemu_st_helpers[opc & (MO_BSWAP | MO_SIZE)]);
|
||||
tcg_out_call_int(s, qemu_st_helpers[opc & (MO_BSWAP | MO_SIZE)]);
|
||||
|
||||
tgen_gotoi(s, S390_CC_ALWAYS, lb->raddr);
|
||||
return true;
|
||||
|
@ -859,7 +859,8 @@ static void tcg_out_call_nodelay(TCGContext *s, const tcg_insn_unit *dest,
|
||||
}
|
||||
}
|
||||
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *dest)
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *dest,
|
||||
const TCGHelperInfo *info)
|
||||
{
|
||||
tcg_out_call_nodelay(s, dest, false);
|
||||
tcg_out_nop(s);
|
||||
|
12
tcg/tcg.c
12
tcg/tcg.c
@ -145,12 +145,8 @@ static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, TCGReg arg1,
|
||||
intptr_t arg2);
|
||||
static bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val,
|
||||
TCGReg base, intptr_t ofs);
|
||||
#ifdef CONFIG_TCG_INTERPRETER
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *target,
|
||||
ffi_cif *cif);
|
||||
#else
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *target);
|
||||
#endif
|
||||
const TCGHelperInfo *info);
|
||||
static bool tcg_target_const_match(int64_t val, TCGType type, int ct);
|
||||
#ifdef TCG_TARGET_NEED_LDST_LABELS
|
||||
static int tcg_out_ldst_finalize(TCGContext *s);
|
||||
@ -4395,11 +4391,7 @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
|
||||
save_globals(s, allocated_regs);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TCG_INTERPRETER
|
||||
tcg_out_call(s, tcg_call_func(op), info->cif);
|
||||
#else
|
||||
tcg_out_call(s, tcg_call_func(op));
|
||||
#endif
|
||||
tcg_out_call(s, tcg_call_func(op), info);
|
||||
|
||||
/* Assign output registers and emit moves if needed. */
|
||||
switch (info->out_kind) {
|
||||
|
@ -558,8 +558,9 @@ static void tcg_out_movi(TCGContext *s, TCGType type,
|
||||
}
|
||||
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *func,
|
||||
ffi_cif *cif)
|
||||
const TCGHelperInfo *info)
|
||||
{
|
||||
ffi_cif *cif = info->cif;
|
||||
tcg_insn_unit insn = 0;
|
||||
uint8_t which;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user