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. Thanks, Claudio