assembly 为什么(V)SHUFPS不在英特尔的恒定时间指令列表中?

djp7away  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(65)

今年早些时候,英特尔发布了一个list指令,保证其数据操作数不具有时序依赖性。(最初有人建议,只有当DOITM被启用时,这些才是恒定时间的,但后来是clarified,这些总是恒定时间的,不管DOITM如何。仅使用来自该列表的指令)。
事实证明,这份清单有很多奇怪之处。它有MOVDQU,但没有MOVUPS,尽管两者在功能上应该是相同的。这不是一个严重的问题:我可以简单地获取编译器的汇编输出,并在汇编之前执行sed 's/movups/movdqu/g'
一个更困难的障碍是它没有(V)SHUFPS,即使它显然有很多其他浮点 Shuffle 指令,如VPERMILPS/DSHUFPS用于BLAKE3。
此指令未包含在恒定时间列表中的已知原因是什么?仅使用此列表中的指令,什么是模拟其功能的好方法?

mznpcxlj

mznpcxlj1#

我找不到第一个问题的答案(为什么它不在列表中),但我有第二个问题的解决方案,即如何解决这个指令。对于BLAKE3实现,有问题的行是

#define _mm_shuffle_ps2(a, b, c)                                               \
  (_mm_castps_si128(                                                           \
      _mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), (c))))

字符串
一降再降是

#define _mm_shuffle_ps2(a, b, c) \
      _mm_blend_epi32 (_mm_shuffle_epi32((a), (c)), _mm_shuffle_epi32((b), (c)), 0b1100)


这会导致GCC生成VPSHUFDVPBLENDD,根据Intel,这两个都应该是常数时间。

相关问题