Project

General

Profile

R1 ISA » History » Version 2

« Previous - Version 2/3 (diff) - Next » - Current version
krufter_multiclet, 05/12/2015 12:06 PM


R1 ISA = Система команд (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