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
指令。这似乎正是您试图通过内联汇编函数实现的目标。(未对准的负载)