- •4. Модель прикладного программирования.
- •4.1. Стек регистров
- •4.1.1. Управление стеком регистров
- •4.1.2. Инструкции стека регистров
- •4.2. Инструкции целочисленного вычисления
- •4.2.1. Арифметические инструкции
- •4.2.2. Логические инструкции
- •4.2.3. 32-Битные адреса и целые
- •4.2.4. Инструкции битовых полей и сдвигов
- •4.2.5. Большие константы.
- •4.3. Инструкции сравнения и предикация
- •4.3.1. Предикация
- •4.3.2. Инструкции сравнения
- •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соответственно увеличивается.