为什么这些8字节写入未优化为MOV?

Joh*_*itb 9 c++ optimization x86 gcc micro-optimization

我的同事和我自己都没有成功解释为什么GCC,ICC和Clang没有优化这个功能

void f(std::uint64_t a, void * p) {
    std::uint8_t *x = reinterpret_cast<std::uint8_t *>(p);
    x[7] = a >> 56;
    x[6] = a >> 48;
    x[5] = a >> 40;
    x[4] = a >> 32;
    x[3] = a >> 24;
    x[2] = a >> 16;
    x[1] = a >> 8;
    x[0] = a;
}
Run Code Online (Sandbox Code Playgroud)

进入这个

mov     QWORD PTR [rsi], rdi
Run Code Online (Sandbox Code Playgroud)

如果我们fmemcpy它来表达,就会发出它mov.如果我们做一些看似微不足道的字节写入序列,为什么不会发生

Jef*_*ett 6

我不是专家,但是gcc只能在gcc 7中为立即常量合并相邻的商店:

如果我不得不猜测,通过第二个错误,等待可能不会太久.