Вы забыли включить оптимизацию, поэтому можно ожидать плохой код. Почему clang создает неэффективный asm с -O0 (для этой простой суммы с плавающей запятой)?
gcc -O3 -m32
использует для этого mov-немедленное.
(используйте volatile
, чтобы, конечно, массив не оптимизировался. Или передайте указатель на него не встроенной функции).
# gcc9.3 -m32 -O3
f():
sub esp, 48
mov DWORD PTR [esp+8], 97
mov DWORD PTR [esp+12], 97
mov DWORD PTR [esp+16], 97
mov DWORD PTR [esp+20], 97
mov DWORD PTR [esp+24], 97
mov DWORD PTR [esp+28], 97
mov DWORD PTR [esp+32], 97
mov DWORD PTR [esp+36], 97
mov DWORD PTR [esp+40], 97
mov DWORD PTR [esp+44], 0
add esp, 48
ret
Копирование 64-битного кода в 16 байты (К сожалению, не используется широковещательная загрузка, даже если доступны SSE3 или AVX). https://godbolt.org/z/AsdbWU
Это, безусловно, того стоит, хотя movabs
с 64-битным непосредственным доступом и четырьмя хранилищами слов + 1 мечом было бы не страшно.
# gcc9.3 -O3 -march=skylake
# with the default tuning / arch options, same code but without "v"
f():
vmovdqa xmm0, XMMWORD PTR .LC0[rip] # should have used vpbroadcastd
vmovaps XMMWORD PTR [rsp-56], xmm0 # it chooses two 16-byte stores
vmovaps XMMWORD PTR [rsp-40], xmm0 # maybe to avoid a vzeroupper or alignment isn't known
mov QWORD PTR [rsp-24], 97 # scalar mov-immediate for the last one
ret
.LC0:
.quad 416611827809
.quad 416611827809