Hi.

   I seem unable to get a QImode shift instruction from this code:

unsigned char x;

void qishifttest2 (unsigned int c)
{
        x <<= c;
}

   Already at the first tree dump, there's a promotion to int:

;; Function qishifttest2 (qishifttest2)
;; enabled by -tree-original

{
  x = (unsigned char) ((int) x << (int) c);
}

   The resulting code doesn't look good (i386):

qishifttest2:
        movzbl  x, %eax         # 23    *zero_extendqisi2_movzbw        [length 
= 7]
        movl    4(%esp), %ecx   # 21    *movsi_1/1      [length = 4]
        sall    %cl, %eax       # 9     *ashlsi3_1/1    [length = 2]
        movb    %al, x          # 10    *movqi_1/7      [length = 5]
        ret                     # 26    return_internal [length = 1]

   It should have shiftet x directly in memory:

        movl    4(%esp), %ecx
        salb    %cl, x
        ret

   Similarily for m68k,

qishifttest2:
        clr.l %d0               | 21    movsi_const0
        move.b x,%d0            | 22    *m68k.md:766
        move.l 4(%sp),%d1       | 20    *m68k.md:671/1
        lsl.l %d1,%d0           | 9     ashlsi3
        move.b %d0,x            | 10    *m68k.md:748/3
        rts

where

        move.l  4(%sp), %d1
        lsl.b   %d1,    x
        rts

should have been generated. Also, notice the redundant zero extension.
Why are we not generating a QImode shift instruction?

-- 
Rask Ingemann Lambertsen

Reply via email to