[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 4/5] tcg: Change generator-side labels to a poin
From: |
Claudio Fontana |
Subject: |
Re: [Qemu-devel] [PATCH 4/5] tcg: Change generator-side labels to a pointer |
Date: |
Sat, 14 Feb 2015 13:26:58 +0100 |
User-agent: |
Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Thunderbird/24.0.1 |
On 14.02.2015 04:12, Richard Henderson wrote:
> This is less about improved type checking than enabling a
> subsequent change to the representation of labels.
>
> Cc: Claudio Fontana <address@hidden>
> Cc: Andrzej Zaborowski <address@hidden>
> Cc: Peter Maydell <address@hidden>
> Cc: Aurelien Jarno <address@hidden>
> Cc: Blue Swirl <address@hidden>
> Cc: Stefan Weil <address@hidden>
> Signed-off-by: Richard Henderson <address@hidden>
> ---
> I've only been able to test aarch64, i386, ppc, and tci so far.
> The arm, sparc and ia64 machines I use are currently down, and
> I didn't take the time to check out an s390 host from redhat.
> I don't have access to a mips host at all.
For the AArch64 backend, ack and tested with images: x86/dos, x86_64/linux,
sparc/linux, arm/linux
Acked-by: Claudio Fontana <address@hidden>
Tested-by: Claudio Fontana <address@hidden>
Btw if you/someone has a handy set of ready to use images for sparc64 and ppc64
I would be grateful, I seem to have lost them..
Ciao,
Claudio
>
> That said, the changes are fairly trivial to visually verify,
> with i386 being the only one that's moderately complex.
>
>
> r~
> ---
> tcg/aarch64/tcg-target.c | 15 ++++------
> tcg/arm/tcg-target.c | 14 ++++-----
> tcg/i386/tcg-target.c | 76
> ++++++++++++++++++++++++------------------------
> tcg/ia64/tcg-target.c | 16 +++++-----
> tcg/mips/tcg-target.c | 17 +++++------
> tcg/ppc/tcg-target.c | 20 ++++++-------
> tcg/s390/tcg-target.c | 31 +++++++++-----------
> tcg/sparc/tcg-target.c | 22 +++++++-------
> tcg/tcg.c | 9 ++----
> tcg/tci/tcg-target.c | 13 ++++-----
> 10 files changed, 108 insertions(+), 125 deletions(-)
>
> diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
> index 987c0bd..87dc245 100644
> --- a/tcg/aarch64/tcg-target.c
> +++ b/tcg/aarch64/tcg-target.c
> @@ -837,12 +837,10 @@ void aarch64_tb_set_jmp_target(uintptr_t jmp_addr,
> uintptr_t addr)
> flush_icache_range(jmp_addr, jmp_addr + 4);
> }
>
> -static inline void tcg_out_goto_label(TCGContext *s, int label_index)
> +static inline void tcg_out_goto_label(TCGContext *s, TCGLabel *l)
> {
> - TCGLabel *l = &s->labels[label_index];
> -
> if (!l->has_value) {
> - tcg_out_reloc(s, s->code_ptr, R_AARCH64_JUMP26, label_index, 0);
> + tcg_out_reloc(s, s->code_ptr, R_AARCH64_JUMP26, l, 0);
> tcg_out_goto_noaddr(s);
> } else {
> tcg_out_goto(s, l->u.value_ptr);
> @@ -850,9 +848,8 @@ static inline void tcg_out_goto_label(TCGContext *s, int
> label_index)
> }
>
> static void tcg_out_brcond(TCGContext *s, TCGMemOp ext, TCGCond c, TCGArg a,
> - TCGArg b, bool b_const, int label)
> + TCGArg b, bool b_const, TCGLabel *l)
> {
> - TCGLabel *l = &s->labels[label];
> intptr_t offset;
> bool need_cmp;
>
> @@ -864,7 +861,7 @@ static void tcg_out_brcond(TCGContext *s, TCGMemOp ext,
> TCGCond c, TCGArg a,
> }
>
> if (!l->has_value) {
> - tcg_out_reloc(s, s->code_ptr, R_AARCH64_CONDBR19, label, 0);
> + tcg_out_reloc(s, s->code_ptr, R_AARCH64_CONDBR19, l, 0);
> offset = tcg_in32(s) >> 5;
> } else {
> offset = l->u.value_ptr - s->code_ptr;
> @@ -1272,7 +1269,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> break;
>
> case INDEX_op_br:
> - tcg_out_goto_label(s, a0);
> + tcg_out_goto_label(s, arg_label(a0));
> break;
>
> case INDEX_op_ld8u_i32:
> @@ -1495,7 +1492,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> a1 = (int32_t)a1;
> /* FALLTHRU */
> case INDEX_op_brcond_i64:
> - tcg_out_brcond(s, ext, a2, a0, a1, const_args[1], args[3]);
> + tcg_out_brcond(s, ext, a2, a0, a1, const_args[1],
> arg_label(args[3]));
> break;
>
> case INDEX_op_setcond_i32:
> diff --git a/tcg/arm/tcg-target.c b/tcg/arm/tcg-target.c
> index e40301c..01e6fbf 100644
> --- a/tcg/arm/tcg-target.c
> +++ b/tcg/arm/tcg-target.c
> @@ -1038,14 +1038,12 @@ static void tcg_out_call(TCGContext *s, tcg_insn_unit
> *addr)
> }
> }
>
> -static inline void tcg_out_goto_label(TCGContext *s, int cond, int
> label_index)
> +static inline void tcg_out_goto_label(TCGContext *s, int cond, TCGLabel *l)
> {
> - TCGLabel *l = &s->labels[label_index];
> -
> if (l->has_value) {
> tcg_out_goto(s, cond, l->u.value_ptr);
> } else {
> - tcg_out_reloc(s, s->code_ptr, R_ARM_PC24, label_index, 0);
> + tcg_out_reloc(s, s->code_ptr, R_ARM_PC24, l, 0);
> tcg_out_b_noaddr(s, cond);
> }
> }
> @@ -1657,7 +1655,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode
> opc,
> s->tb_next_offset[args[0]] = tcg_current_code_size(s);
> break;
> case INDEX_op_br:
> - tcg_out_goto_label(s, COND_AL, args[0]);
> + tcg_out_goto_label(s, COND_AL, arg_label(args[0]));
> break;
>
> case INDEX_op_ld8u_i32:
> @@ -1821,7 +1819,8 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode
> opc,
> case INDEX_op_brcond_i32:
> tcg_out_dat_rIN(s, COND_AL, ARITH_CMP, ARITH_CMN, 0,
> args[0], args[1], const_args[1]);
> - tcg_out_goto_label(s, tcg_cond_to_arm_cond[args[2]], args[3]);
> + tcg_out_goto_label(s, tcg_cond_to_arm_cond[args[2]],
> + arg_label(args[3]));
> break;
> case INDEX_op_brcond2_i32:
> /* The resulting conditions are:
> @@ -1836,7 +1835,8 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode
> opc,
> args[1], args[3], const_args[3]);
> tcg_out_dat_rIN(s, COND_EQ, ARITH_CMP, ARITH_CMN, 0,
> args[0], args[2], const_args[2]);
> - tcg_out_goto_label(s, tcg_cond_to_arm_cond[args[4]], args[5]);
> + tcg_out_goto_label(s, tcg_cond_to_arm_cond[args[4]],
> + arg_label(args[5]));
> break;
> case INDEX_op_setcond_i32:
> tcg_out_dat_rIN(s, COND_AL, ARITH_CMP, ARITH_CMN, 0,
> diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c
> index 1462843..ab63823 100644
> --- a/tcg/i386/tcg-target.c
> +++ b/tcg/i386/tcg-target.c
> @@ -853,10 +853,9 @@ static void tcg_out_addi(TCGContext *s, int reg,
> tcg_target_long val)
> }
>
> /* Use SMALL != 0 to force a short forward branch. */
> -static void tcg_out_jxx(TCGContext *s, int opc, int label_index, int small)
> +static void tcg_out_jxx(TCGContext *s, int opc, TCGLabel *l, int small)
> {
> int32_t val, val1;
> - TCGLabel *l = &s->labels[label_index];
>
> if (l->has_value) {
> val = tcg_pcrel_diff(s, l->u.value_ptr);
> @@ -886,7 +885,7 @@ static void tcg_out_jxx(TCGContext *s, int opc, int
> label_index, int small)
> } else {
> tcg_out8(s, OPC_JCC_short + opc);
> }
> - tcg_out_reloc(s, s->code_ptr, R_386_PC8, label_index, -1);
> + tcg_out_reloc(s, s->code_ptr, R_386_PC8, l, -1);
> s->code_ptr += 1;
> } else {
> if (opc == -1) {
> @@ -894,7 +893,7 @@ static void tcg_out_jxx(TCGContext *s, int opc, int
> label_index, int small)
> } else {
> tcg_out_opc(s, OPC_JCC_long + opc, 0, 0, 0);
> }
> - tcg_out_reloc(s, s->code_ptr, R_386_PC32, label_index, -4);
> + tcg_out_reloc(s, s->code_ptr, R_386_PC32, l, -4);
> s->code_ptr += 4;
> }
> }
> @@ -916,19 +915,19 @@ static void tcg_out_cmp(TCGContext *s, TCGArg arg1,
> TCGArg arg2,
>
> static void tcg_out_brcond32(TCGContext *s, TCGCond cond,
> TCGArg arg1, TCGArg arg2, int const_arg2,
> - int label_index, int small)
> + TCGLabel *label, int small)
> {
> tcg_out_cmp(s, arg1, arg2, const_arg2, 0);
> - tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index, small);
> + tcg_out_jxx(s, tcg_cond_to_jcc[cond], label, small);
> }
>
> #if TCG_TARGET_REG_BITS == 64
> static void tcg_out_brcond64(TCGContext *s, TCGCond cond,
> TCGArg arg1, TCGArg arg2, int const_arg2,
> - int label_index, int small)
> + TCGLabel *label, int small)
> {
> tcg_out_cmp(s, arg1, arg2, const_arg2, P_REXW);
> - tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index, small);
> + tcg_out_jxx(s, tcg_cond_to_jcc[cond], label, small);
> }
> #else
> /* XXX: we implement it at the target level to avoid having to
> @@ -936,76 +935,77 @@ static void tcg_out_brcond64(TCGContext *s, TCGCond
> cond,
> static void tcg_out_brcond2(TCGContext *s, const TCGArg *args,
> const int *const_args, int small)
> {
> - int label_next = label_arg(gen_new_label());
> + TCGLabel *label_next = gen_new_label();
> + TCGLabel *label_this = arg_label(args[5]);
>
> switch(args[4]) {
> case TCG_COND_EQ:
> tcg_out_brcond32(s, TCG_COND_NE, args[0], args[2], const_args[2],
> label_next, 1);
> tcg_out_brcond32(s, TCG_COND_EQ, args[1], args[3], const_args[3],
> - args[5], small);
> + label_this, small);
> break;
> case TCG_COND_NE:
> tcg_out_brcond32(s, TCG_COND_NE, args[0], args[2], const_args[2],
> - args[5], small);
> + label_this, small);
> tcg_out_brcond32(s, TCG_COND_NE, args[1], args[3], const_args[3],
> - args[5], small);
> + label_this, small);
> break;
> case TCG_COND_LT:
> tcg_out_brcond32(s, TCG_COND_LT, args[1], args[3], const_args[3],
> - args[5], small);
> + label_this, small);
> tcg_out_jxx(s, JCC_JNE, label_next, 1);
> tcg_out_brcond32(s, TCG_COND_LTU, args[0], args[2], const_args[2],
> - args[5], small);
> + label_this, small);
> break;
> case TCG_COND_LE:
> tcg_out_brcond32(s, TCG_COND_LT, args[1], args[3], const_args[3],
> - args[5], small);
> + label_this, small);
> tcg_out_jxx(s, JCC_JNE, label_next, 1);
> tcg_out_brcond32(s, TCG_COND_LEU, args[0], args[2], const_args[2],
> - args[5], small);
> + label_this, small);
> break;
> case TCG_COND_GT:
> tcg_out_brcond32(s, TCG_COND_GT, args[1], args[3], const_args[3],
> - args[5], small);
> + label_this, small);
> tcg_out_jxx(s, JCC_JNE, label_next, 1);
> tcg_out_brcond32(s, TCG_COND_GTU, args[0], args[2], const_args[2],
> - args[5], small);
> + label_this, small);
> break;
> case TCG_COND_GE:
> tcg_out_brcond32(s, TCG_COND_GT, args[1], args[3], const_args[3],
> - args[5], small);
> + label_this, small);
> tcg_out_jxx(s, JCC_JNE, label_next, 1);
> tcg_out_brcond32(s, TCG_COND_GEU, args[0], args[2], const_args[2],
> - args[5], small);
> + label_this, small);
> break;
> case TCG_COND_LTU:
> tcg_out_brcond32(s, TCG_COND_LTU, args[1], args[3], const_args[3],
> - args[5], small);
> + label_this, small);
> tcg_out_jxx(s, JCC_JNE, label_next, 1);
> tcg_out_brcond32(s, TCG_COND_LTU, args[0], args[2], const_args[2],
> - args[5], small);
> + label_this, small);
> break;
> case TCG_COND_LEU:
> tcg_out_brcond32(s, TCG_COND_LTU, args[1], args[3], const_args[3],
> - args[5], small);
> + label_this, small);
> tcg_out_jxx(s, JCC_JNE, label_next, 1);
> tcg_out_brcond32(s, TCG_COND_LEU, args[0], args[2], const_args[2],
> - args[5], small);
> + label_this, small);
> break;
> case TCG_COND_GTU:
> tcg_out_brcond32(s, TCG_COND_GTU, args[1], args[3], const_args[3],
> - args[5], small);
> + label_this, small);
> tcg_out_jxx(s, JCC_JNE, label_next, 1);
> tcg_out_brcond32(s, TCG_COND_GTU, args[0], args[2], const_args[2],
> - args[5], small);
> + label_this, small);
> break;
> case TCG_COND_GEU:
> tcg_out_brcond32(s, TCG_COND_GTU, args[1], args[3], const_args[3],
> - args[5], small);
> + label_this, small);
> tcg_out_jxx(s, JCC_JNE, label_next, 1);
> tcg_out_brcond32(s, TCG_COND_GEU, args[0], args[2], const_args[2],
> - args[5], small);
> + label_this, small);
> break;
> default:
> tcg_abort();
> @@ -1035,7 +1035,7 @@ static void tcg_out_setcond2(TCGContext *s, const
> TCGArg *args,
> const int *const_args)
> {
> TCGArg new_args[6];
> - int label_true, label_over;
> + TCGLabel *label_true, *label_over;
>
> memcpy(new_args, args+1, 5*sizeof(TCGArg));
>
> @@ -1044,10 +1044,10 @@ static void tcg_out_setcond2(TCGContext *s, const
> TCGArg *args,
> || (!const_args[4] && args[0] == args[4])) {
> /* When the destination overlaps with one of the argument
> registers, don't do anything tricky. */
> - label_true = label_arg(gen_new_label());
> - label_over = label_arg(gen_new_label());
> + label_true = gen_new_label();
> + label_over = gen_new_label();
>
> - new_args[5] = label_true;
> + new_args[5] = label_arg(label_true);
> tcg_out_brcond2(s, new_args, const_args+1, 1);
>
> tcg_out_movi(s, TCG_TYPE_I32, args[0], 0);
> @@ -1063,9 +1063,9 @@ static void tcg_out_setcond2(TCGContext *s, const
> TCGArg *args,
>
> tcg_out_movi(s, TCG_TYPE_I32, args[0], 0);
>
> - label_over = label_arg(gen_new_label());
> + label_over = gen_new_label();
> new_args[4] = tcg_invert_cond(new_args[4]);
> - new_args[5] = label_over;
> + new_args[5] = label_arg(label_over);
> tcg_out_brcond2(s, new_args, const_args+1, 1);
>
> tgen_arithi(s, ARITH_ADD, args[0], 1, 0);
> @@ -1082,7 +1082,7 @@ static void tcg_out_movcond32(TCGContext *s, TCGCond
> cond, TCGArg dest,
> if (have_cmov) {
> tcg_out_modrm(s, OPC_CMOVCC | tcg_cond_to_jcc[cond], dest, v1);
> } else {
> - int over = label_arg(gen_new_label());
> + TCGLabel *over = gen_new_label();
> tcg_out_jxx(s, tcg_cond_to_jcc[tcg_invert_cond(cond)], over, 1);
> tcg_out_mov(s, TCG_TYPE_I32, dest, v1);
> tcg_out_label(s, over, s->code_ptr);
> @@ -1748,7 +1748,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode
> opc,
> s->tb_next_offset[args[0]] = tcg_current_code_size(s);
> break;
> case INDEX_op_br:
> - tcg_out_jxx(s, JCC_JMP, args[0], 0);
> + tcg_out_jxx(s, JCC_JMP, arg_label(args[0]), 0);
> break;
> OP_32_64(ld8u):
> /* Note that we can ignore REXW for the zero-extend to 64-bit. */
> @@ -1909,7 +1909,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode
> opc,
>
> case INDEX_op_brcond_i32:
> tcg_out_brcond32(s, args[2], args[0], args[1], const_args[1],
> - args[3], 0);
> + arg_label(args[3]), 0);
> break;
> case INDEX_op_setcond_i32:
> tcg_out_setcond32(s, args[3], args[0], args[1],
> @@ -2017,7 +2017,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode
> opc,
>
> case INDEX_op_brcond_i64:
> tcg_out_brcond64(s, args[2], args[0], args[1], const_args[1],
> - args[3], 0);
> + arg_label(args[3]), 0);
> break;
> case INDEX_op_setcond_i64:
> tcg_out_setcond64(s, args[3], args[0], args[1],
> diff --git a/tcg/ia64/tcg-target.c b/tcg/ia64/tcg-target.c
> index 1c01fd9..25f207d 100644
> --- a/tcg/ia64/tcg-target.c
> +++ b/tcg/ia64/tcg-target.c
> @@ -827,9 +827,8 @@ static inline void tcg_out_movi(TCGContext *s, TCGType
> type,
> tcg_opc_x2 (TCG_REG_P0, OPC_MOVL_X2, reg, arg));
> }
>
> -static void tcg_out_br(TCGContext *s, int label_index)
> +static void tcg_out_br(TCGContext *s, TCGLabel *l)
> {
> - TCGLabel *l = &s->labels[label_index];
> uint64_t imm;
>
> /* We pay attention here to not modify the branch target by reading
> @@ -839,7 +838,7 @@ static void tcg_out_br(TCGContext *s, int label_index)
> imm = l->u.value_ptr - s->code_ptr;
> } else {
> imm = get_reloc_pcrel21b_slot2(s->code_ptr);
> - tcg_out_reloc(s, s->code_ptr, R_IA64_PCREL21B, label_index, 0);
> + tcg_out_reloc(s, s->code_ptr, R_IA64_PCREL21B, l, 0);
> }
>
> tcg_out_bundle(s, mmB,
> @@ -1424,9 +1423,8 @@ static inline uint64_t tcg_opc_cmp_a(int qp, TCGCond
> cond, TCGArg arg1,
> }
>
> static inline void tcg_out_brcond(TCGContext *s, TCGCond cond, TCGReg arg1,
> - TCGReg arg2, int label_index, int cmp4)
> + TCGReg arg2, TCGLabel *l, int cmp4)
> {
> - TCGLabel *l = &s->labels[label_index];
> uint64_t imm;
>
> /* We pay attention here to not modify the branch target by reading
> @@ -1436,7 +1434,7 @@ static inline void tcg_out_brcond(TCGContext *s,
> TCGCond cond, TCGReg arg1,
> imm = l->u.value_ptr - s->code_ptr;
> } else {
> imm = get_reloc_pcrel21b_slot2(s->code_ptr);
> - tcg_out_reloc(s, s->code_ptr, R_IA64_PCREL21B, label_index, 0);
> + tcg_out_reloc(s, s->code_ptr, R_IA64_PCREL21B, l, 0);
> }
>
> tcg_out_bundle(s, miB,
> @@ -1990,7 +1988,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode
> opc,
> tcg_out_exit_tb(s, args[0]);
> break;
> case INDEX_op_br:
> - tcg_out_br(s, args[0]);
> + tcg_out_br(s, arg_label(args[0]));
> break;
> case INDEX_op_goto_tb:
> tcg_out_goto_tb(s, args[0]);
> @@ -2172,10 +2170,10 @@ static inline void tcg_out_op(TCGContext *s,
> TCGOpcode opc,
> break;
>
> case INDEX_op_brcond_i32:
> - tcg_out_brcond(s, args[2], args[0], args[1], args[3], 1);
> + tcg_out_brcond(s, args[2], args[0], args[1], arg_label(args[3]), 1);
> break;
> case INDEX_op_brcond_i64:
> - tcg_out_brcond(s, args[2], args[0], args[1], args[3], 0);
> + tcg_out_brcond(s, args[2], args[0], args[1], arg_label(args[3]), 0);
> break;
> case INDEX_op_setcond_i32:
> tcg_out_setcond(s, args[3], args[0], args[1], args[2], 1);
> diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c
> index b7f4d67..5414b83 100644
> --- a/tcg/mips/tcg-target.c
> +++ b/tcg/mips/tcg-target.c
> @@ -635,7 +635,7 @@ static void tcg_out_setcond(TCGContext *s, TCGCond cond,
> TCGReg ret,
> }
>
> static void tcg_out_brcond(TCGContext *s, TCGCond cond, TCGReg arg1,
> - TCGReg arg2, int label_index)
> + TCGReg arg2, TCGLabel *l)
> {
> static const MIPSInsn b_zero[16] = {
> [TCG_COND_LT] = OPC_BLTZ,
> @@ -644,7 +644,6 @@ static void tcg_out_brcond(TCGContext *s, TCGCond cond,
> TCGReg arg1,
> [TCG_COND_GE] = OPC_BGEZ,
> };
>
> - TCGLabel *l;
> MIPSInsn s_opc = OPC_SLTU;
> MIPSInsn b_opc;
> int cmp_map;
> @@ -692,11 +691,10 @@ static void tcg_out_brcond(TCGContext *s, TCGCond cond,
> TCGReg arg1,
> }
>
> tcg_out_opc_br(s, b_opc, arg1, arg2);
> - l = &s->labels[label_index];
> if (l->has_value) {
> reloc_pc16(s->code_ptr - 1, l->u.value_ptr);
> } else {
> - tcg_out_reloc(s, s->code_ptr - 1, R_MIPS_PC16, label_index, 0);
> + tcg_out_reloc(s, s->code_ptr - 1, R_MIPS_PC16, l, 0);
> }
> tcg_out_nop(s);
> }
> @@ -765,7 +763,7 @@ static void tcg_out_setcond2(TCGContext *s, TCGCond cond,
> TCGReg ret,
> }
>
> static void tcg_out_brcond2(TCGContext *s, TCGCond cond, TCGReg al, TCGReg
> ah,
> - TCGReg bl, TCGReg bh, int label_index)
> + TCGReg bl, TCGReg bh, TCGLabel *l)
> {
> TCGCond b_cond = TCG_COND_NE;
> TCGReg tmp = TCG_TMP1;
> @@ -790,7 +788,7 @@ static void tcg_out_brcond2(TCGContext *s, TCGCond cond,
> TCGReg al, TCGReg ah,
> break;
> }
>
> - tcg_out_brcond(s, b_cond, tmp, TCG_REG_ZERO, label_index);
> + tcg_out_brcond(s, b_cond, tmp, TCG_REG_ZERO, l);
> }
>
> static void tcg_out_movcond(TCGContext *s, TCGCond cond, TCGReg ret,
> @@ -1367,7 +1365,8 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode
> opc,
> s->tb_next_offset[a0] = tcg_current_code_size(s);
> break;
> case INDEX_op_br:
> - tcg_out_brcond(s, TCG_COND_EQ, TCG_REG_ZERO, TCG_REG_ZERO, a0);
> + tcg_out_brcond(s, TCG_COND_EQ, TCG_REG_ZERO, TCG_REG_ZERO,
> + arg_label(a0));
> break;
>
> case INDEX_op_ld8u_i32:
> @@ -1527,10 +1526,10 @@ static inline void tcg_out_op(TCGContext *s,
> TCGOpcode opc,
> break;
>
> case INDEX_op_brcond_i32:
> - tcg_out_brcond(s, a2, a0, a1, args[3]);
> + tcg_out_brcond(s, a2, a0, a1, arg_label(args[3]));
> break;
> case INDEX_op_brcond2_i32:
> - tcg_out_brcond2(s, args[4], a0, a1, a2, args[3], args[5]);
> + tcg_out_brcond2(s, args[4], a0, a1, a2, args[3], arg_label(args[5]));
> break;
>
> case INDEX_op_movcond_i32:
> diff --git a/tcg/ppc/tcg-target.c b/tcg/ppc/tcg-target.c
> index 203027e..36fd314 100644
> --- a/tcg/ppc/tcg-target.c
> +++ b/tcg/ppc/tcg-target.c
> @@ -1100,24 +1100,22 @@ static void tcg_out_setcond(TCGContext *s, TCGType
> type, TCGCond cond,
> }
> }
>
> -static void tcg_out_bc(TCGContext *s, int bc, int label_index)
> +static void tcg_out_bc(TCGContext *s, int bc, TCGLabel *l)
> {
> - TCGLabel *l = &s->labels[label_index];
> -
> if (l->has_value) {
> tcg_out32(s, bc | reloc_pc14_val(s->code_ptr, l->u.value_ptr));
> } else {
> - tcg_out_reloc(s, s->code_ptr, R_PPC_REL14, label_index, 0);
> + tcg_out_reloc(s, s->code_ptr, R_PPC_REL14, l, 0);
> tcg_out_bc_noaddr(s, bc);
> }
> }
>
> static void tcg_out_brcond(TCGContext *s, TCGCond cond,
> TCGArg arg1, TCGArg arg2, int const_arg2,
> - int label_index, TCGType type)
> + TCGLabel *l, TCGType type)
> {
> tcg_out_cmp(s, cond, arg1, arg2, const_arg2, 7, type);
> - tcg_out_bc(s, tcg_to_bc[cond], label_index);
> + tcg_out_bc(s, tcg_to_bc[cond], l);
> }
>
> static void tcg_out_movcond(TCGContext *s, TCGType type, TCGCond cond,
> @@ -1242,7 +1240,7 @@ static void tcg_out_brcond2 (TCGContext *s, const
> TCGArg *args,
> const int *const_args)
> {
> tcg_out_cmp2(s, args, const_args);
> - tcg_out_bc(s, BC | BI(7, CR_EQ) | BO_COND_TRUE, args[5]);
> + tcg_out_bc(s, BC | BI(7, CR_EQ) | BO_COND_TRUE, arg_label(args[5]));
> }
>
> void ppc_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr)
> @@ -1866,12 +1864,12 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> const TCGArg *args,
> break;
> case INDEX_op_br:
> {
> - TCGLabel *l = &s->labels[args[0]];
> + TCGLabel *l = arg_label(args[0]);
>
> if (l->has_value) {
> tcg_out_b(s, 0, l->u.value_ptr);
> } else {
> - tcg_out_reloc(s, s->code_ptr, R_PPC_REL24, args[0], 0);
> + tcg_out_reloc(s, s->code_ptr, R_PPC_REL24, l, 0);
> tcg_out_b_noaddr(s, B);
> }
> }
> @@ -2079,11 +2077,11 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> const TCGArg *args,
>
> case INDEX_op_brcond_i32:
> tcg_out_brcond(s, args[2], args[0], args[1], const_args[1],
> - args[3], TCG_TYPE_I32);
> + arg_label(args[3]), TCG_TYPE_I32);
> break;
> case INDEX_op_brcond_i64:
> tcg_out_brcond(s, args[2], args[0], args[1], const_args[1],
> - args[3], TCG_TYPE_I64);
> + arg_label(args[3]), TCG_TYPE_I64);
> break;
> case INDEX_op_brcond2_i32:
> tcg_out_brcond2(s, args, const_args);
> diff --git a/tcg/s390/tcg-target.c b/tcg/s390/tcg-target.c
> index 63e9c82..be984f5 100644
> --- a/tcg/s390/tcg-target.c
> +++ b/tcg/s390/tcg-target.c
> @@ -1274,26 +1274,24 @@ static void tgen_gotoi(TCGContext *s, int cc,
> tcg_insn_unit *dest)
> }
> }
>
> -static void tgen_branch(TCGContext *s, int cc, int labelno)
> +static void tgen_branch(TCGContext *s, int cc, TCGLabel *l)
> {
> - TCGLabel* l = &s->labels[labelno];
> if (l->has_value) {
> tgen_gotoi(s, cc, l->u.value_ptr);
> } else if (USE_LONG_BRANCHES) {
> tcg_out16(s, RIL_BRCL | (cc << 4));
> - tcg_out_reloc(s, s->code_ptr, R_390_PC32DBL, labelno, -2);
> + tcg_out_reloc(s, s->code_ptr, R_390_PC32DBL, l, -2);
> s->code_ptr += 2;
> } else {
> tcg_out16(s, RI_BRC | (cc << 4));
> - tcg_out_reloc(s, s->code_ptr, R_390_PC16DBL, labelno, -2);
> + tcg_out_reloc(s, s->code_ptr, R_390_PC16DBL, l, -2);
> s->code_ptr += 1;
> }
> }
>
> static void tgen_compare_branch(TCGContext *s, S390Opcode opc, int cc,
> - TCGReg r1, TCGReg r2, int labelno)
> + TCGReg r1, TCGReg r2, TCGLabel *l)
> {
> - TCGLabel* l = &s->labels[labelno];
> intptr_t off;
>
> if (l->has_value) {
> @@ -1301,7 +1299,7 @@ static void tgen_compare_branch(TCGContext *s,
> S390Opcode opc, int cc,
> } else {
> /* We need to keep the offset unchanged for retranslation. */
> off = s->code_ptr[1];
> - tcg_out_reloc(s, s->code_ptr + 1, R_390_PC16DBL, labelno, -2);
> + tcg_out_reloc(s, s->code_ptr + 1, R_390_PC16DBL, l, -2);
> }
>
> tcg_out16(s, (opc & 0xff00) | (r1 << 4) | r2);
> @@ -1310,9 +1308,8 @@ static void tgen_compare_branch(TCGContext *s,
> S390Opcode opc, int cc,
> }
>
> static void tgen_compare_imm_branch(TCGContext *s, S390Opcode opc, int cc,
> - TCGReg r1, int i2, int labelno)
> + TCGReg r1, int i2, TCGLabel *l)
> {
> - TCGLabel* l = &s->labels[labelno];
> tcg_target_long off;
>
> if (l->has_value) {
> @@ -1320,7 +1317,7 @@ static void tgen_compare_imm_branch(TCGContext *s,
> S390Opcode opc, int cc,
> } else {
> /* We need to keep the offset unchanged for retranslation. */
> off = s->code_ptr[1];
> - tcg_out_reloc(s, s->code_ptr + 1, R_390_PC16DBL, labelno, -2);
> + tcg_out_reloc(s, s->code_ptr + 1, R_390_PC16DBL, l, -2);
> }
>
> tcg_out16(s, (opc & 0xff00) | (r1 << 4) | cc);
> @@ -1329,7 +1326,7 @@ static void tgen_compare_imm_branch(TCGContext *s,
> S390Opcode opc, int cc,
> }
>
> static void tgen_brcond(TCGContext *s, TCGType type, TCGCond c,
> - TCGReg r1, TCGArg c2, int c2const, int labelno)
> + TCGReg r1, TCGArg c2, int c2const, TCGLabel *l)
> {
> int cc;
>
> @@ -1344,7 +1341,7 @@ static void tgen_brcond(TCGContext *s, TCGType type,
> TCGCond c,
> opc = (type == TCG_TYPE_I32
> ? (is_unsigned ? RIE_CLRJ : RIE_CRJ)
> : (is_unsigned ? RIE_CLGRJ : RIE_CGRJ));
> - tgen_compare_branch(s, opc, cc, r1, c2, labelno);
> + tgen_compare_branch(s, opc, cc, r1, c2, l);
> return;
> }
>
> @@ -1370,13 +1367,13 @@ static void tgen_brcond(TCGContext *s, TCGType type,
> TCGCond c,
> }
> }
> if (in_range) {
> - tgen_compare_imm_branch(s, opc, cc, r1, c2, labelno);
> + tgen_compare_imm_branch(s, opc, cc, r1, c2, l);
> return;
> }
> }
>
> cc = tgen_cmp(s, type, c, r1, c2, c2const);
> - tgen_branch(s, cc, labelno);
> + tgen_branch(s, cc, l);
> }
>
> static void tcg_out_call(TCGContext *s, tcg_insn_unit *dest)
> @@ -1904,12 +1901,12 @@ static inline void tcg_out_op(TCGContext *s,
> TCGOpcode opc,
> break;
>
> case INDEX_op_br:
> - tgen_branch(s, S390_CC_ALWAYS, args[0]);
> + tgen_branch(s, S390_CC_ALWAYS, arg_label(args[0]));
> break;
>
> case INDEX_op_brcond_i32:
> tgen_brcond(s, TCG_TYPE_I32, args[2], args[0],
> - args[1], const_args[1], args[3]);
> + args[1], const_args[1], arg_label(args[3]));
> break;
> case INDEX_op_setcond_i32:
> tgen_setcond(s, TCG_TYPE_I32, args[3], args[0], args[1],
> @@ -2126,7 +2123,7 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode
> opc,
>
> case INDEX_op_brcond_i64:
> tgen_brcond(s, TCG_TYPE_I64, args[2], args[0],
> - args[1], const_args[1], args[3]);
> + args[1], const_args[1], arg_label(args[3]));
> break;
> case INDEX_op_setcond_i64:
> tgen_setcond(s, TCG_TYPE_I64, args[3], args[0], args[1],
> diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c
> index 0c4b028..f9b616f 100644
> --- a/tcg/sparc/tcg-target.c
> +++ b/tcg/sparc/tcg-target.c
> @@ -569,9 +569,8 @@ static void tcg_out_bpcc0(TCGContext *s, int scond, int
> flags, int off19)
> tcg_out32(s, INSN_OP(0) | INSN_OP2(1) | INSN_COND(scond) | flags |
> off19);
> }
>
> -static void tcg_out_bpcc(TCGContext *s, int scond, int flags, int label)
> +static void tcg_out_bpcc(TCGContext *s, int scond, int flags, TCGLabel *l)
> {
> - TCGLabel *l = &s->labels[label];
> int off19;
>
> if (l->has_value) {
> @@ -579,7 +578,7 @@ static void tcg_out_bpcc(TCGContext *s, int scond, int
> flags, int label)
> } else {
> /* Make sure to preserve destinations during retranslation. */
> off19 = *s->code_ptr & INSN_OFF19(-1);
> - tcg_out_reloc(s, s->code_ptr, R_SPARC_WDISP19, label, 0);
> + tcg_out_reloc(s, s->code_ptr, R_SPARC_WDISP19, l, 0);
> }
> tcg_out_bpcc0(s, scond, flags, off19);
> }
> @@ -590,10 +589,10 @@ static void tcg_out_cmp(TCGContext *s, TCGReg c1,
> int32_t c2, int c2const)
> }
>
> static void tcg_out_brcond_i32(TCGContext *s, TCGCond cond, TCGReg arg1,
> - int32_t arg2, int const_arg2, int label)
> + int32_t arg2, int const_arg2, TCGLabel *l)
> {
> tcg_out_cmp(s, arg1, arg2, const_arg2);
> - tcg_out_bpcc(s, tcg_cond_to_bcond[cond], BPCC_ICC | BPCC_PT, label);
> + tcg_out_bpcc(s, tcg_cond_to_bcond[cond], BPCC_ICC | BPCC_PT, l);
> tcg_out_nop(s);
> }
>
> @@ -614,11 +613,10 @@ static void tcg_out_movcond_i32(TCGContext *s, TCGCond
> cond, TCGReg ret,
> }
>
> static void tcg_out_brcond_i64(TCGContext *s, TCGCond cond, TCGReg arg1,
> - int32_t arg2, int const_arg2, int label)
> + int32_t arg2, int const_arg2, TCGLabel *l)
> {
> /* For 64-bit signed comparisons vs zero, we can avoid the compare. */
> if (arg2 == 0 && !is_unsigned_cond(cond)) {
> - TCGLabel *l = &s->labels[label];
> int off16;
>
> if (l->has_value) {
> @@ -626,13 +624,13 @@ static void tcg_out_brcond_i64(TCGContext *s, TCGCond
> cond, TCGReg arg1,
> } else {
> /* Make sure to preserve destinations during retranslation. */
> off16 = *s->code_ptr & INSN_OFF16(-1);
> - tcg_out_reloc(s, s->code_ptr, R_SPARC_WDISP16, label, 0);
> + tcg_out_reloc(s, s->code_ptr, R_SPARC_WDISP16, l, 0);
> }
> tcg_out32(s, INSN_OP(0) | INSN_OP2(3) | BPR_PT | INSN_RS1(arg1)
> | INSN_COND(tcg_cond_to_rcond[cond]) | off16);
> } else {
> tcg_out_cmp(s, arg1, arg2, const_arg2);
> - tcg_out_bpcc(s, tcg_cond_to_bcond[cond], BPCC_XCC | BPCC_PT, label);
> + tcg_out_bpcc(s, tcg_cond_to_bcond[cond], BPCC_XCC | BPCC_PT, l);
> }
> tcg_out_nop(s);
> }
> @@ -1243,7 +1241,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> s->tb_next_offset[a0] = tcg_current_code_size(s);
> break;
> case INDEX_op_br:
> - tcg_out_bpcc(s, COND_A, BPCC_PT, a0);
> + tcg_out_bpcc(s, COND_A, BPCC_PT, arg_label(a0));
> tcg_out_nop(s);
> break;
>
> @@ -1329,7 +1327,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> break;
>
> case INDEX_op_brcond_i32:
> - tcg_out_brcond_i32(s, a2, a0, a1, const_args[1], args[3]);
> + tcg_out_brcond_i32(s, a2, a0, a1, const_args[1], arg_label(args[3]));
> break;
> case INDEX_op_setcond_i32:
> tcg_out_setcond_i32(s, args[3], a0, a1, a2, c2);
> @@ -1420,7 +1418,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> break;
>
> case INDEX_op_brcond_i64:
> - tcg_out_brcond_i64(s, a2, a0, a1, const_args[1], args[3]);
> + tcg_out_brcond_i64(s, a2, a0, a1, const_args[1], arg_label(args[3]));
> break;
> case INDEX_op_setcond_i64:
> tcg_out_setcond_i64(s, args[3], a0, a1, a2, c2);
> diff --git a/tcg/tcg.c b/tcg/tcg.c
> index 751545e..97aa512 100644
> --- a/tcg/tcg.c
> +++ b/tcg/tcg.c
> @@ -208,12 +208,10 @@ static __attribute__((unused)) inline void
> tcg_patch64(tcg_insn_unit *p,
> /* label relocation processing */
>
> static void tcg_out_reloc(TCGContext *s, tcg_insn_unit *code_ptr, int type,
> - int label_index, intptr_t addend)
> + TCGLabel *l, intptr_t addend)
> {
> - TCGLabel *l;
> TCGRelocation *r;
>
> - l = &s->labels[label_index];
> if (l->has_value) {
> /* FIXME: This may break relocations on RISC targets that
> modify instruction fields in place. The caller may not have
> @@ -230,9 +228,8 @@ static void tcg_out_reloc(TCGContext *s, tcg_insn_unit
> *code_ptr, int type,
> }
> }
>
> -static void tcg_out_label(TCGContext *s, int label_index, tcg_insn_unit *ptr)
> +static void tcg_out_label(TCGContext *s, TCGLabel *l, tcg_insn_unit *ptr)
> {
> - TCGLabel *l = &s->labels[label_index];
> intptr_t value = (intptr_t)ptr;
> TCGRelocation *r;
>
> @@ -2333,7 +2330,7 @@ static inline int tcg_gen_code_common(TCGContext *s,
> break;
> case INDEX_op_set_label:
> tcg_reg_alloc_bb_end(s, s->reserved_regs);
> - tcg_out_label(s, args[0], s->code_ptr);
> + tcg_out_label(s, arg_label(args[0]), s->code_ptr);
> break;
> case INDEX_op_call:
> tcg_reg_alloc_call(s, op->callo, op->calli, args,
> diff --git a/tcg/tci/tcg-target.c b/tcg/tci/tcg-target.c
> index 03a7b46..fb2339d 100644
> --- a/tcg/tci/tcg-target.c
> +++ b/tcg/tci/tcg-target.c
> @@ -460,14 +460,13 @@ static void tcg_out_ri64(TCGContext *s, int const_arg,
> TCGArg arg)
> #endif
>
> /* Write label. */
> -static void tci_out_label(TCGContext *s, TCGArg arg)
> +static void tci_out_label(TCGContext *s, TCGLabel *label)
> {
> - TCGLabel *label = &s->labels[arg];
> if (label->has_value) {
> tcg_out_i(s, label->u.value);
> assert(label->u.value);
> } else {
> - tcg_out_reloc(s, s->code_ptr, sizeof(tcg_target_ulong), arg, 0);
> + tcg_out_reloc(s, s->code_ptr, sizeof(tcg_target_ulong), label, 0);
> s->code_ptr += sizeof(tcg_target_ulong);
> }
> }
> @@ -565,7 +564,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> const TCGArg *args,
> s->tb_next_offset[args[0]] = tcg_current_code_size(s);
> break;
> case INDEX_op_br:
> - tci_out_label(s, args[0]);
> + tci_out_label(s, arg_label(args[0]));
> break;
> case INDEX_op_setcond_i32:
> tcg_out_r(s, args[0]);
> @@ -689,7 +688,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> const TCGArg *args,
> tcg_out_r(s, args[0]);
> tcg_out_ri64(s, const_args[1], args[1]);
> tcg_out8(s, args[2]); /* condition */
> - tci_out_label(s, args[3]);
> + tci_out_label(s, arg_label(args[3]));
> break;
> case INDEX_op_bswap16_i64: /* Optional (TCG_TARGET_HAS_bswap16_i64). */
> case INDEX_op_bswap32_i64: /* Optional (TCG_TARGET_HAS_bswap32_i64). */
> @@ -742,7 +741,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> const TCGArg *args,
> tcg_out_ri32(s, const_args[2], args[2]);
> tcg_out_ri32(s, const_args[3], args[3]);
> tcg_out8(s, args[4]); /* condition */
> - tci_out_label(s, args[5]);
> + tci_out_label(s, arg_label(args[5]));
> break;
> case INDEX_op_mulu2_i32:
> tcg_out_r(s, args[0]);
> @@ -755,7 +754,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> const TCGArg *args,
> tcg_out_r(s, args[0]);
> tcg_out_ri32(s, const_args[1], args[1]);
> tcg_out8(s, args[2]); /* condition */
> - tci_out_label(s, args[3]);
> + tci_out_label(s, arg_label(args[3]));
> break;
> case INDEX_op_qemu_ld_i32:
> tcg_out_r(s, *args++);
>
- [Qemu-devel] [PATCH 0/5] Use tcg_malloc more, Richard Henderson, 2015/02/13
- [Qemu-devel] [PATCH 2/5] tcg-ia64: Use tcg_malloc to allocate TCGLabelQemuLdst, Richard Henderson, 2015/02/13
- [Qemu-devel] [PATCH 5/5] tcg: Use tcg_malloc to allocate TCGLabel, Richard Henderson, 2015/02/13
- [Qemu-devel] [PATCH 1/5] tcg: Use tcg_malloc to allocate TCGLabelQemuLdst, Richard Henderson, 2015/02/13
- [Qemu-devel] [PATCH 4/5] tcg: Change generator-side labels to a pointer, Richard Henderson, 2015/02/13
- Re: [Qemu-devel] [PATCH 4/5] tcg: Change generator-side labels to a pointer,
Claudio Fontana <=
- [Qemu-devel] [PATCH 3/5] tcg: Change translator-side labels to a pointer, Richard Henderson, 2015/02/13
- Re: [Qemu-devel] [PATCH 0/5] Use tcg_malloc more, Bastian Koppelmann, 2015/02/16