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

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).