- •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.2. Внутреннее состояние rse
Табл. 6.1 описывает архитектурное состояние, поддерживаемое механизмом стека регистров. Описанные здесь элементы внутреннего состояния RSE, не предоставлены программисту прямо, как архитектурно видимые регистры. Следовательно, внутреннее состояниеRSEне нуждается в сохранении при переключениях контекста или прерываниях. Вместо этого, оно меняется как побочный эффект инструкций, связанных с регистровым стеком. Для описания эффектов этих инструкций, необходимо полное описание внутреннего состоянияRSE. Чтобы отличить их от архитектурно видимых ресурсов, все элементы внутреннего состоянияRSEимеют префикс «RSE». Другие ресурсы, связанные сRSE, являются архитектурно видимыми и представляются программному обеспечению, как прикладные регистрыRSC,BSP,BSPSTOREиRNAT.
Табл. 6.1. Внутреннее состояние RSE
|
Имя |
Описание |
Соответствует |
|
RSE.N_STACKED_PHYS |
Количество физических регистров в стеке (NumberofStackedPhysicalregister): размер файла физических стековых регистров зависит от реализации. |
|
|
RSE.BOF |
Номер регистра нижнего края окна (Bottom-of –frame register number): номер физического регистра GR32. |
AR[BSP] |
|
RSE.StoreReg |
Номер регистра сохранения RSE(RSEStoreRegisternumber): физический номер регистра, который будет следующим регистром сохраненнымRSE. |
AR[BSPSTORE] |
|
RSE.LoadReg |
Номер регистра загрузки RSE(RSELoadRegisternumber): физический номер регистра, на единицу больший, чем тот, который будет следующим регистром для загрузки (по модулю количества физических стековых регистров). |
RSE.BspLoad |
|
RSE.BspLoad |
Указатель вспомогательной памяти (BackingStorePointer) для загрузок памяти: 64-битный адрес вспомогательной памяти, на 8 байт больший, чем следующий адрес для загрузки механизмомRSE. |
RSE.BspLoad |
|
RSE.RNATBitIndex |
Индекс совокупности NaT битов RSE (RSE NaT Collection Bit Index): 6-битный указатель в регистре RNAT (определен, когда обновляется совокупность битов RNAT). |
AR[BSPSTORE] {8:3} |
|
RSE.CFLE |
Разрешение RSE для загрузки текущего окна (RSE Current Frame Load Enable): управляющий бит, который разрешает RSE загрузить регистры в текущее окно после br.ret или rfi. |
|
|
RSE.ndirty |
Количество грязных регистров (numberofdirtyregisters) в регистровом стеке. |
|
|
RSE.ndirty_words |
Количество грязных слов (numberofdirtywords) в регистровом стеке, плюс количество соответствующих регистровNaTсовокупности. |
AR[BSP] – AR[BSPSTORE] |
6.3. Разделы стека регистров
Файл физических регистров процессора обеспечивает, по крайней мере, 96 стековых регистров. Фактическое число стековых регистров (RSE.N_STACKED_PHYS) зависит от реализации и должно быть кратно 16. Рис. 6.3 иллюстрирует циклический характер файла физических регистров и показывает соответствие регистров и вспомогательной памяти. Рис. 6.3 показывает также четыре раздела файла стековых регистров:
Чистый(clean) раздел (светло-серый оттенок): регистры, которые содержат значения из окон родительской процедуры. Регистры в этом разделе были успешно слиты во вспомогательную память с помощьюRSE, и их содержимое не было изменено, с того момента, как они были записаны во вспомогательную память.
Грязный(dirty) раздел (просто серый оттенок): регистры, которые содержат значения из окон родительской процедуры. Регистры в этом разделе еще не были слиты во вспомогательную память с помощьюRSE. Количество регистров, содержащихся в грязном разделе (расстояние междуRSE.StoreRegиRSE.BOF) упоминается какRSE.ndirty.
Текущее(current) окно (темный оттенок): стековые регистры, выделенные для вычислений. Позиция текущего окна в файле физических стековых регистров определяется регистром нижнего края окна (RSE.BOF). Количество регистров в текущем окне определяется размером поля окна (CFM.sof) в маркере текущего окна.
Недействительный(invalid) раздел (диагональные полоски): регистры вне текущего окна, которые не содержат значений из окон родительских процедур. Они доступны для немедленного выделения в текущее окно, либо для операцийRSEзагрузки.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
invalid |
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Physical Stacked Registers | ||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RSE.LoadReg |
RSE.StoreReg |
|
|
RSE.BOF |
|
|
|
| |||||
|
|
|
|
|
|
|
|
|
|
|
C |
|
| ||
|
|
|
clean |
d |
C |
|
| ||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RSE load |
|
|
|
RSE store |
|
return, rfi |
call, cover |
return, rfi, alloc | ||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
H | |||
|
|
RSE. BspLoad |
AR[BSPSTORE] |
AR[BSP] |
|
|
|
| |||||||
|
|
|
|
|
|
|
|
| |||||||
|
Backing Store |
|
|
|
|
|
|
|
| ||||||
Рис. 6.3. Четыре раздела стека регистров.
Границы между четырьмя разделами стека регистров определяются маркером текущего окна (CFM) и тремя номерами физических регистров:StoreReg,LoadregиBOF. Как описано в табл. 6.1, каждый из этих номеров физических регистров имеет соответствующий 64-битный указатель вспомогательной памяти. (Например,AR[BSP] всегда содержит адрес, где будет запомненGR[32] текущего окна).
Рис. 6.3 показывает также, влияние различных инструкций на границы разделов. Загрузки RSEиспользуют недействительные регистры. АктивныеRSEзагрузки и сохранения расширяют чистый раздел. Инструкцииbr.call, brl.callилиcover, могут увеличить указатель нижнего края окна (RSE.BOF), который перемещает регистры из текущего окна в грязный раздел. Инструкцияalloc, может сжать или расширить текущее окно путем обновленияCFM.sof. Инструкцииbr.retиrfiмогут сжать или расширить текущее окно путем обновления и указателя нижнего края окна (RSE.BOF), иCFM.sof.








FM.
sof
irty
urrent









igher
Addresses