Skip to content

Математический сопроцессор. Классификация команд

Ivan Bogatyrev edited this page Jun 12, 2023 · 1 revision

Математический сопроцессор. Классификация команд

Виды команд

  1. Пересылки данных
  2. Базовая арифметика
  3. Сравнения
  4. Трансцендентные операции
  5. Константы
  6. Управление
  7. CPUID

Команды пересылки данных

Команды взаимодействия со стеком (загрузка-выгрузка вещественного числа, целого, BCD)

  • FLD - загрузить вещественное число из источника (переменная или ST(n)) в стек. Номер вершины в SR увеличивается
  • FST/FSTP - скопировать/считать число с вершины стека в приемник
  • FILD - преобразовать целое число из источника в вещественное и загрузить в стек
  • FIST/FISTP - преобразовать вершину в целое и скопировать/считать в приемник
  • FBLD/FBSTP - загрузить/считать десятичное BCD-число
  • FXCH - обменять местами 2 регистра (вершину и источник) стека

Базовая арифметика FPU

Есть аналоги вычитания, деления обратных команд, когда делится второй аргумент на первый. TODO

  • FADD, FADDP, FIADD- сложение, сложение с выдавливанием из стека, сложение целых. Один из операндов - вершина стека.
  • FSUB, FSUBP, FISUB - вычитание, аналогично сложению.
  • FSUBR, FSUBRP, FISUBR- обратное вычитание (приемник из источника)
  • FMUL ... - умножение
  • FDIV ... - деление
  • FDIVR ... - обратное деление
  • FPREM - найти частичный остаток от деления (делится ST(0) на ST(1)). Остаток ищется цепочкой вычитаний, до 64 раз.
  • FABS - модуль
  • FCHS - изменить знак
  • FRNDINT - округлить до целого
  • FSCALE - масштабировать по степени двойки (ST(0) * 2ST(1))
  • FXTRACT - извлечь мантиссу и экспоненту. ST(0) разделяется на мантиссу и экспоненту, мантисса дописывается на вершину стека.
  • FSQRT - квадратный корень ST(0)

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

По результатам команд сопроцессора могут выставляться как основные флаги процессора, так и дополнительные в регистре SR.

FCOMP, FCOMPP выталкивают одно или сразу 2 числа с вершины стека. Сравниваем 2 числа на вершине стека между собой - можем их там оставить или извлечь.

  • FCOM, FCOMP, FCOMPP - сравнить и вытолкнуть из стека
  • FUCOM, FUCOMP, FUCOMPP - сравнить, без учета порядков и вытолкнуть
  • FICOM, FICOMP, FICOMPP - сравнить целые
  • FCOMI, FCOMIP, FUCOMI, FUCOMIP - появились в pentium.
  • FTST - сравнение с нулем.
  • FXAM - выставить флаги в соответствии с типом числа.

Трансцендентные операции FPU

К подобным операциям относится вычисление синуса, косинуса и т.п.

Операндом обычно выступает значение в радианах, при этом не во всем диапазоне (нельзя давать слишком большие углы).

  • FSIN
  • FCOS
  • FSINCOS - вычислить синус и косинус одновременно
  • FPTAN - вычислить тангенс
  • FPATAN - вычислить арктангенс
  • F2XM1 - вычислить 2^x - 1
  • FYL2X - вычислить y * log2(x)
  • FYL2XP1 - вычислить y * log2(x + 1)

Константы FPU

Загрузка констант на вершину стека

  • FLD1 - загрузить 1
  • FLDZ - загрузить 0
  • FLDPI - загрузить PI
  • FLDL2E - загрузить log2(e)
  • FLDL2T - загрузить log2(10)
  • FLDLG2 - загрузить lg(2)
  • FLDLN2 - загрузить ln(2)

Управление FPU

Предусмотрены команды прямого изменения указателя вершины стека, сохранения/изменения состояние сопроцессора. По-хорошему, FINIT должна вызываться первой, при желании поработать с сопроцессором (она очистит все регистры от данных, пометив их пустыми, регистры CR и SR - значениям по умолчанию). FSAVE и FRSTOR сохраняет 94 или 108 байт в зависимости о разрядности машины.

  • FINCSTP, FDECSTP - увеличить/уменьшить указатель вершины стека
  • FFREE - пометить регистр как пустой
  • FINIT, FNINIT - инициализировать дефолтными значениями
  • FCLEX, FNCLEX - очистить регистры CR и SR и флаги исключений ...

CPUID (с 80496)

CPUID сообщает информацию о производителе, типе, модификации процессора и о наличии различных расширений. Ее параметром является регистр EAX.

  • Если EAX=0 то в качестве результата возвращается следующее
    • EAX - максимальное значение (1 или 2)
    • EBX:ECX:EDX - 12-байтный идентификатор производителя процессора (ASCII-строчка)
  • Если EAX=1 то возвращается следующее
    • EAX - версия процессора
    • EDX 32-разрядная информации о допустимых расширениях
      • наличие FPU
      • поддержка v86
      • поддержка точек останова
      • CR4 - дополнительный регистр управления
      • расширение адресации PAE
      • APIC
      • быстрые системные вызовы
      • POE
      • машинно-специфический регистр
      • команды условной пересылки данных CMOVcc
      • MMX
      • FXSR (MMX2)
      • SSE
  • Если EAX=2, то в EAX, EBX, ECX, EDX возвращается информация о существующих механизмах кэширования и поддержке TLB.

Исключения

  • Неточный результат - произошло округление по правилам, заданным в CR. Бит в SR хранит направление округления.
  • Антипереполнение - переход в денормализованное число
  • Переполнение - переход в "бесконечность" соответствующего знака
  • Деление на ноль - переход в "бесконечность" соответствующего знака
  • Денормализованный операнд
  • Недействительная операция
Clone this wiki locally