MIPS 中的溢出/进位标志

问题描述 投票:0回答:2

我搜索了一下,没有找到任何可以正确解释这一点的东西。

在 MIPS 中,您可以使用

add
addu
进行加法运算。主要区别在于
addu
不会产生溢出异常。

假设我们有这个二进制文件(我使用了四位,尽管为了简化 MIPS 是 32):

0111

如果我们添加

1
它变成
1000
.

对于

add
指令,存在溢出且无进位,因为正 7 变为负 1(假设 MIPS 中的二进制补码)。这也会产生溢出异常。

对于

addu
,没有溢出也没有进位,因为一切都按预期进行。

现在假设你有这个二进制文件:

1111

如果我们添加

1
它变成
0000
.

使用

add
指令应该不会溢出,因为负 1 变为 0。进位标志怎么样,它会变为 1 吗?

addu
指令会发生什么?是否认为溢出,因为 15 变成了 0?我知道没有溢出异常,但是溢出标志怎么办?它是否设置为 1?进位标志呢?

mips integer-overflow carryflag
2个回答
3
投票

MIPS 架构中没有进位标志。

当结果的符号与可能发生的预期符号不同时,在加法的情况下会发生溢出异常:

  • 当你将两个正数相加得到一个负数时
  • 当你将两个负数相加得到一个正数时

所以是的,在你假设的 4 位 MIPS 0111+1 中导致溢出,相应的标志被激活。


0
投票

我用谷歌搜索了一下,发现这很有用。

(我认为)这解释了为什么 MIPS 中没有进位。

https://yarchive.net/comp/carry_bit.html

快速总结:MIPS 的目标是简化实现,而进位位会使事情变得更加复杂,尤其是在更具侵略性(流水线/超标量/推测和乱序)的设计中。

在简单的流水线设计中,每个结果都写回其目标寄存器,并且结果通常通过旁路网络提供,以防下一条指令立即需要它。

如果你采用典型的当前 RISC 并包括“add-with-carry”,例如(这当然是可行的),不规则性肯定会增加复杂性,并且进位位可能成为更积极的实现中的瓶颈,因为操作要么设置它要么测试它在它上面序列化,并且还需要在一个尴尬的地方使用额外的硬件(比较器和多路复用器)。 (参见 H&P:在索引中查找绕过和条件代码)。

随着 CPU 变得超标量化,用于检查依赖性的额外逻辑变得更糟:实现者尤其讨厌不规则性。

随着它变得推测性和乱序,典型的设计不仅需要寄存器重命名单元,还需要“进位重命名单元”,因为没有“进位位”这样的东西,但是而是一组独立的进位位,具有适当的重命名逻辑,以选择由逻辑上最近设置该位的指令设置的正确进位位。

© www.soinside.com 2019 - 2024. All rights reserved.