我有一个 x86 RDRAND 实现,如下所示。我对 RDSEED 有类似的实现。
inline void RDRAND32(void* output)
{
#if defined(HAVE_GCC_RDRAND_ASM)
__asm__
(
"1:\n"
".byte 0x0f, 0xc7, 0xf0;\n"
"jnc 1b;\n"
: "=a" (*(uint32_t*)output)
: : "cc"
);
#endif
}
发出的字节码是rdrand eax
并且有能力的处理器会愉快地使用它们。Sun Studio 12.1 及更高版本支持 GCC 内联汇编并使用它们。
Sun 文档说我需要-xarch=avx_i
提供 RDRAND(和 RDSEED -xarch=avx2_i
)的 ISA。另请参阅Sun Studio 12.6 | -xarch x86 的标志。
在这个用例中,我还需要添加-xarch=avx_i
到我的链接器标志吗?RDRAND
万一这很重要,我们在运行时保护 CPU 功能并使用 Mapfile 来降低 ISA(因为运行时路径受到保护):
$ cat cryptopp.mapfile
# Solaris mapfile to override hardware caps to avoid kills
hwcap_1 = SSE SSE2 OVERRIDE;