Packed Shuffle Bytes,反向操作

Packed Shuffle Bytes, reverse operation

需要 AVX 专家:

给出了洗牌指令

VPSHUFB ymm1, ymm2, ymm3/m256

根据文档,这个 "Shuffle bytes in ymm2 according to contents of ymm3/m256."

我的问题是:是否可以逆向操作,也就是说,知道ymm2和洗牌的结果,是否有可能得到ymm3?

例如 vpshufb ymm0, ymm0, ymmword ptr ds:[0x100]

我知道 ymm0 中已经加载了什么,以及结果,但我想了解如何获取 "control mask" ymmword....

is it possible to reverse the operation, in other words, knowing ymm2 and the result of the shuffling, is possible to get ymm3?

不,一般情况下不是。如果源数据有一些重复元素(在泳道内),您无法唯一确定随机播放控制向量是什么,因为该输出字节可能来自多个地方。

当然很容易想出 a 随机播放控件,它可以从该输入创建该输出。


当然,如果洗牌输入数据在每个 16 字节通道中是唯一的,那么是的,您可以唯一地确定每个输出元素必须来自的索引。

即使这样你也只能确定shuffle control每个字节的低4位。 (并且高位未设置,否则 vpshufb 将输出的那个字节归零。)位 6:4 对操作完全没有影响。 (查看手册的操作部分:https://www.felixcloutier.com/x86/pshufb。混洗控制向量元素的位 3:0 是源数据向量的索引。)

随机播放控制元素的高位是另一个可能的歧义:如果输入数据包含任何零字节,则输出零可能来自索引该源元素或来自设置了高位的控制元素。


顺便说一句,没有任何说明可以帮助您高效 执行此操作。 IDK 如果你能做得比一次搜索每个字节 1 的源位置更好。 (使用字节广播和 vpcmpeqb -> vpmovmskb -> bsf 一次搜索所有 16 个位置。)