2012-09-28 14 views
8

Sto provando a compilare un'applicazione C su un Mac. Uso gli intrinseci SSE4 e AES-NI.Come posso utilizzare AES-NI intrinsec su un Mac?

In Linux, mi basta chiamare gcc con la -msse4 e -maes bandiere e comprendono l'intestazione wmmintrin.h e posso chiamare intrinseche SSE come _mm_add_epi64(a,b) o AES-NI intrinseci come _mm_aesenc_si128(a, b) e tutto funziona bene.

Sul Mac, è più difficile, perché Apple sostituisce GCC con llvm-gcc che non supporta ancora AES-NI. Quindi gli intrinseci SSE4 funzionano bene, ma non quelli AES. Anche le chiamate in assembly inline alle istruzioni AES non vengono riconosciute.

Intel ha lots of AES example code sul proprio sito Web, ma è solo per Linux e Windows.

Ho notato che l'istruzione RDRAND non è supportata da llvm-gcc, ma Intel fornisce una soluzione alternativa utilizzando una macro C che si espande nel codice di byte macchina grezzo. (See the rdrand.h example file in this Intel library)

Sfortunatamente non esiste una soluzione alternativa simile per le istruzioni AES-NI, probabilmente perché le istruzioni hanno argomenti e non possono essere valutate come byte di codice macchina statico.

Esistono programmi che utilizzano AES-NI su Mac, incluso il File Vault di Apple, quindi è necessario un metodo che funzioni!

a fare la mia domanda concreta, come vorrei avere la seguente chiamata semplice per compilare utilizzando la più recente gcc-LLVM 4.2 (ultima versione pubblica in Mountain Lion Xcode 4.4.1) Mac:

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

Grazie per qualsiasi aiuto!

+0

Si dovrebbe usare [clang] (https://developer.apple.com/library/mac/#documentation/CompilerTools/Conceptual/LLVMCompilerOverview/_index.html), * not * 'gcc'. –

risposta

7

Supporto per gli sviluppatori Apple ha riferito che non era possibile utilizzare Xcode. (E in effetti la loro risposta era un po 'snella e implicita che AES-NI non era qualcosa che uno sviluppatore aveva mai avuto bisogno di usare direttamente, quindi non dovrei preoccuparmi. Sigh, grazie, Apple.)

Tuttavia, ho fatto trova due soluzioni funzionanti, sia semplicemente evitando il software Apple. Uno è utilizzare il compilatore C++ commerciale di Intel. L'altro è per scaricare e compilare GCC 4.6 o 4.7 dal sorgente e utilizzarlo direttamente. Questa è l'opzione che ho scelto. Ho seguito this guide. Il GCC compila e installa (mentre è pulito) è ancora una seccatura e una soluzione alternativa solo per utilizzare una singola CPU intrinseca, ma funziona. Grazie, squadra GCC!

+3

Questa risposta è cambiata come è possibile con il moderno Xcode (4.6.3), indipendentemente da Apple. – Barry

+0

asm volatile ("aesenc ....": ...); // funziona su entrambi llvm e gcc-4.4 +, assicurati di controllare prima CPUID.01H: ECX.AESNI [bit 25] = 1 – Barry

+0

Il take-away è essere vigile su cripto, sia ad alto che a basso livello, come solo prende un sottile errore di codifica per esporre una grande superficie di attacco. – Barry