9

我正在尝试在 Mac 上编译 C 应用程序。我使用 SSE4 和 AES-NI 内在函数。

在 Linux 中,我只需使用 -msse4 和 -maes 标志调用 gcc 并包含wmmintrin.h标头,我可以调用 SSE 内在函数_mm_add_epi64(a,b)或 AES-NI 内在函数_mm_aesenc_si128(a, b),一切正常。

在 Mac 上,这更难,因为 Apple 用尚不支持 AES-NI 的 llvm-gcc 替换 GCC。所以 SSE4 内在函数工作正常,但不是 AES 的。即使是对 AES 指令的内联汇编调用也无法识别。

英特尔在他们的网站上有很多 AES 示例代码,但它仅适用于 Linux 和 Windows。

我确实注意到 llvm-gcc 也不支持 RDRAND 指令,但英特尔通过使用扩展为原始机器字节码的 C 宏提供了一种解决方法。(请参阅此英特尔库中的 rdrand.h 示例文件

不幸的是,没有为 AES-NI 指令提供类似的解决方法,可能是因为指令有参数并且不能作为静态机器代码字节进行评估。

确实存在在 Mac 上使用 AES-NI 的程序,包括 Apple 自己的 File Vault,所以一定有一些可行的方法!

为了使我的问题具体化,我将如何获得以下简单调用来使用最新的 Mac gcc-llvm 4.2(Mountain Lion xcode 4.4.1 中的最新公开版本)进行编译:

 __m128i A, B, C;
  /* A, B, C initialized here... */
  A = _mm_aesenc_si128(B, C);   

谢谢你的帮助!

4

1 回答 1

8

Apple 开发人员支持报告说使用 Xcode 是不可能的。(事实上​​,他们的回答有点刻薄,暗示 AES-NI 不是开发人员需要直接使用的东西,所以我不应该打扰。叹气,谢谢,Apple。)

但是,我确实找到了两个可行的解决方案,都是通过简单地避免使用 Apple 的软件。一种是使用英特尔自己的商业 C++ 编译器。另一种是从源码下载GCC 4.6或4.7编译后直接使用。这是我选择的选项。我遵循了本指南。GCC 编译和安装(虽然干净)仍然是一个麻烦和解决方法,只是使用单个 CPU 内在函数,但它可以工作。谢谢,海湾合作委员会团队!

于 2012-09-29T21:39:48.260 回答