Facebook
From konrad, 3 Years ago, written in x86 Assembler.
Embed
Download Paste or View Raw
Hits: 122
  1.         .text
  2.         .global clz
  3.         .type   clz, @function
  4. clz:
  5.     mov $64,%rax
  6.     cmp $0x0,%rdi
  7. # Jesli liczba rowna zero to ma 64 zer w sensie bitow
  8.     je koniec
  9.     mov $0x0,%rax
  10. #Sprawdzamy czy liczba ma z przodu 32 zer
  11.     mov $0xFFFFFFFF00000000,%rsi
  12.     and %rdi,%rsi
  13.     cmp $0,%rsi
  14.     jne pomin32
  15.     add $32,%rax
  16.     shl $32,%rdi
  17.    
  18. #jesli liczba ma 32 zer z przodu to dodamy 32 do wyniku i wykonamy sie na
  19. #pozostalych 32 bitach, przesuwamy wtedy liczbe o 32 w lewo, bo tam sa same zera
  20. #jesli nie to bez dodawania 32 do wyniku wykonujemy algorytm dla 32 starszych
  21. #bitow, bez przesuniecia. W taki sposob logarytmicznie sprawdzamy ilosc zer
  22.  
  23. pomin32:
  24. #to samo ale dla 16 bitow z przodu
  25.     mov $0xFFFF000000000000,%rsi
  26.     and %rdi,%rsi
  27.     cmp $0,%rsi
  28.     jne pomin16
  29.     add $16,%rax
  30.     shl $16,%rdi
  31.  
  32. pomin16:
  33. #to samo ale dla 8 bitow z przodu
  34.     mov $0xFF00000000000000,%rsi
  35.     and %rdi,%rsi
  36.     cmp $0,%rsi
  37.     jne pomin8
  38.     add $8,%rax
  39.     shl $8,%rdi
  40.  
  41. pomin8:
  42. #to samo ale dla 4 bitow z przodu
  43.     mov $0xF000000000000000,%rsi
  44.     and %rdi,%rsi
  45.     cmp $0,%rsi
  46.     jne pomin4
  47.     add $4,%rax
  48.     shl $4,%rdi
  49.  
  50. pomin4:
  51. #to samo ale dla 2 bitow z przodu
  52.     mov $0xC000000000000000,%rsi
  53.     and %rdi,%rsi
  54.     cmp $0,%rsi
  55.     jne pomin2
  56.     add $2,%rax
  57.     shl $2,%rdi
  58.    
  59. pomin2:
  60. #to samo ale dla 1 bitu z przodu
  61.     mov $0x8000000000000000,%rsi
  62.     and %rdi,%rsi
  63.     cmp $0,%rsi
  64. #tutaj sprawdzilismy czy ostatni bit jest zerem z dwoch niesprawdzonych bitow
  65.  
  66.     jne koniec
  67. #specjalny przypadek bo dwa ostatnie bity nie moga byc naraz zerami
  68. #inaczej by na samym poczatku algorytm wypisal 64 jako wynik
  69. #w tym przypadku ostatni bit jest zerem wiec przedostatni jest jedynka
  70.     add $1,%rax
  71.  
  72. #nie ma pomin1,  bo to znaczy ze ostatni bit z pary niesprawdzonych jest 1
  73. #czyli nie ma wiekszego prefiksa
  74.  
  75. koniec:    
  76.     ret
  77.  
  78.         .size   clz, .-clz