- •4. Модель прикладного программирования.
- •4.1. Стек регистров
- •4.1.1. Управление стеком регистров
- •4.1.2. Инструкции стека регистров
- •4.2. Инструкции целочисленного вычисления
- •4.2.1. Арифметические инструкции
- •4.2.2. Логические инструкции
- •4.2.4. Инструкции битовых полей и сдвигов
- •4.3. Инструкции сравнения и предикация
- •4.3.1. Предикация
- •4.3.2. Инструкции сравнения
- •4.2.5. Большие константы.
- •4.3.3. Типы сравнения
- •4.3.4. Передачи предикатных регистров
- •4.4. Инструкции доступа к памяти
- •4.4.1. Инструкции загрузки
- •4.4.2. Инструкции сохранения
- •4.4.3. Семафорные инструкции
- •4.4.4. Спекуляция по управлению
- •4.4.4.1. Концепции спекуляции по управлению
- •4.4.4.2. Спекуляция по управлению и инструкции
- •4.4.4.3. Спекулятивность по управлению и сравнения
- •4.4.4.4. Спекуляция по управлению без восстановления
- •4.4.4.5. Контроль операционной системы над откладыванием исключений
- •4.4.4.6. Сливание и заливание регистров
- •4.15. Инструкции, связанные со спекуляцией по управлению
- •4.4.5. Спекуляция по данным
- •4.4.5.1. Концепция спекуляции по данным
- •4.4.5.2. Спекуляция по данным и инструкции
- •4.4.5.3. Детализирование функциональности структуры alat и инструкции связанные с этим.
- •4.4.5.3.1. Выделение и проверка элементов alat
- •4.4.5.3.2. Аннулирование элементов alat.
- •4.4.5.4. Комбинирование спекуляций по управлению и по данным
- •4.4.5.5. Окончания инструкций для управления alat
- •4.4.6. Управление иерархией памяти и непротиворечивость
- •4.4.6.1 Иерархия памяти и подсказки
- •4.4.6.2. Согласованность памяти
- •4.4.7. Упорядочивание доступа к памяти
- •4.5. Инструкции переходов
- •4.5.1. Поддержка модульно планируемых циклов.
- •4.5.2. Подсказки предсказаний переходов.
- •4.5.3. Инструкции предсказания переходов
- •4.6. Инструкции мультимедиа.
- •4.6.1. Параллельная арифметика
- •4.6.2. Параллельные сдвиги
- •4.6.3. Преобразование данных
- •4.7. Пересылки регистрового файла
- •4.8. Символьные строки и подсчет совокупности
- •4.8.1. Символьные строки
- •4.8.2. Подсчет совокупности
- •4.9. Передача уровня привилегий
4.5.1. Поддержка модульно планируемых циклов.
Поддержка программной конвейерной обработки циклов обеспечивается с помощью ротации регистров и специальных типов циклических переходов. Программная конвейерная обработка циклов организована аналогично аппаратной конвейерной обработке функционального устройства. Тело цикла разделено на несколько стадий, а в каждой стадии может быть несколько инструкций или не быть ни одной. Модульно планируемые циклы имеют три фазы: пролог, ядро и эпилог. В течение фазы пролога, при каждом проходе, запускаются новые циклические итерации (заполнение программного конвейера). В течение фазы ядра конвейер полон. Новая итерация начинается, а другая завершается при каждом проходе. В течение фазы эпилога, не начинается никаких новых итераций, а предыдущие итерации завершаются (освобождение программного конвейера).
Предикат назначается для каждой стадии, для управления активацией инструкций на этой стадии (этот предикат называется «предикат стадии»). Для поддержки конвейерного эффекта для предикатов и регистров в стадии программного конвейерного цикла, задаются для ротации, области фиксированного размера предикатных регистров (PR16-PR63) и регистров с плавающей точкой (FR32-FR127), а также область программируемого размера из файла основных регистров. Размер ротационной области в файле основных регистров задается непосредственно в инструкции alloc. Это непосредственное значение должно быть нулевым, либо кратным 8. Область ротации основных регистров определена так, что она начинается от GR32 и накладывается на локальную и выходную области, в зависимости от их относительных размеров. Предикаты стадии располагаются в ротационной области файла предикатных регистров. Для счетных циклов, PR16 архитектурно определен как предикат первой стадии, а предикаты последующих стадий распространяются в предикатные регистры с большими номерами. Для while-циклов предикат первой стадии может быть любым ротационным предикатом, предикаты последующих стадий распространяются в предикатные регистры с большими номерами. Программное обеспечение должно инициализировать ротационные предикаты стадий до входа в цикл. Инструкция alloc не может изменять размер ротационной части окна стека регистров, если не все базы ротационных регистров (rrb) в CFM являются нулями. Все поля rrb могут быть обнулены с помощью инструкции clrrrb. Форма clrrrb.pr может использоваться для очистки только rrb для предикатных регистров. Инструкция clrrrb должна быть последней в группе инструкций.
Регистры ротируются в сторону больших номеров, образуя замкнутое кольцо. Например, значение в регистре Х после одной ротации будет помещено в регистр Х+1. Если Х – самый последний доступный ротационный регистр, то его значение будет перенесено в самый первый доступный ротационный регистр. Ротация осуществляется путем переименования номеров регистров на основании значения базы ротации регистров (rrb) содержащейся в CFM. Для каждого из трех файлов ротационных регистров задаются rrb независимо: для основных регистров – rrb.gr, для регистров с плавающей точкой – rrb.fr, а для предикатных регистров – rrb.pr. Основные регистры ротируются только тогда, когда размер области ротации не равен нулю. Регистры с плавающей точкой и предикатные регистры ротируются всегда. Когда происходит ротация, то два или все три rrb синхронно декрементируются. Каждое поле rrb декрементируется модульно, в соответствии с размерами ротационных областей (например, 96 для rrb.fr). В остальном, работа механизма переименования ротационных регистров не видима для программы. Список инструкций модифицирующих rrb дан в табл.4.25.
Табл.4.25. Инструкции, модифицирующие поля rrb
Мнемоника |
Действие |
clrrrb |
Очищает все rrb |
clrrrb.pr |
Очищает rrb.pr |
br.call, brl.call |
Очищает все rrb |
cover |
Очищает все rrb |
br.ret |
Восстанавливает CFM.rrb из PFM.rrb |
rfi |
Восстанавливает CFM.rrb из IFM.rrb, если IFM.v==1 |
br.ctop, br.cexit, br.wtop, br.wexit |
Декрементирует все rrb |
Есть две категории переходов в программных конвейерных циклах: счетный и типа while. Обе категории имеют по две формы top и exit. Вариант “top” используется тогда, когда условие выхода из цикла расположено ниже тела цикла. Принятый переход продолжит цикл, а не принятый переход приведет к выходу из цикла. Вариант “exit” используется тогда, когда условие выхода из цикла расположено не в подножии цикла, а где-то в другом месте. Здесь, не принятый переход приведет к продолжению цикла, а принятый переход приведет к выходу из цикла. Кроме того, вариант “exit” используется для промежуточных точек в развернутом конвейерном цикле.
Условие перехода в переходе счетного цикла задается указанием типа счетного цикла (ctop или cexit), значением прикладного регистра счетчика цикла (LC) и значением прикладного регистра счетчика эпилогов (EC). Заметим, что переходы счетных циклов не используют вычисление предикатов. Регистр LC инициализируется значением на единицу меньшим, чем количество итераций счетного цикла, а EC инициализируется числом стадий, на которые делится тело цикла. Пока LC будет больше нуля, направление перехода будет продолжать цикл, LC будет декрементироваться, регистры будут ротироваться (поля rrb - декрементируются), а PR16 будет устанавливаться в 1 после ротирования. (При каждом циклическом переходе, в PR63 было некое значение, а после ротации это значение окажется в PR16).
Выполнение перехода счетного цикла при LC равном нулю сигнализирует о начале эпилога. Пока выполняется эпилог и пока EC больше 1, направление перехода будет продолжать цикл, EC будет декрементироваться, регистры будут ротироваться, а после ротации PR16 будет устанавливаться в 0. Выполнение перехода счетного цикла при LC равном нулю и EC равном единице сигнализирует об окончании цикла; направление перехода будет на выход из цикла, EC будет декрементироваться, регистры будут ротироваться, а после ротации PR16 будет установлен в 0. Если при выполнении перехода счетного цикла, и LC равно 0, и EC равно 0, то направление перехода будет на выход из цикла. LC, EC и все поля rrb не будут изменяться (нет ротации), а PR63 будет установлен в 0. LC и EC могут оказаться равными нулю при некоторых типах оптимизации, разворачивания программных конвейерных циклов, если адресат перехода cexit установлен на следующую последовательную связку инструкций, а счетчик прохода циклов (trip) не является равномерно повторяющимся в процессе развертки.
Направление циклического перехода типа while задается указанием типа цикла while (wtop или wexit), значением вычисленного предиката и значением EC. Циклические переходы типа while не используют LC. Пока вычисленный предикат равен 1, направление перехода будет продолжать цикл, регистры будут ротироваться, а после ротации PR16 будет устанавливаться в 0. Пока вычисленный предикат равен 0 и пока EC больше 1, направление перехода будет продолжать цикл, EC будет декрементироваться, регистры будут ротироваться, а после ротации PR16 будет устанавливаться в 0. Вычисленный предикат является единицей в течение стадии ядра и – нулем в течение стадии эпилога. В течение пролога вычисленный предикат может быть либо 0, либо 1, в зависимости от схемы используемой программой конвейеризации while-цикла. Выполнение перехода while-цикла со значением вычисленного предиката равным 0 и EC равном единице, сигнализирует об окончании цикла; направление перехода будет на выход из цикла, EC будет декрементироваться, регистры будут ротироваться, а после ротации PR16 будет установлен в 0. Если при выполнении перехода while-цикла со значением вычисленного предиката равным 0, и EC равно 0, то направление перехода будет на выход из цикла. EC и все поля rrb не будут изменяться (нет ротации), а PR63 будет установлен в 0.
Для while-циклов, инициализация EC зависит от схемы используемой программой конвейеризации while-цикла. Часто первое правильное условие для перехода while-цикла не вычисляется в течение нескольких стадий пролога. Поэтому программные конвейеры для while-циклов, часто имеют несколько спекулятивных стадий пролога. В течение этих стадий, вычисленный предикат может быть установлен в 0 или 1, в зависимости от схемы используемой в программе. Если вычисленный предикат равен единице в течение пролога, то EC будет декрементирован только в течение фазы эпилога и инициализируется в значение на единицу большее, чем количество стадий эпилога. Если вычисленный предикат равен нулю в течение спекулятивных стадий пролога, то EC будет декрементироваться в течение этих частей пролога, а инициализируемое для EC соответственно увеличивается.
