mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 14:45:48 +00:00
tcg: Tidy temporary allocation
In particular, make sure the memory is memset before use. Continues the increased use of TCGTemp pointers instead of integer indices where appropriate. Backports commit 7ca4b752feaab647b0c1a147bd3815fcdb479a59 from qemu
This commit is contained in:
parent
45f9ddf970
commit
7cb5f2fed8
123
qemu/tcg/tcg.c
123
qemu/tcg/tcg.c
|
@ -422,32 +422,45 @@ void tcg_func_start(TCGContext *s)
|
|||
s->be = tcg_malloc(s, sizeof(TCGBackendData));
|
||||
}
|
||||
|
||||
static inline void tcg_temp_alloc(TCGContext *s, int n)
|
||||
static inline int temp_idx(TCGContext *s, TCGTemp *ts)
|
||||
{
|
||||
if (n > TCG_MAX_TEMPS)
|
||||
tcg_abort();
|
||||
ptrdiff_t n = ts - s->temps;
|
||||
tcg_debug_assert(n >= 0 && n < s->nb_temps);
|
||||
return n;
|
||||
}
|
||||
|
||||
static inline TCGTemp *tcg_temp_alloc(TCGContext *s)
|
||||
{
|
||||
int n = s->nb_temps++;
|
||||
tcg_debug_assert(n < TCG_MAX_TEMPS);
|
||||
return memset(&s->temps[n], 0, sizeof(TCGTemp));
|
||||
}
|
||||
|
||||
static inline TCGTemp *tcg_global_alloc(TCGContext *s)
|
||||
{
|
||||
tcg_debug_assert(s->nb_globals == s->nb_temps);
|
||||
s->nb_globals++;
|
||||
return tcg_temp_alloc(s);
|
||||
}
|
||||
|
||||
static int tcg_global_reg_new_internal(TCGContext *s, TCGType type,
|
||||
TCGReg reg, const char *name)
|
||||
{
|
||||
TCGTemp *ts;
|
||||
int idx;
|
||||
|
||||
if (TCG_TARGET_REG_BITS == 32 && type != TCG_TYPE_I32) {
|
||||
tcg_abort();
|
||||
}
|
||||
idx = s->nb_globals;
|
||||
tcg_temp_alloc(s, s->nb_globals + 1);
|
||||
ts = &s->temps[s->nb_globals];
|
||||
|
||||
ts = tcg_global_alloc(s);
|
||||
ts->base_type = type;
|
||||
ts->type = type;
|
||||
ts->fixed_reg = 1;
|
||||
ts->reg = reg;
|
||||
ts->name = name;
|
||||
s->nb_globals++;
|
||||
tcg_regset_set_reg(s->reserved_regs, reg);
|
||||
return idx;
|
||||
|
||||
return temp_idx(s, ts);
|
||||
}
|
||||
|
||||
void tcg_set_frame(TCGContext *s, TCGReg reg, intptr_t start, intptr_t size)
|
||||
|
@ -486,63 +499,47 @@ TCGv_i64 tcg_global_reg_new_i64(TCGContext *s, TCGReg reg, const char *name)
|
|||
int tcg_global_mem_new_internal(TCGContext *s, TCGType type, TCGv_ptr base,
|
||||
intptr_t offset, const char *name)
|
||||
{
|
||||
TCGTemp *ts, *base_ts = &s->temps[GET_TCGV_PTR(base)];
|
||||
int idx;
|
||||
TCGTemp *base_ts = &s->temps[GET_TCGV_PTR(base)];
|
||||
TCGTemp *ts = tcg_global_alloc(s);
|
||||
int bigendian = 0;
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
bigendian = 1;
|
||||
#endif
|
||||
|
||||
idx = s->nb_globals;
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
if (type == TCG_TYPE_I64) {
|
||||
if (TCG_TARGET_REG_BITS == 32 && type == TCG_TYPE_I64) {
|
||||
TCGTemp *ts2 = tcg_global_alloc(s);
|
||||
char buf[64];
|
||||
tcg_temp_alloc(s, s->nb_globals + 2);
|
||||
ts = &s->temps[s->nb_globals];
|
||||
ts->base_type = type;
|
||||
|
||||
ts->base_type = TCG_TYPE_I64;
|
||||
ts->type = TCG_TYPE_I32;
|
||||
ts->fixed_reg = 0;
|
||||
ts->mem_allocated = 1;
|
||||
ts->mem_base = base_ts;
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
ts->mem_offset = offset + 4;
|
||||
#else
|
||||
ts->mem_offset = offset;
|
||||
#endif
|
||||
ts->mem_offset = offset + bigendian * 4;
|
||||
pstrcpy(buf, sizeof(buf), name);
|
||||
pstrcat(buf, sizeof(buf), "_0");
|
||||
ts->name = g_strdup(buf);
|
||||
ts++;
|
||||
|
||||
ts->base_type = type;
|
||||
ts->type = TCG_TYPE_I32;
|
||||
ts->fixed_reg = 0;
|
||||
ts->mem_allocated = 1;
|
||||
ts->mem_base = base_ts;
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
ts->mem_offset = offset;
|
||||
#else
|
||||
ts->mem_offset = offset + 4;
|
||||
#endif
|
||||
tcg_debug_assert(ts2 == ts + 1);
|
||||
ts2->base_type = TCG_TYPE_I64;
|
||||
ts2->type = TCG_TYPE_I32;
|
||||
ts2->mem_allocated = 1;
|
||||
ts2->mem_base = base_ts;
|
||||
ts2->mem_offset = offset + (1 - bigendian) * 4;
|
||||
pstrcpy(buf, sizeof(buf), name);
|
||||
pstrcat(buf, sizeof(buf), "_1");
|
||||
ts->name = g_strdup(buf);
|
||||
|
||||
s->nb_globals += 2;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
tcg_temp_alloc(s, s->nb_globals + 1);
|
||||
ts = &s->temps[s->nb_globals];
|
||||
} else {
|
||||
ts->base_type = type;
|
||||
ts->type = type;
|
||||
ts->fixed_reg = 0;
|
||||
ts->mem_allocated = 1;
|
||||
ts->mem_base = base_ts;
|
||||
ts->mem_offset = offset;
|
||||
ts->name = name;
|
||||
s->nb_globals++;
|
||||
}
|
||||
return idx;
|
||||
return temp_idx(s, ts);
|
||||
}
|
||||
|
||||
static inline int tcg_temp_new_internal(TCGContext *s, TCGType type, int temp_local)
|
||||
static int tcg_temp_new_internal(TCGContext *s, TCGType type, int temp_local)
|
||||
{
|
||||
TCGTemp *ts;
|
||||
int idx, k;
|
||||
|
@ -555,38 +552,30 @@ static inline int tcg_temp_new_internal(TCGContext *s, TCGType type, int temp_lo
|
|||
|
||||
ts = &s->temps[idx];
|
||||
ts->temp_allocated = 1;
|
||||
assert(ts->base_type == type);
|
||||
assert(ts->temp_local == temp_local);
|
||||
tcg_debug_assert(ts->base_type == type);
|
||||
tcg_debug_assert(ts->temp_local == temp_local);
|
||||
} else {
|
||||
idx = s->nb_temps;
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
if (type == TCG_TYPE_I64) {
|
||||
tcg_temp_alloc(s, s->nb_temps + 2);
|
||||
ts = &s->temps[s->nb_temps];
|
||||
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->type = TCG_TYPE_I32;
|
||||
ts->temp_allocated = 1;
|
||||
ts->temp_local = temp_local;
|
||||
ts->name = NULL;
|
||||
ts++;
|
||||
ts->base_type = type;
|
||||
ts->type = TCG_TYPE_I32;
|
||||
ts->temp_allocated = 1;
|
||||
ts->temp_local = temp_local;
|
||||
ts->name = NULL;
|
||||
s->nb_temps += 2;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
tcg_temp_alloc(s, s->nb_temps + 1);
|
||||
ts = &s->temps[s->nb_temps];
|
||||
|
||||
tcg_debug_assert(ts2 == ts + 1);
|
||||
ts2->base_type = TCG_TYPE_I64;
|
||||
ts2->type = TCG_TYPE_I32;
|
||||
ts2->temp_allocated = 1;
|
||||
ts2->temp_local = temp_local;
|
||||
} else {
|
||||
ts->base_type = type;
|
||||
ts->type = type;
|
||||
ts->temp_allocated = 1;
|
||||
ts->temp_local = temp_local;
|
||||
ts->name = NULL;
|
||||
s->nb_temps++;
|
||||
}
|
||||
idx = temp_idx(s, ts);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DEBUG_TCG)
|
||||
|
|
Loading…
Reference in a new issue