R1 ISA » History » Version 1
Version 1/3
-
Next » -
Current version
krufter_multiclet, 05/12/2015 12:06 PM
R1 ISA
PageOutline¶
= Система команд (Instruction Set Architecture) =
Формат кодирования командыФормат AA размер 32 бит:
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 . . . . . . . . . . . . . . . . . . . . . . . . . . X X X X X X -- F2 -- адрес в коммутаторе / номер регистра 2-ого операнда . . . . . . . . . . . . . . . . . . . . X X X X X X -------------------- F1 -- адрес в коммутаторе значения 1-ого операнда . . . . . . . . . . . . . . X X X X X X -------------------------------------- Резерв . . . . . . . . . . X X X X -------------------------------------------------------- TOP -- тип операции . . . . . . . . . X ------------------------------------------------------------------- Признак инструкции, завершающей параграф . . . . . . . . X------------------------------------------------------------------------ Признак чтения из памяти данных (0 — значение используется непосредственно, 1 - значение используется в качестве адреса памяти данных) . . . . . . . X -------------------------------------------------------------------------- Интерпретация значения поля F2 (0 — адрес в коммутаторе, 1 — номер регистра) . . . . . . X ----------------------------------------------------------------------------- Признак наличия поля V у команды (0 — нет, 1— есть) X X X X X X -------------------------------------------------------------------------------- COP -- код операции.
Формат AV размер 64 бит.
Старшая часть имеет такую же структуру как и формата AA, младшие 32 бита -- значение поля V.
Тип операции задается кодом в поле `TOP`.
Сводная таблица кодов типов.
0000 - Беззнаковый байт (Byte) 0001 - Беззнаковый short (Short) 0010 - Беззнаковый long (Long) 0011 - Беззнаковый quad (Quad) 0100 - Упакованный беззнаковый short (Pack short) 0101 - Упакованный знаковый short (Pack signed short) 0110 - Упакованный беззнаковый long (Pack long) 0111 - Упакованный знаковый long (Pack signed long) 1000 - Знаковый байт (Signed byte) 1001 - Знаковый short (Signed short) 1010 - Знаковый long (Signed long) 1011 - Знаковый quad (Signed quad) - не используется 1100 - Float 1101 - Double 1110 - Pack 1111 - Complex
=== Типы в ассемблере ===
Для резервирования памяти данных в ассемблере используются директивы резервирования памяти, используемые в сегменте данных (.data).
Соответствие размера резервируемой памяти директивами ассемблера коду типов операции архитектуры приведено в таблице ниже.
Необходимо понимать, что директивы резервирования памяти в сегменте данных ассемблера никак не связаны с кодом типа операции.
Соответствие определить можно, но одно от другого не зависит.
| '''Код типа''' | '''Директива''' | '''Размер в битах''' | ||||
| byte | .byte | 8b | ||||
| short | .short | 16b | ||||
| long | .long | 32b | ||||
| quad | .quad | 64b |
В ассемблере зависимость от кода типа данных появляется в мнемонике инструкции.
Мнемоника инструкции состоит из двух частей:
1. корня, соответствующего коду операции и
2. суффикса, соответствующего типу операции.
Операций системы команд будут представлены ниже, а мнемонику суффикса показывает следующая таблица:
| '''TOP''' | '''Беззнаковый''' | '''Знаковый''' | '''Примечание''' | |||||
| byte | b | sb | ||||||
| short | s | ss | ||||||
| long | l | sl | ||||||
| quad | q | sq | ||||||
| float | f | |||||||
| double | d | |||||||
| pack | p | |||||||
| comlex | c |
Процессор имеет следующие типы регистров:
- регистры общего назначения (РОН [GPR -- General Purpose Register]);
- регистры индексные (РИ [IR -- Index Register]);
- регистры управляющие (РУ [CR -- Control Register]).
5 4 3 2 1 0
. . X X X X -- Номер регистра.
X X ---------- Тип регистра:
00 -- Регистр общего назначения.
01 -- Зарезервировано, не используется.
10 -- Регистр индексный.
11 -- Регистр управляющий.
=== Регистры общего назначения ===
Используются в качестве сверхбыстрой памяти (Scratchpad memory).
Имеют размер 64 бита.
=== Регистры индексные ===
Имеют следующую логическую структуру:
63 .. 48 47 .. 32 31 .. 0 . . . . . . XXXXXX -- База (Base). . . . XXXXXXX ---------- Маска (Mask). XXXXXXX ------------------- Индекс (Index).
При записи значения в индексный регистр одновременно устанавливаются все части регистра.
При использовании индексного регистра в алгоритме операции участвует только значение базы -- младшие 32 бита, старшие 32 бита формируются в соответствии с правилами размножения знака для операций, работающими с знаковыми целочисленными типами, во всех остальных операциях сбрасываются в ноль.
При этом, после выполнения параграфа в котором существует инструкция, использующая индексный регистр происходит модификация значения индексного регистра по следующей формуле:
$$Index \gets (( Index \vee \neg Mask ) \oplus 1 ) \wedge Mask$$
$$Base \gets Base \oplus Index;$$
или на псевдо-Си:
Index := (( Index | ~Mask ) + 1 ) & Mask Base := Base + Index; Операции сложения выполняются по модулю.
Используются для определения смещения при индексном доступе к оперативной памяти.
В общем случае, для организации цикла используются два индексных регистра.
Один -- для вычисления количества итераций цикла, второй -- для вычисления смешения на каждом цикле итерации.
Шаг смещения, в простейшем случае, является степенью двойки (1,2,4,8,16,...).
=== Регистры управляющие ===
| '''Имя регистра''' | '''Номер''' | '''Права''' | '''Описание''' | |||||
| PSW | 00 | R/W | Регистр управления вычислительным процессом | |||||
| INTR | 01 | R/W | Регистр прерываний | |||||
| MSKR | 02 | R/W | Регистр маска прерываний | |||||
| ER | 03 | R | Регистр исключений | |||||
| IRETADDR | 04 | R | Регистр адреса возврата | |||||
| STVALR | 05 | R/W | Регистр периода системного таймера | |||||
| STCR | 06 | R/W | Регистр управления системным таймером | |||||
| IHOOKADDR | 07 | R/W | Регистр первичного обработчика прерываний | |||||
| INTNUMR | 08 | R | Регистр номера прерывания | |||||
| MODR | 09 | R/W | Регистр маски модификации индексных регистров |
Единицей адресации памяти данных является байт, размером 8 бит.
Адресация по всем блокам памяти данных сквозная.
При этом аппаратно чтение данных выравнено на 64 бита.
При вычитывании данных пересекающих границу выравнивания чтение выполняется в "два приема" (сказывается на быстродействии).
Многобайтные значения в памяти данных располагаются в порядке от старшего байта к младшему (little-endian).
Единицей адресации памяти команд является 64 бита.
Адресация памяти команд блочная.
С программной точки зрения значение метки одинаково во всех блоках.
Значения в блоке памяти команд располагаются в порядке от младшего байта к старшему (big-endian).
Таблица командБольшинство инструкций формируют результат, сохраняемый в коммутаторе.
Размер значения результата соответствует размеру коммутатора -- 64 бит.
| № бита | Флаг | Перевод | Описание | |||||||
| 64 | ZF (Zero Flag) | Флаг нуля | Результат нулевой. | |||||||
| 65 | OF (Overflow Flag) | Флаг переполнения | Потеря значащего бита. | |||||||
| 66 | CF (Carry/Inexact Flag) | Флаг переноса/Флаг потери точности результата в операциях с числами в формате плавающей точки старшего бита результата/При округлении результата произошла потеря значащих битов |
Операция произвела перенос из | |||||||
| 67 | SF (Sign Flag) | Флаг знака | Состояние старшего бита результата. |
Флаги могут иметь значение не для каждой операции.
В таблице команд приведены значения флагов, которые имеют значение.
Обозначения, используемые в таблице команд:
- Все числа представлены в двоичной системе;
- Рядом с двоичным значением кода операции в скобочках дано десятичное значение;
- Если число или цифра не используется то на ее знакоместе стоит знак '-';
- Если цифра в числе может принимать любое значение, на ее знакоместе стоит знак 'x';
- В колонке флаги результата (Result Flags) перечислены флаги которые вырабатывает инструкция или которые она сохраняет.
Т.е. эти флаги, как характеристики значения результата, имеют смысл.
- Примечания, помеченные символом '*' для не реализованных в аппаратуре типов приведены для общности.
=== Инструкции работы с памятью ===
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| rd | 100001 (33) | xx | 00xx | 000000 | xxxxxx | ZF SF | Считывается столько бит сколько определено размером типа. Старшие биты нули. | |||||||||
| xx | 1000 | 000000 | xxxxxx | ZF SF | Считываются 8 бит. 7 бит распространяется в старшие. | |||||||||||
| xx | 1001 | 000000 | xxxxxx | ZF SF | Считываются 16 бит. 15 бит распространяется в старшие. | |||||||||||
| xx | 1010 | 000000 | xxxxxx | ZF SF | Считывается 32 бита. 31 бит распространяется в старшие. | |||||||||||
| xx | 1011 | 000000 | xxxxxx | ZF SF | Считывается 64 бита. | |||||||||||
| xx | 1100 | 000000 | xxxxxx | ZF SF | Старшие биты результата расширяются нулем. | |||||||||||
| xx | 1101 | 000000 | xxxxxx | ZF SF | Старшие биты результата расширяются нулем. | |||||||||||
| xx | 11xx | 000000 | xxxxxx | ZF | Считывается 64 бита. | |||||||||||
| wr | 100010 (34) | xx | xxxx | xxxxxx | xxxxxx | -- -- -- -- | Записывается столько бит сколько определено размером типа. |
wr::
Поле F1 никогда не может быть равной нулю.
wr в отличии от большинства других команд НЕ возвращают значение операнда (оптимизация выполнения).
=== Инструкции работы с регистрами ===
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| exa | 000010 (02) | 01 | 0010 | 000000 | xxxxxx | ZF | Исполнительный адрес, сформированный индексным регистром. | |||||||||
| 11 | 0010 | 000000 | xxxxxx | ZF | Исполнительный адрес, сформированный индексным регистром с полем V. | |||||||||||
| get | 000011 (03) | xx | 00xx | 000000 | xxxxxx | ZF SF | Значение обрезается до размера типа. Старшие биты нули. | |||||||||
| xx | 10xx | 000000 | xxxxxx | ZF SF | Значение обрезается до размера типа. Распространение знакового бита типа. | |||||||||||
| xx | 1100 | 000000 | xxxxxx | ZF SF | Загрузка значения. Старшие биты нули. | |||||||||||
| xx | 11xx | 000000 | xxxxxx | ZF | Загрузка значения. | |||||||||||
| set | 000100 (04) | 00 | 0011 | xxxxxx | xxxxxx | -- -- -- -- | Пересылка значения коммутатора в регистр. | |||||||||
| 01 | 0011 | xxxxxx | xxxxxx | -- -- -- -- | Пересылка значения регистра в регистр. | |||||||||||
| 10 | 0010 | xxxxxx | 000000 | -- -- -- -- | Запись беззнаковой константы в регистр. Старшие биты нули. | |||||||||||
| 1010 | xxxxxx | 000000 | -- -- -- -- | Запись знаковой константы в регистр. Распространение знакового бита типа. |
exa::
В качестве операнда имеет смысл только индексный регистр.
set::
Интерпретация значения поля F1 отличается от интерпретации, используемой для других инструкций.
Значением поля F1 является индекс регистра в который записывается значение, сформированное при интерпретации значений поля F2 и/или V.
В отличии от большинства других команд НЕ возвращают значение операнда (оптимизация выполнения).
get::
Во всех случаях происходит преобразование типа и/или выставление флагов заново.
При формировании значения аргумента инструкция не обращается к памяти данных.
Формат команды с суффиксом 11 не имеет смысла, т.к. для этого используется exa.
Инструкцию можно использовать для преобразования размеров значения целочисленного типа.
Прочтение мнемокода инструкций:
| exa | EXecutive Address |
=== Арифметические инструкции ===
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| add | 000101 (05) | xx | x0xx | xxxxxx | xxxxxx | ZF SF CF OF | Сложение целочисленное. | |||||||||
| xx | 11xx | xxxxxx | xxxxxx | ZF SF OF | Сложение вещественное. | |||||||||||
| sub | 000110 (06) | xx | x0xx | xxxxxx | xxxxxx | ZF SF CF OF | Вычитание целочисленное. | |||||||||
| xx | 11xx | xxxxxx | xxxxxx | ZF SF OF | Вычитание вещественное. | |||||||||||
| mul | 000111 (07) | xx | x0xx | xxxxxx | xxxxxx | ZF SF CF==OF | Умножение целочисленное. | |||||||||
| xx | 11xx | xxxxxx | xxxxxx | ZF SF OF | Умножение вещественное. | |||||||||||
| adc | 001000 (08) | 00 | 00xx | xxxxxx | xxxxxx | ZF SF CF OF | Сложение с переносом. | |||||||||
| sbb | 001001 (09) | 00 | 00xx | xxxxxx | xxxxxx | ZF SF CF OF | Вычитание с заемом. | |||||||||
| insub | 001010 (10) | xx | x0xx | xxxxxx | xxxxxx | ZF SF CF OF | Обратное вычитание целочисленное. | |||||||||
| xx | 11xx | xxxxxx | xxxxxx | ZF SF OF | Обратное вычитание вещественное. | |||||||||||
| div | 001011 (11) | xx | 1100 | xxxxxx | xxxxxx | ZF SF OF | Деление вещественное. | |||||||||
| sqrt | 001100 (12) | xx | 1100 | 000000 | xxxxxx | ZF SF OF | Извлечение квадратного корня вещественное. | |||||||||
| max | 001101 (13) | xx | x0xx | xxxxxx | xxxxxx | ZF SF | Выбор наибольшего для целочисленных типов. | |||||||||
| xx | 110x | xxxxxx | xxxxxx | ZF SF OF | Выбор наибольшего для вещественного. | |||||||||||
| min | 001110 (14) | xx | x0xx | xxxxxx | xxxxxx | ZF SF | Выбор наименьшего для целочисленных типов. | |||||||||
| xx | 110x | xxxxxx | xxxxxx | ZF SF OF | Выбор наименьшего для вещественного. | |||||||||||
| abs | 001111 (15) | xx | 1000 | 000000 | xxxxxx | ZF OF | Абсолютное значение знакового байта. | |||||||||
| xx | 1010 | 000000 | xxxxxx | ZF OF | Абсолютное значение знакового слова. | |||||||||||
| xx | 110x | 000000 | xxxxxx | ZF | Абсолютное значение для вещественного. |
Пояснение:
- Арифметических операций для типов 0011 (unsigned quad), 1011 (quad) не существует.
- Для инструкций в формате AV значение поля V преобразуется к типу операции по правилам для инструкций set.
- Поле F1 не может быть нулем, если не оговорено особо.
Инструкции adc, sbb используют в качестве операндов арифметической операции значение '''второго''' аргумента и значение флага CF '''первого''' аргумента.
Значения флагов CF и OF вычисляются на разрядной сетке типа инструкции.
Например, флаг сдвига (CF) для байтного сложения выставляется при переносе единицы из 7-ого бита результата в 8-ой.
Для инструкции умножения mul если размер результата получился больше чем размер операнда выставляются оба влага CF и OF.
Прочтение мнемокода инструкций:| adc | ADdition with Carry Flag | |||
| sbb | !SuBtract with Barrow (Carry Flag) | |||
| insub | INversion SUBtract |
=== Логические и побитовые инструкции ===
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| or | 010000 (16) | xx | 0011 | xxxxxx | xxxxxx | ZF | Логическое сложение | |||||||||
| and | 010001 (17) | xx | 0011 | xxxxxx | xxxxxx | ZF | Логическое умножение | |||||||||
| xor | 010010 (18) | xx | 0011 | xxxxxx | xxxxxx | ZF | Сложение по mod2 | |||||||||
| not | 010011 (19) | xx | 0011 | 000000 | xxxxxx | ZF | Отрицание | |||||||||
| norm | 010100 (20) | xx | 10xx | 000000 | xxxxxx | ZF | Возвращает значение используемое при нормализации числа с фиксированной точкой. | |||||||||
| pack | 010101 (21) | xx | 0011 | xxxxxx | xxxxxx | ZF | ||||||||||
| patch | 010110 (22) | xx | 0011 | xxxxxx | xxxxxx | ZF | ||||||||||
| bsr | 010111 (23) | xx | 00xx | 000000 | xxxxxx | ZF | Сканирование битов назад | |||||||||
| sll, sal | 011000 (24) | xx | x0xx | xxxxxx | xxxxxx | ZF SF CF OF | Логический/арифметический сдвиг влево | |||||||||
| slr | 011001 (25) | xx | 00xx | xxxxxx | xxxxxx | ZF SF CF OF | Логический сдвиг вправо | |||||||||
| bsf | 011010 (26) | xx | 00xx | 000000 | xxxxxx | ZF | Сканирование битов вперёд | |||||||||
| sar | 011011 (27) | xx | 10xx | xxxxxx | xxxxxx | ZF SF CF OF | Арифметический сдвиг вправо | |||||||||
| rol | 011100 (28) | xx | 00xx | xxxxxx | xxxxxx | ZF SF CF OF | Циклический сдвиг влево | |||||||||
| ror | 011101 (29) | xx | 00xx | xxxxxx | xxxxxx | ZF SF CF OF | Циклический сдвиг вправо |
'''Примечание''':
COP формата '''011'''xxx зарезервирован для реализации инструкций сдвигов и переходов (см. ниже).
Пояснение:
- Инструкции or, and, xor, not реализованы для внутреннего представления (64 бита).
- Инструкции shl и sal реализованы одинаково, различие в знаковости типа операции можно пренебречь.
Все инструкции сдвига выставляют флаги CF и OF. (Далее используется: MSB - Most Significant Bit).
Флаг CF равен выдвигаемому биту.
Флаг OF определен если сдвиг на один разряд.
SLL, SAL, ROL, ROR::
OF <- 0 if (CF == MSB), т.е. два старших бита операнда были одинаковы.
OF <- 1 if (CF != MSB), т.е. два старших бита операнда были различны.
SAR::
OF <- 0
SLR::
OF <- MSB_первоначального_операнда
| sll | Shift Logical Left | |||
| slr | Shift Logical Right | |||
| sal | Shift Arithmetic Left | |||
| sar | Shift Arithmetic Right | |||
| rol | ROtate Left | |||
| ror | ROtate Right | |||
| bsr | Bit Scan Reverse | |||
| bsf | Bit Scan Forward |
=== Инструкции передачи управления ===
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | Условие перехода | Применимость | ||||||||||||
| jmp | 011110 (30) | xx | 0000 | 000000 | xxxxxx | -- -- -- -- | Безусловный | не значимо | ||||||||||||
| je | 011110 (30) | xx | 0001 | xxxxxx | xxxxxx | -- -- -- -- | `V1 V2` | ZF 1 | все | |||||||||||
| jne | 011110 (30) | xx | 0010 | xxxxxx | xxxxxx | -- -- -- -- | `V1 != V2` | ZF 0 | все | |||||||||||
| js | 011110 (30) | xx | 1000 | xxxxxx | xxxxxx | -- -- -- -- | SF 1 | не значимо | ||||||||||||
| jns | 011110 (30) | xx | 1001 | xxxxxx | xxxxxx | -- -- -- -- | SF 0 | не значимо | ||||||||||||
| jo | 011110 (30) | xx | 1010 | xxxxxx | xxxxxx | -- -- -- -- | OF 1 | не значимо | ||||||||||||
| jno | 011110 (30) | xx | 1011 | xxxxxx | xxxxxx | -- -- -- -- | OF 0 | не значимо | ||||||||||||
| jb, jc | 011110 (30) | xx | 0100 | xxxxxx | xxxxxx | -- -- -- -- | `U1 < U2` | CF 1 | без знака | |||||||||||
| jbe | 011110 (30) | xx | 0101 | xxxxxx | xxxxxx | -- -- -- -- | `U1 <= U2` | CF 1 or ZF 1 | без знака | |||||||||||
| ja | 011110 (30) | xx | 0110 | xxxxxx | xxxxxx | -- -- -- -- | `U1 > U2` | CF 0 and ZF 0 | без знака | |||||||||||
| jae, jnc | 011110 (30) | xx | 0111 | xxxxxx | xxxxxx | -- -- -- -- | `U1 >= U2` | CF == 0 | без знака | |||||||||||
| jl | 011110 (30) | xx | 1100 | xxxxxx | xxxxxx | -- -- -- -- | `S1 < S2` | SF != OF | со знаком | |||||||||||
| jle | 011110 (30) | xx | 1101 | xxxxxx | xxxxxx | -- -- -- -- | `S1 <= S2` | SF != OF or ZF 1 | со знаком | |||||||||||
| jg | 011110 (30) | xx | 1110 | xxxxxx | xxxxxx | -- -- -- -- | `S1 > S2` | SF OF and ZF 0 | со знаком | |||||||||||
| jge | 011110 (30) | xx | 1111 | xxxxxx | xxxxxx | -- -- -- -- | `S1 >= S2` | SF OF | со знаком |
Пояснение:
Все инструкции условного перехода в отличии от большинства других команд НЕ возвращают значение операнда (оптимизация выполнения).
Прочтение мнемокода инструкций:| je | Jump if Equal | |||
| jne | Jump if Not Equal | |||
| js | Jump if Signed | |||
| jns | Jump if Not Signed | |||
| jo | Jump if Overflow | |||
| jno | Jump if Not Overflow | |||
| jc | Jump if Carry | |||
| jnc | Jump if Not Carry | |||
| jb | Jump if Below | |||
| jbe | Jump if Below and Equal | |||
| ja | Jump if Above | |||
| jae | Jump if Above and Equal | |||
| jl | Jump if Less | |||
| jle | Jump if Less and Equal | |||
| jg | Jump if Greater | |||
| jge | Jump if Greater and Equal |
=== Инструкции выбора второго аргумента по условию ===
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | Условие перехода | Применимость | ||||||||||||
| se | 011111 (31) | xx | 0001 | xxxxxx | xxxxxx | ZF SF | `V1 V2` | ZF 1 | все | |||||||||||
| sne | 011111 (31) | xx | 0010 | xxxxxx | xxxxxx | ZF SF | `V1 != V2` | ZF 0 | все | |||||||||||
| ss | 011111 (31) | xx | 1000 | xxxxxx | xxxxxx | ZF SF | SF 1 | не значимо | ||||||||||||
| sns | 011111 (31) | xx | 1001 | xxxxxx | xxxxxx | ZF SF | SF 0 | не значимо | ||||||||||||
| so | 011111 (31) | xx | 1010 | xxxxxx | xxxxxx | ZF SF | OF 1 | не значимо | ||||||||||||
| sno | 011111 (31) | xx | 1011 | xxxxxx | xxxxxx | ZF SF | OF 0 | не значимо | ||||||||||||
| sb, sc | 011111 (31) | xx | 0100 | xxxxxx | xxxxxx | ZF SF | `U1 < U2` | CF 1 | без знака | |||||||||||
| sbe | 011111 (31) | xx | 0101 | xxxxxx | xxxxxx | ZF SF | `U1 <= U2` | CF 1 or ZF 1 | без знака | |||||||||||
| sa | 011111 (31) | xx | 0110 | xxxxxx | xxxxxx | ZF SF | `U1 > U2` | CF 0 and ZF 0 | без знака | |||||||||||
| sae, snc | 011111 (31) | xx | 0111 | xxxxxx | xxxxxx | ZF SF | `U1 >= U2` | CF == 0 | без знака | |||||||||||
| sl | 011111 (31) | xx | 1100 | xxxxxx | xxxxxx | ZF SF | `S1 < S2` | SF != OF | со знаком | |||||||||||
| sle | 011111 (31) | xx | 1101 | xxxxxx | xxxxxx | ZF SF | `S1 <= S2` | SF != OF or ZF 1 | со знаком | |||||||||||
| sg | 011111 (31) | xx | 1110 | xxxxxx | xxxxxx | ZF SF | `S1 > S2` | SF OF and ZF 0 | со знаком | |||||||||||
| sge | 011111 (31) | xx | 1111 | xxxxxx | xxxxxx | ZF SF | `S1 >= S2` | SF OF | со знаком |
| se | Send value to switchboard if Equal | |||
| sne | Send value to switchboard if Not Equal | |||
| ss | Send value to switchboard if Signed | |||
| sns | Send value to switchboard if Not Signed | |||
| so | Send value to switchboard if Overflow | |||
| sno | Send value to switchboard if Not Overflow | |||
| sc | Send value to switchboard if Carry | |||
| snc | Send value to switchboard if Not Carry | |||
| sb | Send value to switchboard if Below | |||
| sbe | Send value to switchboard if Below and Equal | |||
| sa | Send value to switchboard if Above | |||
| sae | Send value to switchboard if Above and Equal | |||
| sl | Send value to switchboard if Less | |||
| sle | Send value to switchboard if Less and Equal | |||
| sg | Send value to switchboard if Greater | |||
| sge | Send value to switchboard if Greater and Equal |
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| bc | 100000 (32) | xx | 00xx | xxxxxx | xxxxxx | ZF | Вычислениe числа единичных битов в аргументе |
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| fcpy | 100011 (35) | xx | 0011 | xxxxxx | xxxxxx | ZF SF OF CF | Копирование флагов первого аргумента во второй |
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| ib | 100100 (36) | xx | х000 | xxxxxx | xxxxxx | ZF SF OF CF |
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| cb | 100101 (37) | xx | х000 | xxxxxx | xxxxxx |
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| cbs | 100110 (38) | xx | х000 | xxxxxx | xxxxxx |
=== Инструкции выбора первого или второго аргумента по условию ===
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | Условие перехода | Применимость | ||||||||||||
| me | 100111 (39) | xx | 0001 | xxxxxx | xxxxxx | ZF SF | `V1 V2` | ZF 1 | все | |||||||||||
| mne | 100111 (39) | xx | 0010 | xxxxxx | xxxxxx | ZF SF | `V1 != V2` | ZF 0 | все | |||||||||||
| ms | 100111 (39) | xx | 1000 | xxxxxx | xxxxxx | ZF SF | SF 1 | не значимо | ||||||||||||
| mns | 100111 (39) | xx | 1001 | xxxxxx | xxxxxx | ZF SF | SF 0 | не значимо | ||||||||||||
| mo | 100111 (39) | xx | 1010 | xxxxxx | xxxxxx | ZF SF | OF 1 | не значимо | ||||||||||||
| mno | 100111 (39) | xx | 1011 | xxxxxx | xxxxxx | ZF SF | OF 0 | не значимо | ||||||||||||
| mb | 100111 (39) | xx | 0100 | xxxxxx | xxxxxx | ZF SF | `U1 < U2` | CF 1 | без знака | |||||||||||
| mbe | 100111 (39) | xx | 0101 | xxxxxx | xxxxxx | ZF SF | `U1 <= U2` | CF 1 or ZF 1 | без знака | |||||||||||
| ma | 100111 (39) | xx | 0110 | xxxxxx | xxxxxx | ZF SF | `U1 > U2` | CF 0 and ZF 0 | без знака | |||||||||||
| mae | 100111 (39) | xx | 0111 | xxxxxx | xxxxxx | ZF SF | `U1 >= U2` | CF == 0 | без знака | |||||||||||
| ml | 100111 (39) | xx | 1100 | xxxxxx | xxxxxx | ZF SF | `S1 < S2` | SF != OF | со знаком | |||||||||||
| mle | 100111 (39) | xx | 1101 | xxxxxx | xxxxxx | ZF SF | `S1 <= S2` | SF != OF or ZF 1 | со знаком | |||||||||||
| mg | 100111 (39) | xx | 1110 | xxxxxx | xxxxxx | ZF SF | `S1 > S2` | SF OF and ZF 0 | со знаком | |||||||||||
| mge | 100111 (39) | xx | 1111 | xxxxxx | xxxxxx | ZF SF | `S1 >= S2` | SF OF | со знаком |
| me | Move argument to switchboard if Equal | |||
| mne | Move argument to switchboard if Not Equal | |||
| ms | Move argument to switchboard if Signed | |||
| mns | Move argument to switchboard if Not Signed | |||
| mo | Move argument to switchboard if Overflow | |||
| mno | Move argument to switchboard if Not Overflow | |||
| smb | Move argument to switchboard if Below | |||
| mbe | Move argument to switchboard if Below and Equal | |||
| ma | Move argument to switchboard if Above | |||
| mae | Move argument to switchboard if Above and Equal | |||
| ml | Move argument to switchboard if Less | |||
| mle | Move argument to switchboard if Less and Equal | |||
| mg | Move argument to switchboard if Greater | |||
| mge | Move argument to switchboard if Greater and Equal |
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| move | 101000 (40) | xx | 0011 | xxxxxx | xxxxxx | SF CF OF ZF | Сохраняются флаги аргумента |
=== Инструкции преобразования типов ===
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| cdf | 110111 (55) | xx | 1100 | 000000 | xxxxxx | ZF SF OF | Преобразование double -> float | |||||||||
| clf | 111000 (56) | xx | 1100 | 000000 | xxxxxx | ZF OF | Преобразование long -> float | |||||||||
| cfd | 111001 (57) | xx | 1100 | 000000 | xxxxxx | ZF SF OF | Преобразование float -> double | |||||||||
| cslf | 111010 (58) | xx | 1100 | 000000 | xxxxxx | ZF SF OF | Преобразование signed long -> float | |||||||||
| cfsl | 111011 (59) | xx | 1010 | 000000 | xxxxxx | ZF SF OF | Преобразование float -> signed long |
Значения флагов CF, OF необходимо уточнить по признакам, выставляемым алгоритмом преобразования.
Прочтение мнемокода инструкций:| cdf | Convert Double to Float | |||
| clf | Convert Long to Float | |||
| cfd | Convert Float to Double | |||
| cslf | Convert Signed Long to Float | |||
| cfsl | Convert Float to Signed Long |
=== Мультимедийные инструкции (MMC !MultiMedia Command) ===
Мультимедийные команды выполняются над упакованными значениями.
В данной группе команд TOP может не совпадать с типом результата.
| COP | Suffix | TOP | F1 | F2 | Result Flags | Примечание | ||||||||||
| madd | 110001 (49) | xx | 1110 | xxxxxx | xxxxxx | ZF SF OF | Упакованное умножение со сложением. |
'''madd'''::
Для двух упакованных чисел [a,b] [c,d] выполняет операцию: r = a*c + b*d.
Флаги выставляются аналогично инструкции add с типом float.
Прочтение мнемокода инструкций:
| madd | packed Multiply and ADD |