Получить версию SSE без __asm ​​на x64 - PullRequest
4 голосов
/ 17 февраля 2012

Я пытаюсь построить слегка модифицированные версии некоторых функций библиотеки CRT VS2010, все хорошо, за исключением частей, где она пытается получить доступ к глобальной переменной, которая предположительно содержит версию архитектуры набора команд (ISA):

if (__isa_available > __ISA_AVAILABLE_SSE2)
{
    // ...
}
else if (__isa_available == __ISA_AVAILABLE_SSE2)
{
    // ...
}

Значения, которые он должен содержать, я нашел в файле сборки

__ISA_AVAILABLE_X86   equ 0
__ISA_AVAILABLE_SSE2  equ 1
__ISA_AVAILABLE_SSE42 equ 2
__ISA_AVAILABLE_AVX   equ 3

Как и где __isa_available присваивается значение, нигде не найдено (я пробовал находить файлы во всех моих каталогах ...)

MSDN использует пример CPUID для определения набора команд. Проблема в том, что он использует блоки __asm, и они не разрешены в моей сборке x64.

Кто-нибудь знает, как быстро назначить правильное значение для __isa_available?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2012

Microsoft решила прекратить поддержку встроенной сборки. Но они представили новый формат. Вы можете найти больше информации о CPUID в новом формате здесь (с примером).

Преимущество встроенных функций перед встроенной сборкой заключается в том, что они совместимы с x86 и x64 без дополнительного кода и более просты в использовании.

1 голос
/ 18 февраля 2012

VC ++ имеет встроенную функцию, которая позволяет использовать CPUID без встроенного ASM:

__ cpuid в intrin.h

На этом же сайте представлен обширный пример кода,тоже.

...