我对ISA设计没有经验。我一直在读https://riscv.org/specifications/第2章,第21页。
有人能解释一下为什么RISC-V有直接的算术指令和逻辑指令,如ADDI和XORI,但没有类似的条件分支指令,如BLTI、BEQI等。
(其中,Branch Less Than Immediate会将寄存器与常量和分支进行比较,如果比较少的话。)
我不知情的意见是,BLTI将经常用于C中的固定长度循环,例如:
for (int i = 0; i < 16; i++) {
...
}为什么算术指令和逻辑指令比分支指令更适合直接变体?
发布于 2018-08-12 16:24:05
分支已经需要将分支目标偏移编码为立即的,在其中匹配两个直接操作数将更加困难。使两者都大大缩小将使他们适应,但也将减少使用的指示。
这样的分支偶尔会有用,但我认为您高估了它的有用性:在典型的循环中,没有必要直接将循环计数器与其边值进行比较,实际上,大多数循环变量甚至没有将其放入编译的代码中。
作为一个小例子(使用更高的计数以避免循环的完全展开),
int test(int *data) {
int sum = 0;
for (int i = 0; i < 255; i++)
sum += data[i];
return sum;
}由Clang汇编成:
test(int*): # @test(int*)
addi a2, zero, 1020
mv a3, zero
mv a1, zero
.LBB0_1: # =>This Inner Loop Header: Depth=1
add a4, a0, a3
lw a4, 0(a4)
add a1, a4, a1
addi a3, a3, 4
bne a3, a2, .LBB0_1
mv a0, a1
retClang在这里所做的是计算最终地址,然后循环直到到达该地址,从而消除循环计数器的存在。
这是一个有点特殊的情况,但也有其他的窍门。例如,在许多情况下,循环退出测试可以转换为当寄存器减少到零时退出的循环,这很容易测试,因为RISCV有bnez。如果有必要,原始循环计数器可以与该计数器共存(不参与循环退出测试),或者,如果可能的话,它可以再次消失。
https://stackoverflow.com/questions/51810450
复制相似问题