From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37129) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aHEPc-0001i4-1D for qemu-devel@nongnu.org; Thu, 07 Jan 2016 12:31:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aHEPZ-0004t4-8w for qemu-devel@nongnu.org; Thu, 07 Jan 2016 12:31:47 -0500 Received: from hall.aurel32.net ([2001:bc8:30d7:100::1]:49188) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aHEPZ-0004qx-3F for qemu-devel@nongnu.org; Thu, 07 Jan 2016 12:31:45 -0500 Date: Thu, 7 Jan 2016 18:31:26 +0100 From: Aurelien Jarno Message-ID: <20160107173126.GA15476@aurel32.net> References: <232DDC0A2B605E4F9E85F6904417885F91581A83@BADAG02.ba.imgtec.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <232DDC0A2B605E4F9E85F6904417885F91581A83@BADAG02.ba.imgtec.org> Subject: Re: [Qemu-devel] [PATCH v2] target-mips: Fix ALIGN instruction when bp=0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Miodrag Dinic Cc: "qemu-devel@nongnu.org" , Petar Jovanovic > From e48787a25de9a04985226cd7651795403d5752e6 Mon Sep 17 00:00:00 2001 > From: Miodrag Dinic > Date: Thu, 3 Dec 2015 16:48:57 +0100 > Subject: [PATCH] [PATCH v2] target-mips: Fix ALIGN instruction when bp=0 > > If executing ALIGN with shift count bp=0 within mips64 emulation, > the result of the operation should be sign extended. > > Taken from the official documentation (pseudo code) : > > ALIGN: > tmp_rt_hi = unsigned_word(GPR[rt]) << (8*bp) > tmp_rs_lo = unsigned_word(GPR[rs]) >> (8*(4-bp)) > tmp = tmp_rt_hi || tmp_rt_lo > GPR[rd] = sign_extend.32(tmp) > > Signed-off-by: Miodrag Dinic > --- > target-mips/translate.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/target-mips/translate.c b/target-mips/translate.c > index 5626647..d2443d3 100644 > --- a/target-mips/translate.c > +++ b/target-mips/translate.c > @@ -4630,7 +4630,16 @@ static void gen_align(DisasContext *ctx, int opc, int rd, int rs, int rt, > t0 = tcg_temp_new(); > gen_load_gpr(t0, rt); > if (bp == 0) { > - tcg_gen_mov_tl(cpu_gpr[rd], t0); > + switch (opc) { > + case OPC_ALIGN: > + tcg_gen_ext32s_tl(cpu_gpr[rd], t0); > + break; > +#if defined(TARGET_MIPS64) > + case OPC_DALIGN: > + tcg_gen_mov_tl(cpu_gpr[rd], t0); > + break; > +#endif > + } > } else { > TCGv t1 = tcg_temp_new(); > gen_load_gpr(t1, rs); Reviewed-by: Aurelien Jarno -- Aurelien Jarno GPG: 4096R/1DDD8C9B aurelien@aurel32.net http://www.aurel32.net