2016-04-11 1 views
0

J'étudie la programmation SIMD (SSE) sous Linux x64 .. Je veux assigner un type de tableau court à l'autre type de tableau court var. Mais le résultat est erroné voici ma source. quel est le problème?gcc inline simd erreur d'assemblage: type movdqu instruction courte

#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; 
} 

résultat est:

sArrayB : -13600, -24676, 32767 
+2

En expérimentant avec asm est intéressant, en utilisant intrinsèques (comme Paul suggère) est presque certainement le meilleur moyen d'y aller. Mais si vous devez utiliser asm, changez votre '' x "' '" m "'. –

+1

@DavidWohlferd: Et '' = g "' '' '' = x "', pendant que vous y êtes. – EOF

Répondre

2

Utilisez intrinsics plutôt que de déconner avec asm en ligne:

#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; 
} 

Sortie:

sArrayB : 1, 2, 3