On Tue, May 28, 2013 at 3:01 PM, Claudio Fontana <claudio.font...@huawei.com> wrote: > On 27.05.2013 23:14, Laurent Desnogues wrote: >> >> >> On Monday, May 27, 2013, Richard Henderson <r...@twiddle.net >> <mailto:r...@twiddle.net>> 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.
I definitely agree. Laurent