在预处理器中检测ARM-64?

jww*_*jww 1 macros 64-bit arm visual-studio c-preprocessor

据微软(此处此处)称,该公司将在即将推出的Windows 10版本中支持ARMv8/Aarch64(ARM-64).此外,微软已经提供了预览,因此我猜测工具支持已到位.

对于那些不知道的人,文章提供图像清楚地显示了Qualcomm Snapdragon 410.这是一个A-53核心,它的Aarch64/ARM-64.

Microsoft定义_M_ARM了ARM-32,我们目前使用它来检测NEON可用性.ARMv8支持可选扩展CRC32,AES,SHA-1和SHA-2.我们已经为Apple和Linux编写了代码,我们希望为Microsoft平台启用它.

微软也有__M_ARM_FP,但不清楚用它来检测ARM64.我也不清楚x86的相关性:

扩展为整数字面值,指示使用了哪个/ arch编译器选项:

  • 如果未指定/ arch ARM选项,则在30-39范围内,表示使用了ARM的默认体系结构(VFPv3).
  • 如果使用/ arch:VFPv4,则在40-49范围内.
  • 有关更多信息,请参见/ arch(x86).

我对我可用的Microsoft编译器进行了一些快速测试(所有这些都可以追溯到VC++ 5.0).他们没有消耗ARMv8内在函数,这并不奇怪.我猜我需要一个MSDN订阅来测试最新的工具,但我不再订阅了.

我的问题是:

  • 我们如何在预处理器中检测ARMv8/Aarch64(_M_ARM64?)
  • 什么版本的compiler(_MSC_VER)支持ARMv8指令

这可能是相关的:什么是WINAPI_FAMILY_ONECORE_APP?

mst*_*sjo 5

VS从VS2017开始使用_M_ARM64,详见下文.

答案,顺序相反:

  • 当前发布的Visual Studio版本都不支持ARMv8/AArch64,它们仅支持ARMv7.尽管Windows 10本身显示了arm64支持的迹象(arm64有一些可执行文件和库),但据我所知,到目前为止已发布的编译器版本实际上都没有包含它.(Visual Studio 2015社区至少不包含它,几天前发布的新Visual Studio"15"预览版2也没有.)所以很明显它在内部存在,但它还没有成为任何一部分.公开发布了.

  • 至于要定义的内容; 这是目前未知的,因为没有关于编译器的arm64目标版本的公共文档,因为它尚未发布,也无法根据经验进行测试.

我没有看到微软在你的任何一个链接中都说明它会得到支持的任何明确声明,但至少Windows 10 SDK确实显示出它正在被处理的明显迹象.


编辑:

即使编译器不可用,Windows 10 SDK(其本身包含用于ARM64的库)标头和Visual C++ 2015标头(没有匹配的ARM64库)也包含对此的引用.与此类似_M_ARM,也有_M_ARM64.来自的代码vc/include/intrin.h:

#if defined (_M_ARM)
    #include <armintr.h>
    #include <arm_neon.h>
#endif

#if defined (_M_ARM64)
    #include <arm64intr.h>
    #include <arm64_neon.h>
#endif
Run Code Online (Sandbox Code Playgroud)

EDIT2:

虽然目前还没有针对arm64的Visual C++编译器的公开版本,但clang正在获得Windows/arm64的第一部分支持,他们还使用_M_ARM64:

https://github.com/llvm-project/clang/commit/5b7d7d2b2d0bd7054f51b9d108cdd5299a0ec33e#diff-ed544af3ae6807a8513b1cabb3233941R6576


EDIT3:

随着Visual Studio 2017 15.4版的最新更新,ARM64编译器发布.在安装程序中,可以手动检查"用于ARM64的Visual C++编译器和库"项(默认情况下不启用).

执行此操作后,您可以启动"VS 2017的开发人员命令提示符",并在该shell运行"vsdevcmd -arch = arm64 -host_arch = amd64",然后您在路径中获得了编译器:

**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.4.0
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>vsdevcmd -arch=arm64 -host_arch=amd64
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.4.0
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>cl
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for ARM64
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>
Run Code Online (Sandbox Code Playgroud)

此编译器预定义_M_ARM64允许您识别它,从而回答这个问题.