mirror of https://github.com/proxmox/mirror_qemu
tcg: Add TCGContext.emit_before_op
Allow operations to be emitted via normal expanders into the middle of the opcode stream. Tested-by: Jørgen Hansen <Jorgen.Hansen@wdc.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>master
parent
5888357942
commit
07843f75fd
|
@ -553,6 +553,12 @@ struct TCGContext {
|
||||||
QTAILQ_HEAD(, TCGOp) ops, free_ops;
|
QTAILQ_HEAD(, TCGOp) ops, free_ops;
|
||||||
QSIMPLEQ_HEAD(, TCGLabel) labels;
|
QSIMPLEQ_HEAD(, TCGLabel) labels;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When clear, new ops are added to the tail of @ops.
|
||||||
|
* When set, new ops are added in front of @emit_before_op.
|
||||||
|
*/
|
||||||
|
TCGOp *emit_before_op;
|
||||||
|
|
||||||
/* Tells which temporary holds a given register.
|
/* Tells which temporary holds a given register.
|
||||||
It does not take into account fixed registers */
|
It does not take into account fixed registers */
|
||||||
TCGTemp *reg_to_temp[TCG_TARGET_NB_REGS];
|
TCGTemp *reg_to_temp[TCG_TARGET_NB_REGS];
|
||||||
|
|
14
tcg/tcg.c
14
tcg/tcg.c
|
@ -1521,6 +1521,7 @@ void tcg_func_start(TCGContext *s)
|
||||||
|
|
||||||
QTAILQ_INIT(&s->ops);
|
QTAILQ_INIT(&s->ops);
|
||||||
QTAILQ_INIT(&s->free_ops);
|
QTAILQ_INIT(&s->free_ops);
|
||||||
|
s->emit_before_op = NULL;
|
||||||
QSIMPLEQ_INIT(&s->labels);
|
QSIMPLEQ_INIT(&s->labels);
|
||||||
|
|
||||||
tcg_debug_assert(s->addr_type == TCG_TYPE_I32 ||
|
tcg_debug_assert(s->addr_type == TCG_TYPE_I32 ||
|
||||||
|
@ -2332,7 +2333,11 @@ static void tcg_gen_callN(TCGHelperInfo *info, TCGTemp *ret, TCGTemp **args)
|
||||||
op->args[pi++] = (uintptr_t)info;
|
op->args[pi++] = (uintptr_t)info;
|
||||||
tcg_debug_assert(pi == total_args);
|
tcg_debug_assert(pi == total_args);
|
||||||
|
|
||||||
QTAILQ_INSERT_TAIL(&tcg_ctx->ops, op, link);
|
if (tcg_ctx->emit_before_op) {
|
||||||
|
QTAILQ_INSERT_BEFORE(tcg_ctx->emit_before_op, op, link);
|
||||||
|
} else {
|
||||||
|
QTAILQ_INSERT_TAIL(&tcg_ctx->ops, op, link);
|
||||||
|
}
|
||||||
|
|
||||||
tcg_debug_assert(n_extend < ARRAY_SIZE(extend_free));
|
tcg_debug_assert(n_extend < ARRAY_SIZE(extend_free));
|
||||||
for (i = 0; i < n_extend; ++i) {
|
for (i = 0; i < n_extend; ++i) {
|
||||||
|
@ -3215,7 +3220,12 @@ static TCGOp *tcg_op_alloc(TCGOpcode opc, unsigned nargs)
|
||||||
TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs)
|
TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs)
|
||||||
{
|
{
|
||||||
TCGOp *op = tcg_op_alloc(opc, nargs);
|
TCGOp *op = tcg_op_alloc(opc, nargs);
|
||||||
QTAILQ_INSERT_TAIL(&tcg_ctx->ops, op, link);
|
|
||||||
|
if (tcg_ctx->emit_before_op) {
|
||||||
|
QTAILQ_INSERT_BEFORE(tcg_ctx->emit_before_op, op, link);
|
||||||
|
} else {
|
||||||
|
QTAILQ_INSERT_TAIL(&tcg_ctx->ops, op, link);
|
||||||
|
}
|
||||||
return op;
|
return op;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue