
5.1.3.2. Особенности уровня команд UltraSparc II
Изначально система SPARC
имела 32-разрядную архитектуру, но
UltraSPARC - 64-разрядные машины.
Структура памяти UltraSPARC
II представляет собой
линейный массив
байтов. Это настолько большое число,
что в настоящее время реализовать такой
объем памяти невозможно. Современные
реализации имеют ограничения на объем
памяти, к которой они могут обращаться
(
байтов у UltraSPARC II).
Байты в слове нумеруются слева направо,
но этот порядок можно изменить на
противоположный, установив соответствующий
бит в регистре флагов.
В системе UltraSPARC II имеется две группы 64-битных регистров по 32 в каждой: регистры общего назначения и регистры с плавающей точкой. Регистры общего назначения называются R0-R31, но в некоторых контекстах имеют другие названия. Все они, кроме R0, могут считываться и записываться с помощью различных команд. Их использование частично оговаривается соглашениями, частично основано на их обработке аппаратурой. Отклоняться от этих функций без необходимости не рекомендуется:
R0 (другое название - G0) всегда содержит значение 0;
R1-R7 (G1-G7) содержат глобальные переменные;
R8-R13 (O0-O5) содержат выходные параметры вызываемой процедуры;
R14 (SP) - указатель стека;
R15 (O7) - временный регистр;
R16-R23 (L0-L7) содержат локальные переменные текущей процедуры;
R24-R29 (I0-I5) содержат входные параметры процедуры;
R30 (FP) - указатель текущего стекового фрейма;
R31 (I7) содержит адрес возврата из текущей процедуры.
В действительности процессор UltraSPARC II имеет более чем 32 РОН, но в каждый момент времени программе видны только 32 из них. Эта система регистровых окон предназначена для повышения эффективности вызова процедур. Основная ее идея - имитировать работу стека с помощью регистров. Существует несколько наборов регистров подобно нескольким фреймам в стеке. Специальный регистр CWP (Current Window Pointer) указывает на текущий набор РОН. Команда вызова процедуры скрывает старый набор регистров и путем изменения CWP предоставляет новый набор, который может использовать вызываемая процедура. Некоторые регистры переносятся из старого набора, меняя свои имена. Например, регистры R8-R15 старого набора становятся регистрами R24-R31 нового набора. Восемь глобальных регистров не меняются.
В отличие от памяти, которая виртуально бесконечна (по крайней мере, в отношении стеков), при многократном вложении вызовов процедур машина может исчерпать регистровые окна. В этом случае самый старый набор регистров сохраняется в памяти для освобождения нового набора. Соответственно после многократных выходов из процедур может понадобиться восстановление набора регистров из памяти. Отсюда следует, что система регистровых окон выгодна лишь при отсутствии глубоких вложений процедур.
Имеющиеся в системе UltraSPARC II регистры с плавающей точкой могут содержать 32-битные (одинарная точность) или 64-битные (двойная точность) значения. Возможно также использование пар этих регистров для поддержки 128-битных значений.
Архитектура UltraSPARC II - архитектура загрузки/сохранения. Единственные операции непосредственного обращения к памяти в ней - это команды LOAD (загрузка) и STORE (сохранение). Все операнды арифметических и логических команд берутся из регистров или предоставляются самой командой, и все результаты сохраняются в регистрах.