今年早些时候,英特尔发布了一个指令“列表”,保证不对其数据操作数具有时序依赖性。 (最初有人建议,仅当启用 DOITM 时,这些才是恒定时间,但后来澄清,无论 DOITM 如何,这些总是恒定时间。)出于好奇,我正在研究现实世界的加密货币有多接近实现符合此列表(即仅使用此列表中的指令)。 事实证明这个列表有很多奇怪的地方。它有
MOVDQU
,但没有
MOVUPS
,尽管两者在功能上应该是相同的。这不是一个严重的问题:我可以简单地获取编译器的汇编输出,并在汇编之前执行sed 's/movups/movdqu/g'
。一个更困难的障碍是它没有(V)SHUFPS
,尽管它显然有很多其他浮点洗牌指令,如
VPERMILPS/D
。 SHUFPS
在 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 生成
VPSHUFD
和
VPBLENDD
,根据 Intel 的说法,这两者都应该是恒定时间的。