我想我正在寻找一个琐事问题的答案。我试图理解为什么 MIPS 架构在寄存器中使用显式的“零”值,而您只需通过对自身进行异或任何寄存器来实现相同的目的。可以说手术已经为您完成了;但是,我真的无法想象您会使用大量“零”值的情况。我阅读了 Hennessey 的原始论文,事实上它只是分配了一个零,没有任何真正的理由。
是否存在硬编码二进制赋值为零的逻辑原因?
更新: 在 PIC32MZ 中 MIPS 内核的 xc32-gcc 的 8k 可执行文件中,我有一个“零”实例。
add t3,t1,zero
实际答案: 我将赏金授予了解 MIPS 和条件代码信息的人。答案实际上在于条件的 MIPS 架构。虽然我最初不想为此分配时间,但我审查了opensparc、RISC-V、MIPS-IV和 OpenPOWER 的架构(本文档是内部文档),这里是总结发现。由于流水线的体系结构,在分支上进行比较所需的 R0 寄存器。
- 整数与零比较和分支 (bgez,bgtz,blez,bltz)
- 整数比较两个寄存器和分支 (beq,bne)
- 整数比较两个寄存器和陷阱 (teq,tge,tlt,tne)
- 整数比较寄存器和立即数和陷阱 (teqi,tgei,tlti,tnei)
它只是简单地归结为硬件在实现中的外观。在 RISC-V 手册中,第 68 页有一个未引用的引用:
条件分支被设计成包括两个寄存器之间的算术比较操作(在 PA-RISC 和 Xtensa ISA 中也是如此),而不是使用条件代码(x86、ARM、SPARC、PowerPC),或者只比较一个寄存器与零( Alpha、MIPS)或两个仅用于相等的寄存器 (MIPS)。这种设计的动机是观察到组合比较和分支指令 ts 进入常规流水线,避免额外的条件代码状态或使用临时寄存器,并减少静态代码大小和动态指令提取 trac。另一点是与零的比较需要非平凡的电路延迟(尤其是在高级过程中转向静态逻辑之后),因此几乎与算术量级比较一样昂贵。融合比较和分支指令的另一个优点是在前端指令流中更早地观察到分支,因此可以更早地预测。在可以基于相同的条件代码采取多个分支的情况下,具有条件代码的设计可能具有优势,但我们认为这种情况相对较少。
RISC-V 文档没有击中引用部分的作者。我感谢大家的时间和考虑。