возможно ли отменить операцию, другими словами, зная ymm2 и результат перемешивания, можно получить ymm3?
Нет, в общем, этонет. Если исходные данные имели несколько дублирующих элементов (в пределах дорожек), вы не можете однозначно определить, каким был вектор управления перемешиванием, потому что этот выходной байт мог поступить из нескольких мест.
Это, конечно,легко придумать элемент управления * shuffle , который будет создавать этот вывод из этого входа.
Конечно, если входные данные shuffle были уникальными в пределахкаждая 16-байтовая дорожка, тогда да, вы можете однозначно определить индекс, из которого должен быть получен каждый выходной элемент.
Даже тогда вы можете определить только младшие 4 бита каждого байта элемента управления перемешиванием .(И что старший бит был не установлен, иначе vpshufb
обнуляет этот байт вывода.) Биты 6: 4 не влияют вообще на операцию.(См. Раздел «Эксплуатация» руководства: https://www.felixcloutier.com/x86/pshufb. Биты 3: 0 элементов вектора управления тасованием являются индексами вектора исходных данных.)
Старший бит элементов управления тасованиемдругая возможная неоднозначность: если входные данные содержат нулевые байты, выходной ноль мог бы прийти из индексации этого исходного элемента или из этого элемента управления, для которого установлен высокий бит.
И, кстати, нетt любые инструкции, которые помогут вам сделать это эффективно .IDK, если вы можете сделать лучше, чем поиск исходной позиции каждого байта 1 за один раз.(Использование байтовой трансляции и vpcmpeqb
-> vpmovmskb
-> bsf
для поиска всех 16 позиций одновременно.)