sltu は、2 つの最下位ワードの合計がオペランドの 1 つより小さいか等しいかどうかをチェックします。
そうではありません: $10
2 つの最下位ワードの合計が厳密にオペランドの 1 つよりも小さい場合 (32 ビットの符号なし値と見なされます)、1 に設定されます。合計がそのオペランド以上の場合は 0。
この場合、キャリーが発生したというよりは、そうですか。
はい。
bのさまざまな可能な値を特定の値a (すべてが符号なし 32 ビット値である場合)に加算するとどうなるかを考えてみましょう。
- オーバーフローが発生していない場合、 <= sum <= 0xFFFFFFFF である必要があるため、0 <= b <= (0xFFFFFFFF - a ) となります。
- bの残りのケースでは、オーバーフローが発生します。これらの場合の実際の合計は、0x100000000 <= sum <= a + 0xFFFFFFFF でなければならず、32 ビットに切り捨てられると、0 <= sum <= a - 1 になります。
最も重要な 2 つの単語を追加するときにキャリーが発生したかどうかを確認し、結果を $9 に格納するには、次のようにする必要があります。
sltu $9, $10, $12 # set carry-in bit
そうではありません。
ここでの問題は、2 つの 32 ビット値を加算していることと、場合によっては最下位ワードの合計からキャリーを加算していることです。たとえば、キャリーがあり、両方の最上位ワードが 0xFFFFFFFF である場合を考えてみましょう。合計は 1+ 0xFFFFFFFF + 0xFFFFFFFF = 0xFFFFFFFF となり、キャリーは設定されません (ただし、設定する必要があります)。
これに対処する 1 つの方法は、 に加算$12
した後にキャリーをチェック$10
し、その合計に加算した後に再度チェックする$11
ことです。これらの合計の 1 つだけがキャリーを生成できます (が 0 または 1であるため、 が 0xFFFFFFFF の$12 + $10
場合にのみオーバーフローします。その場合、合計は 0 であるため、2 番目の合計もオーバーフローできません)。$12
$10
したがって、これは(免責事項:遅く、これはテストされていません)トリックを行う可能性があります:
addu $11, $13, $15
sltu $10, $11, $15 # carry from low word
addu $10, $10, $12
sltu $9, $10, $12 # possible carry from high word (1)
addu $10, $10, $14
sltu $8, $10, $14 # possible carry from high word (2)
or $9, $8, $9 # carry in result if either (1) or (2) were true (can't both be true at once)