.text
.global clz
.type clz, @function
clz:
mov $64,%rax
cmp $0x0,%rdi
# Jesli liczba rowna zero to ma 64 zer w sensie bitow
je koniec
mov $0x0,%rax
#Sprawdzamy czy liczba ma z przodu 32 zer
mov $0xFFFFFFFF00000000,%rsi
and %rdi,%rsi
cmp $0,%rsi
jne pomin32
add $32,%rax
shl $32,%rdi
#jesli liczba ma 32 zer z przodu to dodamy 32 do wyniku i wykonamy sie na
#pozostalych 32 bitach, przesuwamy wtedy liczbe o 32 w lewo, bo tam sa same zera
#jesli nie to bez dodawania 32 do wyniku wykonujemy algorytm dla 32 starszych
#bitow, bez przesuniecia. W taki sposob logarytmicznie sprawdzamy ilosc zer
pomin32:
#to samo ale dla 16 bitow z przodu
mov $0xFFFF000000000000,%rsi
and %rdi,%rsi
cmp $0,%rsi
jne pomin16
add $16,%rax
shl $16,%rdi
pomin16:
#to samo ale dla 8 bitow z przodu
mov $0xFF00000000000000,%rsi
and %rdi,%rsi
cmp $0,%rsi
jne pomin8
add $8,%rax
shl $8,%rdi
pomin8:
#to samo ale dla 4 bitow z przodu
mov $0xF000000000000000,%rsi
and %rdi,%rsi
cmp $0,%rsi
jne pomin4
add $4,%rax
shl $4,%rdi
pomin4:
#to samo ale dla 2 bitow z przodu
mov $0xC000000000000000,%rsi
and %rdi,%rsi
cmp $0,%rsi
jne pomin2
add $2,%rax
shl $2,%rdi
pomin2:
#to samo ale dla 1 bitu z przodu
mov $0x8000000000000000,%rsi
and %rdi,%rsi
cmp $0,%rsi
#tutaj sprawdzilismy czy ostatni bit jest zerem z dwoch niesprawdzonych bitow
jne koniec
#specjalny przypadek bo dwa ostatnie bity nie moga byc naraz zerami
#inaczej by na samym poczatku algorytm wypisal 64 jako wynik
#w tym przypadku ostatni bit jest zerem wiec przedostatni jest jedynka
add $1,%rax
#nie ma pomin1, bo to znaczy ze ostatni bit z pary niesprawdzonych jest 1
#czyli nie ma wiekszego prefiksa
koniec:
ret
.size clz, .-clz
{"html5":"htmlmixed","css":"css","javascript":"javascript","php":"php","python":"python","ruby":"ruby","lua":"text\/x-lua","bash":"text\/x-sh","go":"go","c":"text\/x-csrc","cpp":"text\/x-c++src","diff":"diff","latex":"stex","sql":"sql","xml":"xml","apl":"apl","asterisk":"asterisk","c_loadrunner":"text\/x-csrc","c_mac":"text\/x-csrc","coffeescript":"text\/x-coffeescript","csharp":"text\/x-csharp","d":"d","ecmascript":"javascript","erlang":"erlang","groovy":"text\/x-groovy","haskell":"text\/x-haskell","haxe":"text\/x-haxe","html4strict":"htmlmixed","java":"text\/x-java","java5":"text\/x-java","jquery":"javascript","mirc":"mirc","mysql":"sql","ocaml":"text\/x-ocaml","pascal":"text\/x-pascal","perl":"perl","perl6":"perl","plsql":"sql","properties":"text\/x-properties","q":"text\/x-q","scala":"scala","scheme":"text\/x-scheme","tcl":"text\/x-tcl","vb":"text\/x-vb","verilog":"text\/x-verilog","yaml":"text\/x-yaml","z80":"text\/x-z80"}