- •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.4. Работа rse
Вспомогательная память стека регистров организована как стек памяти, который расширяется от младших адресов к старшим адресам. Верхушка стека вспомогательной памяти задается прикладным регистром указателя вспомогательной памяти (BSP), который указывает на первое место памяти, зарезервированное для текущего окна. Загрузки и сохраненияRSE, проявляя активность в адресах ниже указателяBSP, меняют размеры чистого и грязного разделов. Хотя стек концептуально бесконечен в обоих направлениях, но ожидается, что эффективная база стека, будет первой областью памяти первой страницы, распределенной для вспомогательной памяти.
Для обеспечения наиболее полного параллельного выполнения, процессор и RSEработают не зависимо друг от друга в течение нормального выполнения программы. Механизм различаетпринудительные(mandatory) иактивные(eager) операции загрузки/сохранения. Принудительные операции загрузки/сохранения происходят в результате инструкцийalloc, flushrs, loadrs, br.ret илиrfi. Активные операции происходят, когда механизмRSEработает спекулятивно, опережая выполнение программы, и не известно, потребуется ли программе фактически сливание/заливание этого регистра.
Когда RSEработает в фоновом режиме, он запускает активныеRSEоперации сливания/заливания для расширения размера чистого раздела в обоих направлениях – путем уменьшения указателя загрузкиRSE, загружая значения из вспомогательной памяти в недействительные регистры (активнаяRSEзагрузка), а также путем сохранения грязных регистров во вспомогательной памяти и увеличения указателя сохраненияRSE(активноеRSEсохранение). Выделение достаточно большого окна (используяalloc) или выполнение инструкцииflushrs, может заставитьRSEприостановить выполнение программы, и запускать принудительныеRSEсохранения до тех пор, пока требуемое количество регистров не будет слито во вспомогательную память. Аналогично, инструкцииbr.retилиrfi, возвращающие к достаточно большому окну или выполнение инструкцииloadrs, может заставитьRSEприостановить выполнение программы, и запускать принудительныеRSEзагрузки до тех пор, пока требуемое количество регистров не будет восстановлено из вспомогательной памяти. МеханизмRSEработает в активном режиме и приостанавливает выполнение программы всякий раз, когда продвижение программы фактически требует, чтобы регистры были слиты или залиты.
Табл. 6.2 описывает инструкции RSEопераций и модификации состоянийRSE.
Табл. 6.2. Инструкции RSEопераций и модификация состояния
|
Инструкция | |||
Воздействует на состояние |
alloc r1=ar.psf, i,l,o,rA |
br.callA, brl.callA |
br.retA |
rfi, при CR[IFS].v=1 |
AR[BSP]{63:3} |
Не меняется |
AR[BSP]{63:3} + CFM.sol + (AR[BSP]{8:3} + CFM.sol)/63 |
AR[BSP]{63:3}- AR[PFS].pfm.sol- (62- AR[BSP]{8:3}+ AR[PFS].pfm.sol)/63 |
AR[BSP]{63:3}- CR[IFS].ifm.sof- (62-AR[BSP]{8:3}+ CR[IFS].ifm.sof)/63 |
AR[PFS] |
Не меняется |
AR[PFS].pfm=CFM AR[PFS].pec=AR[EC] AR[PFS].ppl=PSR.cpl |
Не меняется |
Не меняется |
GR[r1] |
AR[PFS] |
Нет |
Нет |
Нет |
CFM |
CFM.sof=i+l+o CFM.sol=i+l CFM.sor=r>>3 |
CFM.sof – = CFM.sol CFM.sol = 0 CFM.sor = 0 CFM.rrb.gr = 0 CFM.rrb.fr = 0 CFM.rrb.pr = 0 |
AR[PFS].pfm либоB CFM.sof = 0 CFM.sol = 0 CFM.sor = 0 CFM.rrb.gr = 0 CFM.rrb.fr = 0 CFM.rrb.pr = 0 |
CR[IFS].ifm |
Эти инструкции имеют неопределенное поведение в неполном окне. См. раздел 6.8 «Поведение RSEв неполном регистровом окне».
Обычные инструкции br.retвосстанавливаютCFMизAR[PFS].pfm. Однако, если инструкциейbr.retчитается плохое значениеPFS, то все поляCFMустанавливаются в ноль. См. раздел 6.5.5 «ПлохойPFS, используемый переходом возврата».