tcg: Handle dh_typecode_i128 with TCG_CALL_{RET,ARG}_NORMAL

Many hosts pass and return 128-bit quantities like sequential
64-bit quantities.  Treat this just like we currently break
down 64-bit quantities for a 32-bit host.

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2022-11-11 11:01:13 +10:00
parent ecbea3ec1c
commit 466d375960

View file

@ -707,11 +707,22 @@ static void init_call_layout(TCGHelperInfo *info)
case dh_typecode_s64: case dh_typecode_s64:
info->nr_out = 64 / TCG_TARGET_REG_BITS; info->nr_out = 64 / TCG_TARGET_REG_BITS;
info->out_kind = TCG_CALL_RET_NORMAL; info->out_kind = TCG_CALL_RET_NORMAL;
assert(info->nr_out <= ARRAY_SIZE(tcg_target_call_oarg_regs));
break;
case dh_typecode_i128:
info->nr_out = 128 / TCG_TARGET_REG_BITS;
info->out_kind = TCG_CALL_RET_NORMAL; /* TODO */
switch (/* TODO */ TCG_CALL_RET_NORMAL) {
case TCG_CALL_RET_NORMAL:
assert(info->nr_out <= ARRAY_SIZE(tcg_target_call_oarg_regs));
break;
default:
qemu_build_not_reached();
}
break; break;
default: default:
g_assert_not_reached(); g_assert_not_reached();
} }
assert(info->nr_out <= ARRAY_SIZE(tcg_target_call_oarg_regs));
/* /*
* Parse and place function arguments. * Parse and place function arguments.
@ -733,6 +744,9 @@ static void init_call_layout(TCGHelperInfo *info)
case dh_typecode_ptr: case dh_typecode_ptr:
type = TCG_TYPE_PTR; type = TCG_TYPE_PTR;
break; break;
case dh_typecode_i128:
type = TCG_TYPE_I128;
break;
default: default:
g_assert_not_reached(); g_assert_not_reached();
} }
@ -772,6 +786,19 @@ static void init_call_layout(TCGHelperInfo *info)
} }
break; break;
case TCG_TYPE_I128:
switch (/* TODO */ TCG_CALL_ARG_NORMAL) {
case TCG_CALL_ARG_EVEN:
layout_arg_even(&cum);
/* fall through */
case TCG_CALL_ARG_NORMAL:
layout_arg_normal_n(&cum, info, 128 / TCG_TARGET_REG_BITS);
break;
default:
qemu_build_not_reached();
}
break;
default: default:
g_assert_not_reached(); g_assert_not_reached();
} }
@ -1692,11 +1719,13 @@ void tcg_gen_callN(void *func, TCGTemp *ret, int nargs, TCGTemp **args)
op->args[pi++] = temp_arg(ret); op->args[pi++] = temp_arg(ret);
break; break;
case 2: case 2:
case 4:
tcg_debug_assert(ret != NULL); tcg_debug_assert(ret != NULL);
tcg_debug_assert(ret->base_type == ret->type + 1); tcg_debug_assert(ret->base_type == ret->type + ctz32(n));
tcg_debug_assert(ret->temp_subindex == 0); tcg_debug_assert(ret->temp_subindex == 0);
op->args[pi++] = temp_arg(ret); for (i = 0; i < n; ++i) {
op->args[pi++] = temp_arg(ret + 1); op->args[pi++] = temp_arg(ret + i);
}
break; break;
default: default:
g_assert_not_reached(); g_assert_not_reached();