|
@@ -752,6 +752,10 @@ static void init_call_layout(TCGHelperInfo *info)
|
|
/* Query the last register now to trigger any assert early. */
|
|
/* Query the last register now to trigger any assert early. */
|
|
tcg_target_call_oarg_reg(info->out_kind, info->nr_out - 1);
|
|
tcg_target_call_oarg_reg(info->out_kind, info->nr_out - 1);
|
|
break;
|
|
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:
|
|
case TCG_CALL_RET_BY_REF:
|
|
/*
|
|
/*
|
|
* Allocate the first argument to the output.
|
|
* Allocate the first argument to the output.
|
|
@@ -4605,6 +4609,21 @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
|
|
}
|
|
}
|
|
break;
|
|
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:
|
|
case TCG_CALL_RET_BY_REF:
|
|
/* The callee has performed a write through the reference. */
|
|
/* The callee has performed a write through the reference. */
|
|
for (i = 0; i < nb_oargs; i++) {
|
|
for (i = 0; i < nb_oargs; i++) {
|