Если вам просто нужны 32-битные регистры, вы можете безопасно работать с ними, это нормально для 64-битных.Но если вам просто нужны 16-битные или 8-битные регистры, старайтесь избегать их или всегда используйте movzx / movsx для очистки оставшихся битов.Хорошо известно, что при x86-64 32-битные операнды очищают старшие биты 64-битного регистра.Основная цель этого - избежать ложных цепочек зависимостей.
Пожалуйста, обратитесь к соответствующему разделу - 3.4.1.1 - Руководства разработчика ПО Intel® 64 и IA-32 Architectures Том 1 :
32-битные операнды генерируют 32-битный результат, расширенный от нуля до 64-битного результата в целевом регистре назначения
Прерывание цепочек зависимостей позволяетинструкции, выполняемые параллельно, в случайном порядке, с помощью алгоритма Out-of-Order , внедренного внутренне процессорами с момента выпуска Pentium Pro в 1995 году.
Цитата из Intel® 64и справочное руководство по оптимизации архитектур IA-32 , раздел 3.5.1.8:
Последовательности кода, которые изменяют частичный регистр, могут испытывать некоторую задержку в своей цепочке зависимостей, но этого можно избежать, используя идиомы разрыва зависимостей,В процессорах, основанных на микроархитектуре Intel Core, ряд инструкций может помочь очистить зависимость от выполнения, когда программное обеспечение использует эти инструкции для очистки содержимого регистра до нуля.Разрывать зависимости между частями регистров между инструкциями, используя 32-битные регистры вместо частичных регистров.Для перемещений это может быть выполнено с помощью 32-разрядных перемещений или с помощью MOVZX.
Правило 37 кодирования сборки / компилятора (влияние M, универсальность MH) : разрыв зависимостей на участках регистровмежду инструкциями, используя 32-битные регистры вместо частичных регистров.Для перемещений это можно сделать с помощью 32-разрядных перемещений или с помощью MOVZX.
MOVZX и MOV с 32-разрядными операндами для x64 эквивалентны - все они разрывают цепочки зависимостей.
Вот почему ваш код будет выполняться быстрее, если вы всегда пытаетесь очистить старшие биты больших регистров при использовании меньших регистров.Когда биты всегда очищены, и нет зависимости от предыдущего значения регистра, ЦП может внутренне переименовать регистры.
Переименование регистра - это метод, используемый внутренне ЦП, которыйустраняет ложные зависимости данных, возникающие из-за повторного использования регистров последовательными инструкциями, между которыми нет реальной зависимости данных.