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