2010-04-21 61 views
1

我只是試圖在本機MIPS上實現多精度算法。假設 一個64位整數在寄存器$ 12和$ 13中,另一個在寄存器$ 14和$ 15中。 這筆款項將被存入註冊10美元和11美元。 64位整數的最顯著字中偶數寄存器被發現,並且至少顯著詞在奇數寄存器之中。它在互聯網上說,這是最短的實施。MIPS上的多精度算法

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 I要做的結果:

sltu $9, $10, $12 # set carry-in bit 

這是否任何意義?

回答

0

sltu檢查兩個最低有效字的總和是否小於或等於其中一個操作數。

不太:它設置$10爲1,如果的兩個最低顯著字的總和是嚴格操作數(被視爲32比特的無符號值)小於一個;和0,如果總和等於,或大於,該操作數越大。

如果是這種情況,那麼發生這種情況的可能性是多少?

是的。

考慮到一些特定增值的b各種可能的值時,一個(這裏的一切是一個無符號32位值)會發生什麼:

  • 如果沒有發生溢出,我們必須有一個 < =總和< = 0xFFFFFFFF的,所以0 < = b < =(0xFFFFFFFF的 - 一個)。
  • 其餘病例爲b導致溢出;在這些情況下的實際總和必須0x100000000 < =總和< = 一個 + 0xFFFFFFFF的,其中,當截斷爲32位給出0 < =總和< = 一個 - 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)