Организация циклов. Ограничения при организации циклов. Циклы не по счетчику. Достоинства и недостатки аппаратной поддержки циклов

Циклы

Для организации циклов в ADSP-21000 используется команда DO … UNTIL. При выполнении этой команды программный секвенсор помещает адрес последней инструкции цикла и условие прерывания для выхода из цикла (обе компоненты определяются в инструкции DO…UNTIL) в стек адреса цикла, а адрес вершины цикла – в стек ПС.

Из-за конвейеризации процессор проверяет условие прерывания цикла (и если цикл основан на счетчике, декрементирует счетчик) перед концом цикла, чтобы следующая выборка либо возвращала к началу цикла, читая адрес с вершины стека ПС, либо переходила к инструкции, следующей за циклом, выталкивая при этом значения из стека цикла и стека ПС.

Инструкция безусловного перехода JUMP с параметром (LA) вызывает автоматическое прерывание цикла, если она находится в теле цикла (подобно команде break в языке C).

Стеки циклов

Стек адреса цикла разрядностью 32 бита имеет в глубину шесть уровней. Каждое слово в стеке адреса цикла содержит следующие поля:

Биты Содержание
0 – 23 адрес окончания цикла (адрес последней инструкции цикла)
24 – 28 код завершения
30 – 31 тип цикла: 00 – по условию 01 – по счётчику (длина цикла – 1 инструкция) 10 – по счётчику (длина цикла – 2 инструкции) 11 – по счётчику (длина цикла больше 2-х инструкций)

Регистр LADDR содержит вершину стека адреса цикла. Чтение и запись LADDR не изменяет содержимое стека. Когда стек адреса цикла пуст, LADDR содержит значение 0xFFFF FFFF.

Стек счётчика цикла имеет глубину 6 уровней 32-битных слов и работает синхронно со стеком адреса цикла. Это значит, что оба стека имеют одинаковое число занятых мест.

Программный секвенсор оперирует с двумя отдельными счётчиками цикла: текущим счётчиком CURLCNTR, который отсчитывает итерации для цикла, выполняемого в текущий момент, и содержит значение вершины стека счётчика цикла; и просто счётчиком LCNTR, который содержит значение перед тем, как цикл начнёт выполняться. Инструкция DO … UNTIL LCE (цикл по счётчику) проталкивает значение LCNTR в стек счетчика цикла, чтобы установить новые значения CURLCNTR. Предыдущее значение CURLCNTR сохраняется в стеке на одну позицию ниже. Если CURLCNTR = 0xFFFF FFFF, то стек цикла пуст.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: