Сопроцессор использует шесть основных типов арифметических команд:
Fxxx | Первый операнд берется из верхушки стека (источник), второй - следующий элемент стека. Результат выполнения команды записывается в стек. |
Fxxx память | Источник берется из памяти, приемником является верхушка стека ST(0). Указатель стека ST не изменяется, команда действительна только для операндов с одинарной и двойной точностью. |
Fixxx память | Аналогично предыдущему типу команды, но операндами могут быть 16- или32-битовые целые числа. |
Fxxx ST, ST(i) | Для этого типа регистр ST(i) является источником, а ST(0) - верхушка стека - приемником. Указатель стека не изменяется. |
Fxxx ST(i), ST | Для этого типа регитр ST(0) является источником, а ST(i) - приемником. Указатель стека не изменяется. |
FxxxP ST(i), ST | Регистр ST(i) - приемник, регистр ST(0) - источник. После выполнения команды источник ST(0) извлекается из стека. |
Строка "xxx" может принимать следующие значения:
ADD Сложение
SUB Вычитание
SUBR Обратное вычитание, уменьшаемое и вычитаемое меняются местами
MUL Умножение
DIV Деление
DIVR Обратное деление, делимое и делитель меняются местами
Кроме основных арифметических команд имеются дополнительные арифметические команды:
FSQRT | Извлечение квадратного корня |
FSCALE | Масштабирование на степень числа 2 |
FPREM | Вычисление частичного остатка |
FRNDINT | Округление до целого |
FXTRACT | Выделение порядка числа и мантиссы |
FABS | Вычисление абсолютной величины числа |
FCHS | Изменение знака числа |
По команде FSQRT вычисленное значение квадратного корня записывается в верхушку стека ST(0).
Команда FSCALE изменяет порядок числа, находящегося в ST(0). По этой команде значение порядка числа ST(0) складывается с масштабным коэффициентом, который должен быть предварительно записан в ST(1). Действие этой команды можно представить следующей формулой:
ST(0) = ST(0) * 2n, где -215 <= n <= +215
В этой формуле n - это ST(1).
Команда FPREM вычисляет остаток от деления делимого ST(0) на делитель ST(1). Знак результата равен знаку ST(0), а сам результат получается в вершине стека ST(0).
Действие команды заключается в сдвигах и вычитания, аналогично "ручному" делению "в столбик". После выполнения команды флаг C2 регистра состояния может принимать следующие значения:
0 | остаток от деления, полученный в ST(0), меньше делителя ST(1), команда завершилась полностью; |
1 | ST(0) содержит частичный остаток, программа должна еще раз выполнить команду для получения точного значения остатка. |
Команда RNDINT округляет ST(0) в соответствии с содержимым поля RC управляющего регистра.
Команда FABS вычисляет абсолютное значение ST(0). Аналогично, команда FCHS изменяет знак ST(0) на противоположный.