Узнать номер старшего значащего байта (или бита).

Тема в разделе "WASM.BEGINNERS", создана пользователем SaintSatanist, 28 янв 2011.

  1. SaintSatanist

    SaintSatanist New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2011
    Сообщения:
    2
    Сабж таков - есть "pcmpeqb %mm0,%mm1", результат он предоставляет в виде байтов набитых либо нулями либо FыFычками.
    Далее я делаю
    Код (Text):
    1. mov %mm1, %rax
    2. cmp $0,%rax
    3. je somewhere
    Но в случае когда совпадение найдено, мне надо за минимум операций узнать в каком байте произошло совпадение (в моей программе совпадение может быть только в одном байте).
    Самый простой вариант "в лоб" таков:
    Код (Text):
    1. test $0xff00000000000000,%rax
    2. jne somewhereelse
    3. .....
    4. test $0xff00,%rax
    5. jne somewhereelse
    Ну я располовил проверку написав
    Код (Text):
    1.   mov $0,%rbx        ;в rbx будет номер байта  
    2.   cmp $0, %eax
    3.   jne forward
    4.   shr $32,%rax
    5.   mov $4,%rbx       ;номер байта в старшем dword-е
    6. forward:
    7.   cmp $0,%ax
    8.   jne forwardagain
    9.   shr $16,%rax
    10.   add $2,%rbx       ;номер байта в старшем word-е
    11. forwardagain:
    12.   cmp $0,%al
    13.   jne final
    14.   inc %rbx
    15. final:
    16.   ;и только теперь у нас есть номер байта в регистре rbx
    Архитектура x86-64, ось-линукс.
    Хотелось бы услышать команду из какого-то очередного SIMD-расширения, которая чудным образом называет номер (первого либо самого старшего) ненулевого байта.
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    SaintSatanist
    Если в каждом байте обнулить все биты кроме младшего, а потом умножить rax на магическую константу 0102030405060700h, то в dl мы как раз получим номер байта, еще можно поискать в mmx команду которая перемножаем байты двух регистров и суммирует их, правда как называется не помню.

    [add]Самое полезное пожалуй будет PMOVMSKB, или всякие BSF,BSR[/add]
     
  3. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Загнать в стек и старое доброе repe scasb или команды сканирования бита BTS (?).
     
  4. SaintSatanist

    SaintSatanist New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2011
    Сообщения:
    2
    Премного тебе благодарен.
    Все упомянутые тобой операции будут полезны. Мне стоит узнать сколько они хавают тактов проца, на основе чего выдумать код.
    Если bsf быстрый, то очевидное решение
    Код (Text):
    1. mov %mm1,%rax
    2. bsf %rax,%rbx
    3. shr $3,%rbx
    Если bsf работает пропорционально позиции бита и pmovmskb быстрый, то можно сделать типа
    Код (Text):
    1. PMOVMSKB %mm1,%eax
    2. bsf %eax,%ebx
    Господа, какой код будет быстрее?