В чем разница между использованием:
c.eq.s $1, $2
bc1t L2
И используя:
beq $1, $2, L2
Почему есть два способа ветвления, если они делают одно и то же? А если они разные, то какая польза от каждого?
Спасибо
РЕДАКТИРОВАТЬ: я не знал, что "c.eq.s" зависит от сопроцессора. Я написал только $1, $2 вместо $f1, $f2 для единообразия со вторым набором кода.
Ответ 1 · рейтинг 4 · paxdiablo
Инструкция bc1t просто выполняет переход, если бит 1 условия математического сопроцессора равен true. Это тот случай, если два регистра были равны. Это эквивалентно простому переходу, если значения равны, с beq, но только, если регистры фактически были одними и теми же регистрами в обоих случаях.
С сопроцессором MIPS с плавающей запятой регистры должны быть $f1/$f2 в инструкции c.eq.s, чтобы эти две инструкции не были эквивалентны. Я никогда не видел использования $1/$2 в инструкциях с плавающей запятой, за исключением тех, которые перемещают данные между обычными регистрами и регистрами сопроцессора.
Я думаю, что единственный способ условных переходов с плавающей запятой состоит из двух шагов. В IDT MIPS Microprocessor Family Software Reference Manual говорится:
Инструкции для теста FP и ветвления разделены. Инструкция тестирования сравнивает два значения FP и соответствующим образом устанавливает бит состояния FPA (C в регистре состояния FP); инструкции ветвления разветвляются в зависимости от того, установлен бит или нет.