https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82038

--- Comment #2 from Christopher Head <headch at gmail dot com> ---
I think they do. Just one example, but I’m pretty sure it holds for others too
(left-shift equals multiply by power of two, even for negative integers; it’s
right-shift where the behaviour differs due to different rounding):

== On entry ==
r0 = -16 = 0xFFFFFFF0

== f ==
0:
2: r5 = r0 ASR 31 = 0xFFFFFFFF
4: r3 = r0 = 0xFFFFFFF0
6: r0 = r0 << 14 = 0xFFFC0000
8: r1 = r5 << 14 = 0xFFFFC000
a:
c: r1 = r1 | (r3 LSR 18)
        = 0xFFFFC000 | (0xFFFFFFF0 LSR 18)
        = 0xFFFFC000 | 0x00003FFF
        = 0xFFFFFFFF

On exit, r1:r0 = 0xFFFFFFFF : 0xFFFC0000 = -262,144

== g ==
14: r1 = r0 = 0xFFFFFFF0
16: r0 = r0 << 14 = 0xFFFC0000
18: r1 = r1 ASR 18 = 0xFFFFFFFF

On exit, r1:r0 = 0xFFFFFFFF : 0xFFFC0000 = -262,144

Reply via email to