All of lore.kernel.org
 help / color / mirror / Atom feed
From: Claudio Fontana <claudio.fontana@huawei.com>
To: Richard Henderson <rth@twiddle.net>, qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org,
	Claudio Fontana <claudio.fontana@gmail.com>,
	Stefan Weil <sw@weilnetz.de>, Blue Swirl <blauwirbel@gmail.com>,
	kbastian@mail.uni-paderborn.de,
	Aurelien Jarno <aurelien@aurel32.net>
Subject: Re: [Qemu-devel] [PATCH 4/5] tcg: Change generator-side labels to a pointer
Date: Sat, 14 Feb 2015 13:26:58 +0100	[thread overview]
Message-ID: <54DF3F12.9000908@huawei.com> (raw)
In-Reply-To: <1423883536-6809-5-git-send-email-rth@twiddle.net>

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 <claudio.fontana@gmail.com>
> Cc: Andrzej Zaborowski <balrogg@gmail.com>
> Cc: Peter Maydell <peter.maydell@linaro.org>
> Cc: Aurelien Jarno <aurelien@aurel32.net>
> Cc: Blue Swirl <blauwirbel@gmail.com>
> Cc: Stefan Weil <sw@weilnetz.de>
> Signed-off-by: Richard Henderson <rth@twiddle.net>
> ---
> 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 <claudio.fontana@huawei.com>
Tested-by: Claudio Fontana <claudio.fontana@huawei.com>

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++);
> 

  reply	other threads:[~2015-02-14 12:27 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-14  3:12 [Qemu-devel] [PATCH 0/5] Use tcg_malloc more Richard Henderson
2015-02-14  3:12 ` [Qemu-devel] [PATCH 1/5] tcg: Use tcg_malloc to allocate TCGLabelQemuLdst Richard Henderson
2015-02-14  3:12 ` [Qemu-devel] [PATCH 2/5] tcg-ia64: " Richard Henderson
2015-02-14  3:12 ` [Qemu-devel] [PATCH 3/5] tcg: Change translator-side labels to a pointer Richard Henderson
2015-02-14  3:12 ` [Qemu-devel] [PATCH 4/5] tcg: Change generator-side " Richard Henderson
2015-02-14 12:26   ` Claudio Fontana [this message]
2015-02-14  3:12 ` [Qemu-devel] [PATCH 5/5] tcg: Use tcg_malloc to allocate TCGLabel Richard Henderson
2015-02-16 16:01 ` [Qemu-devel] [PATCH 0/5] Use tcg_malloc more Bastian Koppelmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=54DF3F12.9000908@huawei.com \
    --to=claudio.fontana@huawei.com \
    --cc=aurelien@aurel32.net \
    --cc=blauwirbel@gmail.com \
    --cc=claudio.fontana@gmail.com \
    --cc=kbastian@mail.uni-paderborn.de \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=sw@weilnetz.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.