https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114086
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
And the rest boils down to what code to generate for
bool
foo (int x)
{
return ((682 >> x) & 1);
}
Both that and switch from the #c0 testcase boil down to
_1 = 682 >> x_2(D);
_3 = (_Bool) _1;
or
_6 = 682 >> _4;
_8 = (_Bool) _6;
in GIMPLE dump. Now, for the foo above, gcc emits
movl $682, %eax
btl %edi, %eax
setc %al
ret
and clang emits the same:
movl $682, %eax # imm = 0x2AA
btl %edi, %eax
setb %al
retq
Though, e.g. clang 14 emitted
movl %edi, %ecx
movl $682, %eax # imm = 0x2AA
shrl %cl, %eax
andb $1, %al
retq
which is longer, dunno what is faster.