The following shows a missing easy optimization for GCC: int in_canforward(unsigned int in) { if ((in & ~0xffffff0f) == 0xf0 || (in & ~0xffffff0f) == 0xe0) return 0; return 1; }
results in (@ -O2): in_canforward: andl $240, %edi cmpl $240, %edi sete %al cmpl $224, %edi sete %dl orl %edx, %eax xorl $1, %eax movzbl %al, %eax ret given that 0xf0 and 0xe0 only differ by one bit, there is no reason to test for that bit so the comparision could be: (in & 0xffffff1f) == 0xe0. More generally the optimization is: given (x & m) == a0 || (x & m) == a1 where m, a0, and a1 are all constant let b = (a0 ^ a1) then if (b & (b - 1)) == 0 [b is a power of 2] rewrite to: (x & (m|b)) == (a0 & ~b) -- Summary: Missing simple optimization Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: rtl-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: matt at 3am-software dot com GCC build triplet: x86_64--netbsd GCC host triplet: x86_64--netbsd GCC target triplet: x86_64--netbsd http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31271