为什么(V)SHUFPS不在Intel的恒定时间指令表中?

问题描述 投票:0回答:1

今年早些时候,英特尔发布了一个指令“列表”,保证不对其数据操作数具有时序依赖性。 (最初有人建议,仅当启用 DOITM 时,这些才是恒定时间,但后来澄清,无论 DOITM 如何,这些总是恒定时间。)出于好奇,我正在研究现实世界的加密货币有多接近实现符合此列表(即仅使用此列表中的指令)。 事实证明这个列表有很多奇怪的地方。它有

MOVDQU

,但没有

MOVUPS
,尽管两者在功能上应该是相同的。这不是一个严重的问题:我可以简单地获取编译器的汇编输出,并在汇编之前执行
sed 's/movups/movdqu/g'
一个更困难的障碍是它没有

(V)SHUFPS

,尽管它显然有很多其他浮点洗牌指令,如

VPERMILPS/D
SHUFPS
在 BLAKE3 中
使用
该指令未包含在恒定时间列表中是否有已知原因?仅使用此列表中的指令来模拟其功能的好方法是什么?

assembly cryptography x86-64 cpu-architecture avx
1个回答
0
投票

#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 的说法,这两者都应该是恒定时间的。
    

© www.soinside.com 2019 - 2024. All rights reserved.