我只是想在本机MIPS上实现多精度算法。假使,假设 一个64位整数在寄存器$ 12和$ 13中,另一个在寄存器$ 14和$ 15中。 这笔款项将放在10美元和11美元的寄存器中。 64位整数的最高有效字位于偶数寄存器中,最低有效字位于奇数寄存器中。在网上,它说,这是最短的实施。
addu $11, $13, $15 # add least significant word
sltu $10, $11, $15 # set carry-in bit
addu $10, $10, $12 # add in first most significant word
addu $10, $10, $14 # add in second most significant word
我只想仔细检查一下我是否理解正确。 sltu检查是否 两个最不重要的单词的总和小于或等于一个 操作数。如果是这种情况,那么进位是否发生,这是对的吗?
在添加最重要的两个时检查是否发生了进位 单词并将结果存储在9美元我必须这样做:
sltu $9, $10, $12 # set carry-in bit
这有意义吗?
答案 0 :(得分:0)
sltu检查两个最低有效字的总和是否小于或等于其中一个操作数。
不完全:如果两个最低有效字的总和严格小于一个操作数(被认为是32位无符号值),它会将$10
设置为1;如果和等于或大于该操作数,则为0。
如果是这种情况,那么发生了进位,这是对的吗?
是
考虑将 b 的各种可能值添加到某个特定值 a (其中所有内容都是无符号的32位值)时会发生什么:
在添加两个最重要的单词时检查是否发生了进位,并将结果存储在$ 9中 我必须这样做:
sltu $9, $10, $12 # set carry-in bit
不完全。
这里的问题是你从最低有效字的总和中添加两个32位值和可能是一个进位。例如,考虑存在进位且两个最高有效字都是0xFFFFFFFF的情况:总和将是1 + 0xFFFFFFFF + 0xFFFFFFFF = 0xFFFFFFFF,因此进位不会被设置(但它应该是)。
处理此问题的一种方法是在将$12
添加到$10
后检查进位,并在将$11
添加到该总和后再次检查。这些和中只有一个可以产生进位($12 + $10
仅在$12
为0xFFFFFFFF时溢出,因为$10
为0或1;并且在这种情况下总和为0,所以第二个总和也不能溢出。)
所以这可能(免责声明:已经很晚了,这是未经测试的)做的伎俩:
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)