Нужно для -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 и должен проверить, позволяет ли это в настоящее время выбранная архитектура.

Другие вопросы по тегам