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

时间:2018-08-03 19:08:37

标签: linker solaris isa sunstudio suncc

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

1 个答案:

答案 0 :(得分:2)

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

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