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