Чем аннулированная ветка отличается от обычной ветки? - PullRequest
3 голосов
/ 03 марта 2009

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

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

Ответы [ 2 ]

6 голосов
/ 08 марта 2009

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

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

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

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

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

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

2 голосов
/ 29 апреля 2013

Согласно Руководству по архитектуре SPARC (v9) :

3.2.3 Управление передачей

[...]

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

[...]

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

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

[...]

Примечание по программированию : Бит аннулирования увеличивает вероятность того, что Компилятор может найти полезную инструкцию для заполнения интервала задержки после ветвь, тем самым уменьшая количество инструкций, выполняемых программа. Например, бит аннулирования может использоваться для перемещения инструкции из цикла, чтобы заполнить интервал задержки закрывающей ветви петля. Аналогично, аннулирующий бит может использоваться для перемещения инструкции из ветви «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
...