Wie kann ich AES-NI-Eigenarten auf einem Mac verwenden?

8

Ich versuche eine C-Anwendung auf einem Mac zu kompilieren. Ich benutze SSE4 und AES-NI-Intrinsik.

Unter Linux rufe ich einfach gcc mit den Flags -msse4 und -maes auf und füge den Header wmmintrin.h ein. Ich kann SSE-Intrinsics wie _mm_add_epi64(a,b) oder AES-NI-Intrinsics wie% co_de aufrufen % und alles funktioniert gut.

Auf dem Mac ist es schwieriger, weil Apple GCC durch llvm-gcc ersetzt, das AES-NI noch nicht unterstützt. Also SSE4-Intrinsics funktionieren gut, aber nicht die AES-Einsen. Selbst Inline-Assembly-Aufrufe an die AES-Anweisungen werden nicht erkannt.

Intel hat viele AES-Beispielcode auf ihrer Website, aber es ist nur für Linux und Windows.

Ich habe bemerkt, dass die RDRAND-Anweisung auch von llvm-gcc nicht unterstützt wird, aber Intel bietet eine Umgehung dafür, indem ein C-Makro verwendet wird, das in rohen Maschinen-Byte-Code expandiert. ( Siehe Beispieldatei rdrand.h in dieser Intel-Bibliothek )

Leider gibt es keine ähnliche Problemumgehung für die AES-NI-Anweisungen, wahrscheinlich weil die Anweisungen Argumente haben und nicht als statische Maschinencode-Bytes ausgewertet werden können.

Es gibt Programme, die AES-NI auf dem Mac verwenden, einschließlich Apple's File Vault, also muss es eine Methode geben, die funktioniert!

Um meine Frage zu konkretisieren, wie bekomme ich den folgenden einfachen Aufruf, um mit dem neuesten Mac gcc-llvm 4.2 (neueste Veröffentlichung in Mountain Lion xcode 4.4.1) zu kompilieren:

%Vor%

Danke für jede Hilfe!

    
Rich Denver 28.09.2012, 05:51
quelle

1 Antwort

7

Der Support von Apple-Entwicklern hat berichtet, dass es mit Xcode nicht möglich war. (Und tatsächlich war ihre Antwort ein bisschen snarky und implizierte, dass AES-NI nicht etwas war, das ein Entwickler jemals direkt verwenden musste, also sollte ich nicht stören. Seufz, danke, Apple.)

Ich fand jedoch zwei funktionierende Lösungen, indem ich einfach die Apple-Software vermied. Eine besteht darin, Intels eigenen kommerziellen C ++ - Compiler zu verwenden. Die andere Möglichkeit besteht darin, GCC 4.6 oder 4.7 von der Quelle herunterzuladen und zu kompilieren und sie direkt zu verwenden. Dies ist die Option, die ich gewählt habe. Ich folgte diesem Leitfaden. Die GCC-Kompilierung und -Installation (obwohl sauber) ist immer noch ein Problem und Workaround, nur um eine einzelne CPU intrinsisch zu verwenden, aber es funktioniert. Danke, GCC-Team!

    
Rich Denver 29.09.2012, 21:39
quelle

Tags und Links