Могут ли две инструкции выполняться в одном цикле, если один и тот же регистр используется как вход и выход соответственно?

Например, могут ли эти две инструкции начать выполнение в одном и том же цикле или они мешают друг другу?

MOV  %RAX, (ADDR)      # AT&T syntax: store rax
POP  %RAX

person Eloff    schedule 24.08.2016    source источник
comment
если это movl, то разве это не должно быть eax?   -  person phuclv    schedule 24.08.2016
comment
@LưuVĩnhPhúc: хорошо, это был полностью фиктивный код. Я предполагаю, что это был 16-битный синтаксис Intel (сначала dst, опасность WAW), поскольку почти никто не использует синтаксис AT&T для 16-битного кода. POP AX (popw %ax) действителен в 64-битном режиме и 32-битных режимах, а POPL — нет (и он помечен как x86-64), но я все же подумал, что было бы понятнее преобразовать код в валидный 64-битный. бит синтаксиса AT&T.   -  person Peter Cordes    schedule 24.08.2016
comment
Это был синтаксис ассемблера Go, который, я думаю, пришел из Plan9. Не лучший пример, спасибо за изменение. Ваша переписка правильная.   -  person Eloff    schedule 24.08.2016


Ответы (1)


Да, они могут выполняться в одном и том же цикле на современном неупорядоченном ЦП, поскольку используют алгоритм Томасуло. для переименования регистра. Он полностью исключает все подобные опасности записи после чтения, а также запись после записи, поэтому выполнение не по порядку ограничивается только истинными зависимостями Read-after-Write.

После переименования регистра pop запишет новое значение архитектурного регистра RAX в физический регистр, отличный от того, который содержит старое значение RAX (который является входом для хранилища).

Инструкции не взаимодействуют друг с другом, потому что pop запускает новую цепочку зависимостей для значения RAX. (Его вывод доступен только для записи.) pop (и последующие инструкции, которые читают/записывают RAX) могут выполняться за много циклов до сохранения, особенно если сохраняемое значение создается длинной цепочкой зависимостей.

См. также файл микроархива Агнера Фога и другие ссылки в разделе x86 пометить вики.


обновление: я думал, что вы спрашивали о двух инструкциях, которые записывают один и тот же регистр или считывают один и тот же регистр, поскольку в исходном коде примера не использовались метки % и использовался AX, поэтому я предполагаю, что это был 16-битный синтаксис Intel. В любом случае, оставив эту часть в качестве бонуса.

Две инструкции, читающие один и тот же регистр (чтение после чтения), вообще не представляют опасности.

Процессоры Intel до Sandybridge имеют ограничение на количество недавно измененных регистров, которые могут быть прочитаны в одном и том же цикле, но многократное чтение одного и того же регистра в соседних инструкциях не является проблемой. (Поищите стойла порта чтения регистра в pdf-файле Agner Fog microarch и/или см. этот ответ, где он был уместным).

person Peter Cordes    schedule 24.08.2016
comment
Увлекательные, современные неупорядоченные процессоры так восхитительно сложны :) - person Eloff; 24.08.2016