Чем аннулированная ветвь отличается от обычной?

StackOverflow https://stackoverflow.com/questions/604119

  •  03-07-2019
  •  | 
  •  

Вопрос

В частности, для сборки SPARC, чем аннулированные ветви отличаются от обычных ветвей?

Я всегда думал, что аннулирование инструкций перехода требуется, когда мне нужно заполнить интервал задержки nop для инструкций перехода.Однако я не думаю, что я прав в этой части, потому что вы можете заполнить nop, не аннулируя ветку.

Это было полезно?

Решение

Аннулированная команда перехода приводит к тому, что команда в слоте задержки - команда после перехода - игнорируется, если переход не выполнен.

Почему это должно быть важно?Потому что обычно инструкция после ветки выполняется, даже если ветка взята.Это связано с тем, что существует два программных счетчика: PC и NPC.PC, который указывает на выполняемую команду, обновляется до NPC, который равен PC + 4, в то же время, когда NPC обновляется до цели команды перехода.Таким образом, из-за времени наступления этих событий необходимо загрузить следующую инструкцию.Вместо того чтобы просто выбрасывать этот цикл, выгоднее использовать его, если мы можем.Затем мы бы просто сделали эту инструкцию частью цикла.

loop:   someOp                
        someOtherOp
        branch      loop      ;
        delayslotOp           ; will actually be executed, before someOp, after branch

Если мы не можем использовать слот команд после ветви, то мы вставляем туда nop и ничего не делаем в этом цикле.

Так зачем же тогда иметь разные инструкции с аннулированными и не аннулированными параметрами ветвления?Чтобы дать нам возможность выбора того, что происходит при выходе из цикла.Если мы сделали интервал задержки частью действия цикла, мы могли бы не захотеть, чтобы эта операция выполнялась при выходе из цикла.Поэтому мы бы добавили ",a" в конец инструкции перехода.

На этой странице есть несколько приятных примеров.

Другие советы

В соответствии с Руководство по архитектуре SPARC (версия 9):

3.2.3 Передача управления

[...]

Большинство инструкций по передаче управления задерживаются;то есть команда, непосредственно следующая за командой передачи управления в логической последовательности, отправляется до того, как завершится передача управления на целевой адрес.

[...]

Команда, следующая за командой отложенной передачи управления, называется a инструкция по задержке.Бит в инструкции с задержкой передачи управления (бит аннулирования) может привести к аннулированию инструкции с задержкой (то есть не иметь никакого эффекта), если переход не будет принят.

6.3.4 Инструкции по передаче управления (CTIS)

[...]

Примечание по программированию:Бит аннулирования увеличивает вероятность того, что компилятор сможет найти полезную инструкцию для заполнения интервала задержки после перехода, тем самым уменьшая количество инструкций, выполняемых программой.Например, бит аннулирования может использоваться для перемещения инструкции изнутри цикла, чтобы заполнить интервал задержки ветви, которая замыкает цикл.Аналогично, бит аннулирования может использоваться для перемещения команды из ветви “else" или “then” блока программы “ifthen- else” в слот задержки ветви, которая выбирает между ними.Поскольку предусмотрен полный набор условий, компилятор может упорядочить код (возможно, изменяя смысл условия на противоположный), так что команда либо из ветви “else“, либо из ветви ”then" может быть перемещена в слот задержки.

Следующий код показывает две ветви, в первой всегда выполняется команда задержки, во второй команда задержки аннулируется, если ветвь не принята:

cmp   %i3, %i0
ble   %icc, -0x5c
ld    [%l0 - 0x4], %i5  ; executed whether the branch is taken or not

...

cmp   %l1, 0x80
bl,a  %icc, +0x40
ld    [%fp + 0x7c7], %g2    ; annulled if the branch is not taken, executed otherwise
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top