RISC-V NOP指令

9
我最近在研究RISC-V 32I指令。我对NOP指令有一个问题,规范说它等同于ADDI x0,x0,0。
然而,x0不是程序员可以修改的通用寄存器。因此,为什么x0在这里作为NOP指令的目标寄存器?
请问有人能解释一下这个问题吗?

4
x0是一个只读寄存器,这意味着对它的任何写入操作都会被忽略。 - fsasm
2
与MIPS或许多其他精简指令集(RISC)体系结构一样,对零寄存器的写入将被丢弃:零寄存器如何提高性能?aarch64中的零寄存器'zr'本质上是地面吗?为什么SPARC或MIPS的%r0始终为0? - phuclv
3个回答

7

NOP 是一个伪指令,其展开为 ADDI x0, x0, 0x0(或zero)是一个只读寄存器,专门用于存储值零,即每一位都硬连到0。无论写入该寄存器的内容如何,都将被丢弃,因为它的值不能被修改。

来自The RISC-V Instruction Set Manual Volume I: Unprivileged ISA

NOP 指令不会改变任何架构可见状态,除了将 pc 前进并增加任何适用的性能计数器。 NOP 的编码为 ADDI x0,x0,0

请记住,RISC-V没有算术标志(即进位、溢出、零、符号标志),任何算术操作的目标寄存器是 x0 都可以作为 no operation 指令,而不管源寄存器是什么,因为其净结果将包括将程序计数器推进到下一条指令而不更改任何其他相关处理器状态。


3

牛嘴鸟引用了一个正确的声明,x0保持常量0,不能被写入另一个值。

指令ADDI x0,x0,0执行x0 <- x0 + 0,其中0是编码在指令中的立即数。这种指令对RISCV的状态没有影响,因此是NOP。

RISCV上其他NOP的替代方法: ADDI x0, x1, 0。即使ADD x0, x1, x2也不会对RISCV产生影响(RISCV上没有进位标志),因此像NOP一样运行。


4
如果使用x1作为源,将会引入一个错误的依赖关系,这会导致nop指令在最后一条写入x1的指令执行完之前无法执行,除非硬件特别将其视为真正的nop。从架构上来说,它当然还是一个NOP指令,但从微架构上来看,在超标量(和/或乱序)核心上可能会更糟糕。 - Peter Cordes

2

1
这是一个正确的语句,x0 保存常数 0 并且不能被赋值为其他值。 - Pierre G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接