我是simd的新手。以下是c ++代码的一个小例子:
#include <xmmintrin.h>
#include <iostream>
typedef __m128d simd_t;
int main(void) {
alignas(16) double x[2] = {0,0};
alignas(16) double y[2] = {0,0};
alignas(16) double z[2] = {0,0};
simd_t sx, sy, sz;
sx = _mm_load_pd(&x[0]);
sy = _mm_load_pd(&y[0]);
sz = _mm_mul_pd(sx, sy);
_mm_store_pd(z, sz);
std::cerr << "z=" << z[0] << std::endl;
return 0;
}
我用g ++(Debian 4.9.3-4)4.9.3
构建它g++ -ftree-vectorize -O2 -msse4 -g -std=c++11 -S test.cpp
并查看生成的程序集:
main:
.LFB1789:
.file 1 "test.cpp"
.loc 1 6 0
.cfi_startproc
.LBB37:
.loc 1 7 0
pxor %xmm2, %xmm2
.LBE37:
.loc 1 6 0
subq $40, %rsp
.cfi_def_cfa_offset 48
.LBB44:
.loc 1 15 0
movl $.LC1, %esi
movl $_ZSt4cerr, %edi
.loc 1 7 0
movsd %xmm2, (%rsp)
movsd %xmm2, 8(%rsp)
.loc 1 8 0
movsd %xmm2, 16(%rsp)
movsd %xmm2, 24(%rsp)
.LVL0:
.LBB38:
.LBB39:
.file 2 "/usr/lib/gcc/x86_64-linux-gnu/4.9/include/emmintrin.h"
.loc 2 263 0
movapd (%rsp), %xmm1
mulpd 16(%rsp), %xmm1
movaps %xmm1, (%rsp)
令我感到惊讶的是汇编列表最后的mulpd指令。为什么堆栈用于其中一个操作数?我希望看到像
这样的东西 movapd (%rsp), %xmm1
movapd 16(%rsp), %xmm2
mulpd %xmm2, %xmm1
movaps %xmm1, (%rsp)
感谢。