-
Notifications
You must be signed in to change notification settings - Fork 15.2k
Open
Labels
Description
#include <stdint.h>
uint64_t bar(uint32_t divisor) {
return (1ULL << (63 - __builtin_clz(divisor))) / divisor;
}This compiled to:
bar:
lzcnt edx, edi
mov eax, 1
movabs rsi, -4294967296
mov ecx, edi
xor dl, 63
shlx rax, rax, rdx
movzx edx, dl
bt rsi, rdx
jae .LBB0_1
xor edx, edx
div rcx
ret
.LBB0_1:
xor edx, edx
div ecx
retI was expecting:
bar:
lzcnt ecx, edi
not cl
mov eax, 1
shlx rax, rax, rcx
xor rdx, rdx
div rdi
retThis snippet seems fine:
uint64_t bar(uint32_t divisor) {
return (1ULL << (__builtin_clz(divisor))) / divisor;
}baz:
lzcnt eax, edi
mov ecx, 1
xor edx, edx
shlx eax, ecx, eax
div edi
ret