From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NLbBi-00056X-Gp for qemu-devel@nongnu.org; Fri, 18 Dec 2009 06:40:02 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NLbBd-00053u-HF for qemu-devel@nongnu.org; Fri, 18 Dec 2009 06:40:02 -0500 Received: from [199.232.76.173] (port=46977 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NLbBd-00053f-9D for qemu-devel@nongnu.org; Fri, 18 Dec 2009 06:39:57 -0500 Received: from mail-pw0-f43.google.com ([209.85.160.43]:37804) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NLbBc-0007TB-Jx for qemu-devel@nongnu.org; Fri, 18 Dec 2009 06:39:57 -0500 Received: by pwj11 with SMTP id 11so2029679pwj.2 for ; Fri, 18 Dec 2009 03:39:54 -0800 (PST) MIME-Version: 1.0 In-Reply-To: <89dbe5fc9e003225157911e8ad8b19b73cae7177.1261078375.git.rth@twiddle.net> References: <761ea48b0912170620l534dcb02m8ea6b59524d76dbe@mail.gmail.com> <89dbe5fc9e003225157911e8ad8b19b73cae7177.1261078375.git.rth@twiddle.net> Date: Fri, 18 Dec 2009 12:39:54 +0100 Message-ID: <761ea48b0912180339p111e052cuca152598ef86dc0e@mail.gmail.com> From: Laurent Desnogues Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] Re: [PATCH 4/6] tcg-i386: Implement small forward branches. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Richard Henderson Cc: qemu-devel@nongnu.org On Thu, Dec 17, 2009 at 6:55 PM, Richard Henderson wrote: > There are places, like brcond2, where we know that the destination > of a forward branch will be within 127 bytes. =A0Add the R_386_PC8 > relocation type to support this, and add a flag to tcg_out_jxx to > generate it. =A0Set the flag in the small forward branches in brcond2. > > Signed-off-by: Richard Henderson > --- > =A0elf.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A02 ++ > =A0tcg/i386/tcg-target.c | =A0 36 +++++++++++++++++++++++++----------- > =A02 files changed, 27 insertions(+), 11 deletions(-) > > diff --git a/elf.h b/elf.h > index 11674d7..c84c8ab 100644 > --- a/elf.h > +++ b/elf.h > @@ -243,6 +243,8 @@ typedef struct { > =A0#define R_386_GOTOFF =A0 9 > =A0#define R_386_GOTPC =A0 =A010 > =A0#define R_386_NUM =A0 =A0 =A011 > +/* Not a dynamic reloc, so not included in R_386_NUM. =A0Used in TCG. = =A0*/ > +#define R_386_PC8 =A0 =A0 =A023 > > =A0#define R_MIPS_NONE =A0 =A0 =A0 =A0 =A0 =A00 > =A0#define R_MIPS_16 =A0 =A0 =A0 =A0 =A0 =A0 =A01 > diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c > index 972b102..cc3d28f 100644 > --- a/tcg/i386/tcg-target.c > +++ b/tcg/i386/tcg-target.c > @@ -61,6 +61,9 @@ static void patch_reloc(uint8_t *code_ptr, int type, > =A0 =A0 case R_386_PC32: > =A0 =A0 =A0 =A0 *(uint32_t *)code_ptr =3D value - (long)code_ptr; > =A0 =A0 =A0 =A0 break; > + =A0 =A0case R_386_PC8: > + =A0 =A0 =A0 =A0*(uint8_t *)code_ptr =3D value - (long)code_ptr; > + =A0 =A0 =A0 =A0break; > =A0 =A0 default: > =A0 =A0 =A0 =A0 tcg_abort(); > =A0 =A0 } > @@ -305,7 +308,8 @@ static void tcg_out_addi(TCGContext *s, int reg, tcg_= target_long val) > =A0 =A0 =A0 =A0 tgen_arithi(s, ARITH_ADD, reg, val, 0); > =A0} > > -static void tcg_out_jxx(TCGContext *s, int opc, int label_index) > +/* Use SMALL !=3D 0 to force a short forward branch. =A0*/ > +static void tcg_out_jxx(TCGContext *s, int opc, int label_index, int sma= ll) > =A0{ > =A0 =A0 int32_t val, val1; > =A0 =A0 TCGLabel *l =3D &s->labels[label_index]; > @@ -320,6 +324,7 @@ static void tcg_out_jxx(TCGContext *s, int opc, int l= abel_index) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_out8(s, 0x70 + opc); > =A0 =A0 =A0 =A0 =A0 =A0 tcg_out8(s, val1); > =A0 =A0 =A0 =A0 } else { > + =A0 =A0 =A0 =A0 =A0 =A0assert (!small); To be consistent with the rest I'd use: if (small) tcg_abort(); > =A0 =A0 =A0 =A0 =A0 =A0 if (opc =3D=3D -1) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_out8(s, 0xe9); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_out32(s, val - 5); > @@ -329,6 +334,15 @@ static void tcg_out_jxx(TCGContext *s, int opc, int = label_index) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_out32(s, val - 6); > =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 } > + =A0 =A0} else if (small) { > + =A0 =A0 =A0 =A0if (opc =3D=3D -1) { > + =A0 =A0 =A0 =A0 =A0 =A0tcg_out8(s, 0xeb); > + =A0 =A0 =A0 =A0} else { > + =A0 =A0 =A0 =A0 =A0 =A0tcg_out8(s, 0x0f); I don't think this prefix should be output. Laurent > + =A0 =A0 =A0 =A0 =A0 =A0tcg_out8(s, 0x70 + opc); > + =A0 =A0 =A0 =A0} > + =A0 =A0 =A0 =A0tcg_out_reloc(s, s->code_ptr, R_386_PC8, label_index, -1= ); > + =A0 =A0 =A0 =A0s->code_ptr +=3D 1; > =A0 =A0 } else { > =A0 =A0 =A0 =A0 if (opc =3D=3D -1) { > =A0 =A0 =A0 =A0 =A0 =A0 tcg_out8(s, 0xe9); > @@ -355,7 +369,7 @@ static void tcg_out_brcond(TCGContext *s, int cond, > =A0 =A0 } else { > =A0 =A0 =A0 =A0 tcg_out_modrm(s, 0x01 | (ARITH_CMP << 3), arg2, arg1); > =A0 =A0 } > - =A0 =A0tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index); > + =A0 =A0tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index, 0); > =A0} > > =A0/* XXX: we implement it at the target level to avoid having to > @@ -376,42 +390,42 @@ static void tcg_out_brcond2(TCGContext *s, > =A0 =A0 =A0 =A0 break; > =A0 =A0 case TCG_COND_LT: > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_ar= gs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next); > + =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_LTU, args[0], args[2], const_a= rgs[2], args[5]); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case TCG_COND_LE: > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_ar= gs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next); > + =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_LEU, args[0], args[2], const_a= rgs[2], args[5]); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case TCG_COND_GT: > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_ar= gs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next); > + =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_GTU, args[0], args[2], const_a= rgs[2], args[5]); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case TCG_COND_GE: > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_ar= gs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next); > + =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_GEU, args[0], args[2], const_a= rgs[2], args[5]); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case TCG_COND_LTU: > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_a= rgs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next); > + =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_LTU, args[0], args[2], const_a= rgs[2], args[5]); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case TCG_COND_LEU: > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_a= rgs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next); > + =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_LEU, args[0], args[2], const_a= rgs[2], args[5]); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case TCG_COND_GTU: > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_a= rgs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next); > + =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_GTU, args[0], args[2], const_a= rgs[2], args[5]); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case TCG_COND_GEU: > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_a= rgs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next); > + =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > =A0 =A0 =A0 =A0 tcg_out_brcond(s, TCG_COND_GEU, args[0], args[2], const_a= rgs[2], args[5]); > =A0 =A0 =A0 =A0 break; > =A0 =A0 default: > @@ -913,7 +927,7 @@ static inline void tcg_out_op(TCGContext *s, int opc, > =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 break; > =A0 =A0 case INDEX_op_br: > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JMP, args[0]); > + =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JMP, args[0], 0); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case INDEX_op_movi_i32: > =A0 =A0 =A0 =A0 tcg_out_movi(s, TCG_TYPE_I32, args[0], args[1]); > -- > 1.6.5.2 > >