Ветвь на равных в ассемблере/машинном коде

В чем разница между использованием:

c.eq.s    $1, $2
bc1t      L2

И используя:

beq $1, $2, L2

Почему есть два способа ветвления, если они делают одно и то же? А если они разные, то какая польза от каждого?

Спасибо

РЕДАКТИРОВАТЬ: я не знал, что "c.eq.s" зависит от сопроцессора. Я написал только $1, $2 вместо $f1, $f2 для единообразия со вторым набором кода.


person davidx1    schedule 19.08.2012    source источник
comment
@Mysticial Я думаю, что это должна быть архитектура регистр-регистр (или загрузка-хранилище) для процессора RISC.   -  person davidx1    schedule 19.08.2012
comment
В смысле типа, какой процессор ISA? Это явно не x86. PowerPC? Спарк? MIPS? РУКА? Я только хорошо знаком с x86. Но добавление соответствующего тега приведет к тому, что на него ответят нужные люди.   -  person Mysticial    schedule 19.08.2012


Ответы (1)


Инструкция bc1t просто выполняет переход, если бит 1 условия математического сопроцессора равен true. Это тот случай, если два регистра были равны. Это эквивалентно простому переходу, если значения равны, с beq, но только, если регистры фактически были одними и теми же регистрами в обоих случаях.

С сопроцессором MIPS с плавающей запятой регистры должны быть $f1/$f2 в инструкции c.eq.s, чтобы эти две инструкции не были эквивалентны. Я никогда не видел использования $1/$2 в инструкциях с плавающей запятой, за исключением тех, которые перемещают данные между обычными регистрами и регистрами сопроцессора.

Я думаю, что единственный способ условных переходов с плавающей запятой состоит из двух шагов. В IDT MIPS Microprocessor Family Software Reference Manual говорится:

Инструкции для теста FP и ветвления разделены. Инструкция тестирования сравнивает два значения FP и соответствующим образом устанавливает бит состояния FPA (C в регистре состояния FP); инструкции ветвления разветвляются в зависимости от того, установлен бит или нет.

person paxdiablo    schedule 19.08.2012
comment
Работает ли bc1t только там, где есть сопроцессоры? Например, работать с числами с плавающей запятой двойной точности, в то время как beq работает со всем? - person davidx1; 19.08.2012
comment
@Synia, я понятия не имею, что будет делать bc1t, если у вас нет сопроцессора, он просто проверяет значение специального триггера D между процессором и copro. Если копро там нет, я подозреваю, что все ставки сняты. - person paxdiablo; 19.08.2012
comment
Спасибо за расширение вашего ответа. Я просто хочу перепроверить, правильно ли я понял. Вы имеете в виду, что с микропроцессором MIPS двухэтапный код является единственным способом ветвления в инструкциях с плавающей запятой. Он также работает только с инструкциями с плавающей запятой и ничем другим? При использовании beq работает с регистрами ЦП и НЕ работает с сопроцессорами с плавающей запятой? - person davidx1; 19.08.2012
comment
@Synia: проще говоря, c.eq.s $f1, $f2 — это сравнение с плавающей запятой (в регистрах сопроцессора с плавающей запятой), а beq $1, $2 — целочисленное сравнение (в регистрах общего назначения). В частности, сравнение с плавающей запятой обеспечивает соответствующую обработку NaN и INF. - person ninjalj; 19.08.2012
comment
@Synia: обратите внимание, что есть также инструкция c.ueq.s, которая обрабатывает NaN иначе, чем c.eq.s. - person ninjalj; 19.08.2012