2016-04-11 48 views
0

Linux x64'te SIMD (SSE) programlaması üzerinde çalışıyorum .. Diğer kısa dizi tipi varlara bir dizi kısa tipi atamak istiyorum. Ancak yürütülen sonuç yanlıştır işte benim kaynak. sorun nedir?gcc inline simd montaj hatası: kısa tip movdqu talimatı

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

sonucudur:

sArrayB : -13600, -24676, 32767 
+2

asm deneme yaparken kullandığı içsel (Paul'ün önerdiği gibi) neredeyse kesinlikle gitmek için daha iyi bir yoldur. Ancak, ASM kullanmanız GEREKİRSE, "x" 'i "m" ye değiştirin. –

+1

@DavidWohlferd: Ve "" = g "' to '" = x ", siz işteyken. – EOF

cevap

2

Kullanım intrinsics yerine satır içi asm ile karıştırmasını daha:

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

Çıktı: ilginç

sArrayB : 1, 2, 3