imm[4:0]
и imm[11:5]
обозначают отрезки в битовом представлении непосредственного операнда.
S-формат используется для кодирования инструкций хранилища, то есть:
sX rs2, offset(r1)
Существуют разные типы инструкций магазина, например store-byte (sb
), store-half-word (sh
), store-word (sw
) и т. д. Часть funct3
используется для кодирования типа (например, 0b00
-> sb
, 0b010
-> sw
, 0b011
-> sd
и т. д.). Это позволяет просто использовать один (основной) код операции, сохраняя при этом несколько типов инструкций сохранения, вместо того, чтобы тратить впустую несколько (основных) кодов операции. IOW, funct3
кодирует второстепенный код операции инструкции.
Непосредственный операнд кодирует смещение. Если вы спросите себя, почему он так разделен - это позволяет увеличить сходство остальных частей в кодировке с другими форматами инструкций. Например, части кода операции, rs1 и funct3 расположены в одном и том же месте в форматах инструкций R-типа, I-типа и B. Размещение части RS2 используется совместно с форматами инструкций R-типа и B-типа. Это сходство помогает упростить декодер команд.
Это означает, что смещение имеет ширину 12 бит и псевдокод:
offset = sign_ext(imm[11:5] << 5 | imm[4:0])
См. Также первый рисунок в разделе 2.6 (Инструкции по загрузке и сохранению) спецификации RISC-V Base (ратифицировано 08.06.2019):
person
maxschlepzig
schedule
15.02.2020