Что означает" rep; nop; " в сборке x86? Это то же самое, что и инструкция" пауза"?




  • что значит rep; nop в смысле?

  • это то же самое как pause инструкция?

  • это то же самое как rep nop (без запятой)?

  • в чем разница с простым nop инструкция?

  • он ведет себя по-разному на процессорах AMD и Intel?

  • (бонус) где находится официальная документация по этим инструкциям?




мотивация для этого вопрос



после некоторого обсуждения в комментариях другого вопроса я понял, что не знаю, что rep; nop; означает в x86 (или x86-64) сборке. А также я не мог найти хорошее объяснение в интернете.



я знаю, что rep - это префикс, который означает "повторить следующую инструкцию cx раз" (или, по крайней мере, это было, в старой 16-битной x86 сборке). Согласно этому сводная таблица в Википедии, вроде rep может использоваться только с movs,stos,cmps,lods,scas (но, возможно, это ограничение было снято на новых процессорах). Таким образом, я думаю rep nop (без точки с запятой) повторил бы a nop операция cx раза.



однако, после дальнейших поисков, я еще больше запутался. Кажется, что rep; nop и pause сопоставьте точно такой же код операции и pause немного другое поведение, чем просто nop. Некоторые Старая почта с 2005 года сказал по-другому вещи:




  • "старайтесь не сжигать слишком много энергии"

  • " это эквивалентно 'nop' только с 2-байтовой кодировкой."

  • " это магия на intel. Это похоже на "нет, но пусть другой брат HT работает""

  • "это пауза на intel и быстрое заполнение на Athlon"


С этими разными мнениями, я не мог понять правильный смысл.



это используется в ядре Linux (как i386 и x86_64 с), вместе с этим комментарий: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ также используется в BeRTOS, с тем же комментарием.

709   2  

2 ответов:

rep; nop Это действительно то же самое, что pause инструкция (код операции F390). Он может быть использован для ассемблеров, которые не поддерживают pause инструкции пока нет. На предыдущих процессорах это просто ничего не делало, как и nop но в двух байтах. На новых процессорах, которые поддерживают hyperthreading, он используется как подсказка процессору, что вы выполняете spinloop для повышения производительности. От ссылка на инструкцию Intel:

улучшает выполнение циклов спин-ожидания. При выполнении цикла "spin-wait" Процессор Pentium 4 или Intel Xeon испытывает серьезное снижение производительности при выходе из цикла, поскольку он обнаруживает возможное нарушение порядка памяти. Инструкция PAUSE дает подсказку процессору, что кодовая последовательность является циклом ожидания спина. Процессор использует эту подсказку, чтобы избежать нарушения режима памяти в большинстве ситуаций, что значительно повышает производительность процессора. По этой причине рекомендуется сделать паузу инструкция должна быть размещена во всех циклах ожидания вращения.

префиксы, которые не применяются к инструкции, игнорируются. Однако будущие процессоры могут использовать эту последовательность байтов для кодирования новой инструкции. (да, пространство x86 opcode настолько ограничено, что они делают сумасшедшие вещи, подобные этому, и да, это усложняет декодеры.)

в этом случае это означает, что вы можете использовать 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 К8 или К10.) Пройдут десятилетия, прежде чем кто-либо сможет сделать процессор, который декодирует rep ret как ret, потому что он присутствует в большинстве двоичных файлов в большинстве дистрибутивов Linux. Смотрите что означает` rep ret'?

Comments

    Ничего не найдено.