Префиксы, которые не применяются к инструкции, игнорируются.Однако будущие процессоры могут использовать эту последовательность байтов для кодирования новой инструкции.(да, пространство кода операции x86 настолько ограничено, что они делают сумасшедшие вещи, подобные этому, и да, это усложняет декодеры.)
В этом случае это означает, что вы можете использовать pause
в spinloopsне ломая задний ход .Старые процессоры, которые не знают о pause
, будут декодировать его как NOP без какого-либо вреда.На новых процессорах вы получаете преимущество энергосбережения / дружественности HT и избегая неправильных предположений при упорядочении памяти , когда память, на которую вы вращаетесь, действительно изменяется и вы выходите из цикла вращения.
Ссылки на руководства Intel и множество других полезных вещей на вики-странице тега x86: https://stackoverflow.com/tags/x86/info
Еще один случай, когда префикс rep
, который не имеет смысла, становится новой инструкцией для новыхПроцессоры: lzcnt
- это F3 0F BD /r
.На процессорах, которые не поддерживают эту инструкцию (отсутствует флаг функции LZCNT в их CPUID), она декодируется как rep bsr
, что аналогично bsr
.Таким образом, на старых процессорах он выдает 32 - expected_result
и не определен, когда ввод равен нулю.
Один случай бессмысленного префикса rep
, который, вероятно, никогда не будет декодироваться по-другому: используется rep ret
по умолчанию используется gcc при нацеливании на «общие» процессоры (то есть не на конкретный ЦП с -march
или -mtune
и не на AMD K8 или K10.) Пройдут десятилетия, прежде чем кто-либо сможет создать ЦП, декодирующий rep ret
как и все, кроме ret
, потому что он присутствует в большинстве двоичных файлов в большинстве дистрибутивов Linux.Смотрите Что означает `rep ret`?