- •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.15. Инструкции, связанные со спекуляцией по управлению
Мнемоника |
Действие |
ld.s, ldf.s, ldfp.s |
Спекулятивные загрузки GRиFR |
ld8.fill, ldf.fill |
Восстановить GRв наборе сNaT, восстановитьFR |
st8.spill, stf.spill |
Слить GRв наборе сNaT, слитьFR |
shk.s |
Проверить GRилиFRна маркер отложенного исключения |
tnat |
Проверить NaTбитыGRи установить предикат |
4.4.5. Спекуляция по данным
Также как управление спекулятивными загрузками и проверками позволяет компилятору планировать инструкции через управляющие зависимости, спекулятивная загрузка и проверка данных позволяет компилятору планировать инструкции через некоторые типы неоднозначных зависимостей данных. Эта секция детализирует модель использования и семантику спекуляции по данным, и связанные с ней инструкции.
4.4.5.1. Концепция спекуляции по данным
Как уже говорилось, существует неоднозначная зависимость памяти между сохранением (или любой другой операцией, которая может обновлять память) и загрузкой, когда не может быть статически определено, могли ли загрузка и сохранение обратиться к наложенным областям памяти. Для удобства, сохранение которое не может быть статически однозначным относительно специальной загрузки, считается неоднозначным относительно этой загрузки. В таких случаях компилятор не может изменить порядок, в котором инструкции загрузки и сохранения были первоначально определены в программе. Для преодоления этих ограничений планирования, имеется специальный тип инструкции загрузки называемый предварительной загрузкой, которая может быть запланирована для выполнения раньше, чем одно или более сохранений, являющихся неоднозначными относительно этой загрузки.
Также как в спекуляции по управлению, транслятор может делать спекулятивные операции, которые становятся зависимыми после предварительной загрузки, а позднее вставляет инструкцию проверки, которая определит – была ли спекуляция успешной или нет. Для спекуляции по данным, проверка может быть помещена в любое место, где первоначально могла быть запланирована спекулятивная загрузка не-данных,.
Таким образом, последовательность спекулятивных данных инструкций состоит из предварительной загрузки, нулевого или большего количества инструкций зависящих от значения этой загрузки и инструкции проверки. Это означает, что любая последовательность сохранений следующих за загрузкой, может быть преобразована в предварительную загрузку, за которой следует последовательность сохранений, а далее следует проверка. Решение выполнить такое преобразование сильно зависит от вероятности и стоимости восстановления при неудачной спекуляции по данным.
4.4.5.2. Спекуляция по данным и инструкции
Предварительная (advanced) загрузка возможна в нескольких формах: целочисленная (ld.a), с плавающей точкой (ldf.a) и парная с плавающей точкой (ldfp.a). Когда предварительная загрузка выполнена, то выделяется элемент (entry) в структуре называемойALAT(Advanced Load Address Table – таблица адресов предварительной загрузки). Позже, когда соответствующая инструкция проверки выполнена, присутствие элемента указывает на то, что спекуляция по данным прошла успешно, в противном случае – спекуляция не удачна и выполняется один из двух видов восстановления генерируемых компилятором:
Инструкции проверки загрузки ld.с, ldf.с, ldfp.cиспользуются для восстановления, когда только планирование инструкций перед сохранением, которое является неоднозначно связанным с предварительной загрузкой, сами являются предварительными загрузками. Проверка загрузки просматриваетALATи ищет элемент. Если находит, то спекуляция считается успешной; если в результате поиска элемент не найден, то спекуляция безуспешная и проверка загрузки перезагружает правильное значение из памяти. На рис.4.2. показано это преобразование.
До спекуляции |
После спекуляции по данным |
// другие инструкции st8 [r4]=f12 ld8 r6=[r8];; add r5=r6,r7;; st8 [r18]=r5 |
ld8.a r6=[r8];; //предварительная загрузка // другие инструкции st8 [r4]=f12 ld8.c.clr r6=[r8] //проверка загрузки add r5=r6,r7;; st8 [r18]=r5 |
Рис.4.2. Использование ld.cв восстановлении при спекуляции по данным
Проверка предварительной загрузки используется тогда, когда предварительная загрузка и несколько инструкций зависят от того, что загруженное значение планируется перед сохранением, которое является неоднозначно связанным с предварительной загрузкой. Проверка предварительной загрузки работает как спекулятивная проверка (chk.s) в том что, если спекуляция успешна, то продолжается естественное выполнение, а восстановление не нужно; если же спекуляция не успешна, тоchk.aсделает переход на код восстановления, сгенерированный компилятором. Код восстановления содержит инструкции, которые заново выполнят всю работу, которая зависела от спекулятивно загруженных данных оказавшихся неправильными в точке инструкции проверки. Как и при проверке загрузки, успех спекуляции по данным, устанавливается использованием проверки предварительной загрузки, которая просматриваетALATдля поиска элемента. Это преобразование показано на рис.4.3.
До спекуляции |
После спекуляции по данным |
// другие инструкции st8 [r4]=f12 ld8 r6=[r8];; add r5=r6,r7;; st8 [r18]=r5 |
ld8.a r6=[r8];; // другие инструкции add r5=r6,r7;; // другие инструкции st8 [r4]=f12 ld8.c.clr r6=[r8] back: st8 [r18]=r5
// где-то в другом месте программы recover: ld8 r6=[r8];; add r5=r6,r7;; br back |
Рис.4.3. Использование chk.aв восстановлении при спекуляции по данным
Код восстановления может использовать либо нормальную, либо предварительную загрузку для получения корректного значения ошибочной предварительной загрузки. Предварительная загрузка используется только тогда, когда она полезна для того, чтобы иметь элемент ALAT, заново полученный после ошибочной спекуляции. Последняя инструкция в коде восстановления должна быть переходом к инструкции следующей заchk.a.