【问题标题】:g++ 4.2 inline assembly of SSE instructions wraps up user assembly code with aligned XMM register copyG++ 4.2 SSE 指令的内联汇编使用对齐的 XMM 寄存器副本包装用户汇编代码
【发布时间】:2011-12-20 00:23:05
【问题描述】:

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

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

【问题讨论】:

    标签: c++ g++ sse inline-assembly memory-alignment


    【解决方案1】:

    您要查找的内在函数是 _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 指令。看来这正是您试图通过内联汇编功能完成的工作。 (未对齐的负载)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 2016-05-28
      • 2014-11-21
      • 1970-01-01
      • 2019-03-24
      相关资源
      最近更新 更多