0

我有一个 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;
4

1 回答 1

2

不,你不需要。编译器不处理__asm语句内的指令。汇编器将检测您使用的指令并用适当的 HWCAP 标记 .o。您不必显式地将任何内容传递给编译器。

编译器需要-xarch=avx_i您的唯一情况是,如果您使用的是 rdrand 内在函数,因为在这种情况下,编译器知道它将为它生成指令,avx_i并且必须检查当前选择的架构是否允许它。

于 2019-06-28T19:17:52.543 回答