Mam taką funkcę liczącą log2(x) napisaną w AVR-GCC
Kod: Zaznacz cały
uint8_t clz(uint64_t x) {
uint8_t n=0;
if(x == 0) /* To niekoniecznie, troche trwa takie sprawdzanie, ale zeby sie tego pozbyc trzeba by zmodyfikowac petle ponizej, zeby sie nie 'wysypaly' */
return 64;
/* Najpierw po calym bajcie */
while((x & 0xff00000000000000ULL) == 0) { /* dopoki najstarszy bajt = 0 */
n += 8; /* dodac 8 zer do licznika */
x <<= 8; /* wartosc przesunac o 8 bitow w lewo */
}
/* A teraz po jednym bicie */
while((x & 0x8000000000000000ULL) == 0) { /* dopoki najstarszy bajt = 0 */
n += 1; /* dodac 1 zero do licznika */
x <<= 1; /* wartosc przesunac o 1 bit w lewo */
}
return n;
}
Czy możecie mi podpowiedzieć jak to zobić w asm.Nie radzę tego próbować. avr-gcc jest mało 'kumatym' kompilatorem i cos mi się zdaje, że nie poradzi sobie z optymalizacją.
To samo napisane w asm będzie bardzo szybkie
Liczba na wejsciu jest tupu int16_t
A w pgóle to potzrzebne mi to jest poto aby zamienić zakres licz na wejsciu od 0 do 35314 do wartości z zakresu 0 do 64.