On Tue, Aug 13, 2019 at 09:59:35AM +0000, Christophe Leroy wrote: [snip]
> +.macro __LOAD_REG_IMMEDIATE r, x > + .if \x & ~0xffffffff != 0 > + __LOAD_REG_IMMEDIATE_32 \r, (\x) >> 32 > + rldicr \r, \r, 32, 31 > + .if (\x) & 0xffff0000 != 0 > + oris \r, \r, (\x)@__AS_ATHIGH > + .endif > + .if (\x) & 0xffff != 0 > + oris \r, \r, (\x)@l > + .endif > + .else > + __LOAD_REG_IMMEDIATE_32 \r, \x > + .endif > +.endm Doesn't this force all negative constants, even small ones, to use the long sequence? For example, __LOAD_REG_IMMEDIATE r3, -1 will generate (as far as I can see): li r3, -1 rldicr r3, r3, 32, 31 oris r3, r3, 0xffff ori r3, r3, 0xffff which seems suboptimal. Paul.