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!
Si dovrebbe usare [clang] (https://developer.apple.com/library/mac/#documentation/CompilerTools/Conceptual/LLVMCompilerOverview/_index.html), * not * 'gcc'. –