Почему немедленный I-тип расширяется с 16 бит до 32 бит? - PullRequest
1 голос
/ 18 марта 2020

Я готовлюсь к университетскому экзамену и не понимаю, почему непосредственное поле в I-типе расширяется с 16-битного до 32-битного, есть ли объяснение, которое мне нужно знать, или это просто то, что вам нужно знать, что происходит в архитектуре, не зная, почему?

Кроме того, при вычислении адреса ветви

PC <– PC + 4 + (sign_ext(Imm16) << 2)

Почему мгновенный сдвигается на 2?

1 Ответ

2 голосов
/ 18 марта 2020

Как уже отвечали во многих комментариях ...

Хотя MIPS имеет 16-битный формат инструкций, набор команд, с которым все знакомы, представляет собой 32-битный набор команд фиксированной длины на выровненных границах.

В различных операциях используются 32-битные операнды.

Вы не можете иметь 32-битное значение в наборе команд с фиксированным 32-битным значением; для кода операции не осталось бы битов. Таким образом, MIPS имеет разные форматы инструкций с разными размерами непосредственных данных, чтобы сбалансировать широкий набор инструкций без особой боли при использовании немедленных или принудительных загрузок всех немедленных из соседнего пула. В худшем случае вы можете прибегнуть к этому, но для большого количества вещей вы можете использовать инструкции, как они были спроектированы.

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

То, как используется непосредственное отношение, следует искать в соответствии с инструкцией в документации.

Почему ветки сдвигают непосредственное значение на 2?

Инструкции находятся на выровненных 32-битных границах, что означает, что младшие 2 бита всегда равны нулю. Если вы закодируете эти нули в непосредственный, вы всегда должны будете обнулять их и в основном потерять в четыре раза возможный диапазон вашей относительной ветви p c. Подумайте, что немедленным в этом случае будет количество ИНСТРУКЦИЙ, которые я хочу разветвить, а не количество БАЙТОВ адреса.

Наличие подписи допускает прямое или обратное ветвление.

nextPC <– PC + 4 + (sign_ext(Imm16) << 2)

+ 4 является частью иллюзии конвейера, разные ядра имеют свои собственные конструкции труб, поэтому должен быть стандарт для ISA не сумасшедший в использовании (очень типичный выбор дизайна во многих ISA, чтобы иметь P C в момент выполнения в следующей инструкции). Таким образом, nextP C - это P C следующей инструкции плюс число смещений со знаком в немедленных инструкциях (сдвигая две левые, делая младшие два бита равными нулю). Если условие выполнено или если оно безусловное (я не знаю всех инструкций в формате I, не нужно отвечать на этот вопрос), то nextP C используется логи c, в противном случае P C + 4 используется для следующая инструкция.

РЕДАКТИРОВАТЬ

Да, вы правы, расширение знака уже делает его 32-битным значением. Дополнительный сдвиг заключается в максимизации диапазона, который может принять ветвление, что дает нам в четыре раза больше времени вперед или назад к ветвлению с этим форматом команды. Все расширенные биты верхнего знака имеют значение 0 или 1, и имеется более 2 битов расширения, поэтому сдвиг временного 32-битного значения еще на два бита не повредит этому значению.

С 16-битным знаком, подписанным немедленно, если Я хотел не делать этого сдвига в два, тогда 0x00007FF C - это максимальное расстояние, которое я мог бы разветвлять вперед, и чтобы быть действительной инструкцией, младшие два бита должны были быть нулями. Теперь со сдвигом я могу перейти на 0x1FFF C вперед и использовать все непосредственные биты.

...