2010-04-21 1 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, я должен сделать:

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

Есть ли в этом смысл?

ответ

0

Слту проверяет, меньше ли сумма двух наименее значимых слов или равна одному из операндов.

Не совсем: она устанавливает $10 в 1, если сумма двух младших значащих слов строго меньше, чем один из операндов (рассматриваемых как 32-битных значений без знака); и 0, если сумма равна или больше этого операнда.

Если это так, как это произошло, это право?

Да.

Рассмотрим, что может произойти при добавлении различных возможных значений б к некоторому конкретному значению (где все беззнаковое 32-битное значение):

  • Если переполнение не произошло, мы должны есть с < = сумма < = 0xFFFFFFFF, так что 0 < = б < = (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)