mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 01:03:55 -06:00
tcg: Add TCGType to tcg_op_insert_{after,before}
We cannot rely on the value copied from TCGOP_TYPE(op), because
the relevant op could be typeless, such as INDEX_op_call.
Fixes: fb744ece3a
("tcg: Copy TCGOP_TYPE in tcg_op_insert_{after,before}")
Suggested-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
a3c1c579ba
commit
cf5c9f697f
3 changed files with 14 additions and 11 deletions
|
@ -347,13 +347,13 @@ static TCGArg arg_new_temp(OptContext *ctx)
|
||||||
static TCGOp *opt_insert_after(OptContext *ctx, TCGOp *op,
|
static TCGOp *opt_insert_after(OptContext *ctx, TCGOp *op,
|
||||||
TCGOpcode opc, unsigned narg)
|
TCGOpcode opc, unsigned narg)
|
||||||
{
|
{
|
||||||
return tcg_op_insert_after(ctx->tcg, op, opc, narg);
|
return tcg_op_insert_after(ctx->tcg, op, opc, ctx->type, narg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static TCGOp *opt_insert_before(OptContext *ctx, TCGOp *op,
|
static TCGOp *opt_insert_before(OptContext *ctx, TCGOp *op,
|
||||||
TCGOpcode opc, unsigned narg)
|
TCGOpcode opc, unsigned narg)
|
||||||
{
|
{
|
||||||
return tcg_op_insert_before(ctx->tcg, op, opc, narg);
|
return tcg_op_insert_before(ctx->tcg, op, opc, ctx->type, narg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool tcg_opt_gen_mov(OptContext *ctx, TCGOp *op, TCGArg dst, TCGArg src)
|
static bool tcg_opt_gen_mov(OptContext *ctx, TCGOp *op, TCGArg dst, TCGArg src)
|
||||||
|
|
|
@ -107,8 +107,8 @@ void vec_gen_6(TCGOpcode opc, TCGType type, unsigned vece, TCGArg r,
|
||||||
TCGArg a, TCGArg b, TCGArg c, TCGArg d, TCGArg e);
|
TCGArg a, TCGArg b, TCGArg c, TCGArg d, TCGArg e);
|
||||||
|
|
||||||
TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op,
|
TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op,
|
||||||
TCGOpcode opc, unsigned nargs);
|
TCGOpcode, TCGType, unsigned nargs);
|
||||||
TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op,
|
TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op,
|
||||||
TCGOpcode opc, unsigned nargs);
|
TCGOpcode, TCGType, unsigned nargs);
|
||||||
|
|
||||||
#endif /* TCG_INTERNAL_H */
|
#endif /* TCG_INTERNAL_H */
|
||||||
|
|
17
tcg/tcg.c
17
tcg/tcg.c
|
@ -3449,21 +3449,21 @@ TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs)
|
||||||
}
|
}
|
||||||
|
|
||||||
TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *old_op,
|
TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *old_op,
|
||||||
TCGOpcode opc, unsigned nargs)
|
TCGOpcode opc, TCGType type, unsigned nargs)
|
||||||
{
|
{
|
||||||
TCGOp *new_op = tcg_op_alloc(opc, nargs);
|
TCGOp *new_op = tcg_op_alloc(opc, nargs);
|
||||||
|
|
||||||
TCGOP_TYPE(new_op) = TCGOP_TYPE(old_op);
|
TCGOP_TYPE(new_op) = type;
|
||||||
QTAILQ_INSERT_BEFORE(old_op, new_op, link);
|
QTAILQ_INSERT_BEFORE(old_op, new_op, link);
|
||||||
return new_op;
|
return new_op;
|
||||||
}
|
}
|
||||||
|
|
||||||
TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *old_op,
|
TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *old_op,
|
||||||
TCGOpcode opc, unsigned nargs)
|
TCGOpcode opc, TCGType type, unsigned nargs)
|
||||||
{
|
{
|
||||||
TCGOp *new_op = tcg_op_alloc(opc, nargs);
|
TCGOp *new_op = tcg_op_alloc(opc, nargs);
|
||||||
|
|
||||||
TCGOP_TYPE(new_op) = TCGOP_TYPE(old_op);
|
TCGOP_TYPE(new_op) = type;
|
||||||
QTAILQ_INSERT_AFTER(&s->ops, old_op, new_op, link);
|
QTAILQ_INSERT_AFTER(&s->ops, old_op, new_op, link);
|
||||||
return new_op;
|
return new_op;
|
||||||
}
|
}
|
||||||
|
@ -4214,7 +4214,8 @@ liveness_pass_2(TCGContext *s)
|
||||||
TCGOpcode lopc = (arg_ts->type == TCG_TYPE_I32
|
TCGOpcode lopc = (arg_ts->type == TCG_TYPE_I32
|
||||||
? INDEX_op_ld_i32
|
? INDEX_op_ld_i32
|
||||||
: INDEX_op_ld_i64);
|
: INDEX_op_ld_i64);
|
||||||
TCGOp *lop = tcg_op_insert_before(s, op, lopc, 3);
|
TCGOp *lop = tcg_op_insert_before(s, op, lopc,
|
||||||
|
arg_ts->type, 3);
|
||||||
|
|
||||||
lop->args[0] = temp_arg(dir_ts);
|
lop->args[0] = temp_arg(dir_ts);
|
||||||
lop->args[1] = temp_arg(arg_ts->mem_base);
|
lop->args[1] = temp_arg(arg_ts->mem_base);
|
||||||
|
@ -4277,7 +4278,8 @@ liveness_pass_2(TCGContext *s)
|
||||||
TCGOpcode sopc = (arg_ts->type == TCG_TYPE_I32
|
TCGOpcode sopc = (arg_ts->type == TCG_TYPE_I32
|
||||||
? INDEX_op_st_i32
|
? INDEX_op_st_i32
|
||||||
: INDEX_op_st_i64);
|
: INDEX_op_st_i64);
|
||||||
TCGOp *sop = tcg_op_insert_after(s, op, sopc, 3);
|
TCGOp *sop = tcg_op_insert_after(s, op, sopc,
|
||||||
|
arg_ts->type, 3);
|
||||||
TCGTemp *out_ts = dir_ts;
|
TCGTemp *out_ts = dir_ts;
|
||||||
|
|
||||||
if (IS_DEAD_ARG(0)) {
|
if (IS_DEAD_ARG(0)) {
|
||||||
|
@ -4313,7 +4315,8 @@ liveness_pass_2(TCGContext *s)
|
||||||
TCGOpcode sopc = (arg_ts->type == TCG_TYPE_I32
|
TCGOpcode sopc = (arg_ts->type == TCG_TYPE_I32
|
||||||
? INDEX_op_st_i32
|
? INDEX_op_st_i32
|
||||||
: INDEX_op_st_i64);
|
: INDEX_op_st_i64);
|
||||||
TCGOp *sop = tcg_op_insert_after(s, op, sopc, 3);
|
TCGOp *sop = tcg_op_insert_after(s, op, sopc,
|
||||||
|
arg_ts->type, 3);
|
||||||
|
|
||||||
sop->args[0] = temp_arg(dir_ts);
|
sop->args[0] = temp_arg(dir_ts);
|
||||||
sop->args[1] = temp_arg(arg_ts->mem_base);
|
sop->args[1] = temp_arg(arg_ts->mem_base);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue