From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:36175) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UhJXx-0005YU-IL for qemu-devel@nongnu.org; Tue, 28 May 2013 09:02:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UhJXk-0001EH-MJ for qemu-devel@nongnu.org; Tue, 28 May 2013 09:02:37 -0400 Received: from lhrrgout.huawei.com ([194.213.3.17]:7722) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UhJXk-0001Dc-EE for qemu-devel@nongnu.org; Tue, 28 May 2013 09:02:24 -0400 Message-ID: <51A4AABC.4070206@huawei.com> Date: Tue, 28 May 2013 15:01:48 +0200 From: Claudio Fontana 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> <51A3AA3A.4050406@twiddle.net> In-Reply-To: Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 3/3] tcg/aarch64: implement new TCG target for aarch64 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Laurent Desnogues Cc: Peter Maydell , Jani Kokkonen , "qemu-devel@nongnu.org" , Richard Henderson On 27.05.2013 23:14, Laurent Desnogues wrote: > > > On Monday, May 27, 2013, Richard Henderson > wrote: >> 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. > > You could probably go one step further and use the logical > immediate encoding. Look at build_immediate_table in binutils > opcodes/aarch64-opc.c. The problem would be the use of > binary search; perhaps one could come up with some perfect > hash function. > > > Laurent if it's ok I would go with a variation of Richard's approach. A more sofisticated approach, like the one you suggest, could be added by a successive patch. Thanks, Claudio