mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-02-02 06:11:00 +00:00
tcg: Add tcg_out_dupm_vec to the backend interface
Currently stubbed out in all backends that support vectors. Backports commit d6ecb4a978b718dbe108a9fa9ecccc8b7f7cb579 from qemu
This commit is contained in:
parent
cf238d3544
commit
d4e7c6a8c5
|
@ -819,6 +819,12 @@ static bool tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece,
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool tcg_out_dupm_vec(TCGContext *s, TCGType type, unsigned vece,
|
||||
TCGReg r, TCGReg base, intptr_t offset)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
|
||||
tcg_target_long value)
|
||||
{
|
||||
|
|
|
@ -930,6 +930,13 @@ static void tcg_out_dupi_vec(TCGContext *s, TCGType type,
|
|||
}
|
||||
}
|
||||
|
||||
static bool tcg_out_dupm_vec(TCGContext *s, TCGType type, unsigned vece,
|
||||
TCGReg r, TCGReg base, intptr_t offset)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
static void tcg_out_movi(TCGContext *s, TCGType type,
|
||||
TCGReg ret, tcg_target_long arg)
|
||||
{
|
||||
|
|
|
@ -102,6 +102,8 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
|
|||
#if TCG_TARGET_MAYBE_vec
|
||||
static bool tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece,
|
||||
TCGReg dst, TCGReg src);
|
||||
static bool tcg_out_dupm_vec(TCGContext *s, TCGType type, unsigned vece,
|
||||
TCGReg dst, TCGReg base, intptr_t offset);
|
||||
static void tcg_out_dupi_vec(TCGContext *s, TCGType type,
|
||||
TCGReg dst, tcg_target_long arg);
|
||||
static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc, unsigned vecl,
|
||||
|
@ -113,6 +115,11 @@ static inline bool tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece,
|
|||
{
|
||||
g_assert_not_reached();
|
||||
}
|
||||
static inline bool tcg_out_dupm_vec(TCGContext *s, TCGType type, unsigned vece,
|
||||
TCGReg dst, TCGReg base, intptr_t offset)
|
||||
{
|
||||
g_assert_not_reached();
|
||||
}
|
||||
static inline void tcg_out_dupi_vec(TCGContext *s, TCGType type,
|
||||
TCGReg dst, tcg_target_long arg)
|
||||
{
|
||||
|
@ -2900,6 +2907,7 @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
|
|||
TCGRegSet dup_out_regs, dup_in_regs;
|
||||
TCGTemp *its, *ots;
|
||||
TCGType itype, vtype;
|
||||
intptr_t endian_fixup;
|
||||
unsigned vece;
|
||||
bool ok;
|
||||
|
||||
|
@ -2969,7 +2977,16 @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
|
|||
/* fall through */
|
||||
|
||||
case TEMP_VAL_MEM:
|
||||
/* TODO: dup from memory */
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
endian_fixup = itype == TCG_TYPE_I32 ? 4 : 8;
|
||||
endian_fixup -= 1 << vece;
|
||||
#else
|
||||
endian_fixup = 0;
|
||||
#endif
|
||||
if (tcg_out_dupm_vec(s, vtype, vece, ots->reg, its->mem_base->reg,
|
||||
its->mem_offset + endian_fixup)) {
|
||||
goto done;
|
||||
}
|
||||
tcg_out_ld(s, itype, ots->reg, its->mem_base->reg, its->mem_offset);
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in a new issue