Что означает «немедленное расширение до 32 бит» в MIPS?

Я читаю о фазе декодирования инструкций (ID) в пути данных MIPS, и у меня есть следующая цитата: «После того, как операнды известны, прочитайте фактические данные (из регистров) или увеличьте данные до 32 бит (немедленно) ."

Может кто-нибудь объяснить, что означает часть «расширить данные до 32 бит (немедленно)»? Я знаю, что все регистры содержат 32 бита, и я знаю, что такое немедленный. Я просто не понимаю, зачем нужно расширять непосредственное с 26 до 32 бит.

Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 434
2

Ответы 2

26-битные непосредственные значения присутствуют только в инструкциях перехода и не расширяются по знаку или нулю до 32-битных, потому что они не являются смещениями, которые нужно добавлять/вычитать.

Инструкции I-типа с 16-битными непосредственными значениями отличаются.

  • addi / addiu непосредственные значения расширяются по знаку (путем дублирования верхнего/знакового бита непосредственного значения на все старшие биты). https://en.wikipedia.org/wiki/Two%27s_complement#Sign_extension
    Это позволяет кодировать дополнительные числа 2 из -2^15 .. +2^15-1.
    (от 0xFFFF8000 до 0x00007FFF)
  • ori/andi/xori логические непосредственные значения расширяются нулями (устанавливая все старшие биты равными нулю)
    Это позволяет кодировать числа дополнения без знака / 2 из 0 .. 2^16-1.
    (от 0x00000000 до 0x0000FFFF)

Другие инструкции см. в этом справочник по набору инструкций, в котором разбивается каждая инструкция, показывающая 016 || [I15..0] для нулевого расширения или [I15]16 || [I15..0] для расширения знака.

Это позволяет использовать 16-битные непосредственные значения в качестве входных данных для 32-битной двоичной операции, которая имеет смысл только с двумя входными данными одинаковой ширины.. (В простом классическом конвейере MIPS этап декодирования извлекает операнды из регистров и/или непосредственных значений. Входные данные регистров всегда будут 32-битными, поэтому АЛУ настроен на 32-битные входные данные. Расширение непосредственных значений до 32-битных означает остальной части ЦП не нужно заботиться о том, поступили ли данные из непосредственного регистра или из регистра.)

Также расширенный знак:

  • смещения в режиме адресации reg+imm16, используемом lw/sw и другими инструкциями загрузки/сохранения
  • относительные ветви (PC += imm16<<2)

возможно, другие, проверьте руководство на предмет инструкций, которые я не упомянул, чтобы увидеть, имеют ли они знаковое или нулевое расширение.


Вы можете задаться вопросом: «Почему addiu подписывает-расширяет свое непосредственное значение, даже если оно не подписано?»

Помните, что нет subiu, только addiu с минусом. Возможность складывать или вычитать числа из диапазона -2^15 .. +2^15-1 более полезна, чем просто складывать 0 .. 2^16-1.

И обычно вы не хотите вызывать исключение при переполнении со знаком, поэтому обычно компиляторы используют addu / addiu даже для целых чисел со знаком. addu плохо назван: это не «для целых чисел без знака», это просто версия add/addi с допустимой оболочкой / без сбоев. Это имеет смысл, если вы думаете о C, где переполнение со знаком является неопределенным поведением (и, следовательно, может использовать add и вызывать исключение в том случае, если компилятор хочет реализовать это таким образом), но целые числа без знака имеют четко определенное поведение переполнения. : основание 2 с закруглением.

Также расширенный знак: slti[u] непосредственные. Существуют также инструкции-ловушки с непосредственными инструкциями, и еще больше вещей расширено по знаку на MIPS64 (большинство 32-битных инструкций ALU и несколько более новых инструкций, предназначенных только для MIPS64).

Alexey Frunze 26.03.2019 10:44

На 32-битном ЦП большинство операций, которые вы выполняете (например, сложение, вычитание, разыменование указателя), выполняются с 32-битными числами. Когда у вас есть число с меньшим количеством битов, вам нужно как-то решить, какими будут эти другие биты, когда вы хотите использовать это число в одной из этих операций. Акт принятия решения о том, что представляют собой эти новые старшие биты, называется «расширением».

Предполагая, что вы просто делаете стандартное нулевое расширение или расширение знака, расширение обходится очень дешево. Однако он требует некоторой схемы, поэтому имеет смысл упомянуть его в описании пути данных MIPS.

Другие вопросы по теме