"Wesley W. Terpstra" <[EMAIL PROTECTED]> writes:

> Package: gcc-4.0
> Version: 4.0.1-6
> Severity: important
>
> When compiling the fesetround function (which controls the processor
> rounding mode), gcc-4.0 incorrectly optimizes away the code!!!
>
> Here's the C code in question:
>   __asm__ ("fstd %%fr0,0(%1)" : "=m" (*sw) : "r" (sw));
>   sw[0] &= ~FE_DOWNWARD;
>   sw[0] |= round;
>   __asm__ ("fldd 0(%0),%%fr0" : : "r" (sw));
>
> gcc-3.3 outputs:
> #APP
>         fstd %fr0,0(%r20)
> #NO_APP
>       ldw -56(%r30),%r19
>       depi 0,22,2,%r19
>       or %r19,%r26,%r19
>       stw %r19,-56(%r30)
> #APP
>       fldd 0(%r20),%fr0
> #NO_APP
>
> gcc-4.0 outputs:
> #APP
>         fstd %fr0,0(%r28)
>       fldd 0(%r28),%fr0
> #NO_APP

This is not a bug in gcc. The second asm is not marked as reading *sw,
so the store can be moved behind it, or omitted if it isn't needed
elsewhere. If you access *sw, you need to tell gcc. So the bug is in
whatever code contains this asm.

-- 
        Falk


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to