我正在尝试在Mac上编译一个C应用程序。我使用SSE4和AES-NI指令。
在Linux中,我只需要使用带有-msse4和-maes标志的gcc,并包含头文件,就可以调用SSE指令,例如_mm_add_epi64(a,b)
或AES-NI指令,例如_mm_aesenc_si128(a,b)
,一切正常。
在Mac上,这更加困难,因为Apple使用llvm-gcc替换了GCC,而llvm-gcc尚不支持AES-NI。因此,SSE4指令可以正常工作,但AES指令无法正常工作。甚至对AES指令的内联汇编调用也无法识别。
Intel在其网站上提供了大量AES示例代码,但仅适用于Linux和Windows。
我注意到llvm-gcc也不支持RDRAND指令,但英特尔提供了一个解决方法,即使用C宏将其扩展为原始机器字节码。(请参见此英特尔库中rdrand.h示例文件)
很遗憾,对于AES-NI指令没有提供类似的解决方法,可能是因为这些指令具有参数,无法作为静态机器码字节进行评估。
在Mac上存在使用AES-NI的程序,包括苹果自己的文件保险库,所以一定有一些可行的方法!
为了使我的问题具体化,如何使用最新的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);
感谢任何帮助!
gcc
。 - Brett Hale