从简单的simd代码汇编:为什么不使用xmm寄存器

时间:2015-09-05 20:43:39

标签: c++ simd disassembly

我是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)

感谢。

0 个答案:

没有答案