以字节码形式使用指令时需要 -xarch=XXX 吗?

Need for -xarch=XXX when an instruction is used in byte code form?

我有一个如下所示的 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 的 ISA(以及 -xarch=avx2_i 用于 RDSEED)。另见 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;

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

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