Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ g++;4.2 SSE指令的内联汇编使用对齐的XMM寄存器副本封装用户汇编代码_C++_G++_Sse_Inline Assembly_Memory Alignment - Fatal编程技术网

C++ g++;4.2 SSE指令的内联汇编使用对齐的XMM寄存器副本封装用户汇编代码

C++ g++;4.2 SSE指令的内联汇编使用对齐的XMM寄存器副本封装用户汇编代码,c++,g++,sse,inline-assembly,memory-alignment,C++,G++,Sse,Inline Assembly,Memory Alignment,我有一个使用内联汇编的函数: vec8w x86_sse_ldvwu(const vec8w* m) { vec8w rd; asm("movdqu %[m],%[rd]" : [rd] "=x" (rd) : [m] "xm" (*m)); return rd; } 它被编译为以下程序集代码: sub $0x1c,%esp mov 0x24(%esp),%eax movdqa (%eax),%xmm0 movdqu

我有一个使用内联汇编的函数:

  vec8w x86_sse_ldvwu(const vec8w* m) { 
     vec8w rd; 
     asm("movdqu %[m],%[rd]" : [rd] "=x" (rd) : [m] "xm" (*m)); 
     return rd; 
  } 
它被编译为以下程序集代码:

  sub    $0x1c,%esp
  mov    0x24(%esp),%eax
  movdqa (%eax),%xmm0 
  movdqu %xmm0,%xmm0
  movdqa %xmm0,(%esp)
  movdqa (%esp),%xmm0
  add    $0x1c,%esp
  ret 
代码效率不高,但这不是我关心的问题。正如您所看到的,内联汇编程序插入了一条从%eax中的地址复制到xmm0的movdqa指令。问题是指针vec8w*m未对齐128字节,因此在执行movdqa时出现seg错误。 我的问题是,是否有一种方法可以指示内联汇编程序使用movdqu而不是movdqa(默认情况下使用)?我试图使用SSE内在函数为g++寻找一种解决方法,但不知何故,我在xmmintrin.h文件中找不到movdqu(我想应该在那里声明它)。
不幸的是,我不能修改代码,使函数总是为对齐的参数m调用

您正在寻找的内在特性是
\u mm\u loadu\u si128
。它在
emmintrin.h
中定义。这就是SSE2。
xmmintrin.h
标题仅包含SSE(1)指令

\u mm\u loadu\u si128
将发出您正在查找的
movdqu
指令。这似乎正是您试图通过内联汇编函数实现的目标。(未对准的负载)