Скачиваний:
58
Добавлен:
16.04.2013
Размер:
260.1 Кб
Скачать

5.4.2. Замечание об инициализации ротации предикатов

В этом разделе для инициализации ротации предикатов используется инструкция mov pr.rot = immed. Эта инструкция игнорирует значениеCFM.rrb.pr. Таким образом, примеры в этой главе написаны в предположении, чтоCFM.rrb.prявляется всегда нулем до инициализации предикатных регистров, используяmov pr.rot = immed.

5.4.3. Переходы циклов с программной конвейерной обработкой

Специальные переходы циклов с программной конвейерной обработкой позволяют компилятору генерировать очень компактный код программных конвейерных циклов, с помощью поддержки ротации регистров и с помощью управления заполнением и опустошением программного конвейера в течение фаз пролога и эпилога. Вообще говоря, каждый раз, когда выполняется переход программного конвейерного цикла, имеют место следующие действия:

  1. Делается решение о том, продолжить ли выполнение ядерного цикла.

  2. р16устанавливается в значение для управления выполнением стадий программного конвейера (р63записан переходом, а после ротации это значение окажется вр16).

  3. Ротируются регистры (регистры rrbротируются).

  4. Прикладные регистры LC(счетчик цикла) иEC(счетчик эпилогов) выборочно декрементируются.

Имеется два типа переходов программных конвейерных циклов - счетный и типа while.

5.4.3.1. Переходы счетных циклов

На рис.5.1 показана блок-схема модульно планируемых переходов счетных циклов.

ctop,

cexit

LC?

==0

(epilog)

(специальные неразворачива-

(пролог, ядро)

0

>1

EC?

==0

емые циклы)

==1

LC --

LC = LC

LC = LC

LC = LC

EC=EC

EC --

EC --

EC = EC

PR[63]=1

PR[63]=0

PR[63]=0

PR[63]=0

RRB --

RRB --

RRB --

RRB=RRB

ctop: переход

ctop: проскок

cexit :проскок

cexit :переход

Рис. 5.1. Поток выполнения инструкций ctopиcexit.

В течение фаз пролога и ядра, решение продолжать выполнение ядерного цикла означает, что начата новая исходная итерация. Ротация регистров должна произойти так, чтобы новая исходная итерация не перезаписала регистры, которые используются другими исходными операциями, все еще находящимися в конвейере. Регистр р16устанавливается в 1 для разрешения стадий новых исходных итераций. РегистрLCдекрементируется для обновления счетчика переименования исходных итераций. РегистрECне изменяется.

В течение фазы эпилога, решение продолжать выполнение цикла означает, что программный конвейер еще не полностью опустошен и процесс выполнения исходных итераций должен быть продолжен. Ротация регистров должна продолжаться потому, что оставшиеся исходные итерации все еще записывают результаты, а потребители ожидают, что ротация произойдет. Теперь р16устанавливается в 0, поскольку больше нет новых исходных итераций и инструкций, соответственно не существующие исходные итерации должны быть заблокированы. РегистрECсодержит счетчик оставшихся стадий выполнения для последней исходной итерации и декрементируется в течение эпилога. Для большинства циклов, когда переход программного конвейерного цикла выполняется при ЕС равном 1, то это указывает на то, что конвейер пуст и делается решение о выходе из цикла. Специальный случай, когда переход программного конвейерного цикла выполняется при ЕС равном 0, может произойти в развернутом программном конвейерном цикле, если адресат инструкции переходаcexitустановлен на следующую последовательную связку.

Для счетных циклов, имеется два типа циклических переходов программной конвейерной обработки. Переход br.ctopпринимается, когда делается решение о продолжения ядерного цикла. Он используется там, где решение о продолжении цикла располагается внизу цикла. Переходbr.exitне принимается, когда делается решение о продолжения ядерного цикла. Он используется там, где решение о продолжении цикла располагается где угодно, но только не внизу цикла.