Упакованные в случайном порядке байты, обратная операция - PullRequest
0 голосов
/ 19 сентября 2019

Нужен эксперт по AVX:

с учетом инструкции по перетасовке

VPSHUFB ymm1, ymm2, ymm3 / m256

В соответствии с документами, это "Перестановка байтов в ymm2в соответствии с содержанием ymm3 / m256. "

Мой вопрос: возможно ли отменить операцию, другими словами, зная ymm2 и результат перемешивания, можно получить ymm3?

Например vpshufb ymm0, ymm0, ymmword ptr ds:[0x100]

Я знаю, что уже загружено в ymm0, и результат, но я хотел бы понять, как получить ymmword "контрольная маска" ....

1 Ответ

3 голосов
/ 19 сентября 2019

возможно ли отменить операцию, другими словами, зная ymm2 и результат перемешивания, можно получить ymm3?

Нет, в общем, этонет. Если исходные данные имели несколько дублирующих элементов (в пределах дорожек), вы не можете однозначно определить, каким был вектор управления перемешиванием, потому что этот выходной байт мог поступить из нескольких мест.

Это, конечно,легко придумать элемент управления * shuffle , который будет создавать этот вывод из этого входа.


Конечно, если входные данные shuffle были уникальными в пределахкаждая 16-байтовая дорожка, тогда да, вы можете однозначно определить индекс, из которого должен быть получен каждый выходной элемент.

Даже тогда вы можете определить только младшие 4 бита каждого байта элемента управления перемешиванием .(И что старший бит был не установлен, иначе vpshufb обнуляет этот байт вывода.) Биты 6: 4 не влияют вообще на операцию.(См. Раздел «Эксплуатация» руководства: https://www.felixcloutier.com/x86/pshufb. Биты 3: 0 элементов вектора управления тасованием являются индексами вектора исходных данных.)

Старший бит элементов управления тасованиемдругая возможная неоднозначность: если входные данные содержат нулевые байты, выходной ноль мог бы прийти из индексации этого исходного элемента или из этого элемента управления, для которого установлен высокий бит.


И, кстати, нетt любые инструкции, которые помогут вам сделать это эффективно .IDK, если вы можете сделать лучше, чем поиск исходной позиции каждого байта 1 за один раз.(Использование байтовой трансляции и vpcmpeqb -> vpmovmskb -> bsf для поиска всех 16 позиций одновременно.)

...