在 x64 上获取不带 __asm 的 SSE 版本
Posted
技术标签:
【中文标题】在 x64 上获取不带 __asm 的 SSE 版本【英文标题】:Get SSE version without __asm on x64 【发布时间】:2012-02-17 19:56:35 【问题描述】:我正在尝试构建 VS2010 CRT 库的某些功能的略微修改版本,除了它尝试访问可能包含指令集架构版本 (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
?
【问题讨论】:
【参考方案1】:Microsoft 决定停止对内联汇编的支持。但他们引入了一种新格式。您可以在新格式here 中找到有关 CPUID 的更多信息(带有示例)。
内在函数相对于内联汇编的优势在于它们无需额外代码即可与 x86 和 x64 兼容,并且更易于使用。
【讨论】:
太棒了,这正是我所需要的。【参考方案2】:VC++ 有一个内在特性,允许您在没有内联 ASM 的情况下使用 CPUID:
__cpuid in intrin.h
在同一个网站上也有一个广泛的代码示例。
【讨论】:
以上是关于在 x64 上获取不带 __asm 的 SSE 版本的主要内容,如果未能解决你的问题,请参考以下文章
x64 asm如何将函数指针设置为_cdecl C函数并调用它?
Visual Studio 2008 内联汇编 关键字__asm出错