From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49955) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c4XuT-0006WF-Qg for qemu-devel@nongnu.org; Wed, 09 Nov 2016 13:47:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c4XuO-0007Jj-WE for qemu-devel@nongnu.org; Wed, 09 Nov 2016 13:47:45 -0500 Received: from mail-wm0-x236.google.com ([2a00:1450:400c:c09::236]:34917) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1c4XuO-0007JO-PD for qemu-devel@nongnu.org; Wed, 09 Nov 2016 13:47:40 -0500 Received: by mail-wm0-x236.google.com with SMTP id a197so325121406wmd.0 for ; Wed, 09 Nov 2016 10:47:40 -0800 (PST) Sender: Richard Henderson References: <1478712603-18286-1-git-send-email-laurent@vivier.eu> From: Richard Henderson Message-ID: Date: Wed, 9 Nov 2016 19:47:35 +0100 MIME-Version: 1.0 In-Reply-To: <1478712603-18286-1-git-send-email-laurent@vivier.eu> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH] target-m68k: add rol/ror/roxl/roxr instructions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Laurent Vivier , qemu-devel@nongnu.org On 11/09/2016 06:30 PM, Laurent Vivier wrote: > + /* create [src:X:..] */ > + > + tcg_gen_deposit_i32(t0, QREG_CC_X, src, 1, size); > + tcg_gen_shli_i32(t0, t0, 31 - size); > + > + /* rotate */ > + > + tcg_gen_rotl_i32(t0, t0, shift); > + > + /* result is [src:..:src:X] */ > + > + tcg_gen_andi_i32(X, t0, 1); > + tcg_gen_shri_i32(t0, t0, 1); I don't see how this is supposed to work. If you form [src:x:...], and rotate by 0, then X gets garbage. Of course, you're actually forming [0:src:x]. But for a rol of 2, the lsb of src gets 0's instead of the msb of src. If you want to use a 32-bit rotate here, you have to (1) reduce the rotate by modulo size + 1 and (2) form [src:...:src:x]. E.g. tcg_gen_deposit_i32(t0, Q_REG_CC_X, src, 32 - size, size); tcg_gen_deposit_i32(t0, t0, src, 1, size); r~