go x/crypto/chacha20poly1305: 在amd64上无条件使用PSHUFB指令

7uzetpgm  于 4个月前  发布在  Go
关注(0)|答案(4)|浏览(62)

看起来像是golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s在构建时无条件地使用了PSHUFB指令,即使GOAMD64=v1。PSHUFB是SSSE3的一部分,而SSSE3只有v2+版本。在我编写的类似chacha8rand的代码中,我不想因为两份代码和一个运行时开关的开销,所以我只是做了

// ROL16 rotates the uint32s in register R left by 16, using temporary T if needed.
#ifdef GOAMD64_v2
#define ROL16(R, T) PSHUFB ·rol16<>(SB), R
#else
#define ROL16(R, T) ROL(16, R, T)
#endif

// ROL8 rotates the uint32s in register R left by 8, using temporary T if needed.
#ifdef GOAMD64_v2
#define ROL8(R, T) PSHUFB ·rol8<>(SB), R
#else
#define ROL8(R, T) ROL(8, R, T)
#endif

这对于这段代码来说可能也没关系,因为较新的x86芯片最终还是会使用AVX代码路径。

vuktfyat

vuktfyat1#

https://go.dev/cl/538786提到了这个问题:chacha20poly1305: guard PSHUFP usage with GOAMD64_v2

35g0bw71

35g0bw712#

这是否需要回溯到1.20和1.21版本?
我认为是的。重新开放以做出这个决定。

gdrx4gfi

gdrx4gfi3#

你好,我有一个用户报告说由于这个更改(rfjakob/gocryptfs#828),gocryptfs的性能下降了15%。CPU是cpu: Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz,所以我猜它太旧了,不支持AVX,但它确实有PSHUFB。

能否在运行时检测到PSHUFB?

suzh9iv8

suzh9iv84#

你好,@rfjakob,感谢你报告这个问题。我认为对于PSHUFB的特性检测没有被考虑,它只是与其他amd64v2特性一起分组。你介意打开一个新的问题来讨论这个吗?

相关问题