On 4/24/16 9:17 PM, Xinok wrote:
I modified David's solution a bit to (hopefully) eliminate the branch:
bool powerOf2(uint x){ return !x ^ !(x & (x - 1)); }
0000000000000000 <_D4test8powerOf2FkZb>:
0: 50 push %rax
1: 53 push %rbx
2: 48 89 fa mov %rdi,%rdx
5: 85 d2 test %edx,%edx
7: 0f 94 c0 sete %al
a: 8d 8a ff ff ff ff lea -0x1(%rdx),%ecx
10: 85 ca test %ecx,%edx
12: 0f 94 c3 sete %bl
15: 32 c3 xor %bl,%al
17: 5b pop %rbx
18: 59 pop %rcx
19: c3 retq
1a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
The branches are gone but I'm really not sure if this is better or worse.
With gdc https://godbolt.org/g/jcU4np isPow2B is the winner (shortest
code, simplest instructions). -- Andrei