tcg: add temp_sync()
Add a new function temp_sync() to synchronize the canonical location of a temp with the value in the corresponding register, but without freeing the associated register. Rewrite temp_save() to call temp_sync() followed by temp_dead(). Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
7f6ceedf9c
commit
1ad80729be
34
tcg/tcg.c
34
tcg/tcg.c
@ -1593,31 +1593,27 @@ static inline void temp_dead(TCGContext *s, int temp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* save a temporary to memory. 'allocated_regs' is used in case a
|
/* sync a temporary to memory. 'allocated_regs' is used in case a
|
||||||
temporary registers needs to be allocated to store a constant. */
|
temporary registers needs to be allocated to store a constant. */
|
||||||
static void temp_save(TCGContext *s, int temp, TCGRegSet allocated_regs)
|
static inline void temp_sync(TCGContext *s, int temp, TCGRegSet allocated_regs)
|
||||||
{
|
{
|
||||||
TCGTemp *ts;
|
TCGTemp *ts;
|
||||||
int reg;
|
|
||||||
|
|
||||||
ts = &s->temps[temp];
|
ts = &s->temps[temp];
|
||||||
if (!ts->fixed_reg) {
|
if (!ts->fixed_reg) {
|
||||||
switch(ts->val_type) {
|
switch(ts->val_type) {
|
||||||
|
case TEMP_VAL_CONST:
|
||||||
|
ts->reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type],
|
||||||
|
allocated_regs);
|
||||||
|
ts->val_type = TEMP_VAL_REG;
|
||||||
|
s->reg_to_temp[ts->reg] = temp;
|
||||||
|
ts->mem_coherent = 0;
|
||||||
|
tcg_out_movi(s, ts->type, ts->reg, ts->val);
|
||||||
|
/* fallthrough*/
|
||||||
case TEMP_VAL_REG:
|
case TEMP_VAL_REG:
|
||||||
tcg_reg_free(s, ts->reg);
|
tcg_reg_sync(s, ts->reg);
|
||||||
break;
|
break;
|
||||||
case TEMP_VAL_DEAD:
|
case TEMP_VAL_DEAD:
|
||||||
ts->val_type = TEMP_VAL_MEM;
|
|
||||||
break;
|
|
||||||
case TEMP_VAL_CONST:
|
|
||||||
reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type],
|
|
||||||
allocated_regs);
|
|
||||||
if (!ts->mem_allocated)
|
|
||||||
temp_allocate_frame(s, temp);
|
|
||||||
tcg_out_movi(s, ts->type, reg, ts->val);
|
|
||||||
tcg_out_st(s, ts->type, reg, ts->mem_reg, ts->mem_offset);
|
|
||||||
ts->val_type = TEMP_VAL_MEM;
|
|
||||||
break;
|
|
||||||
case TEMP_VAL_MEM:
|
case TEMP_VAL_MEM:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -1626,6 +1622,14 @@ static void temp_save(TCGContext *s, int temp, TCGRegSet allocated_regs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* save a temporary to memory. 'allocated_regs' is used in case a
|
||||||
|
temporary registers needs to be allocated to store a constant. */
|
||||||
|
static inline void temp_save(TCGContext *s, int temp, TCGRegSet allocated_regs)
|
||||||
|
{
|
||||||
|
temp_sync(s, temp, allocated_regs);
|
||||||
|
temp_dead(s, temp);
|
||||||
|
}
|
||||||
|
|
||||||
/* save globals to their canonical location and assume they can be
|
/* save globals to their canonical location and assume they can be
|
||||||
modified be the following code. 'allocated_regs' is used in case a
|
modified be the following code. 'allocated_regs' is used in case a
|
||||||
temporary registers needs to be allocated to store a constant. */
|
temporary registers needs to be allocated to store a constant. */
|
||||||
|
Loading…
Reference in New Issue
Block a user