mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-20 18:31:11 +00:00
tcg/sparc: Split out target constraints to tcg-target-con-str.h
Backports 77f268e80b40f005e984b0818d9e01862e72f393
This commit is contained in:
parent
a10afe6cff
commit
af77ca2679
23
qemu/tcg/sparc/tcg-target-con-str.h
Normal file
23
qemu/tcg/sparc/tcg-target-con-str.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/* SPDX-License-Identifier: MIT */
|
||||||
|
/*
|
||||||
|
* Define Sparc target-specific operand constraints.
|
||||||
|
* Copyright (c) 2021 Linaro
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define constraint letters for register sets:
|
||||||
|
* REGS(letter, register_mask)
|
||||||
|
*/
|
||||||
|
REGS('r', ALL_GENERAL_REGS)
|
||||||
|
REGS('R', ALL_GENERAL_REGS64)
|
||||||
|
REGS('s', ALL_QLDST_REGS)
|
||||||
|
REGS('S', ALL_QLDST_REGS64)
|
||||||
|
REGS('A', TARGET_LONG_BITS == 64 ? ALL_QLDST_REGS64 : ALL_QLDST_REGS)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define constraint letters for constants:
|
||||||
|
* CONST(letter, TCG_CT_CONST_* bit set)
|
||||||
|
*/
|
||||||
|
CONST('I', TCG_CT_CONST_S11)
|
||||||
|
CONST('J', TCG_CT_CONST_S13)
|
||||||
|
CONST('Z', TCG_CT_CONST_ZERO)
|
|
@ -66,10 +66,6 @@ typedef enum {
|
||||||
TCG_REG_I7,
|
TCG_REG_I7,
|
||||||
} TCGReg;
|
} TCGReg;
|
||||||
|
|
||||||
#define TCG_CT_CONST_S11 0x100
|
|
||||||
#define TCG_CT_CONST_S13 0x200
|
|
||||||
#define TCG_CT_CONST_ZERO 0x400
|
|
||||||
|
|
||||||
/* used for function call generation */
|
/* used for function call generation */
|
||||||
#define TCG_REG_CALL_STACK TCG_REG_O6
|
#define TCG_REG_CALL_STACK TCG_REG_O6
|
||||||
|
|
||||||
|
@ -188,5 +184,6 @@ static inline void flush_icache_range(uintptr_t start, uintptr_t stop)
|
||||||
void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t);
|
void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t);
|
||||||
|
|
||||||
#define TCG_TARGET_NEED_POOL_LABELS
|
#define TCG_TARGET_NEED_POOL_LABELS
|
||||||
|
#define TCG_TARGET_CON_STR_H
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -67,18 +67,38 @@ static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
|
||||||
# define SPARC64 0
|
# define SPARC64 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Note that sparcv8plus can only hold 64 bit quantities in %g and %o
|
#define TCG_CT_CONST_S11 0x100
|
||||||
registers. These are saved manually by the kernel in full 64-bit
|
#define TCG_CT_CONST_S13 0x200
|
||||||
slots. The %i and %l registers are saved by the register window
|
#define TCG_CT_CONST_ZERO 0x400
|
||||||
mechanism, which only allocates space for 32 bits. Given that this
|
|
||||||
window spill/fill can happen on any signal, we must consider the
|
/*
|
||||||
high bits of the %i and %l registers garbage at all times. */
|
* For softmmu, we need to avoid conflicts with the first 3
|
||||||
#if SPARC64
|
* argument registers to perform the tlb lookup, and to call
|
||||||
# define ALL_64 0xffffffffu
|
* the helper function.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_SOFTMMU
|
||||||
|
#define SOFTMMU_RESERVE_REGS MAKE_64BIT_MASK(TCG_REG_O0, 3)
|
||||||
#else
|
#else
|
||||||
# define ALL_64 0xffffu
|
#define SOFTMMU_RESERVE_REGS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that sparcv8plus can only hold 64 bit quantities in %g and %o
|
||||||
|
* registers. These are saved manually by the kernel in full 64-bit
|
||||||
|
* slots. The %i and %l registers are saved by the register window
|
||||||
|
* mechanism, which only allocates space for 32 bits. Given that this
|
||||||
|
* window spill/fill can happen on any signal, we must consider the
|
||||||
|
* high bits of the %i and %l registers garbage at all times.
|
||||||
|
*/
|
||||||
|
#define ALL_GENERAL_REGS MAKE_64BIT_MASK(0, 32)
|
||||||
|
#if SPARC64
|
||||||
|
# define ALL_GENERAL_REGS64 ALL_GENERAL_REGS
|
||||||
|
#else
|
||||||
|
# define ALL_GENERAL_REGS64 MAKE_64BIT_MASK(0, 16)
|
||||||
|
#endif
|
||||||
|
#define ALL_QLDST_REGS (ALL_GENERAL_REGS & ~SOFTMMU_RESERVE_REGS)
|
||||||
|
#define ALL_QLDST_REGS64 (ALL_GENERAL_REGS64 & ~SOFTMMU_RESERVE_REGS)
|
||||||
|
|
||||||
/* Define some temporary registers. T2 is used for constant generation. */
|
/* Define some temporary registers. T2 is used for constant generation. */
|
||||||
#define TCG_REG_T1 TCG_REG_G1
|
#define TCG_REG_T1 TCG_REG_G1
|
||||||
#define TCG_REG_T2 TCG_REG_O7
|
#define TCG_REG_T2 TCG_REG_O7
|
||||||
|
@ -322,45 +342,6 @@ static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse target specific constraints */
|
|
||||||
static const char *target_parse_constraint(TCGArgConstraint *ct,
|
|
||||||
const char *ct_str, TCGType type)
|
|
||||||
{
|
|
||||||
switch (*ct_str++) {
|
|
||||||
case 'r':
|
|
||||||
ct->regs = 0xffffffff;
|
|
||||||
break;
|
|
||||||
case 'R':
|
|
||||||
ct->regs = ALL_64;
|
|
||||||
break;
|
|
||||||
case 'A': /* qemu_ld/st address constraint */
|
|
||||||
ct->regs = TARGET_LONG_BITS == 64 ? ALL_64 : 0xffffffff;
|
|
||||||
reserve_helpers:
|
|
||||||
tcg_regset_reset_reg(ct->regs, TCG_REG_O0);
|
|
||||||
tcg_regset_reset_reg(ct->regs, TCG_REG_O1);
|
|
||||||
tcg_regset_reset_reg(ct->regs, TCG_REG_O2);
|
|
||||||
break;
|
|
||||||
case 's': /* qemu_st data 32-bit constraint */
|
|
||||||
ct->regs = 0xffffffff;
|
|
||||||
goto reserve_helpers;
|
|
||||||
case 'S': /* qemu_st data 64-bit constraint */
|
|
||||||
ct->regs = ALL_64;
|
|
||||||
goto reserve_helpers;
|
|
||||||
case 'I':
|
|
||||||
ct->ct |= TCG_CT_CONST_S11;
|
|
||||||
break;
|
|
||||||
case 'J':
|
|
||||||
ct->ct |= TCG_CT_CONST_S13;
|
|
||||||
break;
|
|
||||||
case 'Z':
|
|
||||||
ct->ct |= TCG_CT_CONST_ZERO;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return ct_str;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* test if a constant matches the constraint */
|
/* test if a constant matches the constraint */
|
||||||
static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
|
static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||||
const TCGArgConstraint *arg_ct)
|
const TCGArgConstraint *arg_ct)
|
||||||
|
@ -1743,8 +1724,8 @@ static void tcg_target_init(TCGContext *s)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
s->tcg_target_available_regs[TCG_TYPE_I32] = 0xffffffff;
|
s->tcg_target_available_regs[TCG_TYPE_I32] = ALL_GENERAL_REGS;
|
||||||
s->tcg_target_available_regs[TCG_TYPE_I64] = ALL_64;
|
s->tcg_target_available_regs[TCG_TYPE_I64] = ALL_GENERAL_REGS64;
|
||||||
|
|
||||||
s->tcg_target_call_clobber_regs = 0;
|
s->tcg_target_call_clobber_regs = 0;
|
||||||
tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_G1);
|
tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_G1);
|
||||||
|
|
Loading…
Reference in a new issue