mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 10:34:58 -06:00
tcg: Use output_pref wrapper function
We will shortly have the possibility of more that two outputs, though only for calls (for which preferences are moot). Avoid direct references to op->output_pref[] when possible. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
cb10bc63b7
commit
31fd884b2e
2 changed files with 23 additions and 16 deletions
|
@ -518,6 +518,11 @@ typedef struct TCGOp {
|
||||||
/* Make sure operands fit in the bitfields above. */
|
/* Make sure operands fit in the bitfields above. */
|
||||||
QEMU_BUILD_BUG_ON(NB_OPS > (1 << 8));
|
QEMU_BUILD_BUG_ON(NB_OPS > (1 << 8));
|
||||||
|
|
||||||
|
static inline TCGRegSet output_pref(const TCGOp *op, unsigned i)
|
||||||
|
{
|
||||||
|
return i < ARRAY_SIZE(op->output_pref) ? op->output_pref[i] : 0;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct TCGProfile {
|
typedef struct TCGProfile {
|
||||||
int64_t cpu_exec_time;
|
int64_t cpu_exec_time;
|
||||||
int64_t tb_count1;
|
int64_t tb_count1;
|
||||||
|
|
34
tcg/tcg.c
34
tcg/tcg.c
|
@ -1966,7 +1966,7 @@ static void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
|
||||||
|
|
||||||
if (have_prefs) {
|
if (have_prefs) {
|
||||||
for (i = 0; i < nb_oargs; ++i) {
|
for (i = 0; i < nb_oargs; ++i) {
|
||||||
TCGRegSet set = op->output_pref[i];
|
TCGRegSet set = output_pref(op, i);
|
||||||
|
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
ne_fprintf(f, " pref=");
|
ne_fprintf(f, " pref=");
|
||||||
|
@ -2636,11 +2636,11 @@ static void liveness_pass_1(TCGContext *s)
|
||||||
}
|
}
|
||||||
ts->state = TS_DEAD;
|
ts->state = TS_DEAD;
|
||||||
la_reset_pref(ts);
|
la_reset_pref(ts);
|
||||||
|
|
||||||
/* Not used -- it will be tcg_target_call_oarg_regs[i]. */
|
|
||||||
op->output_pref[i] = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Not used -- it will be tcg_target_call_oarg_reg(). */
|
||||||
|
memset(op->output_pref, 0, sizeof(op->output_pref));
|
||||||
|
|
||||||
if (!(call_flags & (TCG_CALL_NO_WRITE_GLOBALS |
|
if (!(call_flags & (TCG_CALL_NO_WRITE_GLOBALS |
|
||||||
TCG_CALL_NO_READ_GLOBALS))) {
|
TCG_CALL_NO_READ_GLOBALS))) {
|
||||||
la_global_kill(s, nb_globals);
|
la_global_kill(s, nb_globals);
|
||||||
|
@ -2802,7 +2802,9 @@ static void liveness_pass_1(TCGContext *s)
|
||||||
ts = arg_temp(op->args[i]);
|
ts = arg_temp(op->args[i]);
|
||||||
|
|
||||||
/* Remember the preference of the uses that followed. */
|
/* Remember the preference of the uses that followed. */
|
||||||
op->output_pref[i] = *la_temp_pref(ts);
|
if (i < ARRAY_SIZE(op->output_pref)) {
|
||||||
|
op->output_pref[i] = *la_temp_pref(ts);
|
||||||
|
}
|
||||||
|
|
||||||
/* Output args are dead. */
|
/* Output args are dead. */
|
||||||
if (ts->state & TS_DEAD) {
|
if (ts->state & TS_DEAD) {
|
||||||
|
@ -2872,7 +2874,7 @@ static void liveness_pass_1(TCGContext *s)
|
||||||
|
|
||||||
set &= ct->regs;
|
set &= ct->regs;
|
||||||
if (ct->ialias) {
|
if (ct->ialias) {
|
||||||
set &= op->output_pref[ct->alias_index];
|
set &= output_pref(op, ct->alias_index);
|
||||||
}
|
}
|
||||||
/* If the combination is not possible, restart. */
|
/* If the combination is not possible, restart. */
|
||||||
if (set == 0) {
|
if (set == 0) {
|
||||||
|
@ -3539,7 +3541,7 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOp *op)
|
||||||
TCGReg oreg, ireg;
|
TCGReg oreg, ireg;
|
||||||
|
|
||||||
allocated_regs = s->reserved_regs;
|
allocated_regs = s->reserved_regs;
|
||||||
preferred_regs = op->output_pref[0];
|
preferred_regs = output_pref(op, 0);
|
||||||
ots = arg_temp(op->args[0]);
|
ots = arg_temp(op->args[0]);
|
||||||
ts = arg_temp(op->args[1]);
|
ts = arg_temp(op->args[1]);
|
||||||
|
|
||||||
|
@ -3656,7 +3658,7 @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
|
||||||
if (IS_DEAD_ARG(1)) {
|
if (IS_DEAD_ARG(1)) {
|
||||||
temp_dead(s, its);
|
temp_dead(s, its);
|
||||||
}
|
}
|
||||||
tcg_reg_alloc_do_movi(s, ots, val, arg_life, op->output_pref[0]);
|
tcg_reg_alloc_do_movi(s, ots, val, arg_life, output_pref(op, 0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3673,7 +3675,7 @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
|
||||||
tcg_regset_set_reg(allocated_regs, its->reg);
|
tcg_regset_set_reg(allocated_regs, its->reg);
|
||||||
}
|
}
|
||||||
oreg = tcg_reg_alloc(s, dup_out_regs, allocated_regs,
|
oreg = tcg_reg_alloc(s, dup_out_regs, allocated_regs,
|
||||||
op->output_pref[0], ots->indirect_base);
|
output_pref(op, 0), ots->indirect_base);
|
||||||
set_temp_val_reg(s, ots, oreg);
|
set_temp_val_reg(s, ots, oreg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3792,7 +3794,7 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
||||||
switch (arg_ct->pair) {
|
switch (arg_ct->pair) {
|
||||||
case 0: /* not paired */
|
case 0: /* not paired */
|
||||||
if (arg_ct->ialias) {
|
if (arg_ct->ialias) {
|
||||||
i_preferred_regs = op->output_pref[arg_ct->alias_index];
|
i_preferred_regs = output_pref(op, arg_ct->alias_index);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the input is readonly, then it cannot also be an
|
* If the input is readonly, then it cannot also be an
|
||||||
|
@ -3841,7 +3843,7 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
||||||
* and to identify a few cases where it's not required.
|
* and to identify a few cases where it's not required.
|
||||||
*/
|
*/
|
||||||
if (arg_ct->ialias) {
|
if (arg_ct->ialias) {
|
||||||
i_preferred_regs = op->output_pref[arg_ct->alias_index];
|
i_preferred_regs = output_pref(op, arg_ct->alias_index);
|
||||||
if (IS_DEAD_ARG(i1) &&
|
if (IS_DEAD_ARG(i1) &&
|
||||||
IS_DEAD_ARG(i2) &&
|
IS_DEAD_ARG(i2) &&
|
||||||
!temp_readonly(ts) &&
|
!temp_readonly(ts) &&
|
||||||
|
@ -3877,7 +3879,7 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
||||||
|
|
||||||
case 3: /* ialias with second output, no first input */
|
case 3: /* ialias with second output, no first input */
|
||||||
tcg_debug_assert(arg_ct->ialias);
|
tcg_debug_assert(arg_ct->ialias);
|
||||||
i_preferred_regs = op->output_pref[arg_ct->alias_index];
|
i_preferred_regs = output_pref(op, arg_ct->alias_index);
|
||||||
|
|
||||||
if (IS_DEAD_ARG(i) &&
|
if (IS_DEAD_ARG(i) &&
|
||||||
!temp_readonly(ts) &&
|
!temp_readonly(ts) &&
|
||||||
|
@ -4001,10 +4003,10 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
||||||
} else if (arg_ct->newreg) {
|
} else if (arg_ct->newreg) {
|
||||||
reg = tcg_reg_alloc(s, arg_ct->regs,
|
reg = tcg_reg_alloc(s, arg_ct->regs,
|
||||||
i_allocated_regs | o_allocated_regs,
|
i_allocated_regs | o_allocated_regs,
|
||||||
op->output_pref[k], ts->indirect_base);
|
output_pref(op, k), ts->indirect_base);
|
||||||
} else {
|
} else {
|
||||||
reg = tcg_reg_alloc(s, arg_ct->regs, o_allocated_regs,
|
reg = tcg_reg_alloc(s, arg_ct->regs, o_allocated_regs,
|
||||||
op->output_pref[k], ts->indirect_base);
|
output_pref(op, k), ts->indirect_base);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -4015,7 +4017,7 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
reg = tcg_reg_alloc_pair(s, arg_ct->regs, o_allocated_regs,
|
reg = tcg_reg_alloc_pair(s, arg_ct->regs, o_allocated_regs,
|
||||||
op->output_pref[k], ts->indirect_base);
|
output_pref(op, k), ts->indirect_base);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2: /* second of pair */
|
case 2: /* second of pair */
|
||||||
|
@ -4098,7 +4100,7 @@ static bool tcg_reg_alloc_dup2(TCGContext *s, const TCGOp *op)
|
||||||
}
|
}
|
||||||
|
|
||||||
oreg = tcg_reg_alloc(s, dup_out_regs, allocated_regs,
|
oreg = tcg_reg_alloc(s, dup_out_regs, allocated_regs,
|
||||||
op->output_pref[0], ots->indirect_base);
|
output_pref(op, 0), ots->indirect_base);
|
||||||
set_temp_val_reg(s, ots, oreg);
|
set_temp_val_reg(s, ots, oreg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue