mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
tcg: Add temp allocation for TCGv_i128
This enables allocation of i128. The type is not yet usable, as we have not yet added data movement ops. Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
5427a9a760
commit
43eef72f41
2 changed files with 74 additions and 18 deletions
60
tcg/tcg.c
60
tcg/tcg.c
|
@ -1273,26 +1273,45 @@ TCGTemp *tcg_temp_new_internal(TCGType type, bool temp_local)
|
|||
tcg_debug_assert(ts->base_type == type);
|
||||
tcg_debug_assert(ts->kind == kind);
|
||||
} else {
|
||||
int i, n;
|
||||
|
||||
switch (type) {
|
||||
case TCG_TYPE_I32:
|
||||
case TCG_TYPE_V64:
|
||||
case TCG_TYPE_V128:
|
||||
case TCG_TYPE_V256:
|
||||
n = 1;
|
||||
break;
|
||||
case TCG_TYPE_I64:
|
||||
n = 64 / TCG_TARGET_REG_BITS;
|
||||
break;
|
||||
case TCG_TYPE_I128:
|
||||
n = 128 / TCG_TARGET_REG_BITS;
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
ts = tcg_temp_alloc(s);
|
||||
if (TCG_TARGET_REG_BITS == 32 && type == TCG_TYPE_I64) {
|
||||
TCGTemp *ts2 = tcg_temp_alloc(s);
|
||||
ts->base_type = type;
|
||||
ts->temp_allocated = 1;
|
||||
ts->kind = kind;
|
||||
|
||||
ts->base_type = type;
|
||||
ts->type = TCG_TYPE_I32;
|
||||
ts->temp_allocated = 1;
|
||||
ts->kind = kind;
|
||||
|
||||
tcg_debug_assert(ts2 == ts + 1);
|
||||
ts2->base_type = TCG_TYPE_I64;
|
||||
ts2->type = TCG_TYPE_I32;
|
||||
ts2->temp_allocated = 1;
|
||||
ts2->temp_subindex = 1;
|
||||
ts2->kind = kind;
|
||||
} else {
|
||||
ts->base_type = type;
|
||||
if (n == 1) {
|
||||
ts->type = type;
|
||||
ts->temp_allocated = 1;
|
||||
ts->kind = kind;
|
||||
} else {
|
||||
ts->type = TCG_TYPE_REG;
|
||||
|
||||
for (i = 1; i < n; ++i) {
|
||||
TCGTemp *ts2 = tcg_temp_alloc(s);
|
||||
|
||||
tcg_debug_assert(ts2 == ts + i);
|
||||
ts2->base_type = type;
|
||||
ts2->type = TCG_TYPE_REG;
|
||||
ts2->temp_allocated = 1;
|
||||
ts2->temp_subindex = i;
|
||||
ts2->kind = kind;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3384,9 +3403,14 @@ static void temp_allocate_frame(TCGContext *s, TCGTemp *ts)
|
|||
case TCG_TYPE_V64:
|
||||
align = 8;
|
||||
break;
|
||||
case TCG_TYPE_I128:
|
||||
case TCG_TYPE_V128:
|
||||
case TCG_TYPE_V256:
|
||||
/* Note that we do not require aligned storage for V256. */
|
||||
/*
|
||||
* Note that we do not require aligned storage for V256,
|
||||
* and that we provide alignment for I128 to match V128,
|
||||
* even if that's above what the host ABI requires.
|
||||
*/
|
||||
align = 16;
|
||||
break;
|
||||
default:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue