Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么RV32I包含ADDI和XORI等指令,而不包含BLTI?_Assembly_Riscv_Instruction Set - Fatal编程技术网

Assembly 为什么RV32I包含ADDI和XORI等指令,而不包含BLTI?

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

我在ISA设计方面没有经验。我一直在读第二章第21页

有人能解释为什么RISC-V有使用直接指令的算术和逻辑指令,如ADDI和XORI,但没有类似的条件分支指令,如BLTI、BEQI等

(其中
B
ranch
L
ess
T
han
I
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