/* This function reverses the bytes in a word. The method was discovered in 1986 following a competition between ARM programmers; it requires just 4 instructions and 1 work register. A method using only 3 instructions per word reversed was also found, but it has some set-up overhead and uses a 2nd register. */ unsigned long reverse(unsigned long v) { unsigned long t; t = v ^ ((v << 16) | (v >> 16)); // EOR r1,r0,r0,ROR #16 [1] t &= ~0xff0000; // BIC r1,r1,#&ff0000 v = (v << 24) | (v >> 8); // MOV r0,r0,ROR #8 return v ^ (t >> 8); // EOR r0,r0,r1,LSR #8 } The gcc-3.4.3 with -O2 produces: reverse: mov r3, r0 [2] mov r0, r0, ror #16 [2] eor r0, r0, r3 [2] bic r0, r0, #16711680 mov r3, r3, ror #8 eor r0, r3, r0, lsr #8 mov pc, lr Itc doesn't seem to produce [2] optimal code [1].
-- Summary: better optimalization of EOR/MOV block. Product: gcc Version: 3.4.3 Status: UNCONFIRMED Severity: minor Priority: P2 Component: rtl-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: pluto at pld-linux dot org CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: pentium3-pld-linux GCC host triplet: pentium3-pld-linux GCC target triplet: arm-pld-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18560