tcg/ppc: Split out target constraints to tcg-target-con-str.h
Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
abc730e18e
commit
85d251d7ec
30
tcg/ppc/tcg-target-con-str.h
Normal file
30
tcg/ppc/tcg-target-con-str.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/* SPDX-License-Identifier: MIT */
|
||||||
|
/*
|
||||||
|
* Define PowerPC target-specific operand constraints.
|
||||||
|
* Copyright (c) 2021 Linaro
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define constraint letters for register sets:
|
||||||
|
* REGS(letter, register_mask)
|
||||||
|
*/
|
||||||
|
REGS('r', ALL_GENERAL_REGS)
|
||||||
|
REGS('v', ALL_VECTOR_REGS)
|
||||||
|
REGS('A', 1u << TCG_REG_R3)
|
||||||
|
REGS('B', 1u << TCG_REG_R4)
|
||||||
|
REGS('C', 1u << TCG_REG_R5)
|
||||||
|
REGS('D', 1u << TCG_REG_R6)
|
||||||
|
REGS('L', ALL_QLOAD_REGS)
|
||||||
|
REGS('S', ALL_QSTORE_REGS)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define constraint letters for constants:
|
||||||
|
* CONST(letter, TCG_CT_CONST_* bit set)
|
||||||
|
*/
|
||||||
|
CONST('I', TCG_CT_CONST_S16)
|
||||||
|
CONST('J', TCG_CT_CONST_U16)
|
||||||
|
CONST('M', TCG_CT_CONST_MONE)
|
||||||
|
CONST('T', TCG_CT_CONST_S32)
|
||||||
|
CONST('U', TCG_CT_CONST_U32)
|
||||||
|
CONST('W', TCG_CT_CONST_WSZ)
|
||||||
|
CONST('Z', TCG_CT_CONST_ZERO)
|
@ -62,6 +62,21 @@
|
|||||||
#define TCG_CT_CONST_MONE 0x2000
|
#define TCG_CT_CONST_MONE 0x2000
|
||||||
#define TCG_CT_CONST_WSZ 0x4000
|
#define TCG_CT_CONST_WSZ 0x4000
|
||||||
|
|
||||||
|
#define ALL_GENERAL_REGS 0xffffffffu
|
||||||
|
#define ALL_VECTOR_REGS 0xffffffff00000000ull
|
||||||
|
|
||||||
|
#ifdef CONFIG_SOFTMMU
|
||||||
|
#define ALL_QLOAD_REGS \
|
||||||
|
(ALL_GENERAL_REGS & \
|
||||||
|
~((1 << TCG_REG_R3) | (1 << TCG_REG_R4) | (1 << TCG_REG_R5)))
|
||||||
|
#define ALL_QSTORE_REGS \
|
||||||
|
(ALL_GENERAL_REGS & ~((1 << TCG_REG_R3) | (1 << TCG_REG_R4) | \
|
||||||
|
(1 << TCG_REG_R5) | (1 << TCG_REG_R6)))
|
||||||
|
#else
|
||||||
|
#define ALL_QLOAD_REGS (ALL_GENERAL_REGS & ~(1 << TCG_REG_R3))
|
||||||
|
#define ALL_QSTORE_REGS ALL_QLOAD_REGS
|
||||||
|
#endif
|
||||||
|
|
||||||
TCGPowerISA have_isa;
|
TCGPowerISA have_isa;
|
||||||
static bool have_isel;
|
static bool have_isel;
|
||||||
bool have_altivec;
|
bool have_altivec;
|
||||||
@ -222,64 +237,6 @@ static bool reloc_pc14(tcg_insn_unit *src_rw, const tcg_insn_unit *target)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse target specific constraints */
|
|
||||||
static const char *target_parse_constraint(TCGArgConstraint *ct,
|
|
||||||
const char *ct_str, TCGType type)
|
|
||||||
{
|
|
||||||
switch (*ct_str++) {
|
|
||||||
case 'A': case 'B': case 'C': case 'D':
|
|
||||||
tcg_regset_set_reg(ct->regs, 3 + ct_str[0] - 'A');
|
|
||||||
break;
|
|
||||||
case 'r':
|
|
||||||
ct->regs = 0xffffffff;
|
|
||||||
break;
|
|
||||||
case 'v':
|
|
||||||
ct->regs = 0xffffffff00000000ull;
|
|
||||||
break;
|
|
||||||
case 'L': /* qemu_ld constraint */
|
|
||||||
ct->regs = 0xffffffff;
|
|
||||||
tcg_regset_reset_reg(ct->regs, TCG_REG_R3);
|
|
||||||
#ifdef CONFIG_SOFTMMU
|
|
||||||
tcg_regset_reset_reg(ct->regs, TCG_REG_R4);
|
|
||||||
tcg_regset_reset_reg(ct->regs, TCG_REG_R5);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case 'S': /* qemu_st constraint */
|
|
||||||
ct->regs = 0xffffffff;
|
|
||||||
tcg_regset_reset_reg(ct->regs, TCG_REG_R3);
|
|
||||||
#ifdef CONFIG_SOFTMMU
|
|
||||||
tcg_regset_reset_reg(ct->regs, TCG_REG_R4);
|
|
||||||
tcg_regset_reset_reg(ct->regs, TCG_REG_R5);
|
|
||||||
tcg_regset_reset_reg(ct->regs, TCG_REG_R6);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case 'I':
|
|
||||||
ct->ct |= TCG_CT_CONST_S16;
|
|
||||||
break;
|
|
||||||
case 'J':
|
|
||||||
ct->ct |= TCG_CT_CONST_U16;
|
|
||||||
break;
|
|
||||||
case 'M':
|
|
||||||
ct->ct |= TCG_CT_CONST_MONE;
|
|
||||||
break;
|
|
||||||
case 'T':
|
|
||||||
ct->ct |= TCG_CT_CONST_S32;
|
|
||||||
break;
|
|
||||||
case 'U':
|
|
||||||
ct->ct |= TCG_CT_CONST_U32;
|
|
||||||
break;
|
|
||||||
case 'W':
|
|
||||||
ct->ct |= TCG_CT_CONST_WSZ;
|
|
||||||
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 int tcg_target_const_match(tcg_target_long val, TCGType type,
|
static int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||||
const TCGArgConstraint *arg_ct)
|
const TCGArgConstraint *arg_ct)
|
||||||
|
@ -185,5 +185,6 @@ void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t, uintptr_t);
|
|||||||
#define TCG_TARGET_NEED_LDST_LABELS
|
#define TCG_TARGET_NEED_LDST_LABELS
|
||||||
#endif
|
#endif
|
||||||
#define TCG_TARGET_NEED_POOL_LABELS
|
#define TCG_TARGET_NEED_POOL_LABELS
|
||||||
|
#define TCG_TARGET_CON_STR_H
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user