From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Mo1Ya-0003oP-04 for qemu-devel@nongnu.org; Wed, 16 Sep 2009 16:56:52 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Mo1YX-0003lX-8G for qemu-devel@nongnu.org; Wed, 16 Sep 2009 16:56:49 -0400 Received: from [199.232.76.173] (port=45447 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mo1YX-0003lL-1j for qemu-devel@nongnu.org; Wed, 16 Sep 2009 16:56:49 -0400 Received: from hall.aurel32.net ([88.191.82.174]:52047) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Mo1YW-0005sl-DP for qemu-devel@nongnu.org; Wed, 16 Sep 2009 16:56:48 -0400 Date: Wed, 16 Sep 2009 22:56:46 +0200 From: Aurelien Jarno Subject: Re: [Qemu-devel] [PATCH] Fix extlh instruction on Alpha Message-ID: <20090916205646.GA28487@hall.aurel32.net> References: <20090909120628.J4195@stanley.csl.cornell.edu> <20090916195242.GE770@volta.aurel32.net> <20090916163826.M50839@stanley.csl.cornell.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <20090916163826.M50839@stanley.csl.cornell.edu> Sender: Aurelien Jarno List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Vince Weaver Cc: qemu-devel@nongnu.org On Wed, Sep 16, 2009 at 04:45:20PM -0400, Vince Weaver wrote: > On Wed, 16 Sep 2009, Aurelien Jarno wrote: > > > On Wed, Sep 09, 2009 at 12:08:25PM -0400, Vince Weaver wrote: > > > > } else { > > > + int l1; > > > TCGv tmp1, tmp2; > > > - tmp1 = tcg_temp_new(); > > > + tmp1 = tcg_temp_local_new(); > > > + l1 = gen_new_label(); > > > + > > > tcg_gen_andi_i64(tmp1, cpu_ir[rb], 7); > > > tcg_gen_shli_i64(tmp1, tmp1, 3); > > > + > > > + tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]); > > > + tcg_gen_brcondi_i64(TCG_COND_EQ, tmp1, 0, l1); > > > + > > > tmp2 = tcg_const_i64(64); > > > tcg_gen_sub_i64(tmp1, tmp2, tmp1); > > > tcg_temp_free(tmp2); > > > > Given that a test costs a lot (partly due to the fact temp local > > variable must be used), I do wonder if doing a AND here wouldn't > > be better: > > > > tcg_gen_andi_i64(tmp1, tmp1, 0x3f); > > I'm not sure I follow. > > The code is attempting the following: > > tmp1=rb&0x7; > tmp1=temp1<<3; > > if (tmp1!=0) { > tmp1=64-tmp1; > rc=ra< } > else { > rc=ra; > } > > The problem with the original code is that in the case of tmp1 being 0, > the shift left by 64 would result in 0, instead of the identity. > > I tried to avoid the jump but couldn't. Am I missing something? > I mean the following code: tmp1=rb&0x7; tmp1=temp1<<3; tmp1=64-tmp1; tmp1=tmp1 & 0x3f; rc=ra<