Навигатор
My RISC-V home
Инструкции
базового набора
RV64I
(дополняет
RV32I):
арифметические
сдвиги
загрузки
сохранения
См. также
|
Инструкции SLLI, SRLI, SRAI (64 бита)
SLLI rd, rs1, shamt
SRLI rd, rs1, shamt
SRAI rd, rs1, shamt
При обсуждении используются следующие обобщенные обозначения инструкций:
- SxxI32 (вместо xx можно подставить LL, RL или RA, т.е. SLLI32, SRLI32 или SRAI32) - инструкции набора RV32I, обозначаемые ранее как SLLI, SRLI и SRAI соответственно.
- SxxI64 - те же инструкции, но для набора RV64I.
Набор команд: базовый RV64I
Формат: I (с некоторой особенностью полей shamt и func7!!!)
Операнды: rd и rs1 – регистры, shamt – 6-битная константа
Действие: сдвиг значения rs1 на shamt битов; результат помещается в rd
Примечания
- Все инструкции сдвигов SxxI64 кодируются почти одинаково с SxxI32. В частности, и для RV32I, и для RV64I одинаковым образом кодируются поля инструкции opcod, rd, func3 и rs1.
- Но есть отличие. В SxxI32 число сдвигов shamt помещается в 5 битов. Для SxxI64 под него требуется уже 6 битов.
Недостающий для поля shamt бит берется из поля func7, фактически превращая его в func6! (См. пример ниже.) Кстати говоря, для RV128I придется "отбирать" у func6 еще один бит!
- При shamt < 32 кодирование соответствующих пар инструкций SxxI32 и SxxI64 неразличимо. Но начиная с 32 (до 64) инструкция SxxI32 становится некорректной. Лично мне это кажется неудобным, поскольку при большом сдвиге, не зная разрядность, невозможно по записи команды однозначно понять, правильна она или нет. Да и если говорить строго, то все то это плохо походит на правила кодирования для объявленного формата I.
- Принятое в стандарте RISC-V название поля shamt – это сокращение от SHift AMounT, т.е. количество сдвигов.
Пример
Инструкция SLLI x31, x7, 36 сдвигает содержимое регистра x7 на 36 битов влево, а результат помещает в x31 .
Код инструкции для 64-битных данных (а для 32-битных команда некорректна) содержит следующие поля:
поле | разрядность | содержимое | примечание |
func6 | 6 битов | 000000 |
всегда |
shamt | 6 битов | 100100 | 36 |
rs1 | 5 битов | 00111 | x7 |
func3 | 3 бита | 001 |
всегда |
rd | 5 битов | 11111 | x31 |
opcode | 7 битов | 0010011 |
всегда |
Итоговый код
000000 100100 00111 001 11111 00100112 = 02 43 9F 9316
Для увеличения разрядности shamt биты берутся из поля func7.
|