我有一个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文档说,对于提供RDRAND的ISA,我需要-xarch=avx_i
(对于RDSEED,需要-xarch=avx2_i
)。另请参见Sun Studio 12.6 | -xarch Flags for 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;
答案 0 :(得分:2)
不,您不需要。编译器不处理__asm
语句中的指令。汇编器将检测到您使用的指令,并使用适当的HWCAP标记.o。您不必显式地将任何内容传递给编译器。
唯一的情况是编译器需要-xarch=avx_i
,如果您使用的是rdrand内在函数,因为在这种情况下,编译器知道它将为avx_i
生成指令,因此必须检查如果当前选择的体系结构允许它。