mirror of https://github.com/xemu-project/xemu.git
tcg: Add TCG_CALL_RET_BY_VEC
This will be used by _WIN64 to return i128. Not yet used, because allocation is not yet enabled. Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
5e3d0c199f
commit
c6556aa0c8
|
@ -37,6 +37,7 @@
|
|||
typedef enum {
|
||||
TCG_CALL_RET_NORMAL, /* by registers */
|
||||
TCG_CALL_RET_BY_REF, /* for i128, by reference */
|
||||
TCG_CALL_RET_BY_VEC, /* for i128, by vector register */
|
||||
} TCGCallReturnKind;
|
||||
|
||||
typedef enum {
|
||||
|
|
19
tcg/tcg.c
19
tcg/tcg.c
|
@ -752,6 +752,10 @@ static void init_call_layout(TCGHelperInfo *info)
|
|||
/* Query the last register now to trigger any assert early. */
|
||||
tcg_target_call_oarg_reg(info->out_kind, info->nr_out - 1);
|
||||
break;
|
||||
case TCG_CALL_RET_BY_VEC:
|
||||
/* Query the single register now to trigger any assert early. */
|
||||
tcg_target_call_oarg_reg(TCG_CALL_RET_BY_VEC, 0);
|
||||
break;
|
||||
case TCG_CALL_RET_BY_REF:
|
||||
/*
|
||||
* Allocate the first argument to the output.
|
||||
|
@ -4605,6 +4609,21 @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
|
|||
}
|
||||
break;
|
||||
|
||||
case TCG_CALL_RET_BY_VEC:
|
||||
{
|
||||
TCGTemp *ts = arg_temp(op->args[0]);
|
||||
|
||||
tcg_debug_assert(ts->base_type == TCG_TYPE_I128);
|
||||
tcg_debug_assert(ts->temp_subindex == 0);
|
||||
if (!ts->mem_allocated) {
|
||||
temp_allocate_frame(s, ts);
|
||||
}
|
||||
tcg_out_st(s, TCG_TYPE_V128,
|
||||
tcg_target_call_oarg_reg(TCG_CALL_RET_BY_VEC, 0),
|
||||
ts->mem_base->reg, ts->mem_offset);
|
||||
}
|
||||
/* fall through to mark all parts in memory */
|
||||
|
||||
case TCG_CALL_RET_BY_REF:
|
||||
/* The callee has performed a write through the reference. */
|
||||
for (i = 0; i < nb_oargs; i++) {
|
||||
|
|
Loading…
Reference in New Issue