LINUX.ORG.RU

[gcc][gas][x64] movq ... %rax ; movq %rax, %rdi ; call ...

 , ,


0

1

Добрый вечер. Кто-нибудь вкурсе почему gcc перекладывает первый аргумент функциям в %rdi не напрямую, а всегда через %rax? Я ABI читал и перечитывал, но может где недоглядел. Это просто неоптимальность или всё-таки в этом есть какой-то смысл?

fopen(...); ...
getc(...); ...
fclose(...);

movq -24(%rbp), %rax
movq %rdx, %rsi
movq %rax, %rdi
call fopen
...
movq -16(%rbp), %rax
movq %rax, %rdi
call _IO_getc
...
movq -16(%rbp), %rax
movq %rax, %rdi
call fclose

Немного не в тему, но объясни, пожалуйста, что означает

movq -24(%rbp), %rax
? Интересует именно -24(%rbp)

bk_ ★★
()
Ответ на: комментарий от elverion

Короче говоря это запись локальной переменной в rax

elverion
()
Ответ на: комментарий от frey

Нету. Более того, оно работает, если пересылать напрямую. Но это такое тонкое дело - может оказаться, что оно упадёт с вероятностью 1/34 из-за каких-то хитростей архитектуры с кешем, например. Я в этом мало понимаю, потому оно меня и волнует.

ander-skirnir
() автор топика
Ответ на: комментарий от frey

>Взять со стека, положить в регистр.

Вы запутаете так человека без дополнительных пояснений.

По теме: 2ТС: например, на первопне это выполнилось бы за одинаковое кол-во тактов на двух конвеерах, а лишняя инструкция иногда помогает выравнять границу следующего цикла. Для более других процов может скомпилится иначе, возможно. На х86 изначально с регистром ах были более быстрые и разной размерностью инструкции.
С ключем -fomit-frame-pointer так и вообще bp не будет, параметры будут или через регистры сразу или относительно sp

madcore ★★★★★
()
Ответ на: комментарий от ander-skirnir

Т.е., синтаксис «адрес А + регистр Р в скобках»

А(%Р)

означает в терминологии gdb

x/(%rgp - 24)

?

Имею ввиду, что скобки - переход по адресу?

bk_ ★★
()

У меня 32-бит и я пробовал с -m64.

Описанное поведение проявилось только c -O0. Уже с -O1 компилятор перестал тасовать регистры, присваивая напрямую. Но до этого я увидел это:

	movl	$.LC0, %edx
	movl	$.LC1, %eax
	movq	%rdx, %rsi
	movq	%rax, %rdi
	call	fopen
Похоже это механизм расширения с 32 до 64-битных значений и он просто тянется в x86_64 версии как наследие.

i-rinat ★★★★★
()
Ответ на: комментарий от ander-skirnir

можно попобробнее как именно упадет? процессор заглохнет?

bga_ ★★★★
()
Ответ на: комментарий от i-rinat

А я совсем и забыл об этом параметре. У меня с ним тоже напрямую. Спасибо, теперь я уверен, что ничего не упадёт, так что проблема решена :)

@madcore: Тоже спасибо за инфу.

@bga_: Ну вычитал где-то о каких-то непонятных проблемах, связанных с длиной кеша процессора - вот и волнуюсь.

ander-skirnir
() автор топика
Ответ на: комментарий от ander-skirnir

> о каких-то непонятных проблемах, связанных с длиной кеша процессора

С длиной линии кеша. Ключевые слова: «ассоциативность кеша». Грубо и вкратце: номер линии определяется по младшим битам адреса. Например, если по 6 битам, то байт [n] и байт [n+64] попадут на одну линию и при чтении подряд адресов [n+k*64] будет происходить сброс и заполнение этой одной линии. Эффективность кеша будет даже отрицательная.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

ох я а уж испугался что процессор падает %). Про кеш знаю

bga_ ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.