Эффективный isalnum()

Тема в разделе "WASM.A&O", создана пользователем h3uristic, 19 май 2007.

  1. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    а я б cmov* предпочёл бы.
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    cresta
    С лишними push\pop и с тормозной BT ес-но побитовый вариант хуже. Но, ведь можно и класику типа and ecx,7 + shr al,cl использовать. Если нужен компромисс размера и скорости, то и с размером таблицы можно особо не мелочиться, вполне подойдет классический дельфовый вариант set of char c 32 байтной таблицей (<= одной линейки кэша) - зато без лишних jcc
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    n0name
    Что в приоретете, автор пока даже сам не определился :)
    Если есть варианты (по скорости, по размеру), выкладывай.
    Из того, что я в этом топике видел, пока работа с битами самая медленная. И не самая маленькая по размеру.
    Давай варианты. Мысль с битами твоя - вот и давай нормальную реализацию :)

    leo
    pop/push ebx никак не лишние: в задаче оговорено незадействование регистров (кроме аккумулятора).
    Давай тоже варианты.

    P.S.
    Маленький код по-моему давно уже перестал быть приорететом. В отличие от скорости.
    ИМХО.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    в #18 - 46 байт.
    Код (Text):
    1. format binary
    2.  
    3. use16
    4. org 100h
    5.         cmp al, 7Ah
    6.         jge _end
    7.         sub al, 2Dh
    8.         js  _end
    9.         bt word [table], ax
    10.  
    11. _end:
    12.         ; some code
    13.  
    14.                 ;  43210fed   cba98765
    15. table           db 11111011b, 00011111b ; 2d
    16.                 db 11111000b, 11111111b ; 3d
    17.                 db 11111111b, 00111111b ; 4d
    18.                 db 11110100b, 11111111b ; 5d
    19.                 db 11111111b, 00111111b ; 6d
    23 байта
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ровно в 2 раза меньше.
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    n0name

    надо добавить clc, причем 2 штуки (+2 байта), иначе числа больше 7А и меньшие 2D будут давать неверные значения на короткой (10 байт) таблице. И заменить jge на jae.

    Код (Text):
    1.         clc
    2.         cmp     al, 7Ah
    3.         jae     @F
    4.         sub     al, 2Dh
    5.         clc
    6.         js      @F
    7.         bt      word ptr [table], ax
    8. @@:
    Если делать таблицу 32 байта (256 бит) и использовать bt, то код станет 12 байт:
    Код (Text):
    1.         and     ax,0FFh
    2.         bt      word ptr [table], ax
    Этот вариант почти вдвое быстрее предыдущего варианта (34/64), правда на 9 байт длиннее (44/35).
    Возможно это и есть компромисс между скоростью и размером.

    leo
    and cl, 7 + rcr al,cl не очень впечатлило... ~90 тиков (10 проходов).
     
  7. h3uristic

    h3uristic New Member

    Публикаций:
    0
    Регистрация:
    18 май 2007
    Сообщения:
    82
    немного переделанный код от n0name на 2 байта короче

    Код (Text):
    1. ; надо заменить это
    2.                 cmp al, 7Ah
    3.             jge _end
    4.                 sub al, 2Dh
    5.                 js  _end
    6.  
    7. ; на это
    8.             sub al,2dh
    9.             cmp al,4dh
    10.             ja .exit
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    cresta
    На атлонах bt рулит в цикле, т.к. она конвееризована (throughput = 2), а вот на P4 это отстой полнейший :dntknw:
     
  9. h3uristic

    h3uristic New Member

    Публикаций:
    0
    Регистрация:
    18 май 2007
    Сообщения:
    82
    Код (Text):
    1. ;;в al код символа
    2. ;; ah должен быть сброшен -  поддержка unicode ;))
    3. ;;CF = 0 если символ входит в заданный диапазон
    4. nsumbol:
    5.             sub al,2dh
    6.             cmp al,4dh
    7.             ja .exit
    8.            
    9. ;;  ????????
    10.             bt word [table],ax
    11. ;;  ????????
    12.                    
    13. .exit:      ret                    
    14.  
    15.         table       db      00000100b, 11100010b, 00001111b, 00000000b
    16.                             db      00000000b, 11000000b, 00001011b, 00000000b
    17.                         db      00000000b, 00000000b
    15 байт
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ты где то ошибся в подсчетах. и плюс как прально сказал cresta, надо clc сделать после cmp.