我试图构建VS2010 CRT库的一些函数的稍微修改的版本,除了它试图访问一个全局变量的部分之外,一切都很好,该变量可能包含指令集架构版本(伊萨):
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
是如何以及在哪里被赋值的,我们找不到(我在所有目录中尝试了find-in-files...)
MSDN参考CPUID示例来确定指令集。问题是它使用了__asm
块,而这些块在我的x64构建中是不允许的。
有谁知道如何快速地为__isa_available
分配正确的值?
2条答案
按热度按时间nafvub8i1#
微软决定停止对内联汇编的支持。但他们引入了一种新的格式。您可以在新格式here中找到有关CPUID的更多信息(示例)。
intrinsic优于内联汇编的优点是,它们与x86和x64兼容,无需额外代码,并且更易于使用。
n1bvdmb62#
VC++有一个内部函数,允许你在没有内联ASM的情况下使用CPUID:
__cpuid in intrin.h
在同一个网站上也有一个广泛的代码示例。