Segher Boessenkool <segher at gcc dot> changed:

           What    |Removed                     |Added
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2019-04-22
                 CC|                            |segher at gcc dot
     Ever confirmed|0                           |1

--- Comment #1 from Segher Boessenkool <segher at gcc dot> ---
They didn't test the right targets ;-)

While for x86_64 you get

        movl    %edi, %eax
        sall    $5, %eax
        subl    %edi, %eax
        addl    $27961, %eax
        andl    $15, %eax

and for aarch64 you get

        lsl     w1, w0, 5
        sub     w0, w1, w0
        mov     w1, 27961
        add     w0, w0, w1
        and     w0, w0, 15

for sparc{,64} you get

        sethi   %hi(27648), %g1
        or      %g1, 313, %g1
        sub     %g1, %o0, %o0
        jmp     %o7+8
         and    %o0, 15, %o0

(the mul-by-31 was optimised away by combine).

While for 32-bit powerpc you get

        mulli 3,3,31
        addi 3,3,27961
        rlwinm 3,3,0,28,31

(if you don't set a modern -mcpu=, anyway), for powerpc64 you get

        subfic 3,3,9
        rldicl 3,3,0,60

This again is done by combine:

Trying 10, 11 -> 12:
   10: r129:SI=r128:SI-r132:DI#4
      REG_DEAD r132:DI
      REG_DEAD r128:SI
   11: r130:SI=r129:SI+0x6d39
      REG_DEAD r129:SI
   12: r125:SI=r130:SI&0xf
      REG_DEAD r130:SI
Failed to match this instruction:
(set (reg:SI 125)
    (and:SI (minus:SI (const_int 9 [0x9])
            (subreg:SI (reg:DI 132) 4))
        (const_int 15 [0xf])))
Successfully matched this instruction:
(set (reg:SI 130)
    (minus:SI (const_int 9 [0x9])
        (subreg:SI (reg:DI 132) 4)))
Successfully matched this instruction:
(set (reg:SI 125)
    (and:SI (reg:SI 130)
        (const_int 15 [0xf])))

Ideally this would be done in gimple already, of course.  Combine cannot
handle this in general.

Reply via email to