Вот вариант без ветки:
# input and output in $t0
sra $t1,$t0,31
xor $t0,$t0,$t1
sub $t0,$t0,$t1
Как это работает?
Сначала $t1
заполняется битом знака $t0
. Поэтому, если $t0
положительно, $t1
будет установлено в 0, а если $t0
отрицательно, $t1
будет установлено в 0xFFFFFFFF.
Затем, каждый бит $t0
инвертируется, если $t1
равен 0xFFFFFFFF, или остается неизменным, если $t1
равен 0. Просто так получается, что инвертирование всех битов числа совпадает с установкой его на (-number)-1
(в два дополнения).
Наконец, либо 0xFFFFFFFF (что равно -1), либо 0 вычитается из промежуточного результата.
Так что, если $t0
изначально был отрицательным, вы получите:
$t0 = ($t0 ^ 0xFFFFFFFF) - 0xFFFFFFFF
== (-$t0 - 1) - -1
== (-$t0 - 1) + 1
== -$t0
.
И если он изначально был положительным, вы получите:
$t0 = ($t0 ^ 0) - 0
== $t0
.