如何在Mac上使用AES-NI内在函数?

时间:2012-09-28 05:51:56

标签: xcode gcc aes sse llvm-gcc

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

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

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

英特尔在其网站上有lots of AES example code,但它仅适用于Linux和Windows。

我注意到llvm-gcc也不支持RDRAND指令,但英特尔通过使用扩展为原始机器字节代码的C宏为此提供了解决方法。 (See the rdrand.h example file in this Intel library

不幸的是,没有为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);   

感谢您的帮助!

1 个答案:

答案 0 :(得分:7)

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

然而,我确实找到了两个可行的解决方案,都是通过简单地避开Apple的软件。一种是使用英特尔自己的商业C ++编译器。 另一种是从源代码下载和编译GCC 4.6或4.7并直接使用它。这是我选择的选项。我跟着this guide. GCC编译和安装(虽然干净)仍然是一个麻烦和解决方法只是为了使用单个CPU内在,但它的工作原理。谢谢,GCC团队!