Нужно для -xarch=XXX, когда инструкция используется в форме байтового кода?
У меня есть реализация 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, а также использует их.
Солнце говорит, что мне нужно -xarch=avx_i
для ISA, который обеспечивает RDRAND (и -xarch=avx2_i
для RDSEED). Также смотрите Sun Studio 12.6 | -xarch Флаги для x86.
Мне все еще нужно добавить -xarch=avx_i
на мои флаги компоновщика для RDRAND
в этом случае использования?
В случае, если это имеет значение, мы защищаем функции процессора во время выполнения и используем Mapfile для понижения ISA (потому что пути выполнения защищены):
$ cat cryptopp.mapfile
# Solaris mapfile to override hardware caps to avoid kills
hwcap_1 = SSE SSE2 OVERRIDE;
0 ответов
Нет, не надо. Компилятор не обрабатывает инструкции внутри__asm
заявление. Ассемблер обнаружит используемые вами инструкции и пометит.o соответствующим HWCAP. Вам не нужно ничего явно передавать компилятору.
Единственный случай, когда компилятор потребует -xarch=avx_i
от вас, если вы используете встроенные функции rdrand, поскольку в этом случае компилятор знает, что он собирается сгенерировать инструкции для avx_i
и должен проверить, позволяет ли это в настоящее время выбранная архитектура.