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