首页 > 解决方案 > Packed Shuffle Bytes,反向操作

问题描述

需要 AVX 专家:

给出洗牌指令

VPSHUFB ymm1、ymm2、ymm3/m256

根据文档,此“根据 ymm3/m256 的内容对 ymm2 中的字节进行洗牌”。

我的问题是:是否可以反转操作,换句话说,知道 ymm2 和洗牌的结果,是否有可能得到 ymm3?

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

我知道 ymm0 中已经加载了什么以及结果,但我想了解如何获取“控制掩码”ymmword ....

标签: assemblyavxavx2

解决方案


是否可以反转操作,换句话说,知道 ymm2 和洗牌的结果,是否有可能得到 ymm3?

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

当然,很容易想出一个随机控制来从该输入创建输出。


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

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

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


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


推荐阅读