По состоянию на август 2018 года:
В самой последней инструкции RISC-V User-Level *1004* (версия 2.1) нет инструкции по замене байтов. Однако в руководстве есть заполнитель для «B» стандартного расширения для битовой манипуляции . Некоторые черновые материалы рабочей группы этого расширения собраны на GitHub . В частности, проект спецификации говорит о команде grev
(обобщенная обратная), которая может выполнять 16, 32 и 64-битные перестановки байтов:
Эта инструкция предоставляет отдельную аппаратную инструкцию, которая может реализовать весь обмен байтов, порядок побитового обмена, обмен коротким порядком, замену порядка слов (RV64), замену порядкового куска, битовое обращение в байте и т. Д. все из одной аппаратной инструкции. Он принимает одно значение регистра и мгновенный элемент, который контролирует, какая функция выполняется, посредством контроля уровней в рекурсивном дереве, на котором происходят обращения.
Однако рабочая группа по продлению B была "распущена по бюрократическим причинам в ноябре 2017 года", прежде чем они смогли завершить разработку спецификации.
В результате, в настоящее время, кажется, нет ничего проще, чем делать обычную сменную маску или танец. Я не смог найти встроенного языка ассемблера bswap в портах GCC или clang riscv. В качестве примера приведем разбор функции bswapsi2
(которая заменяет 32-битное значение в байтах), испускаемой компилятором riscv64-linux-gnu-gcc
версии 8.1.0-12:
000000000000068a <__bswapsi2>:
68a: 0185169b slliw a3,a0,0x18
68e: 0185579b srliw a5,a0,0x18
692: 8fd5 or a5,a5,a3
694: 66c1 lui a3,0x10
696: 4085571b sraiw a4,a0,0x8
69a: f0068693 addi a3,a3,-256 # ff00 <__global_pointer$+0xd6a8>
69e: 8f75 and a4,a4,a3
6a0: 8fd9 or a5,a5,a4
6a2: 0085151b slliw a0,a0,0x8
6a6: 00ff0737 lui a4,0xff0
6aa: 8d79 and a0,a0,a4
6ac: 8d5d or a0,a0,a5
6ae: 2501 sext.w a0,a0
6b0: 8082 ret