Работа команды: Декремент указателя вершины стека FPU; ST(0) <- CONSTANT;
Описание:
FLD1 – Поместить +1.0 в стек
FLDL2T – Поместить log 210 в стек
FLDL2E – Поместить log 2 e в стек
FLDPI – Поместить число π в стек
FLDLG2 – Поместить lg 2 в стек
FLDLN2 – Поместить ln 2 в стек
FLDZ – Поместить +0.0 в стек
Каждая команда загрузки константы помещает в стек FPU одну из указанных выше общепринятых констант (в расширенном действительном формате).
FLDCW ; Загрузка управляющего слова
Команда FLDCW заменяет текущее значение управляющего слова FPU значением, находящимся в заданном слове памяти.
FST/FSTP ; Сохранить действительное число
Работа команды: DEST <- ST(0); IF команда = FSTP THEN извлечение из стека ST; FI;
Команда FST копирует текущее значение регистра ST в операнд назначения (другой регистр, либо память действительного формата одинарной или двойной точности); при этом аппаратный стек не меняется. FSTP (копирование с очисткой стека) выполняет сначала копирование, а затем извлечение ST из стека. Если источник является регистром, то используется номер регистра, который был до извлечения из стека.
FXCH ; Поменять местами содержимое регистров
Работа команды: врем <- ST; ST <- DEST; DEST <- врем;
Команда меняет местами содержимое регистра назначения и вершины стека. Если назначение явно не задано, то используется ST (1). Многие числовые константы работают только с вершиной стека; FXCH обеспечивает простое средство использования этих команд по отношению к нижним элементам стека. Например, следующая последовательность берет квадратный корень из содержимого третьего регистра сверху (предполагая, что ST непустой):
FXCH ST(3)
FSQRT
FXCH ST(3)
b) команды арифметической обработки
Выполняют четыре арифметических действия над всеми типами данных. Даже обработка целых чисел в сопроцессоре идет по принципу вещественных чисел.
FADD/FADDP/FIADD ; Сложение
Работа команды: DEST <- DEST + SRC; IF команда = FADDP THEN извлечение из стека ST FI;
Команды сложения складывают операнды источника и назначения и возвращают сумму в операнд назначения. Операнд в вершине стека может быть удвоен командой FADD ST, ST(0)
Здесь и далее команда с окончанием Р выталкивает ST(0) из стека: помечает ST(0) как пустой и увеличивает TOP на 1.
FSUB/FSUBP/FISUB ; Вычитание
Работа команды: DEST <- ST - Другой операнд; IF команда = FSUBP THEN извлечение из стека ST; FI;
Команды вычитания вычитают из вершины стека другой операнд и возвращают разность в регистр назначения.
FSUBR/FSUBPR/FISUBR ; Обратное вычитание
Работа команды: DEST <- Другой операнд - ST; IF команда = FSUBRP THEN извлечение из стека ST; FI;
Команды обратного вычитания вычитают вершину стека из другого операнда и возвращают разность в регистр назначения.
FCOM/FCOMP/FCOMPP ; Сравнение действительных чисел
Команды сравнивают вершину стека с источником, который может являться регистром или операндом памяти, являющимся действительным числом одинарной или двойной точности. Если операнд не задан, то ST сравнива-ется с ST(1). После выполнения команды коды условий отражают отношение между ST и исходным операндом.
FICOM/FICOMP ; Сравнение целочисленных значений
Команды сравнивают вершину стека с исходным операндом. После выполнения команды коды условий отражают соотношение между ST и исходным операндом.
FCHS ; Изменение знака
Команда меняет на противоположный знак ST (знаковый бит ST <- NOT (знаковый бит в ST) ). Эта операция заменяет положительное значение на отрицательное при той же абсолютной величине, и наоборот.
FMUL/FMULP/FIMUL ; Умножение
Работа команды: DEST <- DEST x SCR; IF команда = FMULP THEN извлечение из стека ST FI;
Команды умножения умножают операнд назначения на исходный операнд (источник) и возвращают произведение в операнд назначения.
FDIV/FDIVP/FIDIV ; Деление
Команды деления делят вершину стека на прочие операнды и возвращают частное в операнд назначения.
При делении нормального числа на 0 происходит исключение деления на 0 и результат будет бесконечность соответствующего знака. При делении бесконечности на ноль (или любое число) результат – бесконечность, при делении нуля на бесконечность (или любое число) результат – ноль.
FDIVR/FDIVPR/FIDIVR ; Деление в обратном порядке
Команды делят другой операнд на вершину стека и возвращают частное в операнд назначения. В остальном эти команды аналогичны предыдущим.
FTST ; Тестирование
Работа команды:
CASE (отношение операндов) OF
Не сравнимы: C3, C2, C0 <- 111;
ST > SRC: C3, C2, C0 <- 000;
ST < SRC: C3, C2, C0 <- 001;
ST = SRC: C3, C2, C0 <- 100;
-----------------------------------------------------------------
Флаги FPU | EFlags
-----------------------------------------------------------------
C0 CF
C1 отсутствует
C2 PF
C3 ZF
-----------------------------------------------------------------
Команда тестирования сравнивает вершину стека с 0.0. После выполнения команды коды условий (флаги) отражают результат сравнения.
FRNDINT ; Округление к целому
Работа команды: ST <- округленный ST;
Команда округления к целому округляет значение в ST к целому в соответствии с полем RC управляющего слова FPU.
c) команды вычисления элементарных функций
FABS ; Абсолютное значение
Команда абсолютного значения FABS очищает знаковый бит ST (ST <- 0). Операция оставляет положительное значение без изменений либо заменяет отрицательное значение положительным, равным по абсолютной величине.
FSCALE ; Умножение на масштабный коэффициент
Работа команды: ST <- ST x 2**ST(1);
Команда масштабирования округляет значение в ST(1) до целого в сторону нуля, умножает ST(0) на 2 в степени ST(1) и записывает результат в ST(0). Таким образом, FSCALE обеспечивает быстрое умножение или деление на целочисленные степени 2.
Примечание. Команда FSCALE может использоваться как команда, обратная по отношению к FXTRACT. Поскольку FSCALE не извлекает из стека экспонентную часть, за FSCALE должна следовать команда FSTP ST(1), чтобы полностью отменить действие предыдущей команды FXTRACT.
FXTRACT ; Выделение экспоненты и мантиссы
Работа команды: врем <- мантисса ST; ST <- экспонента ST;
Декремент указателя вершины стека FPU; ST <- врем;
Команда разделяет значение в ST(0) на экспоненту и мантиссу, экспонента заменяет исходный операнд в ST(0), и затем TOP уменьшается на 1, и в стек помещается мантисса. После выполнения команды ST(0) (новая вершина стека) содержит значение исходной мантиссы, выраженное действительным числом со знаком исходного операнда, а ST(1) содержит значение истинной (несмещенной) экспоненты исходного операнда, выраженное действительным числом.
FSQRT ; Квадратный корень
Команда FSQRT заменяет значение в ST(0) на его квадратный корень.
FSIN ; Синус
Работа команды:
IF операнд в допустимом диапазоне
THEN
C2 <- 0;
ST <- sin(ST);
ELSE
C2 <- 1;
FI;
Команда FSIN заменяет содержимое ST на sin (ST). Значение ST, выраженное в радианах, должно лежать в диапазоне | O | < 2**63.
FCOS ; Косинус
Команда FCOS заменяет содержимое ST на cos (ST). Значение ST, выраженное в радианах, должно лежать в диапазоне | O | < 2**63. Если операнд находится вне допустимого диапазона, то флаг C2 устанавливается, а ST остается неизмененным. Программист сам ответственен за то, чтобы уменьшить операнд до абсолютного значения, меньшего, чем 2**63, вычитая соответствующее число, кратное 2π .
FPATAN ; Частичный арктангенс
Работа команды: ST(1) <- arctan(ST(1)/ST); извлечение из стека ST;
Частичный арктангенс вычисляет арктангенс от ST(1)/ST(0) и возвращает вычисленное значение в радианах в ST(1). Затем выполняется извлечение из стека ST(0). Результат имеет тот же знак, что и операнд из ST(1), и по величине меньше числа π.
FPTAN ; Частичный тангенс
Частичный тангенс заменяет содержимое ST на tg (ST) и затем помещает в стек FPU величину 1.0. Значение ST в радианах должно лежать в диапазоне | O | < 2**63.
F2XM1 ; Вычисление 2Х - 1
Работа команды: ST <- (2ST – 1);
Команда F2XM1 заменяет содержимое ST на (2ST – 1). ST должен находиться в диапазоне -1 < ST < 1. Если операнд находится вне допустимого диапазона, то результат F2XM1 неопределен.
Значения, не равные 2, могут возводиться в степень по формуле XY = 2(Y * log2 X) .
Команды FLDL2T и FLDL2E загружают константы log2 10 и log2 e, соответственно. Команда FYL2X может быть использована для вычисления y * log2 x для произвольного положительного x.
FYL2X ; Вычисление y * log2 x
Работа команды: ST(1) <- ST(1) * log2 ST; извлечение из стека ST;
Команда FYL2X вычисляет логарифм ST по основанию 2, умножает логарифм на ST(1) и возвращает полученное значение в ST(1). Операнд в ST не может быть отрицательным. Если операнд в ST отрицателен, то генерируется исключение неверной операции.
FYL2XP1 ; Вычисление y * log2 (x +1)
Работа команды: ST(1 ) <- ST(1) * log2 (ST +1.0); извлечение из стека ST;
Команда FYL2XР1 вычисляет логарифм (ST+1.0) по основанию 2, умножает логарифм на ST(1) и возвращает полученное значение в ST (1). Операнд в ST должен лежать в диапазоне -(1-(кв.корень из 2/2)) <= ST <= кв.корени из 2 -1
d) Команды управления
FINIT/FNINIT ; Инициализация модуля FPU операций с плавающей точкой
Команды инициализации устанавливают FPU в иcходное состояние, независимо от действий, выполнявшихся им ранее. Управляющее слово FPU устанавливается в значение 037FY (округление до ближайшего, все исключения маскируются, 64-битовая точность представления). Слово состояния очищается (флаги исключений не установлены, регистр стека R0 = вершине стека). Стековые регистры имеют теги «пусто». Указатели ошибки (как команд, так и данных) очищены.
FINIT проверяет наличие немаскируемых исключений ошибок операций с плавающей точкой и обрабатывает их, прежде чем выполнить инциализацию; FNINIT же этого не делает.
FWAIT ; Ожидание
Команда FWAIT заставляет процессор проверить наличие необработанных немаскируемых исключений FPU и обработать их, прежде чем перейти к дальнейшему выполнению программы. Эту команду следует указывать в критических ситуациях после команд FPU, чтобы убедиться, что возможные исключения будут обработаны.
FNOP ; Отсутствие операции
Эта команда заменяет место и время, но не выполняет никакого действия. Может использоваться для создания задержек в процессе выполнении программы.
П1.9. Команды MMX (MultiMedia eXtension) расширения
Эта группа команд появилась, начиная с процессора i586 (Pentium P54C ), ориентирована на обработку мультимедийных приложений и предназначена для повышения эффективности выполнения программ, работающих с большими потоками данных (большими массивами целых чисел) по несложным алгоритмам (обработка графики и видеоизображений, синтез и обработка звука).
MMX расширение включает в себя дополнительные регистры, типы данных и команды, ориентированные на одновременную обработку нескольких целых чисел.
Расширение ММХ использует восемь 64-битных регистра MM0 – MM7, физически размещающихся в поле мантиссы восьми регистров FPU R0 – R7. При записи числа в ММ i поле экспоненты Ri [64-79] заполняется единицами. Кроме того, поле TOP регистра SR FPU и весь регистр тегов TW обнуляются. Поэтому нельзя одновременно пользоваться командами FPU и командами ММХ. При необходимости этого следует пользоваться командами FSAVE / FRSTOR при переходе от команды FPU к ММХ и обратно для сохранения и восстановления регистров FPU или ММХ соответственно.
Расширение ММХ использует 4 новых типа данных:
Учетверенное слово (64-битное число).
Упакованные двойные слова (два 32-битных двойных слова, упакованных в 64-битное данное).
Упакованные слова (четыре 16-битных слова, упакованных в 64-битное данное).
Упакованные байты (восемь байт, упакованных в 64-битное данное).
Отличительные особенности обработки данных:
1. Перемещение данных в память или в регистры осуществляется в упакованном виде, а логическая или арифметическая обработка выполняются над каждым элементом (полем) отдельно.
2. Арифметические операции в ММХ используют специальный способ обработки переполнения, который называется «насыщение». Если результат операции больше (меньше) максимального (минимального) значения соответствующего типа данных, то его полагают равным этому максимальному (минимальному) значению. Так, при операциях с цветом насыщение позволяет сохранять чисто белый цвет при переполнении и чисто черный при антипереполнении, а обычная арифметика привела бы к инверсии цвета.
(Кроме пересылок все остальные команды начинаются с буквы P.)
Пересылка
MOVD d, s – пересылка двойных слов.
Если приемник – регистр ММХ, двойное слово записывается в его младшую половину (биты 0 – 31), если источник – регистр ММХ, в приемник записывается младшее двойное слово этого регистра.
MOVQ d, s – пересылка учетверенных слов.
Преобразование типов (упаковка со знаковым насыщением).
PACKSSWB d, s – упаковывает и насыщает слова со знаком в байты.
Четыре слова, находящиеся в приемнике (регистре ММХ), копируются в четыре младших байта приемника, а четыре слова источника (регистр ММХ или переменная) копируются в старшие четыре байта приемника. Если значение какого-либо слова больше 127 или меньше -128, в байт помещается число +127 или –128 соответственно.
PACKSSDW d, s – упаковывает и насыщает двойные слова со знаком в слова.
Аналогично, два двойных слова из приемника копируются в два младших слова приемника, а два двойных слова из источника копируются в старшие два слова приемника.
Распаковка и объединение старших элементов.
PUNPCKHBW d, s – распаковка байтов и объединение в слова,
PUNPCKHWD d, s – распаковка слов и объединение в двойные слова,
PUNPCKHDQ d, s – распаковка двойных слов и объединение в учетверенное слово.
Команды распаковывают старшие элементы источника (регистр ММХ или переменная) и приемника (регистр ММХ) и записывают их в приемник через один.
Пример:
Арифметические операции.
PADDB/W/D d, s – сложение отдельных байтов/слов/двойных слов без учета переноса
PADDSB/W d, s – сложение с насыщением
PADDUSB/W d, s – сложение без учета знака с насыщением
Аналогичные команды имеются для операций вычитания (PSUBB/W/D, PSUBSB/W, PSUBUSB/W).
PMULHW d, s – умножение с фиксацией старших слов результатов
PMULLW d, s – умножение с фиксацией младших слов результатов
Эти команды умножают каждое из 4 слов источника на соответствующее слово приемника. Затем старшее (младшее) слово каждого из результатов записывается в соответствующую позицию приемника.
PMADDWD d, s – умножение со сложением.
Каждое из четырех слов источника умножается на соответствующее слово приемника. Произведения двух старших пар слов складываются и их сумма записывается в старшее двойное слово приемника, а сумма произведений двух младших пар слов записывается в младшее двойное слово приемника (команда применяется при реализации алгоритмов фильтрации изображений и т.п.).
Сравнения.
PCMPEQB/PCMPEQW/PCMPEQD d, s – сравнение на равенство
Команды сравнивают отдельные байты/слова/двойные слова источника и приемника и в случае их равенства соответствующий элемент приемника заполняется единицами, а иначе – нулями.
PCMPGTB/PCMPGTW/PCMPGTD d, s – сравнение на больше .
Команды аналогичны предыдущим, но заполнение приемника единицами происходит, если элемент приемника больше элемента источника.
Логические команды.
PAND d, s – логическое И
PANDN d, s – логическое НЕ-И (штрих Шеффера)
POR d, s – логическое ИЛИ
PXOR d, s – логическое исключающее ИЛИ
Команды выполняют побитовые логические операции над источником и приемником и сохраняют результирующие биты в приемнике.
П1.10. Расширение AMD 3DNow!
В процессорах AMD, начиная с AMD 3D, появилось расширение ММХ-команд для обработки как целых, так и пары упакованных 32-битных вещественных чисел:
- дополнительный тип данных: – упакованные 32-битные вещественные числа;
- дополнительный набор команд над этими данными (начинаются с PF: P – это MMX, а F –- float);
- дополнительный набор команд над обычными ММХ-типами данных (упакованными целыми числами).
Дополнительный набор команд расширения AMD 3DNow! включает:
- команды преобразования упакованных целых чисел в упакованные вещественные и обратно;.
- команды сложения, вычитания, сравнения и умножения упакованных вещественных чисел;
- команды вычисления среднего арифметического для упакованных 8-битных целых чисел без знака;
- команды деления и вычисления квадратного корня по итерационным формулам;
- некоторые другие команды.
П1.11. Команды потокового расширения SSE, SSE2
Команды потокового расширения SSE (Streaming SIMD Extension) появились в процессорах фирмы Intel, начиная с Pentium III, для дополнения набора групповых операций над упакованными целыми числами и выполнения групповых операций над упакованными 32-битными вещественными числами:
- обработка групп целых чисел, упакованных в 64- и 128-битные слова;
- обработка одной пары вещественных чисел одинарной (32 бит) или двойной (64 бита) точности;
- обработка 4 пар вещественных чисел одинарной или 2 пар – двойной точности.
Команды реализуются на дополнительном блоке XMM из восьми 128-битных регистров, названных ХММ0-ХММ7. При выполнении SSE – команд традиционное оборудование FPU не используется, что позволяет эффективно смешивать их с командами FPU. Дальнейшее развитие технологии SSE в процессорах Pentium 4 вылилось в набор команд SSE2, включающих 271 команду, для выполнения различных арифметических и логических операций с обработкой за 1 такт до 4 32-битных чисел с плавающей запятой, упакованных в 128-битное слово.