Можно ли избежать копирования из другого раздела при инициализации стека в g cc? - PullRequest
0 голосов
/ 24 апреля 2020

например

void f()
{
   wchar_t s[]=L"aaaaaaaaa";
}

компилируется во что-то вроде

.section .rdata
LC0:.ascii "a\0a\0a\0a\0a\0a\0\0"
.section .text
movl LC0,%eax
movl %eax,0x888(%esp)
...

Можно ли избежать зависимости от другого раздела? Такие как

movl $0x00610061,0x888(%esp);movl $0x00610061,0x88c(%esp);...

1 Ответ

1 голос
/ 24 апреля 2020

Вы забыли включить оптимизацию, поэтому можно ожидать плохой код. Почему 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...