Реклама:

Все целочисленные команды пользовательского режима UltraSPARC III перечислены в табл. 5.10, при этом используются следующие обозначения:

SRC - регистр-источник;

DST - регистр-приемник;

R1 - регистр-источник;

S2 - источник (регистр или непосредственно данные);

ADDR - адрес памяти;

TRAP# - номер системного прерывания;

FCN - код функции;

MASK - тип операции;

CON - константа;

V - обозначение регистра;

СС - набор кодов условия;

R - регистр-приемник;

сс - условие;

г - LZ, LEZ, Z, NZ, GZ или GEZ.

В таблице не представлены команды с плавающей точкой, команды управления (например, команды управления кэш-памятью, команды перезагрузки системы), команды, включающие отличные от пользовательских адресные пространства, устаревшие команды. Набор команд удивительно мал. Оно и понятно, ведь UltraSPARC III - это RISC-процессор.

Структура команд LOAD и STORE очень проста. Эти команды имеют варианты для 1, 2, 4 и 8 байт. Если в 64-разрядный регистр загружается число размером меньше 64 бит, это число может быть либо расширено по знаку, либо дополнено нулями. Существуют команды для обоих вариантов.

Следующая группа команд предназначена для арифметических операций. Команды с буквами СС в названии устанавливают биты кода условия. В CISC-машинах большинство команд устанавливают коды условия, но в RISC-машине это нежелательно, поскольку ограничивает способность компилятора сортировать команды, чтобы минимизировать задержки.

Таблица 5.10. Основные команды процессора UltraSPARC III

Команда

Описание

Команды загрузки

 

LDSB ADDR, DST

Загрузка байта со знаком (8 бит)

intbl@tabl_body = LDUB ADDR, DST

Загрузка байта без знака (8 бит)

LDSH ADDR, DST

Загрузка полуслова со знаком (8 бит)

LDUH ADDR, DST

Загрузка полуслова без знака (16 бит)

LDSW ADDR, DST

Загрузка слова со знаком (32 бита)

LDUW ADDR, DST

Загрузка слова без знака (32 бита)

LDX ADDR, DST

Загрузка расширенного слова (64 бита)

Команды сохранения

 

STB SRC, ADDR

Сохранение байта (8 бит)

STH SRC, ADDR

Сохранение полуслова (16 бит)

STW SRC, ADDR

Сохранение слова (32 бита)

STX SRC, ADDR

Загружает расширенное слово (64 бита)

Арифметические команды

 

ADD R1, S2, DST

Сложение

ADDCC

Сложение и установка кода условия

ADDC

Сложение с переносом

ADDCCC

Сложение с переносом и установкой кода

 

условия

SUB R1, S2, DST

Вычитание

SUBCC

Вычитание с установкой кода условия

SUBC

Вычитание с переносом

SUBCCC

Вычитание с установкой кода переноса

MULXR1, S2, DST

Умножение

SDIVXR1, S2, DST

Деление с учетом знака

UDIVX R1, S2, DST

Деление без учета знака

TADCCR1,S2, DST

Сложение с использованием поля тега

Команды обычного и циклического сдвига

 

SLLR1, S2, DST

Логический сдвиг влево (32 бита)

SLLXR1, S2, DST

Логический сдвиг влево (64 бита)

SRLR1, S2, DST

Логический сдвиг вправо (32 бита)

SRLXR1, S2, DST

Логический сдвиг вправо (64 бита)

SRAR1, S2, DST

Арифметический сдвиг вправо (32 бита)

SRAXR1, S2, DST

Арифметический сдвиг вправо (64 бита)

Логические команды

 

AND R1, S2, DST

Логическое И

ANDCC R1, S2, DST

Логическое И с установкой кода условия

ANDN R1, S2, DST

Логическое НЕ-И

Команда

Описание

ANDNCC R1. S2, DST

Логическое НЕ-И с установкой кода условия

OR R1. S2, DST

Логическое ИЛИ

ORCC R1, S2, DST

Логическое ИЛИ с установкой кода условия

ORN R1, S2, DST

Логическое НЕ-ИЛИ

ORNCC R1, S2, DST

Логическое НЕ-ИЛИ с установкой кода

 

условия

XOR R1. S2, DST

Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ

XORCC R1, S2, DST

Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ

 

с установкой кода условия

XNOR R1, S2, DST

Логическое ИСКЛЮЧАЮЩЕЕ НЕ-ИЛИ

XNORCC

Логическое ИСКЛЮЧАЮЩЕЕ НЕ-ИЛИ

 

с установкой кода условия

Команды передачи управления

 

BPcc ADDR

Переход с прогнозированием ветвлений

BPr SRC, ADDR

Переход в регистр

CALL ADDR

Вызов процедуры

RETURN ADDR

Выход из процедуры

JMPL ADDR, DST

Переход со связыванием

SAVE R1, S2, DST

Расширение регистровых окон

RESTORE R1, S2. DST

Восстановление регистровых окон

Тсс CC, TRAP#

Системное прерывание при определенном

 

условии

PREFETCH FNC

Выборка данных из памяти с упреждением

LDSTUB ADDR, R

Атомарная операция загрузки/сохранения

MEMBAR MASK

Барьер в памяти

Прочие команды

 

SETHI CON, DST

Установка битов с 10-го по 13-й

MOVcc CC, S2, DST

Перемещение при определенном условии

MOVr, R1, S2, DST

Перемещение в зависимости от значения

 

регистра

NOP

Пустая операция

POPC S1, DST

Подсчет генеральной совокупности

RDCCR V, DST

Чтение регистра кода условия

WRCCR, R1, S2, V

Запись регистра кода условия

RDPC V, DST

Чтение счетчика команд

Если изначальный порядок следования команд А... В ... С, где А устанавливает коды условий, а В их проверяет, то компилятор не сможет вставить команду С между А и В, если тоже С устанавливает коды условий. По этой причине многие команды имеют два варианта, а компилятор обычно использует ту команду, которая не устанавливает коды условий, если не планируется проверить их позже.

Поддерживаются также команды умножения, деления с учетом знака и деления без учета знака.

Кроме того, поддерживается специальный формат 30-разрядных чисел с автоматическим опознаванием типа данных за счет поля тега. Этот формат используется для таких языков, как Smalltalk и Prolog, в которых тип переменных может меняться во время выполнения программы. При наличии таких чисел компилятор вставляет, например, команду ADD, а во время выполнения программы машина определяет, какая именно команда ADD нужна в данном случае, целочисленная или с плавающей точкой.

Группа команд сдвига включает одну команду сдвига влево и две команды сдвига вправо. Каждая из них имеет два варианта: 32- и 64-разрядный. Команды сдвига в основном используются для манипулирования битами. Большинство CISC-машин имеют довольно много разнообразных команд обычного и циклического сдвига, но практически все они совершенно бесполезны.

Логические команды аналогичны арифметическим. Эта группа включает команды AND (И), OR (ИЛИ), X0R (ИСКЛЮЧАЮЩЕЕ ИЛИ), ANDN (НЕ-И), 0RN (НЕ-ИЛИ) и XN0R (ИСКЛЮЧАЮЩЕЕ НЕ-ИЛИ). Полезность последних трех команд сомнительна, но они могут выполняться за один цикл и не требуют практически никакого дополнительного аппаратного обеспечения, а потому часто включаются в набор команд. Даже разработчики RISC-машин порой поддаются искушению.

Следующая группа содержит команды передачи управления. Символами ВРсс обозначена группа команд, которые совершают переходы в зависимости от различных условий, а также указывают компилятору, требуется или нет прогнозирование ветвлений. Команды ВРг проверяют регистры и совершают переход, если условие подтверждается.

Предусмотрено два способа вызова процедур. Для команды CALL используется вариант 4 формата с 30-разрядным смещением (см. рис. 5.11). Этого значения достаточно для того, чтобы добраться до любой команды в пределах 2 Гбайт от вызывающего оператора в любом направлении. Команда CALL копирует адрес возврата в регистр R15, который после вызова превращается в регистр R31.

Второй способ вызова процедуры - использование команды JMPL в варианте 1а или lb формата (см. рис. 5.11). Эта команда позволяет помещать адрес возврата в любой регистр. Такая форма может быть полезной в том случае, если целевой адрес вычисляется в ходе выполнения программы.

Команды SAVE и RESTORE манипулируют регистровым окном и указателем стека. Обе команды совершают прерывание, если следующее (предыдущее) окно недоступно.

В последней группе содержатся команды, не попавшие ни в одну из других групп. Команда SETHI введена из-за невозможности поместить 32-разрядный непосредственный операнд в регистр. Команда SETHI устанавливает биты с 10-го по 31-й, а затем следующая команда передает оставшиеся биты, используя непосредственный формат.

Команда РОРС подсчитывает число установленных (единичных) битов в слове. Последние три команды предназначены для чтения и записи специальных регистров.

Ряд широко распространенных CISC-команд, не представленных в табл. 5.10, можно легко смоделировать, использовав либо регистр GO, либо операнд-константу (см. вариант lb формата на рис. рис. 5.11). Некоторые из них перечислены в табл. 5.11. Эти команды распознаются ассемблером UltraSPARC III и часто вставляются в код компиляторами. При моделировании многих из них используется тот факт, что регистр GO связан с аппаратным нулем и запись в этот регистр не дает никакого эффекта.

Таблица 5.11. Некоторые моделируемые команды UltraSPARC III

Команда

Описание

MOV SRC, DST

Выполнение команды OR с операндами SRC и GO и сохранение

 

результата в DST

CMPSRC1, SRC2

Вычитание SRC2 из SRC1 (команда SUBCC) и сохранение результата в GO

TST SRC

Выполнение команды ORCC с операндами SRC и GO и сохранение

 

результата в GO

NOT DST

Выполнение команды XNOR с операндами DST и GO

NEG DST

Вычитание SRC2 из SRC1 (команда SUBCC) и сохранение результата в GO

INC DST

Прибавление 1 к DST (непосредственный операнд) - команда ADD

DEC DST

Вычитание 1 из DST (непосредственный операнд) - команда SUB

CLR DST

Выполнение команды OR с операндами GO и GO и сохранение

 

результата в DST

NOP

Выполнение команды SETHI с операндами GO и 0

RET

Выполнение команды JMPL % 17 + 8, %G0

Команды процессора Pentium 4 || Оглавление || Команды 8051