Commit 51e3972c authored by Richard Henderson's avatar Richard Henderson
Browse files

tcg: Use tcg_malloc to allocate TCGLabel



Pre-allocating 512 of them per TB is a waste.

Reviewed-by: default avatarBastian Koppelmann <kbastian@mail.uni-paderborn.de>
Signed-off-by: default avatarRichard Henderson <rth@twiddle.net>
parent bec16311
Loading
Loading
Loading
Loading
+18 −13
Original line number Diff line number Diff line
@@ -246,15 +246,11 @@ static void tcg_out_label(TCGContext *s, TCGLabel *l, tcg_insn_unit *ptr)
TCGLabel *gen_new_label(void)
{
    TCGContext *s = &tcg_ctx;
    int idx;
    TCGLabel *l;
    TCGLabel *l = tcg_malloc(sizeof(TCGLabel));

    if (s->nb_labels >= TCG_MAX_LABELS)
        tcg_abort();
    idx = s->nb_labels++;
    l = &s->labels[idx];
    l->has_value = 0;
    l->u.first_reloc = NULL;
    *l = (TCGLabel){
        .id = s->nb_labels++
    };

    return l;
}
@@ -1086,11 +1082,20 @@ void tcg_dump_ops(TCGContext *s)
                i = 0;
                break;
            }
            for (; i < nb_cargs; i++) {
                if (k != 0) {
                    qemu_log(",");
            switch (c) {
            case INDEX_op_set_label:
            case INDEX_op_br:
            case INDEX_op_brcond_i32:
            case INDEX_op_brcond_i64:
            case INDEX_op_brcond2_i32:
                qemu_log("%s$L%d", k ? "," : "", arg_label(args[k])->id);
                i++, k++;
                break;
            default:
                break;
            }
                qemu_log("$0x%" TCG_PRIlx, args[k++]);
            for (; i < nb_cargs; i++, k++) {
                qemu_log("%s$0x%" TCG_PRIlx, k ? "," : "", args[k]);
            }
        }
        qemu_log("\n");
+5 −11
Original line number Diff line number Diff line
@@ -167,7 +167,8 @@ typedef struct TCGRelocation {
} TCGRelocation; 

typedef struct TCGLabel {
    int has_value;
    unsigned has_value : 1;
    unsigned id : 31;
    union {
        uintptr_t value;
        tcg_insn_unit *value_ptr;
@@ -183,8 +184,6 @@ typedef struct TCGPool {

#define TCG_POOL_CHUNK_SIZE 32768

#define TCG_MAX_LABELS 512

#define TCG_MAX_TEMPS 512

/* when the size of the arguments of a called function is smaller than
@@ -556,8 +555,6 @@ struct TCGContext {
    target_ulong gen_opc_pc[OPC_BUF_SIZE];
    uint16_t gen_opc_icount[OPC_BUF_SIZE];
    uint8_t gen_opc_instr_start[OPC_BUF_SIZE];

    TCGLabel labels[TCG_MAX_LABELS];
};

extern TCGContext tcg_ctx;
@@ -766,9 +763,7 @@ TCGLabel *gen_new_label(void);

static inline TCGArg label_arg(TCGLabel *l)
{
    ptrdiff_t idx = l - tcg_ctx.labels;
    tcg_debug_assert(idx >= 0 && idx < tcg_ctx.nb_labels);
    return idx;
    return (uintptr_t)l;
}

/**
@@ -779,10 +774,9 @@ static inline TCGArg label_arg(TCGLabel *l)
 * encoding of the TCG opcode stream.
 */

static inline TCGLabel *arg_label(TCGArg idx)
static inline TCGLabel *arg_label(TCGArg i)
{
    tcg_debug_assert(idx < tcg_ctx.nb_labels);
    return &tcg_ctx.labels[idx];
    return (TCGLabel *)(uintptr_t)i;
}

/**