MIPS的多精度算法

时间:2010-04-21 13:30:34

标签: assembly math mips

我只是想在本机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 

这有意义吗?

1 个答案:

答案 0 :(得分:0)

  

sltu检查两个最低有效字的总和是否小于或等于其中一个操作数。

不完全:如果两个最低有效字的总和严格小于一个操作数(被认为是32位无符号值),它会将$10设置为1;如果和等于或大于该操作数,则为0。

  

如果是这种情况,那么发生了进位,这是对的吗?

考虑将 b 的各种可能值添加到某个特定值 a (其中所有内容都是无符号的32位值)时会发生什么:

  • 如果没有发生溢出,我们必须 a < = sum< = 0xFFFFFFFF,所以0< = b < =(0xFFFFFFFF - )。
  • b 的其余情况会导致溢出;这些情况下的实际总和必须是0x100000000< = sum< = a + 0xFFFFFFFF,当截断为32位时,给出0< = sum< = a - 1。
  

在添加两个最重要的单词时检查是否发生了进位,并将结果存储在$ 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)