Я хочу разработать псевдоинструкцию в MIPS, которая пропускает следующую инструкцию
Проще использовать «ветвь», которая всегда проверяется.
beqc $0,$0,2
заменит PC
на PC+(2*4)
, если $ 0 == $ 0 (т.е. всегда), и пропустит следующую инструкцию.
Этот прием часто используется для обработки if-then-else
if(a1)
a2=3;
else
a3=4;
beqc $a1, $0, else
addi $a2, $0, 3
beqc $0, $0, 2 ; go to end of if then else
else: addi $a3, $0, 4
# end of if-then else
beqc
- это ветвь с меньшей задержкой, введенная в mips64-v6 (наряду со многими другими ветвями /прыжок с нулевой задержкой слотов).
В более старых версиях mips ISA невозможно пропустить следующую инструкцию, так как все ветви выполняют следующую инструкцию.Чтобы пропустить вторую следующую инструкцию, идея та же самая.
beq $0,$0,2 ; delayed branch. execute next instruction and if test
; is true (ie always) go to pc+4+2*4
add $0, $0, $0 ; aka nop (because of the delay slot)
xxx $a1, $a2, $a3 ; this instruction will be skipped
yyy $t1, $t2, $t3 ; and this instruction will be executed