Vlákno názorů k článku Specifika instrukční sady mikroprocesorů Intel 8086/8088 (3) od _dw - repne scasb Na 486 clocks 7+5*n, * = 5...

  • 26. 9. 2024 3:41

    _dw

    repne scasb
    Na 486 clocks 7+5*n, * = 5 if n=0
    (n = count of bytes, words or dwords)

    Hledani mezery v retezci...

    To me pripomina ze pry existuje jazyk co ma nepocitane retezce... ze pry konci retezce hodnotou nula.
    Coz znamena ze v dobe pred internetem kazdy objevoval kolo a resil jak ziskat co nejrychleji delku retezce, pokud s nim chtel delat neco vic nez tisknout.
    A pro 486 nekdo vymyslel tohle...

    lea ecx, [eax - 0x01010101]   ; Od kazdeho bajtu odecti 1 *
    not eax                       ; invertuj všechny bity v EAX
    and eax, ecx                  ; **
    test eax, 0x80808080          ; Pokud je výsledek v nejvyšších bitech 1, je v některém bajtu nula
    jnz found_zero_byte           ; Pokud některý bajt obsahuje nulu, jdi na found_zero_byte

    * Pokud je nulovych bajtu vic, je zaruceno ze aspon v jednom bude FF.

    ** Co se stane kdyz odecteme od bajtu 1? Zmeni to nejnizsi jednickovy bit na nulu. A vsechny bity pod nim nastavi na 1.
    Co se stane kdyz provedema AND s invertovanymi bity? Horni nulove a jednickove bity se nezmenily, takze kdyz byly nulove jsou jednickove po inverzi a kdyz byly jednickove jsou nulove po inverzi... takze AND je vsechny vynuluje. Ten nejnizsi jednickovy bit po inverzi je nula a stejne po odecteni je taky nula, takze "dvojnasobne" zaruceno ze po AND ziska hodnotu nula. Takze jednickove bity budou jen nejnizsi nulove. Tim je zaruceno ze pokud tam na zacatku bylo neco jineho nez 0 tak nejvyssi bit bude vzdy NULA.

    Ten kod ma clock 1-2 takty krome skoku na instrukci a prohledava 4 vetsi hodnotu nez 8 bitovy char.
    Pokud se to neprovadi nad 10 znakovymi retezci tak je to rychlejsi.

  • 29. 9. 2024 23:19

    Ladis

    Podobně se akceleruje přes SIMD instrukce, princip je stejný. Samozřejmě nezarovnaný začátek a konec dělám jinak.