在 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函数并调用它?

VS的 X64下的汇编编译

Visual Studio 2008 内联汇编 关键字__asm出错

如何获取基本堆栈指针的地址

如何将 x86 和 x64 asm 文件包含到单个 Visual Studio 项目中?

如何获取基堆栈指针的地址