c-gcc内联simd程序集错误:短类型movdqu指令



我正在学习Linux x64中的SIMD(SSE)编程。。我想把一个数组短类型分配给另一个短数组类型var。但执行结果错误这是我的消息来源。问题出在哪里?

#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, %%xmm0nt"
       "movdqu %%xmm0, %0"
       :"=g"(sArrayB)
       :"x"(sArrayA)
       :"%xmm0"
    );
    printf("sArrayB : %d, %d, %dn", sArrayB[0], sArrayB[1], sArrayB[2] );
    return 0;
}

结果是:

sArrayB : -13600, -24676, 32767

使用内部函数而不是乱用内联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, %dn", sArrayB[0], sArrayB[1], sArrayB[2]);
    return 0;
}

输出:

sArrayB : 1, 2, 3

最新更新