我有一个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 )。也见Studio 12.6 \x{e76f}用于-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;发布于 2019-06-28 19:17:52
不,你不需要。编译器不处理__asm语句中的指令。汇编程序将检测您使用的指令,并使用适当的HWCAP标记.o。您不必显式地将任何内容传递给编译器。
编译器需要-xarch=avx_i的唯一情况是如果您使用rdrand,就像在本例中编译器知道它将要为avx_i生成指令,并且必须检查当前选择的体系结构是否允许它。
https://stackoverflow.com/questions/51678753
复制相似问题