我以前使用过8086的汇编语言,所以8086中的旋转操作只是一个命令。但是我找不到使用Risc-V汇编语言进行旋转操作的特定关键字。
答案 0 :(得分:1)
似乎扩展名“ B”最终应定义这样的指令。
在此之前,您必须使用左移和右移进行组合。
这里等效于MIPS32R2 rotrv指令(按变量计数向右旋转):
rotrv:
subu neg_count, zero, count
srlv tmp1, src, count
sllv tmp2, src, neg_count
or dst, tmp1, tmp2
您可以在riscv上执行相同的操作。
答案 1 :(得分:1)
RISC-V基本指令集不包括旋转指令。
因此,您必须使用多个基本指令来实现旋转(又称为循环移位):
.text
.balign 4
# unsigned long rotl(unsigned long x, unsigned long amnt);
.global rotl
rotl:
sll a2, a0, a1
sub a4, zero, a1
srl a3, a0, a4
or a0, a2, a3
ret
# unsigned long rotr(unsigned long x, unsigned long amnt);
.global rotr
rotr:
srl a2, a0, a1
sub a4, zero, a1
sll a3, a0, a4
or a0, a2, a3
ret
请注意,sub a4, zero, a1
绕回零,并且左移逻辑(sll
)仅使用{的低六位(RV64G)或五位(RV32G) {1}}作为移动量。
按立即数操作数移位时,GNU a4
不会不隐式截断移位量,因此必须显式屏蔽它,例如:
as
RISC-V Bitmanip Extension "B"规范草案的确包含一些附加的移位和随机播放指令,包括左右旋转:
# unsigned long rotl3(unsigned long x); .global rotl3 rotl3: slli a2, a0, 3 srli a3, a0, (-3 & 63) # & 31 for RV32G or a0, a2, a3 ret # unsigned long rotr3(unsigned long x); .global rotr3 rotr3: srli a2, a0, 3 slli a3, a0, (-3 & 63) # & 31 for RV32G or a0, a2, a3 ret .global rotl
({RISV-V Bitmanip Extension V0.92,第2.2.1节,第14页)
当然,从2020年开始,由于草案的状态,bitmanip指令及其编码可能会更改,并且对软件工具链,模拟器和硬件中的“ B”扩展的支持还不广泛。