2016-04-11 4 views
0

Ich studiere SIMD (SSE) Programmierung in Linux x64 .. Ich möchte ein Array kurzen Typ zu den anderen kurzen Array-Typ var zuweisen. Aber ausgeführtes Ergebnis ist falsch hier ist meine Quelle. was ist das Problem?gcc inline simd Montagefehler: kurze Art movdqu Anweisung

#include <stdio.h> 
#include <emmintrin.h> 

int main(int argc, char* argv[]) 
{ 
    short sArrayA[8] = {1,2,3,4,5,6,7,8}; 
    short sArrayB[8] = {0,0,0,0,0,0,0,0}; 

    __asm__ __volatile__(
     "movdqu %1, %%xmm0\n\t" 
     "movdqu %%xmm0, %0" 
     :"=g"(sArrayB) 
     :"x"(sArrayA) 
     :"%xmm0" 
    ); 

    printf("sArrayB : %d, %d, %d\n", sArrayB[0], sArrayB[1], sArrayB[2]); 
    return 0; 
} 

Ergebnis ist:

sArrayB : -13600, -24676, 32767 
+2

Während mit asm experimentieren interessant ist, mit intrinsics (wie Paul suggeriert) ist mit ziemlicher Sicherheit der bessere Weg. Aber wenn du asm verwenden musst, ändere dein '" x "' in '" m "'. –

+1

@DavidWohlverld: Und '" = g "' zu '" = x "', während du schon dabei bist. – EOF

Antwort

2

Verwenden intrinsics anstatt Herumspielen mit Inline-asm:

#include <stdio.h> 
#include <emmintrin.h> 

int main(int argc, char* argv[]) 
{ 
    short sArrayA[8] = {1,2,3,4,5,6,7,8}; 
    short sArrayB[8] = {0,0,0,0,0,0,0,0}; 

    __m128i v = _mm_loadu_si128((__m128i *)sArrayA); 
    _mm_storeu_si128((__m128i *)sArrayB, v); 

    printf("sArrayB : %d, %d, %d\n", sArrayB[0], sArrayB[1], sArrayB[2]); 
    return 0; 
} 

Ausgang:

sArrayB : 1, 2, 3