首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么RV32I包含诸如ADDI和XORI之类的指令,而不包含BLTI?

为什么RV32I包含诸如ADDI和XORI之类的指令,而不包含BLTI?
EN

Stack Overflow用户
提问于 2018-08-12 15:55:37
回答 1查看 1.1K关注 0票数 3

我对ISA设计没有经验。我一直在读https://riscv.org/specifications/第2章,第21页。

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

(其中,Branch Less Than Immediate会将寄存器与常量和分支进行比较,如果比较少的话。)

我不知情的意见是,BLTI将经常用于C中的固定长度循环,例如:

代码语言:javascript
复制
for (int i = 0; i < 16; i++) {
    ...
}

为什么算术指令和逻辑指令比分支指令更适合直接变体?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-12 16:24:05

分支已经需要将分支目标偏移编码为立即的,在其中匹配两个直接操作数将更加困难。使两者都大大缩小将使他们适应,但也将减少使用的指示。

这样的分支偶尔会有用,但我认为您高估了它的有用性:在典型的循环中,没有必要直接将循环计数器与其边值进行比较,实际上,大多数循环变量甚至没有将其放入编译的代码中。

作为一个小例子(使用更高的计数以避免循环的完全展开),

代码语言:javascript
复制
int test(int *data) {
    int sum = 0;
    for (int i = 0; i < 255; i++)
        sum += data[i];
    return sum;
}

由Clang汇编成:

代码语言:javascript
复制
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

Clang在这里所做的是计算最终地址,然后循环直到到达该地址,从而消除循环计数器的存在。

这是一个有点特殊的情况,但也有其他的窍门。例如,在许多情况下,循环退出测试可以转换为当寄存器减少到零时退出的循环,这很容易测试,因为RISCV有bnez。如果有必要,原始循环计数器可以与该计数器共存(不参与循环退出测试),或者,如果可能的话,它可以再次消失。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51810450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档