mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-28 12:32:05 -06:00
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:
parent
ecbea3ec1c
commit
466d375960
1 changed files with 33 additions and 4 deletions
37
tcg/tcg.c
37
tcg/tcg.c
|
@ -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();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue