Пропуск следующей инструкции в mips32 - PullRequest
0 голосов
/ 16 февраля 2019

Предположим, я хочу разработать псевдоинструкцию в MIPS, которая пропускает следующую инструкцию после того, как я назову эту инструкцию пропуска, скажем, skip $s0.

Я подумал, что, возможно, смогу использовать $jr на $s0, но япотребуется изменить адрес $s0.

Как я могу подойти к этой проблеме?

1 Ответ

0 голосов
/ 16 февраля 2019

Я хочу разработать псевдоинструкцию в 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
...