Почему для x86-64 инструкции на 32-разрядных регистров ноль верхняя часть полный 64-битный регистр?

В х86-64 тур Интел пособий, я читал

пожалуй, самое удивительное в том, что инструкция, таких как мову в eax, ebx потенциально автоматически обнуляет верхние 32 битарегистре rax`.

В документации Intel (3.4.1.1 регистров общего назначения в 64-разрядном режиме в ручном базовая архитектура), котируемые на тот же источник говорит нам:

  • 64-разрядные операнды генерировать 64-битный результат в общем-цель назначения регистра.
  • 32-разрядные операнды генерировать 32-битный результат, ноль-расширенная в 64-битный результат в общем-цель назначения регистра.
  • 8-битные и 16-битные операнды генерировать 8-разрядный или 16-разрядный результат. Верхний 56 бит или 48 бит (соответственно) универсального назначения регистров могут быть изменены операцией. Если результат 8-бит или 16-бит предназначен для 64-разрядных вычислений адреса, явно знак-продлить регистрацию до полного 64-бит.

В x86-32 и x86-64 сборки, 16-битные инструкции, такие как

mov ax, bx

Дон'т показать такой-то "странные" и поведение, что старшее слово регистра eax обнуляется.

Таким образом: какова причина такого поведения была введена? На первый взгляд это кажется нелогичным (но причина может быть в том, что я привык к причудам архитектуры x86-32 ассамблеи).

Комментарии к вопросу (5)
Решение

Я'м не АМД или говорить за них, но я бы сделал точно так же. Потому что обнуление высокая половина не'т создать зависимость от предыдущего значения, что процессору придется ждать. Регистрация переименование механизм, по существу, побеждены, если бы это было'т сделано именно так.

Таким образом, вы можете писать быстрый код, используя 32-разрядные значения в 64-битном режиме без явного разрыва зависимостей все время. Без этого поведения, каждый 32-битных инструкций в 64-разрядном режиме придется ждать на что-то, что было раньше, даже при том, что высокая часть почти не используется. (Оформление инт 64-битный отходов кэш памяти и пропускной способности памяти; х86-64 наиболее эффективно поддерживает 32 и 64-бит размера операнда)

Поведение для 8 и 16-битного размера операнда является странным. Зависимость безумие является одной из причин того, что 16-разрядные инструкции теперь избегают. для x86-64 унаследовала от 8086 для 8-ми и 386 для 16-бит, и решил у 8 и 16-битных регистров в 64-битном режиме, как это делают в 32-битном режиме.


См. также https://stackoverflow.com/questions/41573502/why-doesnt-gcc-use-partial-registers для практических деталях, как пишет в 8 и 16-разрядных частичных регистров (и последующие чтения полный реестр) обрабатываются реальные процессоры.

Комментарии (9)

Это просто экономит место в инструкции, а набор инструкций. Вы можете перемещать небольшие непосредственного значения в 64-разрядный регистр с использованием существующих (32-бит) инструкции.

Она также избавляет вас от необходимости кодировать 8 байт значения мову РАКС, 42, когда мову еах, 42 может быть использован повторно.

Эта оптимизация не так важна, для 8 и 16 бит ОПС (потому что они меньше), и изменение правил также будет сломать старый код.

Комментарии (15)