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.

Reply via email to