Project

General

Profile

R1 ISA » History » Version 2

Version 1 (krufter_multiclet, 05/12/2015 12:06 PM) → Version 2/3 (krufter_multiclet, 05/12/2015 12:06 PM)

h1. R1 ISA
[[PageOutline]]

= Система команд (Instruction Set Architecture) =

== Формат кодирования команды ==

Формат AA размер 32 бит:
<pre>
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 -- код операции.
</pre>

Формат AV размер 64 бит.
Старшая часть имеет такую же структуру как и формата AA, младшие 32 бита -- значение поля V.

== Типы операции ==

Тип операции задается кодом в поле `TOP`.

Сводная таблица кодов типов.
<pre>
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
</pre>

=== Типы в ассемблере ===

Для резервирования памяти данных в ассемблере используются директивы резервирования памяти, используемые в сегменте данных (.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]).

<pre>
5 4 3 2 1 0
. . X X X X -- Номер регистра.
X X ---------- Тип регистра:
00 -- Регистр общего назначения.
01 -- Зарезервировано, не используется.
10 -- Регистр индексный.
11 -- Регистр управляющий.
</pre>

=== Регистры общего назначения ===

Используются в качестве сверхбыстрой памяти (Scratchpad memory).
Имеют размер 64 бита.

=== Регистры индексные ===

Имеют следующую логическую структуру:
<pre>
63 .. 48 47 .. 32 31 .. 0
. . . . . . XXXXXX -- База (Base).
. . . XXXXXXX ---------- Маска (Mask).
XXXXXXX ------------------- Индекс (Index).
</pre>

При записи значения в индексный регистр одновременно устанавливаются все части регистра.

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

При этом, после выполнения параграфа в котором существует инструкция, использующая индексный регистр происходит модификация значения индексного регистра по следующей формуле:

$$Index \gets (( Index \vee \neg Mask ) \oplus 1 ) \wedge Mask$$
$$Base \gets Base \oplus Index;$$

или на псевдо-Си:
<pre>
Index := (( Index | ~Mask ) + 1 ) & Mask
Base := Base + Index;
Операции сложения выполняются по модулю.
</pre>

Используются для определения смещения при индексном доступе к оперативной памяти.
В общем случае, для организации цикла используются два индексных регистра.
Один -- для вычисления количества итераций цикла, второй -- для вычисления смешения на каждом цикле итерации.
Шаг смещения, в простейшем случае, является степенью двойки (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 ||