Например, могут ли эти две инструкции начать выполнение в одном и том же цикле или они мешают друг другу?
MOV %RAX, (ADDR) # AT&T syntax: store rax
POP %RAX
Например, могут ли эти две инструкции начать выполнение в одном и том же цикле или они мешают друг другу?
MOV %RAX, (ADDR) # AT&T syntax: store rax
POP %RAX
Да, они могут выполняться в одном и том же цикле на современном неупорядоченном ЦП, поскольку используют алгоритм Томасуло. для переименования регистра. Он полностью исключает все подобные опасности записи после чтения, а также запись после записи, поэтому выполнение не по порядку ограничивается только истинными зависимостями Read-after-Write.
После переименования регистра pop
запишет новое значение архитектурного регистра RAX в физический регистр, отличный от того, который содержит старое значение RAX (который является входом для хранилища).
Инструкции не взаимодействуют друг с другом, потому что pop
запускает новую цепочку зависимостей для значения RAX. (Его вывод доступен только для записи.) pop
(и последующие инструкции, которые читают/записывают RAX) могут выполняться за много циклов до сохранения, особенно если сохраняемое значение создается длинной цепочкой зависимостей. сильный>
См. также файл микроархива Агнера Фога и другие ссылки в разделе x86 пометить вики.
обновление: я думал, что вы спрашивали о двух инструкциях, которые записывают один и тот же регистр или считывают один и тот же регистр, поскольку в исходном коде примера не использовались метки %
и использовался AX, поэтому я предполагаю, что это был 16-битный синтаксис Intel. В любом случае, оставив эту часть в качестве бонуса.
Две инструкции, читающие один и тот же регистр (чтение после чтения), вообще не представляют опасности.
Процессоры Intel до Sandybridge имеют ограничение на количество недавно измененных регистров, которые могут быть прочитаны в одном и том же цикле, но многократное чтение одного и того же регистра в соседних инструкциях не является проблемой. (Поищите стойла порта чтения регистра в pdf-файле Agner Fog microarch и/или см. этот ответ, где он был уместным).
movl
, то разве это не должно быть eax? - person phuclv   schedule 24.08.2016popw %ax
) действителен в 64-битном режиме и 32-битных режимах, а POPL — нет (и он помечен как x86-64), но я все же подумал, что было бы понятнее преобразовать код в валидный 64-битный. бит синтаксиса AT&T. - person Peter Cordes   schedule 24.08.2016