Путаница в руководстве RISC V: формат инструкции VS немедленный формат

У меня есть вопрос, связанный с руководством по RISC V. В нем есть разные типы кодирования инструкций, такие как R-тип, I-тип. Как и кодировка MIPS.

* R-type

  31        25 24     20 19     15 14  12 11      7 6           0
 +------------+---------+---------+------+---------+-------------+
 | funct7     | rs2     | rs1     |funct3| rd      | opcode      |
 +------------+---------+---------+------+---------+-------------+

* I-type

  31                  20 19     15 14  12 11      7 6           0
 +----------------------+---------+------+---------+-------------+
 | imm                  | rs1     |funct3| rd      | opcode      |
 +----------------------+---------+------+---------+-------------+

* S-type

  31        25 24     20 19     15 14  12 11      7 6           0
 +------------+---------+---------+------+---------+-------------+
 | imm        | rs2     | rs1     |funct3| imm     | opcode      |
 +------------+---------+---------+------+---------+-------------+

* U-type

  31                                      11      7 6           0
 +---------------------------------------+---------+-------------+
 | imm                                   | rd      | opcode      |
 +---------------------------------------+---------+-------------+

Но у него также есть так называемый немедленный формат: например, I-немедленный, S-немедленный и т. Д.

* I-immediate

  31                                        10        5 4     1  0
 +-----------------------------------------+-----------+-------+--+
 |                                  <-- 31 | 30:25     | 24:21 |20|
 +-----------------------------------------+-----------+-------+--+

* S-immediate

  31                                        10        5 4     1  0
 +-----------------------------------------+-----------+-------+--+
 |                                  <-- 31 | 30:25     | 11:8  |7 |
 +-----------------------------------------+-----------+-------+--+

* B-immediate

  31                                  12 11 10        5 4     1  0
 +--------------------------------------+--+-----------+-------+--+
 |                               <-- 31 |7 | 30:25     | 11:8  |z |
 +--------------------------------------+--+-----------+-------+--+

* U-immediate

  31 30               20 19           12 11                      0
 +--+-------------------+---------------+-------------------------+
 |31| 30:20             | 19:12         |                   <-- z |
 +--+-------------------+---------------+-------------------------+

* J-immediate

  31                  20 19           12 11 10        5 4     1  0
 +----------------------+---------------+--+-----------+-------+--+
 |               <-- 31 | 19:12         |20| 30:25     | 24:21 |z |
 +----------------------+---------------+--+-----------+-------+--+

Согласно руководству, там говорится, что эти немедленные действия производятся инструкцией RISC-V, но как эти вещи связаны?

Какой смысл иметь немедленный формат?


person Billy    schedule 06.07.2018    source источник
comment
Форматы I-U-S-B-немедленного действия не являются форматом инструкций, а, скорее, как хорошо объяснил Питер Кордес, - как непосредственные сообщения кодируются в каждом из форматов инструкций.   -  person Pierre G.    schedule 07.07.2018


Ответы (1)


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

Для инструкций I-типа это тривиально, просто арифметически сдвиньте командное слово вправо на 20 бит, потому что есть только одно непосредственное поле, и оно непрерывно вверху командного слова.

Для немедленных инструкций S-типа есть два отдельных поля в командном слове: [31:25] и [11:7], и это показывает, что они находятся в том порядке, а не [11:7, 31:25] и без каких-либо неявных нулей между ними. .

Непосредственные инструкции типа B, по-видимому, помещают бит 7 перед [30:25], а младший бит является неявным нулем. (Таким образом, полученное число всегда четное). Я предполагаю, что тип B предназначен для веток.

U-тип также интересен, заполняя 20-битное значение сразу завершающими нулями. Он используется для lui для создания старших битов 32-битных констант (остальное addi). Это не совпадение, что U-тип и I-тип вместе имеют всего 32 непосредственных бита.

Для доступа к статическим данным lui может создать старшую часть адреса, в то время как lw может предоставить младшую часть напрямую, вместо использования addi для создания полного адреса в регистре. Это характерно для RISC, как ИСАС MIPS и PowerPC, а также (см пример на Godbolt компилятор исследователь). Но в отличие от большинства других RISC ISA, RISC-V имеет auipc, который немедленно добавляет U-тип к счетчик программ для эффективного PIC без необходимости загружать адреса из GOT (глобальной таблицы смещения). (В недавней ревизии MIPS также была добавлена ​​инструкция добавления к ПК, но долгое время MIPS плохо справлялся с PIC).

lui может кодировать любой адрес, выровненный по 4К, то есть адрес начала страницы с 4Кб страниц.

person Peter Cordes    schedule 06.07.2018
comment
Могу я спросить, зачем нужно расширять непосредственные биты до 32 бит? Это потому, что непосредственное декодирование в 32 бита, чтобы сохранить тот же размер, что и содержимое в регистре? - person Billy; 08.07.2018
comment
@Billy: такая инструкция, как add r0, r1, 1234 (или любой другой синтаксис для RISC-V), выполняет 32-битное сложение, поэтому оба ввода должны быть одинакового размера. Таким образом, немедленно требуется правило для расширения до ширины регистра; в противном случае каждая инструкция могла бы иметь собственное правило для расширения при необходимости немедленно. (Однако инструкции сдвига не нужно заботиться о старших битах.) Кстати, MIPS ori с нулевым расширением немедленно, а MIPS addiu с помощью знака. IDK, если RISC-V имеет какие-либо инструкции, которые повторно интерпретируют немедленное переопределение общего правила. - person Peter Cordes; 08.07.2018
comment
Для чего используется U-тип: для загрузки старших битов регистра. Обычно в паре с I-типом или S-типом, который обеспечивает оставшиеся биты. Например, чтобы добавить 0x12345678 в регистр, вы должны lui rt, 0x12345 (тип U) установить rt = 0x12345000, а затем addi rd, rt, 0x678 (тип I), чтобы завершить работу. Точно так же, чтобы выполнить абсолютное сохранение в 0x12345678, вы должны следовать за sw rs, 0x678(rt) (S-тип). - person Raymond Chen; 12.07.2018
comment
@RaymondChen: спасибо; это имеет смысл. Я больше знаком с MIPS, у которого есть 16-битные немедленные изменения; Я думаю, что MIPS lui просто использует тот же формат I-типа, что и другие инструкции. (Позволяет создать произвольную 32-битную константу в 2-х инструкциях). С меньшими значениями непосредственных значений для инструкций I-типа RISC-V имеет смысл использовать достаточно места для кодирования на lui, чтобы получить 32 общих немедленных бита в 2 инструкциях. - person Peter Cordes; 13.07.2018