Я читаю в сообщении в блоге, что недавние микроархитектуры X86 также могут обрабатывать идиомы обнуления регистровых регистров (такие как xor-ing регистр с сам) в регистре renamer; в словах автора:
"переименовать регистр также знает, как выполнять эти инструкции - он может обнулить сами регистры."
Кто-нибудь знает, как это работает на практике? Я знаю, что некоторые ISA, такие как MIPS, содержат архитектурный регистр, который всегда установлен на ноль в аппаратном обеспечении; означает ли это, что внутри микроархитектура X86 имеет аналогичные "нулевые" регистры внутри, которые регистрируются при удобстве? Или моя ментальная модель не совсем корректна в отношении того, как этот материал работает микроархитектурно?
Причина, по которой я спрашиваю, заключается в том, что (по некоторым наблюдениям) кажется, что mov
из одного регистра, содержащего нуль в пункт назначения, в цикле все еще значительно быстрее, чем обнуление регистра через xor внутри цикла.
В основном то, что происходит, это то, что я хотел бы обнулить регистр в цикле в зависимости от условия; это может быть сделано путем распределения архитектурного регистра досрочно для хранения нуля (%xmm3
, в данном случае), который не изменяется для всей продолжительности цикла и выполняет в нем следующее:
movapd %xmm3, %xmm0
или вместо этого с xor трюком:
xorpd %xmm0, %xmm0
(И синтаксис AT & T).
Другими словами, выбор заключается в подъеме постоянного нуля за пределы цикла или рематериализация его внутри него для каждой итерации. Последний сокращает количество живых архитектурных регистров на единицу и, с предполагаемым особым осознанием случая и обработкой икомы процессором процессором, кажется, что он должен быть таким же быстрым, как и первый (тем более, что эти машины имеют больше физических в любом случае регистры, чем архитектурные регистры, поэтому он должен иметь возможность внутренне выполнять эквивалент того, что я сделал в сборке, вытаскивая постоянный нуль или даже лучше, внутренне, с полной осведомленностью и контролем над своими собственными ресурсами). Но, похоже, это не так, поэтому мне любопытно, сможет ли кто-либо с знаниями архитектуры ЦП объяснить, есть ли для этого хорошая теоретическая причина.
Регистры в этом случае происходят с регистрами SSE, и машина оказывается Ivy Bridge; Я не уверен, насколько важен любой из этих факторов.