x86 декодирование многопользовательских команд
Агнер Фог в своем microarch.pdf говорит:
Декодирование становится более эффективным, потому что команда, которая генерирует один объединенный моп, может входить в любой из трех декодеров, в то время как команда, которая генерирует два мопа, может идти только в декодер D0.
Я знаю, что декодеры принимают машинный код x86 в качестве ввода (как вывод ассемблера из mov eax, eax
) и производить микрооперации в качестве вывода.
Как определяется, какой декодер должен декодировать конкретную инструкцию перед декодированием? Может быть, предварительные декодеры?
1 ответ
Микроарх PDF Агнера объясняет декодирование и то, что происходит с многопользовательскими инструкциями.
Если многопользовательская команда не является первым insn в декодируемом блоке, декодирование заканчивается на этом insn. В следующем цикле декодирование начинается с многопользовательского insn, поэтому оно попадает в сложный декодер, который может обрабатывать многопользовательские инструкции.
Вот почему повторяющийся шаблон 3-1-3-1 декодируется лучше, чем повторяющийся шаблон 3-3-1-1.
Предварительные декодеры отмечают только длину / границы команд. Они еще не знают, какие insns будут декодировать для нескольких мопов. Это требует фактического декодирования инструкций, поэтому нет способа перемешать поток команд, чтобы отправить сложные инструкции сложному декодеру.
Вот почему порядок команд имеет значение, когда вы находитесь в узком месте на декодерах. Для процессоров с кэшем UOP производительность декодирования обычно не критична. Если это так, у вас есть проблема с размером кода. Надеемся, что код редко запускается достаточно часто, чтобы его производительность имела значение, но достаточно редко, чтобы он не нагревался в кэше UOP.