Почему RV64 ввел новые коды операций для 32-битных операций вместо 64-битных
Проходя через спецификацию RISC-V, я заметил, что 64-битная версия отличается от 32-битной тем, что она
- Расширить регистры до 64 бит
- Изменены инструкции, действующие на весь 64-битный диапазон.
- Добавлена новая инструкция для выполнения 32-битных операций
Это делает код RV32 несовместимым с RV64. Однако, если бы 64-битная версия была бы реализована с использованием:
- Расширить регистры до 64 бит
- переименовывать
ADD/SUB/SHL/..
вADDW/SUBW/SHLW/..
и оставьте их работоспособными только на 32 битах со знаком расширения. - Добавить новые инструкции
ADD/SUB/SHL/..
или жеADDD/SUBD/SHLD/..
действовать на полную 64 бит
Это позволило бы программам RV32 работать и на RV64. Для реализации ЦП значение efford останется прежним, поскольку в обоих случаях должны быть реализованы 64-битная и 32-битная инструкция, и в отличие от спецификации будут заменены только коды операций для 64-битной и 32-битной версии. (За исключением, может быть, для инструкции умножения.)
Так почему же RISC-V решил добавить новые коды операций для 32-битных операций вместо 64-битных операций в RV64?
1 ответ
RV64 и RV32 вполне совместимы. Если программа не полагается на неявную 32-битную арифметику по модулю и все адреса вписываются в 32-битную, машинный код может быть таким же. Однако очень просто добавить полный пользовательский режим RV32 к процессору RV64.
64-битный суперсет RV32 будет слишком сложным. Недостаточно места для кода операции для AUIPC, JAL, LOAD, STORE и BRANCH. Хуже с дополнительными расширениями.
Несколько 32-битных инструкций в RV64 в основном предназначены для программ, использующих 32-битную арифметику по модулю. Это очень распространенная проблема. Хотя быстрый и переносимый код должен их избегать.