MSVC 2019 _fxrstor64 和 _fxsave64 内部函数可用性

MSVC 2019 _fxrstor64 and _fxsave64 intrinsics availability

为确保编译器是 MSVC2019 以及 _fxrstor64 和 _fxsave64 内在函数可供使用,我至少需要进行哪些预处理器检查?

要检查您是否(至少)拥有 MSVC 2019 编译器,您应该使用以下内容:

#if !defined(_MSC_VER) || (_MSC_VER < 1900)
#error "Not MSVC or MSVC is too old"
#endif

要使 _fxrstor64_fxsave64 内在函数可用于 MSVC,您需要检查是否包含“immintrin.h”header:

#ifndef _INCLUDED_IMM
#error "Haven't included immintrin.h"
#endif

您还(可能很明显)需要针对 x64 架构进行编译:

#ifndef _M_X64
#error "Wrong target architetcture!"
#endif

您可以将所有这些检查放在一个测试中,如下所示:

#if defined(_MSC_VER) && (_MSC_VER >= 1900) && defined(_INCLUDED_IMM) && defined(_M_X64)
    // OK
#else
    #error "Wrong compiler or target architecture, or missing header file."
#endif

请注意,_INCLUDED_IMM 标记 特定于 MSVC 编译器;例如,clang-cl 使用 __IMMINTRIN_H。因此,如果您还想启用其他 MSVC-compatible 编译器,则需要为它们自己的每个标记添加可选检查(通过查看“immintrin.h” header 每个标记使用)。


如评论中所述,一旦完成并通过其他三项检查,显式 #include <immintrin.h> 可能更明智(header 中的包含守卫将处理任何多重包含).所以:

#if defined(_MSC_VER) && (_MSC_VER >= 1900) && defined(_M_X64)
    #include <immintrin.h> // All good!
#else
   // TODO: allow GCC / clang / ICC which also provide _fxsave64 in immintrin.h
    #error "Wrong compiler/version, or not x86-64."
#endif

(这也解决了使用不同标记表示包含该 header 文件的不同实现的问题。)