x87 - x87

редактировать

x87 - это с плавающей точкой связанное с архитектурой x86 набором инструкций. Он возник как расширение набора инструкций 8086 в форме дополнительных сопроцессоров с плавающей запятой , которые работали в тандеме с соответствующими процессорами x86. Эти микрочипы имели названия, оканчивающиеся на «87». Это также было известно как NPX (расширение числового процессора). Как и другие расширения базового набора команд, инструкции x87 не являются строго необходимыми для создания рабочих программ, но предоставляют аппаратные средства и микрокод реализации общих числовых задач, что позволяет выполнять эти задачи намного быстрее, чем соответствующие машинный код может. Набор команд x87 включает в себя инструкции для основных операций с плавающей запятой, таких как сложение, вычитание и сравнение, а также для более сложных числовых операций, таких как, например, вычисление функции касательной и ее обратной.

Большинство процессоров x86, начиная с Intel 80486, имели эти инструкции x87, реализованные в основном процессоре, но этот термин иногда все еще используется для обозначения этой части набора команд. До того, как инструкции x87 стали стандартом для ПК, компиляторам или программистам приходилось использовать довольно медленные вызовы библиотек для выполнения операций с плавающей запятой, метод, который все еще распространен во (недорогих) встроенных системах.

Содержание

  • 1 Описание
    • 1.1 Производительность
  • 2 Производители
  • 3 Архитектурные поколения
    • 3,1 8087
    • 3,2 80187
    • 3,3 80287
    • 3,4 80387
    • 3,5 80487
    • 3,6 80587
  • 4 См. Также
  • 5 Ссылки
  • 6 Примечания
  • 7 Внешние ссылки

Описание

Регистры x87 образуют восьмиуровневый нестрогий структура stack в диапазоне от ST (0) до ST (7) с регистрами, к которым можно получить прямой доступ любым операндом, используя смещение относительно вершины, а также сдвигать и выталкивать. (Эту схему можно сравнить с тем, как фрейм стека может одновременно вставляться / выталкиваться и индексироваться.)

Есть инструкции для вставки, вычисления и вставки значений поверх этого стека; унарные операции (FSQRT, FPTAN и т. Д.) Затем неявно адресуют самый верхний ST (0), тогда как двоичные операции (FADD, FMUL, FCOM и т. Д.) Неявно адресуют ST (0) и ST (1). Модель нестрогого стека также позволяет двоичным операциям использовать ST (0) вместе с прямым операндом памяти или с явно указанным стековым регистром ST (x) в роли, аналогичной традиционной аккумулятор (комбинированный адресат и левый операнд). Это также может быть отменено для каждой инструкции с ST (0) в качестве неизмененного операнда и ST (x) в качестве пункта назначения. Кроме того, содержимым ST (0) можно обмениваться с другим регистром стека с помощью инструкции FXCH ST (x).

Эти свойства позволяют использовать стек x87 как семь свободно адресуемых регистров плюс специальный аккумулятор (или как семь независимых аккумуляторов). Это особенно применимо к процессорам суперскалярной x86 (например, Pentium 1993 года и позже), где эти инструкции обмена (коды D9C8..D9CF h) оптимизирован до нулевого штрафа тактовой частоты за счет использования одного из целочисленных путей для FXCH ST (x) параллельно с инструкцией FPU. Несмотря на то, что они естественны и удобны для программистов на языке ассемблера, некоторые авторы компиляторов сочли сложным создание автоматических генераторов кода, которые эффективно планируют код x87. Такой интерфейс на основе стека потенциально может свести к минимуму необходимость сохранения временных переменных в вызовах функций по сравнению с интерфейсом на основе регистров (хотя исторически проблемы дизайна в исходной реализации ограничивали этот потенциал).

x87 предоставляет одинарная точность, двойная точность и 80-битная двойная расширенная точность двоичная арифметика с плавающей запятой в соответствии со стандартом IEEE 754-1985. По умолчанию все процессоры x87 используют внутреннюю 80-битную двойную расширенную точность (чтобы обеспечить стабильную точность при выполнении многих вычислений, см. Обоснование конструкции IEEE 754 ). Таким образом, данная последовательность арифметических операций может вести себя несколько иначе по сравнению со строгой одинарной или двойной точностью IEEE 754 FPU. Поскольку это иногда может быть проблематично для некоторых получисловых вычислений, написанных с учетом двойной точности для правильной работы, чтобы избежать таких проблем, x87 можно настроить с использованием специального регистра конфигурации / состояния для автоматического округления до одинарной или двойной точности после каждой операции. С момента появления SSE2 инструкции x87 не так важны, как раньше, но остаются важными как скалярная единица высокой точности для численных вычислений, чувствительных к ошибке округления и требуется 64-битная мантисса точность и расширенный диапазон, доступный в 80-битном формате.

Производительность

Подсчет тактовых циклов для примеров типичных инструкций FPU x87 (здесь показаны только версии регистр-регистр).

Обозначение A... B (от минимального до максимального) охватывает изменения синхронизации, зависящие от переходного состояния конвейера и выбранной арифметической точности (32, 64 или 80 бит); он также включает вариации из-за числовых случаев (например, количество установленных битов, ноль и т. д.). Обозначение L → H отображает значения, соответствующие самой низкой (L) и самой высокой (H) максимальной тактовой частоте, которые были доступны.

реализация x87FADDFMULFDIVFXCHFCOMFSQRTFPTANFPATANМакс. Частота. (МГц)Пик FMUL. (миллионов / s )FMUL. отн. 5 МГц 8087
808770…10090…145193…20310…1540… 50180…18630…540250…8000005 → 00100,034… 0,055 → 0,100… 0,111~ 00001 → 2 × быстрее
80287 (исходный)0006 → 00120,041… 0,066 → 0,083… 0,133.0001,2 → 2,4 ×
80387 (и более поздние модели 287)23… 3429… 5788… 911824122… 129191… 497314… 4870016 → 00330,280… 0,552 → 0,580… 1,1000 ~ 10 → 20 ×
80486 (или 80487)8… 2016734483… 87200… 273218… 3030016 → 0050….0000001.0 → 3.1000 ~ 18 → 56 ×
Cyrix 6x86, Cyrix MII 4… 74 … 624… 342459… 60117… 12997… 1610066 → 0300..000011… 16 → 50… 7500 ~ 320 → 1400 ×
AMD K6 (включая K6 II / III)2221… 412321… 41??0166 → 0550…..00000083 → 2750 ~ 1500 → 5000 ×
Pentium / Pentium MMX1… 31… 3391 (0 *)1…47017…17319…1340060 → 0300..000020 … 60 → 100… 3000 ~ 1100 → 5400 ×
Pentium Pro 1… 32… 516… 56128… 68??0150 → 0200..000030… 75 → 40… 1000 ~ 1400 → 1800 ×
Pentium II / III1… 32… 517… 38127… 50??0233 → 1400..00047… 116 → 280… 7000 ~ 2100 → 13000 ×
Атлон (K7)1…41…413… 241… 216… 35??0500 → 2330..00125… 500 → 580… 23300 ~ 9000 → 42000 ×
Athlon 64 (K8)1000 → 3200..0250… 1000 → 800… 3200~ 18000 → 58000 ×
Pentium 4 1… 52… 720… 43несколько. циклов120… 43??1300 → 3800..00186… 650 → 543… 1900~ 11000 → 34000 ×
* Эффективный За счет суперскалярного исполнения часто возможна нулевая задержка тактовой частоты.
Процессор 8087 с частотой 5 МГц был исходным процессором x87. По сравнению с типичными программно реализуемыми подпрограммами с плавающей запятой на 8086 (без 8087), коэффициенты были бы даже больше, возможно, еще в 10 раз (то есть правильное добавление чисел с плавающей запятой на языке ассемблера может потребовать более 1000 циклов.

Производители

Компании, которые разработали или изготовили блоки с плавающей запятой, совместимые с Intel 8087 или более поздними моделями, включают AMD (287, 387, 486DX, 5x86, K5, K6, K7, K8), Chips and Technologies (сопроцессоры Super MATH), Cyrix (FasMath, Cx87SLC, Cx87DLC и т. Д., 6x86, Cyrix MII), Fujitsu (ранний Pentium Mobile и т. Д.), Harris Semiconductor (производились процессоры 80387 и 486DX), IBM (различные конструкции 387 и 486), IDT ( WinChip, C3, C7, Nano и т. д.), IIT (2C87, 3C87 и т. д.), LC Technology (сопроцессоры Green MATH), National Semiconductor (Geode GX1, Geode GXm и т. Д.), NexGen (Nx587), Rise Technology (mP6), ST Microelectronics (производство 486DX, 5x86 и т. д.), Texas Instruments (производство процессоров 486DX и т. д.), Transmeta (TM5600 и TM5800), ULSI (сопроцессоры Math · Co), VIA (C3, C7 и Nano и т. д.) и Xtend (83S87SX-25 и другие сопроцессоры).

Архитектурные поколения

8087

8087 был первым математическим сопроцессором для 16-битных процессоров, разработанным Intel. Он был создан для работы с микропроцессорами Intel 8088 или 8086. (Более ранние процессоры Intel 8231 и 8232 с плавающей запятой, продаваемые для использования с ЦП i8080, фактически были лицензионными версиями процессоров AMD Am9511 и Am9512 с 1977 и 1979 годов.)

80187

16 МГц версия Intel 80187

80187 (80C187) - математический сопроцессор для процессора Intel 80186. Он не может работать с 80188, поскольку 80188 имеет восьмибитную шину данных; 80188 может использовать только 8087. 80187 не появился одновременно с 80186 и 80188, но фактически был запущен после 80287 и 80387. Хотя интерфейс с основным процессором такой же, как и у 8087, его ядро ​​совпадает с ядром 80387 и, таким образом, полностью соответствует IEEE 754 и способно выполнять все дополнительные инструкции 80387.

80287

80287 (i287) является математическим сопроцессором для серии Intel 80286 микропроцессоров . Модели Intel включали варианты с указанными верхними частотными пределами от 6 до 12 МГц. Позже последовали i80287XL с микроархитектурой 387 и i80287XLT, специальная версия, предназначенная для ноутбуков, а также другие варианты.

80287XL на самом деле является 80387SX с распиновкой 287. Он содержит внутренний множитель 3/2, чтобы материнские платы, на которых сопроцессор работал на 2/3 скорости ЦП, могли вместо этого запускать FPU с той же скоростью, что и ЦП. Другие модели 287 с производительностью, подобной 387, - это Intel 80C287, построенный с использованием CHMOS III, и AMD 80EC287, изготовленный по процессу AMD CMOS с использованием только полностью статических вентилей.

80287 и 80287XL работают с микропроцессором 80386 и изначально были единственными сопроцессорами, доступными для 80386 до появления 80387 в 1987 году. Наконец, они смогли работать с Cyrix Cx486SLC. Однако для обоих этих микросхем 80387 является предпочтительным из-за его более высокой производительности и большей функциональности его набора команд.

80387

Изображение кристалла процессора Intel 80387

80387 (387 или i387 ) - первый сопроцессор Intel, полностью совместимый со стандартом IEEE 754-1985. Выпущенный в 1987 году, спустя целых два года после чипа 386, i387 обладает значительно более высокой скоростью по сравнению с предыдущими сопроцессорами Intel 8087/80287 и улучшенными характеристиками его тригонометрических функций. Команды FPTAN и FPATAN 8087 и 80287 ограничены аргументом в диапазоне ± π / 4 (± 45 °), а 8087 и 80287 не имеют прямых инструкций для функций SIN и COS.

Без сопроцессор, 386 обычно выполняет арифметические операции с плавающей запятой с помощью (относительно медленных) программных процедур, реализованных во время выполнения с помощью программного обработчика исключений. Когда математический сопроцессор соединен с 386, сопроцессор выполняет арифметические операции с плавающей запятой аппаратно, возвращая результаты намного быстрее, чем (эмулирующий) вызов библиотеки программного обеспечения.

i387 совместим только со стандартным чипом i386, который имеет 32-битную шину процессора. Уменьшенный более поздний вариант i386SX, который имеет более узкую 16-битную шину данных, не может взаимодействовать с 32-битной шиной i387. Для i386SX требуется собственный сопроцессор, 80387SX, который совместим с более узкой 16-битной шиной данных SX.

80487

i487SX

i487SX (P23N) продавался как модуль с плавающей запятой сопроцессор для Intel i486SX машины. Фактически он содержал полноценную реализацию i486DX. При установке в систему i486SX i487 отключил основной ЦП и взял на себя все операции ЦП. I487 принял меры по обнаружению наличия i486SX и не мог работать без исходного процессора.

80587

Nx587 был последним FPU для x86, который производиться отдельно от ЦП, в данном случае NexGen Nx586.

См. также

Ссылки

Примечания

Внешние ссылки

Последняя правка сделана 2021-06-22 06:10:47
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте