------- Additional Comments From pinskia at gcc dot gnu dot org  2004-10-16 04:05 
-------
Actually there are two ands for -march=pentiumpro also:
        movl    4(%esp), %ecx
        movzbl  8(%esp), %edx  <--- one
        movl    (%ecx), %eax
        andl    $3, %edx  <--- two
        andl    $-4, %eax <-- I have not figured out where this one comes from but it 
shows up on x86 
and x86-64 and also PPC
        orl     %edx, %eax
        movl    %eax, (%ecx)
        ret

PPC produces:
        lwz r0,0(r3)
        rlwinm r4,r4,0,30,31
        rlwimi r0,r4,30,0,1
        stw r0,0(r3)
        blr
which is responsible but not optimal as 3.3 produces better:
        lwz r2,0(r3)
        rlwimi r2,r4,30,0,1
        stw r2,0(r3)
        blr

(insn 11 10 12 0 0x0 (set (zero_extract:SI (reg:SI 2 r2 [120])
            (const_int 2 [0x2])
            (const_int 0 [0x0]))
        (reg/v:SI 4 r4 [119])) 106 {insvsi} (insn_list:REG_DEP_OUTPUT 10 (nil))
    (expr_list:REG_DEAD (reg/v:SI 4 r4 [119])
        (nil)))
Should be the only thing which is produced but:
(insn 14 15 16 0 (parallel [
            (set (reg:SI 4 r4 [121])
                (and:SI (reg:SI 4 r4 [ v ])
                    (const_int 3 [0x3])))
            (clobber (scratch:CC))
        ]) 100 {andsi3} (nil)
    (expr_list:REG_UNUSED (scratch:CC)
        (nil)))

(insn:TI 16 14 17 0 (set (zero_extract:SI (reg:SI 0 r0 [122])
            (const_int 2 [0x2])
            (const_int 0 [0x0])) 
        (reg:SI 4 r4 [121])) 125 {insvsi} (insn_list:REG_DEP_TRUE 14 
(insn_list:REG_DEP_TRUE 15 (nil)))
    (expr_list:REG_DEAD (reg:SI 4 r4 [121])
        (nil)))

is produced, note the extra and 3 which is not needed for as the zero_extract does the 
work for us (I 
think this is equivalent to the extra and for -march=i386).

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18008

Reply via email to