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

Reply via email to