Assembly 为什么RV32I包含ADDI和XORI等指令,而不包含BLTI?
我在ISA设计方面没有经验。我一直在读第二章第21页 有人能解释为什么RISC-V有使用直接指令的算术和逻辑指令,如ADDI和XORI,但没有类似的条件分支指令,如BLTI、BEQI等 (其中Assembly 为什么RV32I包含ADDI和XORI等指令,而不包含BLTI?,assembly,riscv,instruction-set,Assembly,Riscv,Instruction Set,我在ISA设计方面没有经验。我一直在读第二章第21页 有人能解释为什么RISC-V有使用直接指令的算术和逻辑指令,如ADDI和XORI,但没有类似的条件分支指令,如BLTI、BEQI等 (其中BranchLessThanImmediate将寄存器与常数进行比较,如果较小,则将寄存器与分支进行比较。) 我不知情的意见是,BLTI将经常用于C中的固定长度循环,例如: for (int i = 0; i < 16; i++) { ... } for(int i=0;i
B
ranchL
essT
hanI
mmediate将寄存器与常数进行比较,如果较小,则将寄存器与分支进行比较。)
我不知情的意见是,BLTI将经常用于C中的固定长度循环,例如:
for (int i = 0; i < 16; i++) {
...
}
for(int i=0;i<16;i++){
...
}
为什么算术和逻辑指令比分支指令更适合立即变量?分支已经需要将分支目标偏移量编码为立即变量,在其中安装两个立即操作数会更困难。将两者都缩小会使它们适合,但也会降低指令的有用性 这样一个分支偶尔会有用,但在我看来,您高估了它的有用性:在典型的循环中,没有必要直接将循环计数器与其边界值进行比较,事实上,大多数循环变量甚至没有将其写入编译代码中 举个小例子(使用更高的计数以避免循环完全展开) Clang在这里所做的是计算最终地址,然后循环直到到达该地址,从而消除循环计数器的存在
这是一个有点特殊的情况,但也有其他技巧。例如,在许多情况下,循环退出测试可以转换为当寄存器减为零时退出的循环,这很容易测试,因为RISCV具有
bnez
。如有必要,原始循环计数器可以与之共存(不参与循环退出测试),或者如果可能,它可以再次消失。是。当blti
实际上是由slt
和bne
组成的伪指令时,在MIPS中也会发生同样的情况。注意:RISC-V的bnez x,off
(分支如果不等于零)是扩展到:bne x,x0,off
int test(int *data) {
int sum = 0;
for (int i = 0; i < 255; i++)
sum += data[i];
return sum;
}
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
ret