On 5/27/23 17:04, Stefan Kanthak wrote:
--- .c ---
int ispowerof2(unsigned long long argument) {
     return __builtin_popcountll(argument) == 1;
}
--- EOF ---

GCC 13.3    gcc -m32 -march=alderlake -O3
             gcc -m32 -march=sapphirerapids -O3
             gcc -m32 -mpopcnt -mtune=sapphirerapids -O3

https://gcc.godbolt.org/z/cToYrrYPq
ispowerof2(unsigned long long):
         xor     eax, eax        # superfluous
         xor     edx, edx        # superfluous
         popcnt  eax, [esp+4]
         popcnt  edx, [esp+8]
         add     eax, edx
         cmp     eax, 1      ->    dec  eax
         sete    al
         movzx   eax, al         # superfluous
         ret

9 instructions in 28 bytes      # 6 instructions in 20 bytes

I agree this can be done using 6 instructions, but you cannot do it using the dec instruction. If you use the dec instruction, "movzx eax, al" becomes a required instruction (consider the case when the input is 0) resulting in 7 instructions and 22 bytes.

Reply via email to