以字节码形式使用指令时需要 -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
的指令并且已经检查当前选择的架构是否允许。
我有一个如下所示的 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
的指令并且已经检查当前选择的架构是否允许。