I think there might be a problem in the way gcc-3.4.0 handles constants 
with one bit set within a test.

When I compile the following code (with -O0):

if (a & 0x40)
   {
   function();
   }

I end up with:

        mov     &a, r15
        clrc
        rrc     r15
        rra     r15
        rra     r15
        rra     r15
        rra     r15
        rra     r15
        and     #llo(1), r15
        jeq     .L2
        call    #function
.L2:

which works, but is very inefficient.

If I use a constant with more than one bit set I get:

        mov     &fred, r15
        and     #llo(72), r15
        jeq     .L2
        call    #function
.L2:

which is closer to what I would expect, though I would have thought it 
could use the bit instruction to produce smaller/faster code.  
(Incidentally I've done a search through a fairly large chunk of 
compiler output and not found one 'bit' instruction.  It makes me 
wonder if the compiler is generating them at all.)

I have tried turning optimisation on, this doesn't make any difference 
at level 1,2 or 3.
I have observed the same code generation for a test in a while loop.
The same pattern occurs even with constants that can be generated from 
r2/r3.

Has anyone else observed these problems or developed a fix/workaround?

Regards

Phil.

Reply via email to