https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86131

            Bug ID: 86131
           Summary: powerpc: gcc uses costly multiply instead of shift
                    left
           Product: gcc
           Version: 8.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: christophe.le...@c-s.fr
  Target Milestone: ---

unsigned long f1(unsigned long a, unsigned long b)
{
        return a >> ((4 - a) * 8);
}

unsigned long f2(unsigned long a, unsigned long b)
{
        return a >> ((4 - a) << 3);
}

unsigned long g1(unsigned long a, unsigned long b)
{
        return a >> (32 - a * 8);
}

unsigned long g2(unsigned long a, unsigned long b)
{
        return a >> (32 - (a << 3));
}

when compiling with GCC 8.1 with -O2 -mcpu=860, the following result is
obtained:

00000000 <f1>:
   0:   1d 23 ff f8     mulli   r9,r3,-8
   4:   39 29 00 20     addi    r9,r9,32
   8:   7c 63 4c 30     srw     r3,r3,r9
   c:   4e 80 00 20     blr

00000010 <f2>:
  10:   21 23 00 04     subfic  r9,r3,4
  14:   55 29 18 38     rlwinm  r9,r9,3,0,28
  18:   7c 63 4c 30     srw     r3,r3,r9
  1c:   4e 80 00 20     blr

00000020 <g1>:
  20:   1d 23 ff f8     mulli   r9,r3,-8
  24:   39 29 00 20     addi    r9,r9,32
  28:   7c 63 4c 30     srw     r3,r3,r9
  2c:   4e 80 00 20     blr

00000030 <g2>:
  30:   54 69 18 38     rlwinm  r9,r3,3,0,28
  34:   21 29 00 20     subfic  r9,r9,32
  38:   7c 63 4c 30     srw     r3,r3,r9
  3c:   4e 80 00 20     blr

mulli requires 2 cycles, therefore it shouldn't be used, should it ?

The same code compiled with -mcpu=e300c2 gives:

00000000 <f1>:
   0:   54 69 18 38     rlwinm  r9,r3,3,0,28
   4:   21 29 00 20     subfic  r9,r9,32
   8:   7c 63 4c 30     srw     r3,r3,r9
   c:   4e 80 00 20     blr

00000010 <f2>:
  10:   21 23 00 04     subfic  r9,r3,4
  14:   55 29 18 38     rlwinm  r9,r9,3,0,28
  18:   7c 63 4c 30     srw     r3,r3,r9
  1c:   4e 80 00 20     blr

00000020 <g1>:
  20:   54 69 18 38     rlwinm  r9,r3,3,0,28
  24:   21 29 00 20     subfic  r9,r9,32
  28:   7c 63 4c 30     srw     r3,r3,r9
  2c:   4e 80 00 20     blr

00000030 <g2>:
  30:   54 69 18 38     rlwinm  r9,r3,3,0,28
  34:   21 29 00 20     subfic  r9,r9,32
  38:   7c 63 4c 30     srw     r3,r3,r9
  3c:   4e 80 00 20     blr

Reply via email to