|
From: | Richard Henderson |
Subject: | Re: [Qemu-devel] [PATCH 2/4] tcg/aarch64: implement new TCG target for aarch64 |
Date: | Mon, 27 May 2013 11:47:22 -0700 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130514 Thunderbird/17.0.6 |
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~
[Prev in Thread] | Current Thread | [Next in Thread] |