Симулятор Xspim: передача целых чисел с mtc1

Код для передачи целого числа 9 в сопроцессор, получения максимального значения его квадратного корня, затем передачи этого значения обратно и вывода на печать:

addi $t1, $zero, 9
mtc1 $t1, $f0
sqrt.s $f0, $f0      # (*)
ceil.w.s $f0, $f0   # (*)
mfc1 $t0, $f0
addi $v0, $zero, 1
addi $a0, $t0, 0
syscall

Обратите внимание на строки с (*): (1) я также пробовал использовать .d вместо .s; (2) Я также пытался сделать разные регистры источника и назначения (от $f0 до $f2 и обратно).

Мой результат — 1 (если я возьму слово, то 0). Однако, если я закомментирую *-ed строки, 9 будет передано туда и сюда нормально: 9 будет напечатано.

Я добавил системный вызов «print_double» (= 3) после передачи (и перед передачей обратно в ЦП), чтобы распечатать переданное число, и печатается очень маленькое положительное число.

Мои вопросы:

а) Что происходит?

(b) mtc1: целое число, переданное ЦП, получено как двойное или одинарное? Прежде чем отправить его обратно с mfc1, он должен быть одинарным или двойным, или это не имеет значения? (экспериментировал с cvt.d.s и т.п., безрезультатно)

Примечание: я делаю это для развлечения, используя «Компьютерную организацию и дизайн» (Паттерсон, Хеннесси). В 4-м издании неправильный синтаксис для mtc1 в приложении B.10 - порядок rd и rs должен быть таким, как указано выше.


person gnometorule    schedule 17.10.2013    source источник


Ответы (1)


Добавление cvt.s.w для преобразования загруженного целого числа в число с плавающей запятой одинарной точности устраняет проблему:

addi $t1, $zero, 36
mtc1 $t1, $f0
cvt.s.w $f0,$f0    # convert the integer in $f0 to floating point
sqrt.s $f0, $f0      
ceil.w.s $f0, $f0  # ceil and convert from floating point to integer 
mfc1 $t0, $f0
addi $v0, $zero, 1
addi $a0, $t0, 0
syscall
person Michael    schedule 17.10.2013
comment
Спасибо! У меня тоже сейчас работает. Это, очевидно, также отвечает (b) после передачи, его необходимо сначала сделать с двойной (cvt.d.w) или одинарной (cvt.s.w) точностью с плавающей запятой. - person gnometorule; 17.10.2013