Microsoft编译器下_rdrand_step内在函数的可用性?

根据微软的x64(amd64)Intrinsics列表 ,微软提供了一个固有的RDRAND:

  • _rdrand16_step
  • _rdrand32_step
  • _rdrand64_step

但是,页面并没有讨论检测内在的可用性。 有一个脚注[2] ,但它说,它只适用于英特尔CPU。

我有两个问题。 首先,我如何检测内部函数的可用性。 也就是说,我应该使用什么样的预处理器macros来防止调用_rdrand64_step

其次,如何在AMD CPU下访问RDRAND。 根据AMD手册,AMD也提供这个function。

(更幽默地说,微软称之为amd64 Intrinsic List页面,当他们不包括AMD的时候,他们为什么称之为AMD64固有列表)


有关AMD和RDRAND指令,请参阅AMD64体系结构程序员手册第3卷:通用和系统指令 ,第278页。

你可以使用以下命令来检查MS编译器的版本:

  1. MSVC ++ 14.0 _MSC_VER == 1900(Visual Studio 2015) 详细

  2. 我不知道如何使用它的AMD架构。 如果我得到一些解决方案,会让你知道

  3. 你可以得到答案为什么MS文档在这篇文章中称它为amd64。

首先,我如何检测内部函数的可用性。 也就是说,我应该使用什么样的预处理器宏来防止调用_rdrand64_step。

以下是RDRAND内部函数所需的编译器版本:

  • 微软2012年8月份添加了RDRAND,VS2012。 测试_MSC_VER >= 1700
  • GCC于2010年12月加入了RDRAND,GCC 4.6。
  • Clang于2012年7月添加了RDRAND,Clang 3.2。
  • 英特尔在2011年9月加入了RDRAND,ICC 12.1。

其次,如何在AMD CPU下访问RDRAND。 根据AMD手册,AMD也提供这个功能。

提供RDRAND指令的AMD CPU似乎即将到来。 也就是说,目前没有CPU随该功能一起发货。

Microsoft文档清楚地表明内部函数仅适用于Intel CPU。 鉴于英特尔与AMD之间的反竞争历史,为了确保AMD的支持,ASM应手工制作,并与MASM / ML和MASM64 / ML64进行汇编。