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.