- •6. Механизм стека регистров (rse)
- •6.1. Обзор rsEи вспомогательной памяти
- •6.2. Внутреннее состояние rse
- •6.3. Разделы стека регистров
- •6.4. Работа rse
- •6.5. Управление rse
- •6.5.1. Регистр конфигурации стека регистров (rsc)
- •6.5.2. Регистр NaTсовокупности регистрового стека (rnat)
- •6.5.3. Прикладные регистры указатели вспомогательной памяти (bspstorEиBsp)
- •6.5.4. Инструкции управления rse
- •6.5.5 Плохой pfs, используемый переходом возврата
- •6.6. Прерывания rse
- •6.7. Поведение rsEпри прерываниях
- •6.8. Поведение rsEв неполном регистровом окне
- •6.9. Взаимодействие rsEиAlat
- •6.10. Когерентность вспомогательной памяти и упорядочивание памяти
- •6.11. Переключения внешней памяти rse
- •6.11.1 Переключение из прерванного контекста
- •6.11.2. Возврат в прерванный контекст
- •6.11.3. Синхронное переключение вспомогательной памяти.
- •6.12. Инициализация rse
6.5.4. Инструкции управления rse
Этот раздел описывает инструкции управления RSE:cover, flushrsиloadrs. Влияние трех управляющих инструкцийRSEна состояниеRSE, суммируется в табл. 6.5.
Инструкция coverдобавляет все регистры в текущем окне к грязному разделу, и выделяет текущее окно нулевого размера. В результате обновляетсяAR[BSP]. Инструкцияcoverочищает поля базы переименования регистров в маркере текущего окнаCFM. ЕслиPSR.ic=0, то первоначальное значениеCFMкопируется вCR[IFS].ifm, аCR[IFS].vустанавливается в 1. Инструкцияcoverдолжна задаваться как последняя инструкция в группе связок, иначе вызывается ошибка «Нелегальная операция».
Инструкция flushrsсливает все грязные регистры во вспомогательную память. Если она успешна, то устанавливаетсяRSE.ndirty=0 иBSPSTORE=BSP. Посколькуflushrsможет вызватьRSEсохранения, то прикладной регистрRNATизменяется. Инструкцияflushrsдолжна быть первой инструкцией в группе инструкций, иначе вызывается ошибка «Нелегальная операция».
Инструкция loadrsгарантирует, что указанная часть вспомогательной памяти, ниже текущегоBSP, присутствует в физических стековых регистрах. Размер секции вспомогательной памяти задается в полеloadrsприкладного регистраRSC(AR[RSC.loadrs]). При успешном завершенииloadrs, все регистры иNaTсовокупности, между текущим значениемBSPи точкой разрыва (tear-point) (BSP-(RSC.loadrs{13:3} << 3)), но не больше этого, гарантированно будут присутствовать и отмечаться как грязные в стековых физических регистрах. Когдаloadrsзавершена,BSPSTOREиRSE.BspLoadопределяются равными адресу точки разрыва вспомогательной памяти. Все другие физические стековые регистры помечаются как недействительные.
Если точка разрыва задает адрес ниже, чем RSE.BspLoad, тоRSEзапускает принудительные загрузки для регистров иNaTсовокупности. Все регистры между текущим BSP и точкой разрыва помечаются как недействительные.
Если RSEуже загрузил регистры выше точки разрыва, когда выполняется инструкцияloadrs, тоRSEпомечает чистые регистры ниже точки разрыва, как недействительные и помечает чистые регистры выше точки разрыва, как грязные.
Если точка разрыва задает адрес больший, чем BSPSTORE, тоRSEпомечает чистые и грязные регистры ниже точки разрыва, как недействительные (в этом случае грязные регистры теряются).
Табл. 6.5 Инструкции управления RSE
Воздействует на состояние |
Инструкция | ||
cover |
flushrsA |
loadrsA | |
AR[BSP]{63:3} |
AR[BSP]{63:3}+CFM.sof + (AR[BSP]{8:3}+CFM.sof)/63 |
Не меняется |
Не меняется |
AR[BSPSTORE]{63:3} |
Не меняется |
AR[BSP]{63:3} |
AR[BSP]{63:3} – AR[RSC].loadrs{13:3} |
RSE.BspLoad{63:3} |
Не меняется |
Зависит от моделиB |
AR[BSP]{63:3} – AR[RSC].loadrs{13:3} |
AR[RNAT] |
Не меняется |
Обновляется |
Не определено |
RSE.RNATBitIndex |
Не меняется |
AR[BSPSTORE]{63:3} |
AR[BSPSTORE]{63:3} |
CR[IFS] |
If (PSR.ic==0) { CR[IFS].ifm = CFM CR[IFS].v = 1 } |
Не меняется |
Не меняется |
CFM |
CFM.sof = 0, CFM.sol = 0 CFM.sor = 0, CFM.rrb.gr = 0 CFM.rrb.fr=0,CFM.rrb.pr = 0 |
Не меняется |
Не меняется |
Эти инструкции имеют неопределенное поведение с неполным окном. См. раздел 6.8 «Поведение RSEпри неполном регистровом окне».
Вообще-то, реализация активного механизма RSE, сохранитRSE.BspLoadв течение выполнения инструкцииflushrs. Реализация ленивого механизмаRSEможет установитьRSE.BspLoadв значениеAR[BSPSTORE] после успешного или ошибочного завершенияflushrs.
Путем установки нулевого значения для RSC.loadrs, инструкцияloadrsможет использоваться для аннулирования всех стековых регистров за пределами текущего окна. Инструкцияloadrsзаставит содержимое регистраRNATстать неопределенным. ИндексNaTсовокупности устанавливается в битах {8:3} нового значенияBSPSTORE. Инструкцияloadrsдолжна быть первой инструкцией в группе инструкций, в противном случае, результат не определен. Следующие условия заставят инструкциюloadrsвызвать ошибку «Нелегальная операция»:
Если RSC.modeне равно нулю.
Если, и CFM.sof, иRSC.loadrsне равны нулю.
Если RSC.loadrsзадает для загрузки больше слов, чем доступно в стековом файле физических регистров (RSE.N_STACKED_PHYS).