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.