unsigned long long div16(unsigned long long n) { return n / 16; } Without -mpowerpc64: _div16: slwi r0,r3,28 srwi r4,r4,4 or r4,r0,r4 srwi r3,r3,4 blr With: _div16: li r0,0 rldimi r0,r3,32,0 rldimi r0,r4,0,32 srdi r4,r0,4 srdi r3,r0,36 blr
powerpc-linux too. 3.4 is even worse due to needlessly setting up a stack frame.
Subject: Bug 17959 Author: sayle Date: Thu Mar 30 17:47:48 2006 New Revision: 112543 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=112543 Log: PR target/17959 * expr.c (emit_group_store): Optimize group stores into a pseudo register by using a paradoxical subreg to initialize the destination if the first or last member of the group specifies a "low part". Modified: trunk/gcc/ChangeLog trunk/gcc/expr.c
This is now be fixed on mainline. With -mpowerpc64, we now generate: _div16: rldimi 3,4,0,32 srdi 4,3,4 srdi 3,3,36 blr