From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NLbCB-0005Sa-Rq for qemu-devel@nongnu.org; Fri, 18 Dec 2009 06:40:31 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NLbC7-0005P5-OB for qemu-devel@nongnu.org; Fri, 18 Dec 2009 06:40:31 -0500 Received: from [199.232.76.173] (port=46989 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NLbC7-0005Ou-Ig for qemu-devel@nongnu.org; Fri, 18 Dec 2009 06:40:27 -0500 Received: from mail-px0-f189.google.com ([209.85.216.189]:63003) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NLbC6-0007Va-NM for qemu-devel@nongnu.org; Fri, 18 Dec 2009 06:40:27 -0500 Received: by pxi27 with SMTP id 27so364005pxi.4 for ; Fri, 18 Dec 2009 03:40:24 -0800 (PST) MIME-Version: 1.0 In-Reply-To: <38131b3a03ff4872a19c52b5c042dd7d77341b75.1261078375.git.rth@twiddle.net> References: <761ea48b0912170620l534dcb02m8ea6b59524d76dbe@mail.gmail.com> <38131b3a03ff4872a19c52b5c042dd7d77341b75.1261078375.git.rth@twiddle.net> Date: Fri, 18 Dec 2009 12:40:24 +0100 Message-ID: <761ea48b0912180340w64e247bdsaa4401ba8d161ae3@mail.gmail.com> From: Laurent Desnogues Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] Re: [PATCH 5/6] tcg-i386: Simplify brcond2. 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 7:38 PM, Richard Henderson wrote: > Split out tcg_out_cond from tcg_out_brcond. =A0Add "small" arguments > to all branch functions for completeness. =A0Unify all the calls to > generate branches within brcond2 and pass on the small flag. > > Signed-off-by: Richard Henderson > --- > =A0tcg/i386/tcg-target.c | =A0 87 ++++++++++++++++++++++-----------------= --------- > =A01 files changed, 40 insertions(+), 47 deletions(-) > > diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c > index cc3d28f..f7b2416 100644 > --- a/tcg/i386/tcg-target.c > +++ b/tcg/i386/tcg-target.c > @@ -355,9 +355,8 @@ static void tcg_out_jxx(TCGContext *s, int opc, int l= abel_index, int small) > =A0 =A0 } > =A0} > > -static void tcg_out_brcond(TCGContext *s, int cond, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 TCGArg arg1, TCGArg= arg2, int const_arg2, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 int label_index) > +static void tcg_out_cond(TCGContext *s, int cond, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 TCGArg arg1, TCGArg arg= 2, int const_arg2) > =A0{ > =A0 =A0 if (const_arg2) { > =A0 =A0 =A0 =A0 if (arg2 =3D=3D 0) { > @@ -369,68 +368,61 @@ 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, 0); > +} > + > +static void tcg_out_brcond(TCGContext *s, int cond, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 TCGArg arg1, TCGArg= arg2, int const_arg2, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 int label_index, in= t small) > +{ > + =A0 =A0tcg_out_cond(s, cond, arg1, arg2, const_arg2); > + =A0 =A0tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index, small); > =A0} > > =A0/* XXX: we implement it at the target level to avoid having to > =A0 =A0handle cross basic blocks temporaries */ > -static void tcg_out_brcond2(TCGContext *s, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0const TCGArg *ar= gs, const int *const_args) > +static void tcg_out_brcond2(TCGContext *s, const TCGArg *args, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0const int *const= _args, int small) > =A0{ > - =A0 =A0int label_next; > - =A0 =A0label_next =3D gen_new_label(); > - =A0 =A0switch(args[4]) { > + =A0 =A0int label_next =3D gen_new_label(); > + =A0 =A0int label_dest =3D args[5]; > + =A0 =A0int cond =3D args[4], c1, c2, c3; > + > + =A0 =A0switch (cond) { > =A0 =A0 case TCG_COND_EQ: > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_NE, args[0], args[2], const_a= rgs[2], label_next); > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_EQ, args[1], args[3], const_a= rgs[3], args[5]); > + =A0 =A0 =A0 =A0c1 =3D -1, c2 =3D TCG_COND_NE, c3 =3D TCG_COND_EQ; > =A0 =A0 =A0 =A0 break; > =A0 =A0 case TCG_COND_NE: > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_NE, args[0], args[2], const_a= rgs[2], args[5]); > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_NE, args[1], args[3], const_a= rgs[3], args[5]); > + =A0 =A0 =A0 =A0c1 =3D TCG_COND_NE, c2 =3D -1, c3 =3D TCG_COND_NE; > =A0 =A0 =A0 =A0 break; > =A0 =A0 case TCG_COND_LT: > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_a= rgs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_LTU, args[0], args[2], const_= args[2], args[5]); > - =A0 =A0 =A0 =A0break; > - =A0 =A0case TCG_COND_LE: > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_a= rgs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_LEU, args[0], args[2], const_= args[2], args[5]); > - =A0 =A0 =A0 =A0break; > - =A0 =A0case TCG_COND_GT: > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_a= rgs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_GTU, args[0], args[2], const_= args[2], args[5]); > - =A0 =A0 =A0 =A0break; > - =A0 =A0case TCG_COND_GE: > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_a= rgs[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_GEU, args[0], args[2], const_= args[2], args[5]); > - =A0 =A0 =A0 =A0break; > =A0 =A0 case TCG_COND_LTU: > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_= args[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_LTU, args[0], args[2], const_= args[2], args[5]); > + =A0 =A0 =A0 =A0c1 =3D cond, c2 =3D TCG_COND_NE, c3 =3D TCG_COND_LTU; > =A0 =A0 =A0 =A0 break; > + =A0 =A0case TCG_COND_LE: > =A0 =A0 case TCG_COND_LEU: > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_= args[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_LEU, args[0], args[2], const_= args[2], args[5]); > + =A0 =A0 =A0 =A0c1 =3D cond, c2 =3D TCG_COND_NE, c3 =3D TCG_COND_LEU; > =A0 =A0 =A0 =A0 break; > + =A0 =A0case TCG_COND_GT: > =A0 =A0 case TCG_COND_GTU: > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_= args[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_GTU, args[0], args[2], const_= args[2], args[5]); > + =A0 =A0 =A0 =A0c1 =3D cond, c2 =3D TCG_COND_NE, c3 =3D TCG_COND_GTU; > =A0 =A0 =A0 =A0 break; > + =A0 =A0case TCG_COND_GE: > =A0 =A0 case TCG_COND_GEU: > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_= args[3], args[5]); > - =A0 =A0 =A0 =A0tcg_out_jxx(s, JCC_JNE, label_next, 1); > - =A0 =A0 =A0 =A0tcg_out_brcond(s, TCG_COND_GEU, args[0], args[2], const_= args[2], args[5]); > + =A0 =A0 =A0 =A0c1 =3D cond, c2 =3D TCG_COND_NE, c3 =3D TCG_COND_GEU; > =A0 =A0 =A0 =A0 break; > =A0 =A0 default: > - =A0 =A0 =A0 =A0tcg_abort(); > + =A0 =A0 =A0 =A0tcg_abort (); This is unwanted :-) > + =A0 =A0} > + > + =A0 =A0tcg_out_cond(s, cond, args[1], args[3], const_args[3]); > + =A0 =A0if (c1 !=3D -1) { > + =A0 =A0 =A0 =A0tcg_out_jxx(s, tcg_cond_to_jcc[c1], label_dest, small); > =A0 =A0 } > + =A0 =A0if (c2 !=3D -1) { > + =A0 =A0 =A0 =A0tcg_out_jxx(s, tcg_cond_to_jcc[c2], label_next, 1); > + =A0 =A0} > + =A0 =A0tcg_out_brcond(s, c3, args[0], args[2], const_args[2], label_des= t, small); > + > =A0 =A0 tcg_out_label(s, label_next, (tcg_target_long)s->code_ptr); > =A0} I'm not sure I really like that rewrite, I find it hard to read. Convince me it's better :-) Laurent > @@ -1058,10 +1050,11 @@ static inline void tcg_out_op(TCGContext *s, int = opc, > =A0 =A0 =A0 =A0 =A0 =A0 tcg_out_modrm(s, 0x01 | (ARITH_SBB << 3), args[5]= , args[1]); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case INDEX_op_brcond_i32: > - =A0 =A0 =A0 =A0tcg_out_brcond(s, args[2], args[0], args[1], const_args[= 1], args[3]); > + =A0 =A0 =A0 =A0tcg_out_brcond(s, args[2], args[0], args[1], const_args[= 1], > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[3], 0); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case INDEX_op_brcond2_i32: > - =A0 =A0 =A0 =A0tcg_out_brcond2(s, args, const_args); > + =A0 =A0 =A0 =A0tcg_out_brcond2(s, args, const_args, 0); > =A0 =A0 =A0 =A0 break; > > =A0 =A0 case INDEX_op_bswap16_i32: > -- > 1.6.5.2 > >