- •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, используемый переходом возврата».
