Сабж таков - есть "pcmpeqb %mm0,%mm1", результат он предоставляет в виде байтов набитых либо нулями либо FыFычками. Далее я делаю Код (Text): mov %mm1, %rax cmp $0,%rax je somewhere Но в случае когда совпадение найдено, мне надо за минимум операций узнать в каком байте произошло совпадение (в моей программе совпадение может быть только в одном байте). Самый простой вариант "в лоб" таков: Код (Text): test $0xff00000000000000,%rax jne somewhereelse ..... test $0xff00,%rax jne somewhereelse Ну я располовил проверку написав Код (Text): mov $0,%rbx ;в rbx будет номер байта cmp $0, %eax jne forward shr $32,%rax mov $4,%rbx ;номер байта в старшем dword-е forward: cmp $0,%ax jne forwardagain shr $16,%rax add $2,%rbx ;номер байта в старшем word-е forwardagain: cmp $0,%al jne final inc %rbx final: ;и только теперь у нас есть номер байта в регистре rbx Архитектура x86-64, ось-линукс. Хотелось бы услышать команду из какого-то очередного SIMD-расширения, которая чудным образом называет номер (первого либо самого старшего) ненулевого байта.
SaintSatanist Если в каждом байте обнулить все биты кроме младшего, а потом умножить rax на магическую константу 0102030405060700h, то в dl мы как раз получим номер байта, еще можно поискать в mmx команду которая перемножаем байты двух регистров и суммирует их, правда как называется не помню. [add]Самое полезное пожалуй будет PMOVMSKB, или всякие BSF,BSR[/add]
Премного тебе благодарен. Все упомянутые тобой операции будут полезны. Мне стоит узнать сколько они хавают тактов проца, на основе чего выдумать код. Если bsf быстрый, то очевидное решение Код (Text): mov %mm1,%rax bsf %rax,%rbx shr $3,%rbx Если bsf работает пропорционально позиции бита и pmovmskb быстрый, то можно сделать типа Код (Text): PMOVMSKB %mm1,%eax bsf %eax,%ebx Господа, какой код будет быстрее?