Введение
Подмножество архитектуры наборов инструкций x86 для арифметики с плавающей запятой.
x87 — это подмножество наборов инструкций архитектуры x86, предназначенное для работы с числами с плавающей запятой. Оно возникло как расширение набора инструкций 8086 в виде опциональных сопроцессоров с плавающей запятой, работающих совместно с соответствующими процессорами x86. Эти микросхемы имеют названия, заканчивающиеся на "87". Также известно как NPX (Numeric Processor eXtension). Как и другие расширения базового набора инструкций, инструкции x87 не являются строго необходимыми для создания рабочих программ, но предоставляют аппаратные и микрокодовые реализации общих численных задач, позволяя выполнять их значительно быстрее, чем соответствующие программные реализации. Набор инструкций x87 включает в себя инструкции для базовых операций с плавающей запятой, таких как сложение, вычитание и сравнение, а также для более сложных численных операций, например, вычисления функции тангенса и её обратной функции. В большинстве процессоров x86, начиная с Intel 80486, эти инструкции x87 реализованы непосредственно в центральном процессоре, однако этот термин иногда по-прежнему используется для обозначения этой части набора инструкций. До того, как инструкции x87 стали стандартными в персональных компьютерах, компиляторам или программистам приходилось использовать относительно медленные вызовы библиотек для выполнения операций с плавающей запятой, метод, который до сих пор распространен во встраиваемых системах (особенно в недорогих).
x87 is a floating point related subset of the x86 architecture instruction set. It originated as an extension of the 8086 instruction set in the form of optional floating point coprocessors that work in tandem with corresponding x86 CPUs. These microchips have names ending in "87". This is also known as the NPX (Numeric Processor eXtension). Like other extensions to the basic instruction set, x87 instructions are not strictly needed to construct working programs, but provide hardware and microcode implementations of common numerical tasks, allowing these tasks to be performed much faster than corresponding machine code routines can. The x87 instruction set includes instructions for basic floating point operations such as addition, subtraction and comparison, but also for more complex numerical operations, such as the computation of the tangent function and its inverse, for example. Most x86 processors since the Intel 80486 have had these x87 instructions implemented in the main CPU, but the term is sometimes still used to refer to that part of the instruction set. Before x87 instructions were standard in PCs, compilers or programmers had to use rather slow library calls to perform floating point operations, a method that is still common in (low cost) embedded systems.
Описание
Регистры x87 формируют восьмиуровневую нестрогую структуру стека, простирающуюся от ST(0) до ST(7), с регистрами, к которым можно обращаться напрямую с помощью любого операнда, используя смещение относительно вершины стека, а также выполнять операции помещения (push) и извлечения (pop). (Эта схема сопоставима с тем, как фрейм стека может одновременно подвергаться операциям помещения/извлечения и индексации.) Существуют инструкции для помещения, вычисления и извлечения значений из вершины стека; унарные операции (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 – D9CFh) оптимизируются до нулевой задержки за счет использования одного из целочисленных путей для FXCH ST(x) параллельно с инструкцией FPU. Несмотря на то, что это естественно и удобно для программистов на языке ассемблера, некоторым разработчикам компиляторов оказалось сложным создавать автоматические генераторы кода, эффективно планирующие код x87. Такой интерфейс, основанный на стеке, потенциально может минимизировать необходимость сохранения временных переменных при вызовах функций по сравнению с интерфейсом, основанным на регистрах (хотя исторически проблемы проектирования в реализации 8087 ограничивали этот потенциал). x87 обеспечивает арифметику с плавающей точкой одинарной, двойной и 80-битной двойной расширенной точности в соответствии со стандартом IEEE 754 1985 года. По умолчанию все процессоры x87 используют 80-битную двойную расширенную точность внутренне (для обеспечения устойчивой точности при выполнении множества вычислений, см. обоснование проектирования IEEE 754). Таким образом, последовательность арифметических операций может вести себя немного иначе, чем строгий FPU IEEE 754 одинарной или двойной точности. Поскольку это иногда может быть проблематично для некоторых получисловых вычислений, написанных с расчетом на двойную точность для правильной работы, для предотвращения таких проблем x87 можно настроить с помощью специального регистра конфигурации/статуса для автоматического округления до одинарной или двойной точности после каждой операции. С момента появления SSE2 инструкции x87 стали менее важными, чем раньше, но остаются важными как высокоточный скалярный блок для численных вычислений, чувствительных к ошибкам округления и требующих 64-битной точности мантиссы и расширенного диапазона, доступного в 80-битном формате.
Производители
Компании, разработавшие или изготовившие блоки вычислений с плавающей точкой, совместимые с 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 и т.д.), Weitek (1067, 1167, 3167 и 4167) и Xtend (83S87SX 25 и другие сопроцессоры).
8087 - - - - - - -
8087 был первым математическим сопроцессором для 16-битных процессоров, разработанным компанией Intel. Он был создан для работы в связке с микропроцессорами Intel 8088 или 8086. (Более ранние процессоры Intel 8231 и 8232 с плавающей точкой, предлагаемые для использования с процессором i8080, на самом деле являлись лицензионными версиями FPU AMD Am9511 и Am9512, выпущенными в 1977 и 1979 годах.)
80С187
Хотя в оригинальной спецификации 1982 года для (на основе NMOS) процессоров 80188 и 80186 упоминаются конкретные математические сопроцессоры, оба этих чипа фактически работали в связке с 8087. Однако в 1987 году, для работы с обновленным CMOS процессором Intel 80C186, Intel представила математический сопроцессор 80C187. Несмотря на то, что интерфейс 80C187 с основным процессором аналогичен интерфейсу 8087, его ядро фактически является ядром 80387SX и, следовательно, полностью соответствует стандарту IEEE 754 и способно выполнять все дополнительные инструкции 80387.
80287 - - - - - - - - - - -
80287 (i287) — математический сопроцессор для серии микропроцессоров Intel 80286. Модели Intel включали варианты с установленными верхними пределами частоты от 6 до 12 МГц. Версии NMOS были доступны с частотой 6, 8 и 10 МГц. Версия Intel 80287 10 Numerics Coprocessor с частотой 10 МГц стоила 250 долларов США при закупке от 100 штук. Эти версии 80287, 80287 8 и 80287 10 в коробке были доступны за 212, 326 и 374 доллара США соответственно. Также была доступна версия 80C287A в коробке за 457 долларов США. Другие модели 287 с производительностью, сопоставимой с 387, включают Intel 80C287, созданный с использованием технологии CHMOS III, и AMD 80EC287, изготовленный по CMOS-технологии AMD с использованием исключительно полностью статических логических элементов. Затем последовал i80287XL с микроархитектурой 387 SX и 287-контактным разъёмом. i80287XLT — специальная версия, предназначенная для ноутбуков, а также другие варианты. Он содержит встроенный умножитель 3/2, что позволяло материнским платам, работавшим с сопроцессором на скорости 2/3 от скорости CPU, запускать FPU на той же скорости, что и CPU. И 80287XL, и 80287XLT обеспечивали на 50% более высокую производительность, на 83% меньшее энергопотребление и дополнительные инструкции. 80287 и 80287XL работали с микропроцессором 80386 и изначально были единственными доступными сопроцессорами для 80386 до появления 80387 в 1987 году. В конечном итоге они могли работать и с Cyrix Cx486SLC. Однако для обоих этих чипов 80387 предпочтительнее из-за его более высокой производительности и расширенного набора инструкций.
80387 - - - - - - - - -
80387 (387 или i387) — первый сопроцессор Intel, полностью соответствующий стандарту IEEE 754 1985 года. Выпущенный в 1987 году, через два года после чипа 386, i387 обеспечивает значительно более высокую скорость работы по сравнению с предыдущими сопроцессорами Intel 8087/80287 и улучшенные характеристики тригонометрических функций. Он был доступен в количестве 100 штук по цене 500 долларов США. Вскоре после этого он стал доступен через подразделение Intel по улучшению персональных компьютеров по розничной цене 795 долларов США. Версия 25 МГц продавалась в розничной сети за 1395 долларов США. Математический сопроцессор Intel M387 соответствовал стандарту MIL STD 883 Rev. C. Это устройство подвергалось испытаниям, включающим температурные циклы в диапазоне от 55 до 125 °C, проверку герметичности и длительные испытания на надежность. Эта военная версия работает на частоте 16 МГц и была доступна в корпусах PGA с 68 выводами и QFP (quad flatpack). Цена на военную версию в количестве 100 штук для корпуса PGA составляла 1155 долларов США. Была доступна 33-мегагерцовая версия 387DX с производительностью 3,4 мегаватт в секунду. Следующие розничные версии 16-, 20-, 25- и 33-мегагерцовых математических сопроцессоров 387DX стоили 570, 647, 814 и 994 доллара США соответственно. Инструкции FPTAN и FPATAN процессоров 8087 и 80287 ограничены аргументом в диапазоне ±π/4 (±45°), а в процессорах 8087 и 80287 отсутствуют прямые инструкции для функций SIN и COS. Без сопроцессора процессор 386 обычно выполняет арифметику с плавающей точкой с помощью (относительно медленных) программных подпрограмм, реализованных во время выполнения через программный обработчик исключений. При использовании математического сопроцессора совместно с 386, сопроцессор выполняет арифметику с плавающей точкой аппаратно, возвращая результаты значительно быстрее, чем при вызове (эмулируемой) программной библиотеки. i387 совместим только со стандартным чипом i386, имеющим 32-битную шину процессора. Более поздняя, удешевленная модель i386SX, оснащенная более узкой 16-битной шиной данных, не может взаимодействовать с 32-битной шиной i387. Для i386SX требуется собственный сопроцессор 80387SX, совместимый с узкой 16-битной шиной данных SX. Intel также выпустила версию сопроцессора 387SX с низким энергопотреблением.
80487 - - - - - - - - -
i487SX (P23N) позиционировался как сопроцессор для вычислений с плавающей запятой для компьютеров Intel i486SX. Однако на самом деле он содержал полноценную реализацию i486DX. При установке в систему i486SX, i487 отключал основной процессор и полностью брал на себя все его функции. i487 принимал меры для определения наличия i486SX и не функционировал без установленного оригинального процессора.
80587 - - - - - - - - - - - -
Nx587 был последним сопроцессором для x86, произведенным отдельно от центрального процессора, в данном случае NexGen Nx586.