我正在尝试在 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);
谢谢你的帮助!