gpt4 book ai didi

c++ - g++ 4.2 SSE 指令的内联汇编用对齐的 XMM 寄存器拷贝包装用户汇编代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:17 25 4
gpt4 key购买 nike

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

  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

代码效率不是很高,但这不是我关心的问题。如您所见,内联汇编程序插入一条 movdqa 指令,从 %eax 中的地址复制到 xmm0。问题是指针 vec8w* m 不是 128 字节对齐,因此在执行 movdqa 时出现段错误。我的问题是是否有办法指示内联汇编程序使用 movdqu 而不是 movdqa(默认情况下使用)?我试图寻找一种使用 g++ 的 SSE 内部函数的解决方法,但不知何故我无法在 xmmintrin.h 文件中找到 movdqu(我想应该在其中声明)。不幸的是,我无法修改代码,以便始终为 aligned 参数 m 调用该函数。

最佳答案

您正在寻找的内在函数是 _mm_loadu_si128。它在 emmintrin.h 中定义。这是SSE2。 xmmintrin.h header 仅包含 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 指令。看来这正是您试图通过内联汇编函数实现的目标。 (未对齐的负载)

关于c++ - g++ 4.2 SSE 指令的内联汇编用对齐的 XMM 寄存器拷贝包装用户汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7975721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com