Thread (6 messages) 6 messages, 5 authors, 2000-08-04

Re: shifts on 64bit ints

flat view

From: Franz Sirl <hidden>
Date: 2000-08-03 23:54:53

At 01:02 04.08.00, David Edelsohn wrote:
        First, I would suggest that you use a printf format like "%08x"
for better legibility.

        Second, I tried your example with gcc-2.95.2 on PowerPC AIX
gcc-2.95.2 on PowrePC Linux, and a recent development snapshot of GCC with
various optimization levels (you did not specify what options you used to
compile the testcase) and I consistently saw the following output:

Mask 29 is 0x0000000020000000 - 0xffffffffdfffffff
Mask 30 is 0x0000000040000000 - 0xffffffffbfffffff
Mask 31 is 0x0000000080000000 - 0xffffffff7fffffff
Mask 32 is 0x0000000100000000 - 0xfffffffeffffffff
Mask 33 is 0x0000000200000000 - 0xfffffffdffffffff
Mask 34 is 0x0000000400000000 - 0xfffffffbffffffff

        You appear to have a problem, but it is local to your system
(could be toolchain or C library as well).
Oh no!! It's even worse! The kernel implementation of ashldi3, ashrdi3 and
lshrdi3 seems broken, see this code in arch/ppc/kernel/misc.S:

/*
 * Extended precision shifts
 *
 * R3/R4 has 64 bit value
 * R5    has shift count
 * result in R3/R4
 *
 *  ashrdi3:     XXXYYY/ZZZAAA -> SSSXXX/YYYZZZ
 *  ashldi3:     XXXYYY/ZZZAAA -> YYYZZZ/AAA000
 *  lshrdi3:     XXXYYY/ZZZAAA -> 000XXX/YYYZZZ
 */
_GLOBAL(__ashrdi3)
        li      r6,32
        sub     r6,r6,r5
        slw     r7,r3,r6        /* isolate YYY */
        srw     r4,r4,r5        /* isolate ZZZ */
        or      r4,r4,r7        /* YYYZZZ */
        sraw    r3,r3,r5        /* SSSXXX */
        blr

_GLOBAL(__ashldi3)
        li      r6,32
        sub     r6,r6,r5
        srw     r7,r4,r6        /* isolate ZZZ */
        slw     r4,r4,r5        /* AAA000 */
        slw     r3,r3,r5        /* YYY--- */
        or      r3,r3,r7        /* YYYZZZ */
        blr

_GLOBAL(__lshrdi3)
        li      r6,32
        sub     r6,r6,r5
        slw     r7,r3,r6        /* isolate YYY */
        srw     r4,r4,r5        /* isolate ZZZ */
        or      r4,r4,r7        /* YYYZZZ */
        srw     r3,r3,r5        /* 000XXX */
        blr

I don't see how these can handle shift's >=32...

Somebody should fix that...

Franz.


** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help