Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M9 / Системная архитектура часть 6..doc
Скачиваний:
21
Добавлен:
16.04.2013
Размер:
270.85 Кб
Скачать

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

Не меняется

Не меняется

  1. Эти инструкции имеют неопределенное поведение с неполным окном. См. раздел 6.8 «Поведение RSEпри неполном регистровом окне».

  2. Вообще-то, реализация активного механизма 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).