【问题标题】:Packed Shuffle Bytes, reverse operationPacked Shuffle Bytes,反向操作
【发布时间】:2019-09-18 22:39:55
【问题描述】:

需要 AVX 专家:

给定洗牌指令

VPSHUFB ymm1、ymm2、ymm3/m256

根据文档,这个“根据 ymm3/m256 的内容在 ymm2 中随机播放字节。”

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

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

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

【问题讨论】:

  • 一张带方框和箭头的纸就是这样做的方法。

标签: assembly avx avx2


【解决方案1】:

是否可以逆运算,也就是说知道ymm2和shuffle的结果,是否有可能得到ymm3?

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

当然,想出 一个 shuffle 控件来从该输入创建输出是很容易的。


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

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

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


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

【讨论】:

    猜你喜欢
    • 2019-03-06
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多