2

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

  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 调用该函数。

4

1 回答 1

2

您正在寻找的内在是_mm_loadu_si128. 它定义在emmintrin.h. 这是SSE2。标xmmintrin.h头仅包含 SSE(1) 指令。

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/intref_cls/common/intref_sse2_int_load.htm

_mm_loadu_si128将发出movdqu您正在寻找的指令。看来这正是您试图通过内联汇编函数完成的任务。(未对齐的负载)

于 2011-11-02T04:14:21.227 回答