tcg/mips: Remove support for O32 and N32 ABIs
See previous commit for rationale. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20251009195210.33161-5-philmd@linaro.org>
This commit is contained in:
parent
4384542a57
commit
affedc6787
3 changed files with 9 additions and 60 deletions
|
|
@ -30,15 +30,9 @@
|
||||||
* arguments being syscall arguments (also 'long').
|
* arguments being syscall arguments (also 'long').
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if _MIPS_SIM == _ABIO32
|
|
||||||
/* 8 * 4 = 32 for outgoing parameters; 1 * 4 for s0 save; 1 * 4 for align. */
|
|
||||||
#define FRAME 40
|
|
||||||
#define OFS_S0 32
|
|
||||||
#else
|
|
||||||
/* 1 * 8 for s0 save; 1 * 8 for align. */
|
/* 1 * 8 for s0 save; 1 * 8 for align. */
|
||||||
#define FRAME 16
|
#define FRAME 16
|
||||||
#define OFS_S0 0
|
#define OFS_S0 0
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
NESTED(safe_syscall_base, FRAME, ra)
|
NESTED(safe_syscall_base, FRAME, ra)
|
||||||
|
|
@ -47,34 +41,6 @@ NESTED(safe_syscall_base, FRAME, ra)
|
||||||
.cfi_adjust_cfa_offset FRAME
|
.cfi_adjust_cfa_offset FRAME
|
||||||
REG_S s0, OFS_S0(sp)
|
REG_S s0, OFS_S0(sp)
|
||||||
.cfi_rel_offset s0, OFS_S0
|
.cfi_rel_offset s0, OFS_S0
|
||||||
#if _MIPS_SIM == _ABIO32
|
|
||||||
/*
|
|
||||||
* The syscall calling convention is nearly the same as C:
|
|
||||||
* we enter with a0 == &signal_pending
|
|
||||||
* a1 == syscall number
|
|
||||||
* a2, a3, stack == syscall arguments
|
|
||||||
* and return the result in a0
|
|
||||||
* and the syscall instruction needs
|
|
||||||
* v0 == syscall number
|
|
||||||
* a0 ... a3, stack == syscall arguments
|
|
||||||
* and returns the result in v0
|
|
||||||
* Shuffle everything around appropriately.
|
|
||||||
*/
|
|
||||||
move s0, a0 /* signal_pending pointer */
|
|
||||||
move v0, a1 /* syscall number */
|
|
||||||
move a0, a2 /* syscall arguments */
|
|
||||||
move a1, a3
|
|
||||||
lw a2, FRAME+16(sp)
|
|
||||||
lw a3, FRAME+20(sp)
|
|
||||||
lw t4, FRAME+24(sp)
|
|
||||||
lw t5, FRAME+28(sp)
|
|
||||||
lw t6, FRAME+32(sp)
|
|
||||||
lw t7, FRAME+40(sp)
|
|
||||||
sw t4, 16(sp)
|
|
||||||
sw t5, 20(sp)
|
|
||||||
sw t6, 24(sp)
|
|
||||||
sw t7, 28(sp)
|
|
||||||
#else
|
|
||||||
/*
|
/*
|
||||||
* The syscall calling convention is nearly the same as C:
|
* The syscall calling convention is nearly the same as C:
|
||||||
* we enter with a0 == &signal_pending
|
* we enter with a0 == &signal_pending
|
||||||
|
|
@ -95,7 +61,6 @@ NESTED(safe_syscall_base, FRAME, ra)
|
||||||
move a3, a5
|
move a3, a5
|
||||||
move a4, a6
|
move a4, a6
|
||||||
move a5, a7
|
move a5, a7
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This next sequence of code works in conjunction with the
|
* This next sequence of code works in conjunction with the
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,10 @@
|
||||||
#ifndef TCG_TARGET_REG_BITS_H
|
#ifndef TCG_TARGET_REG_BITS_H
|
||||||
#define TCG_TARGET_REG_BITS_H
|
#define TCG_TARGET_REG_BITS_H
|
||||||
|
|
||||||
#if _MIPS_SIM == _ABIO32
|
#if !defined(_MIPS_SIM) || _MIPS_SIM != _ABI64
|
||||||
# define TCG_TARGET_REG_BITS 32
|
|
||||||
#elif _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
|
|
||||||
# define TCG_TARGET_REG_BITS 64
|
|
||||||
#else
|
|
||||||
# error "Unknown ABI"
|
# error "Unknown ABI"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define TCG_TARGET_REG_BITS 64
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -26,16 +26,10 @@
|
||||||
|
|
||||||
/* used for function call generation */
|
/* used for function call generation */
|
||||||
#define TCG_TARGET_STACK_ALIGN 16
|
#define TCG_TARGET_STACK_ALIGN 16
|
||||||
#if _MIPS_SIM == _ABIO32
|
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
# define TCG_TARGET_CALL_STACK_OFFSET 16
|
|
||||||
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
|
||||||
# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
|
|
||||||
#else
|
|
||||||
# define TCG_TARGET_CALL_STACK_OFFSET 0
|
|
||||||
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
|
||||||
# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
|
||||||
#endif
|
|
||||||
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
||||||
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
||||||
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
|
||||||
|
|
||||||
#if TCG_TARGET_REG_BITS == 32
|
#if TCG_TARGET_REG_BITS == 32
|
||||||
|
|
@ -135,12 +129,10 @@ static const TCGReg tcg_target_call_iarg_regs[] = {
|
||||||
TCG_REG_A1,
|
TCG_REG_A1,
|
||||||
TCG_REG_A2,
|
TCG_REG_A2,
|
||||||
TCG_REG_A3,
|
TCG_REG_A3,
|
||||||
#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
|
|
||||||
TCG_REG_T0,
|
TCG_REG_T0,
|
||||||
TCG_REG_T1,
|
TCG_REG_T1,
|
||||||
TCG_REG_T2,
|
TCG_REG_T2,
|
||||||
TCG_REG_T3,
|
TCG_REG_T3,
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
|
static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
|
||||||
|
|
@ -1053,17 +1045,11 @@ static void tcg_out_call_int(TCGContext *s, const tcg_insn_unit *arg, bool tail)
|
||||||
* Note that __mips_abicalls requires the called function's address
|
* Note that __mips_abicalls requires the called function's address
|
||||||
* to be loaded into $25 (t9), even if a direct branch is in range.
|
* to be loaded into $25 (t9), even if a direct branch is in range.
|
||||||
*
|
*
|
||||||
* For n64, always drop the pointer into the constant pool.
|
* We can re-use helper addresses often; always drop the pointer
|
||||||
* We can re-use helper addresses often and do not want any
|
* into the constant pool.
|
||||||
* of the longer sequences tcg_out_movi may try.
|
|
||||||
*/
|
*/
|
||||||
if (sizeof(uintptr_t) == 8) {
|
|
||||||
tcg_out_movi_pool(s, TCG_REG_T9, (uintptr_t)arg, TCG_REG_TB);
|
tcg_out_movi_pool(s, TCG_REG_T9, (uintptr_t)arg, TCG_REG_TB);
|
||||||
} else {
|
|
||||||
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_T9, (uintptr_t)arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* But do try a direct branch, allowing the cpu better insn prefetch. */
|
|
||||||
if (tail) {
|
if (tail) {
|
||||||
if (!tcg_out_opc_jmp(s, OPC_J, arg)) {
|
if (!tcg_out_opc_jmp(s, OPC_J, arg)) {
|
||||||
tcg_out_opc_reg(s, OPC_JR, 0, TCG_REG_T9, 0);
|
tcg_out_opc_reg(s, OPC_JR, 0, TCG_REG_T9, 0);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue