Roman Zippel <[EMAIL PROTECTED]> writes:

> This is taken from execute/20040709-1.c:
>
> struct K { unsigned int k : 6, l : 1, j : 10, i : 15; };
> struct K retmeK (struct K x)
> {
>   return x;
> }
>
> This produces the following code:
>
> retmeK:
>         link.w %fp,#0
>         move.l %d3,-(%sp)
>         move.l %d2,-(%sp)
>         clr.l %d0
>         move.l 8(%fp),%d1
>         bfextu %d1{#7:#10},%d3
>         bfextu %d1{#17:#15},%d2
>         bfins %d2,%d0{#17:#15}
>         bfins %d3,%d0{#7:#10}
> ->      moveq #26,%d2
>         lsr.l %d2,%d1
>         bfins %d1,%d0{#0:#7}
>         move.l (%sp)+,%d2
>         move.l (%sp)+,%d3
>         unlk %fp
>         rts

The code generated by 4.3.0 20070122 still looks correct.

> Even without this bug gcc usage of bitfield instruction has become a 
> little insane lately, e.g. 2.95/3.4 produce this code:
>
> retmeK:
>         link.w %a6,#0
>         move.l 8(%a6),%d0
>         unlk %a6
>         rts

FWIW, I get this very code with 4.3.0 20070122 when compiling without
optimisation.  

Andreas.

-- 
Andreas Schwab, SuSE Labs, [EMAIL PROTECTED]
SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany
PGP key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

Reply via email to