В последней версии Руководство ISA уровня пользователя RISC-V (версия 2.1). Однако в руководстве есть заполнитель для стандартного расширения «B» для обработки битов. Некоторые черновые материалы рабочей группы этого расширения собраны на GitHub. В частности, в проекте спецификации говорится о grev
инструкция (обобщенная обратная), которая может делать 16-, 32- и 64-битные перестановки байтов:
Эта инструкция предоставляет одну аппаратную инструкцию, которая может реализовать все операции по замене порядка байтов, побитовое обращение, замену короткого порядка, замену порядка слов (RV64), замену порядка полубайтов, побитовое обращение в байтах и т. Д., Все из единая аппаратная инструкция. Он принимает значение одного регистра и непосредственное значение, которое контролирует, какая функция выполняется, посредством управления уровнями в рекурсивном дереве, на которых происходят развороты.
Рабочая группа по расширению B была «распущена по бюрократическим причинам в ноябре 2017 года», прежде чем они смогли завершить спецификацию.
В 2020 году рабочая группа снова активна и публикует свои работы в связанном репозитории GitHub.
В результате, в настоящее время, кажется, нет ничего проще, чем делать обычный сдвиг с маской или танцевать. Я не смог найти ни одного встроенного языка ассемблера 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
person
Lassi
schedule
30.08.2018
endian.h
be32toh()
. godbolt.org/z/6MzVWa. Возможно, написание чистого C, который компиляторы могут распознать как перестановку байтов, сработает, но не докажет отсутствие инструкции. - person Peter Cordes   schedule 30.08.2018