[英]gcc inline simd assembly error : short type movdqu instruction
我正在研究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, %%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;
}
结果是:
sArrayB : -13600, -24676, 32767
使用内在函数而不是搞乱内联汇编:
#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;
}
输出:
sArrayB : 1, 2, 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.