Wie initialisiert man __m128i Array statisch in gcc?

8

Ich portiere einen SSE-Optimierungscode von Windows nach Linux. Und ich habe festgestellt, dass der folgende Code, der in MSVC gut funktioniert, in GCC nicht funktioniert. Der Code soll ein Array von __m128i initialisieren. Jedes __mi28i enthält 16 int8_t. Es wird mit gcc kompiliert, aber das Ergebnis ist nicht wie erwartet. Da gcc __m128i als "long long int" definiert, initialisiert der Code ein Array wie folgt: long long int coeffs_ssse3 [4] = {64, 83, 64, 36}. Ich googelte und mir wurde gesagt, dass "der einzige portable Weg, um einen Vektor zu initialisieren, _mm_set_XXX intrinsics ist." Ich möchte jedoch wissen, gibt es eine andere Möglichkeit, das Array __m128i zu initialisieren? Statisch besser, und muss den folgenden Code nicht viel ändern (da ich Tonnen von Code im folgenden Format habe). Jeder Vorschlag wird geschätzt.

%Vor%     
shengbinmeng 19.03.2013, 12:15
quelle

1 Antwort

7

Es scheint, dass gcc die __m128* -Typen nicht als Kandidaten für die Aggregat-Initialisierung behandelt. Da sie keine Standardtypen sind, wird dieses Verhalten von Compiler zu Compiler variieren. Ein Ansatz wäre, das Array als ein ausgerichtetes Array von 8-Bit-Ganzzahlen zu deklarieren und dann einfach einen Zeiger darauf zu werfen:

%Vor%

Ich glaube jedoch nicht, dass diese Syntax ( __attribute__((aligned(x))) ) von Visual Studio unterstützt wird. Sie benötigen also #ifdef trickery, um die richtigen Direktiven zu verwenden, um die von Ihnen gewünschte Ausrichtung zu erreichen Zielplattformen.

    
Jason R 19.03.2013, 12:49
quelle

Tags und Links