From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:46989) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uh2SH-000406-GL for qemu-devel@nongnu.org; Mon, 27 May 2013 14:47:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Uh2S8-0005xg-6f for qemu-devel@nongnu.org; Mon, 27 May 2013 14:47:37 -0400 Received: from mail-qe0-f51.google.com ([209.85.128.51]:51701) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uh2S8-0005xc-2O for qemu-devel@nongnu.org; Mon, 27 May 2013 14:47:28 -0400 Received: by mail-qe0-f51.google.com with SMTP id nd7so3840871qeb.24 for ; Mon, 27 May 2013 11:47:27 -0700 (PDT) Sender: Richard Henderson Message-ID: <51A3AA3A.4050406@twiddle.net> Date: Mon, 27 May 2013 11:47:22 -0700 From: Richard Henderson MIME-Version: 1.0 References: <5141F36E.10004@huawei.com> <519DCEC8.8060000@huawei.com> <519DD0BF.4090702@huawei.com> <519E43EE.6090702@twiddle.net> <519F2A8F.6090903@huawei.com> <519F9D11.9020603@twiddle.net> <51A346EC.2080005@huawei.com> In-Reply-To: <51A346EC.2080005@huawei.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 2/4] tcg/aarch64: implement new TCG target for aarch64 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Claudio Fontana Cc: Peter Maydell , Jani Kokkonen , qemu-devel@nongnu.org On 2013-05-27 04:43, Claudio Fontana wrote: >> Hmm, true. Although I'd been thinking more along the lines of >> arranging the code such that we'd use movz to set the zero. > > I think we need to keep treating zero specially if we want to keep the optimization where we don't emit needless MOVK instructions for half-words of value 0000h. > > I can however make one single function out of movi32 and movi64, it could look like this: > > if (!value) { > tcg_out_movr(s, 0, rd, TCG_REG_ZXR); > return; > } > > base = (value > 0xffffffff) ? 0xd2800000 : 0x52800000; > > while (value) { > /* etc etc */ > } if (type == TCG_TYPE_I32) { value = (uint32_t)value; ext = 0; } else if (value <= 0xffffffff) { ext = 0; } else { ext = 0x80000000; } base = 0x52800000; /* MOVZ */ do { int shift = ctz64(value) & (63 & -16); int half = (value >> shift) & 0xffff; tcg_out32(s, base | ext | half << 5 | rd); value &= ~(0xffffUL << shift); base = 0x72800000; /* MOVK */ } while (value != 0); Since we go through the loop at least once, we emit the movz for zero input. No need for any extra tests. And using ctz we can iterate fewer times. r~