我有一个使用内联汇编的函数:
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 时出现段错误。我的问题是是否有办法指示内联汇编器使用 movdqu 而不是 movdqa (默认情况下使用)?我试图寻找一种使用 G++ 的 SSE 内在函数的解决方法,但不知何故我在 xmmintrin.h 文件中找不到 movdqu (我想应该在哪里声明它)。不幸的是,我无法修改代码,以便始终为对齐的参数 m 调用该函数。