2012-09-28 18 views
8

Estoy intentando compilar una aplicación C en una Mac. Yo uso los intrínsecos SSE4 y AES-NI.¿Cómo puedo usar los intrínsecos de AES-NI en una Mac?

En Linux, acabo de llamar gcc con la -msse4 y -maes banderas e incluyen la cabecera wmmintrin.h y puedo llamar a las características intrínsecas de la ESS como _mm_add_epi64(a,b) o AES-NI intrínsecos como _mm_aesenc_si128(a, b) y todo funciona bien.

En la Mac, es más difícil, porque Apple reemplaza a GCC con llvm-gcc que aún no es compatible con AES-NI. Entonces, los intrínsecos SSE4 funcionan bien, pero no los AES. Incluso las llamadas de ensamblaje en línea a las instrucciones AES no son reconocidas.

Intel tiene lots of AES example code en su sitio web, pero solo para Linux y Windows.

Me di cuenta la instrucción RDRAND es también sin apoyo por llvm-gcc pero Intel proporciona una solución para que utilizando una macro C que se expande en código byte máquina prima. (See the rdrand.h example file in this Intel library)

Lamentablemente, no existe una solución provisional similar para las instrucciones de AES-NI, probablemente porque las instrucciones tienen argumentos y no se pueden evaluar como bytes de código de máquina estático.

Existen programas que usan AES-NI en la Mac, incluido el propio File Vault de Apple, por lo que debe haber algún método que funcione.

para hacer mi pregunta concreta, ¿cómo iba a obtener la siguiente simple llamada para compilar utilizando la última 4.2 (última versión pública en Mountain Lion Xcode 4.4.1) gcc-llvm Mac:

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

Gracias por ¡alguna ayuda!

+0

Debería utilizar [clang] (https://developer.apple.com/library/mac/#documentation/CompilerTools/Conceptual/LLVMCompilerOverview/_index.html), * not * 'gcc'. –

Respuesta

7

El soporte para desarrolladores de Apple informó que no era posible usar Xcode. (Y de hecho su respuesta fue un poco sarcástica e implícita de que AES-NI no era algo que un desarrollador necesitara usar directamente, así que no debería molestar. Suspiro, gracias, Apple.)

Sin embargo, lo hice encuentre dos soluciones de trabajo, ambas simplemente evitando el software de Apple. Una es usar el propio compilador comercial de C++ de Intel. El otro es descargar y compilar GCC 4.6 o 4.7 de la fuente y usarlo directamente. Esta es la opción que elegí. Seguí this guide. La compilación e instalación de GCC (aunque está limpia) sigue siendo una molestia y una solución solo para usar una única CPU intrínseca, pero funciona. Gracias, equipo de GCC!

+3

Esta respuesta ha cambiado, ya que es posible con el moderno Xcode (4.6.3), independientemente de Apple. – Barry

+0

asm volátil ("aesenc ....": ...); // funciona tanto en llvm como en gcc-4.4 +, asegúrese de verificar primero CPUID.01H: ECX.AESNI [bit 25] = 1 – Barry

+0

La guía para llevar está atenta a criptografía, ya sea de nivel alto o bajo, ya que solo toma un error de codificación sutil para exponer una gran superficie de ataque. – Barry

Cuestiones relacionadas