Intel 8087 - Intel 8087

Intel 8087
Intel C8087.jpg
Математический сопроцессор Intel 8087
Общая информация
Запущен1980
ПродаетсяIntel, IBM[1]
РазработаноIntel
Общий производитель (и)
Спектакль
Максимум. ЦПУ тактовая частотаОт 4 МГц до 10 МГц
Архитектура и классификация
Мин. размер элемента3 мкм
Набор инструкцийx87 (сопроцессор расширение x86-16 )
Физические характеристики
Пакет (ы)
История
Предшественник8231/8232
Преемник80287

В Intel 8087, объявленный в 1980 году, был первым x87 плавающая точка сопроцессор для 8086 линейка микропроцессоров.[4][5][6]

Целью 8087 было ускорение вычислений для плавающая точка арифметика, например добавление, вычитание, умножение, разделение, и квадратный корень. Он также вычислил трансцендентные функции Такие как экспоненциальный, логарифмический или же тригонометрический вычисления, и помимо операций с плавающей запятой он также может работать с большими двоичными и десятичными целыми числами. Повышение производительности составило примерно от 20% до более 500%, в зависимости от конкретного приложения. 8087 может выполнить около 50 000ФЛОПЫ[5] используя около 2,4 Вт.[6] От установки 8087 выиграли только арифметические операции; компьютеры, используемые только с такими приложениями, как текстовый редактор, например, не выиграют от дополнительных расходов (около 150 долларов[7]) и энергопотребление 8087.

Умереть Intel 8087

8087 была продвинутой ИС для своего времени, раздвигая границы производственных технологий того периода. Первоначальная урожайность была чрезвычайно низкой.[нужна цитата ]

Продажи 8087 значительно выросли, когда IBM включал разъем сопроцессора на IBM PC материнская плата. Из-за нехватки микросхем IBM фактически не предлагала 8087 в качестве опции для ПК до тех пор, пока она не появилась на рынке в течение шести месяцев. Разработка 8087 привела к IEEE 754-1985 стандарт для арифметики с плавающей запятой. Позже были x87 сопроцессоры для процессоров 80186 (не используются в ПК-совместимых), 80286, 80386 и 80386SX. Начиная с 80486, более поздняя версия Intel x86 процессоры не использовали отдельный сопроцессор с плавающей запятой; Функции с плавающей запятой были интегрированы с процессором.

Внутри чипа отсутствовал аппаратный умножитель, и вычисления выполнялись с использованием КОРДИК алгоритм.[8]

Дизайн и развитие

Intel ранее производила 8231 Блок арифметической обработки, а 8232 Процессор с плавающей запятой. Они были разработаны для использования с 8080 или аналогичные процессоры и использовали 8-битную шину данных. Они были связаны с хост-системой либо через программируемый ввод / вывод, либо через DMA контроллер.[9]

Изначально модель 8087 была задумана Биллом Полманом, менеджером по техническим вопросам в Intel, который курировал разработку чипа 8086. Билл предпринял шаги, чтобы убедиться, что чип 8086 может поддерживать математический чип, который еще предстоит разработать.

В 1977 году Полман получил добро на разработку математической микросхемы 8087. Брюс Равенел был назначен архитектором, а Джон Палмер был нанят в качестве со-архитектора и математика для проекта. Они разработали революционный дизайн с 64 битами мантиссы и 16 битами экспоненты для действительного числа самого длинного формата, с ЦП с архитектурой стека и 8 80-битными регистрами стека с богатым для вычислений набором инструкций. Эта конструкция решила несколько нерешенных известных проблем в области числовых вычислений и числового программного обеспечения: были устранены проблемы с ошибками округления для 64-битных операндов и решены преобразования числового режима для всех 64-битных чисел. Палмер зачислен Уильям Кахан сочинения о плавающей запятой как существенное влияние на их дизайн.[10]

Дизайн 8087 первоначально был встречен прохладным приемом в Санта-Кларе из-за его агрессивного дизайна. В конце концов, дизайн был передан Intel Israel, а Рафи Нейв был назначен руководить внедрением чипа. Палмер, Равенель и Нейв получили патенты на дизайн.[11] Роберт Келер и Джон Бейлисс также получили патент на методику, при которой некоторые инструкции с определенным битовым шаблоном выгружались в сопроцессор.[12]

8087 имел 45000 транзисторов и производился с обедняющей нагрузкой 3 мкм. HMOS схема. Он работал в тандеме с 8086 или 8088 и представил около 60 новых инструкции. Самая 8087 сборки мнемоника начинаются с F, такие как FADD, FMUL, FCOM и так далее, что делает их легко отличимыми от инструкций 8086. Двоичные кодировки для всех инструкций 8087 начинаются с битовой комбинации 11011, десятичной дроби 27, такой же, как у ASCII символ ESC, хотя и в старших битах байта; подобные префиксы инструкций также иногда упоминаются как "коды выхода ". Мнемоника инструкций, назначенная Intel для этих инструкций сопроцессора, -" ESC ".

Когда ЦП 8086 или 8088 выполнял команду ESC, если второй байт (байт ModR / M) определял операнд памяти, ЦП выполнял цикл шины для чтения одного слова из области памяти, указанной в инструкции (с использованием любого 8086 режим адресации), но он не будет сохранять операнд чтения в каком-либо регистре ЦП или выполнять с ним какие-либо операции; 8087 будет наблюдать за шиной и декодировать поток команд синхронно с 8086, распознавая инструкции сопроцессора, предназначенные для себя. Для инструкции 8087 с операндом в памяти, если инструкция вызвала чтение операнда, 8087 будет брать слово данных, считываемых основным ЦП из шины данных. Если бы считываемый операнд был длиннее одного слова, 8087 также скопировал бы адрес с адресной шины; затем, после завершения цикла чтения данных, управляемого ЦП, 8087 немедленно использует DMA для управления шиной и передачи дополнительных байтов самого операнда. Если инструкция 8087 с операндом памяти вызвала запись этого операнда, 8087 проигнорирует слово чтения на шине данных и просто скопирует адрес, затем запросит DMA и запишет весь операнд таким же образом, как он будет читать конец расширенного операнда. Таким образом, главный ЦП поддерживал общий контроль шины и синхронизации шины, в то время как 8087 обрабатывал все другие аспекты выполнения инструкций сопроцессора, за исключением коротких периодов DMA, когда 8087 брал на себя шину для чтения или записи операндов в / из собственных внутренних регистров. Как следствие этой конструкции, 8087 мог работать только с операндами, взятыми либо из памяти, либо из его собственных регистров, а любой обмен данными между 8087 и 8086 или 8088 происходил только через RAM.

Программа основного ЦП продолжала выполняться, пока 8087 выполнял инструкцию; с точки зрения основного ЦП 8086 или 8088, инструкция сопроцессора занимала столько времени, сколько обработка кода операции и любого цикла операнда памяти (2 тактовых цикла без операнда, 8 тактовых циклов плюс время вычисления EA [от 5 до 12 тактов циклов] для операнда памяти [плюс еще 4 тактовых цикла на 8088], чтобы передать второй байт слова операнда), после чего ЦП начнет выполнение следующей инструкции программы. Таким образом, система с 8087 была способна выполнять настоящую параллельную обработку, выполняя одну операцию в целочисленном ALU основного ЦП, одновременно выполняя операцию с плавающей запятой в сопроцессоре 8087. Поскольку 8086 или 8088 исключительно управляли потоком команд и синхронизацией и не имели прямого доступа к внутреннему состоянию 8087, и поскольку 8087 мог выполнять только одну инструкцию за раз, программы для объединенной системы 8086/8087 или 8088/8087 должен был убедиться, что 8087 успевает выполнить последнюю отданную ему инструкцию, прежде чем он будет отдан другой. Для этой цели была предоставлена ​​инструкция WAIT (основного ЦП), и большинство ассемблеров неявно утверждали инструкцию WAIT перед каждым экземпляром большинства инструкций сопроцессора с плавающей запятой. (Нет необходимости использовать инструкцию WAIT перед операцией 8087, если программа использует другие средства, чтобы гарантировать, что между выдачей чувствительных к времени инструкций 8087 проходит достаточно времени, чтобы 8087 никогда не мог получить такую ​​инструкцию, прежде чем он завершит предыдущую Если используется WAIT, также необязательно, чтобы он непосредственно предшествовал следующей инструкции 8087.) Инструкция WAIT ожидала подтверждения входного контакта -TEST 8086/8088 (низкий уровень), и этот вывод был подключен к выводу BUSY 8087 во всех системах, которые имели 8087 (поэтому TEST был подтвержден, когда BUSY был отключен).

Поскольку очереди предварительной выборки инструкций 8086 и 8088 делают время, когда инструкция выполняется, не всегда таким же, как время ее выборки, сопроцессор, такой как 8087, не может определить, когда инструкция для себя является следующей инструкцией, которая будет выполняться чисто наблюдая за шиной ЦП. У 8086 и 8088 есть два сигнала состояния очереди, подключенных к сопроцессору, чтобы позволить ему синхронизироваться с внутренним таймингом CPU выполнения инструкций из его очереди предварительной выборки. 8087 поддерживает свою собственную идентичную очередь предварительной выборки, из которой он считывает коды операций сопроцессора, которые он фактически выполняет. Поскольку очереди предварительной выборки 8086 и 8088 имеют разные размеры и разные алгоритмы управления, 8087 определяет, к какому типу ЦП он подключен, наблюдая за определенной линией шины ЦП при сбросе системы, и 8087 соответствующим образом корректирует свою внутреннюю очередь команд. Избыточное дублирование оборудования очереди предварительной выборки в ЦП и сопроцессоре неэффективно с точки зрения энергопотребления и общей площади кристалла, но оно позволило интерфейсу сопроцессора использовать очень мало выделенных выводов IC, что было важно. В то время, когда был представлен 8086, который определял интерфейс сопроцессора, пакеты IC с более чем 40 выводами были редкими, дорогими и сталкивались с такими проблемами, как чрезмерная емкость выводов, основной фактор ограничения для скорости передачи сигналов.

Коды операций сопроцессора кодируются 6 битами по 2 байта, начиная с escape-последовательности:

 ┌───────────────────────┐ │ 1101 1xxx │ mmxx xrrr │ └───────────┴───── ──────

Первые три бита «x» - это первые три бита кода операции с плавающей запятой. Затем два бита «m», затем три последних бита кода операции с плавающей запятой, за которыми следуют три бита «r». Биты «m» и «r» определяют информацию о режиме адресации.[13]

Прикладные программы должны были быть написаны так, чтобы использовать специальные инструкции с плавающей запятой. Во время выполнения программное обеспечение могло обнаружить сопроцессор и использовать его для операций с плавающей запятой. При обнаружении отсутствия аналогичные функции с плавающей запятой должны были быть вычислены в программном обеспечении, или весь сопроцессор можно было эмулировать в программном обеспечении для более точной числовой совместимости.[7]

Регистры

Упрощенная микроархитектура 8087

Семейство x87 не использует напрямую адресуемый регистр установить такие как основные регистры процессоров x86; вместо этого регистры x87 образуют восьмиуровневую глубину куча структура[14] от st0 до st7, где st0 - вершина. Инструкции x87 работают, вставляя, вычисляя и выталкивая значения в этот стек. Однако двоичные операции, такие как FADD, FMUL, FCMP и т. Д., Могут либо неявно используйте самые верхние st0 и st1 или можете использовать st0 вместе с явный операнд или регистр памяти; регистр st0 может, таким образом, использоваться как аккумулятор (т. е. как комбинированный адресат и левый операнд) и также может быть заменен любым из восьми регистров стека с помощью инструкции FXCH stИкс (коды D9C8 – D9CFчас). Это позволяет использовать стек x87 в качестве семи свободно адресуемых регистров плюс аккумулятор. Это особенно актуально на суперскалярный процессоры x86 (Pentium от 1993 г. и позже), где эти инструкции обмена оптимизированы до штрафа за нулевой тактовый сигнал.

Стандарт IEEE с плавающей запятой

Когда Intel разрабатывала 8087, она стремилась создать стандартный формат с плавающей запятой для будущих проектов. Важным аспектом 8087 с исторической точки зрения было то, что он стал основой для IEEE 754 стандарт с плавающей запятой. 8087 не реализовал возможный стандарт IEEE 754 во всех его деталях, поскольку стандарт не был завершен до 1985 года, но 80387 сделал. 8087 имел два основных 32 /64-битный типы данных с плавающей запятой и дополнительные расширенный 80-битный внутренний временный формат (который также может храниться в памяти) для повышения точности больших и сложных вычислений. Помимо этого, 8087 предлагал 80-битный / 18-значный упакованный BCD (двоично-десятичная дробь ) и 16-, 32- и 64-битные целочисленные типы данных.[14]

8087 типов данных
79...71...67...63...50...31...22...15...00(битовая позиция)
±ЭкспонентаДробная часть80-битное реальное значение повышенной точности
±ЭкспонентаДробная часть64-битное реальное значение двойной точности
±ЭкспонентаДробная часть32-битный реальный с одинарной точностью
±BCD целое число18-значное десятичное целое число
±Целое число64-битное двоичное целое число
±Целое число32-битное двоичное целое число
±Целое число16-битное двоичное целое число

бесконечность

8087 ручки бесконечность ценности либо аффинное замыкание или же проективное замыкание (выбирается регистром статуса). При аффинном замыкании положительные и отрицательные бесконечности рассматриваются как разные значения. При проективном замыкании бесконечность рассматривается как представление без знака для очень маленьких или очень больших чисел.[15] Эти два метода обработки бесконечности были включены в черновую версию IEEE 754 стандарт с плавающей запятой. Однако проективное замыкание (проективно расширенная система действительных чисел ) был исключен из более позднего официального выпуска IEEE 754-1985. 80287 сохранил проективное замыкание в качестве опции, но 80387 и последующие процессоры с плавающей запятой (включая 80187) поддерживали только аффинное замыкание.

Сопроцессорный интерфейс

8087 отличался от последующих сопроцессоров Intel тем, что был напрямую подключен к шинам адреса и данных. 8087 искал инструкции, которые начинались с последовательности «11011», и действовал в соответствии с ними, немедленно запрашивая DMA у основного ЦП по мере необходимости для доступа к операндам памяти длиной более одного слова (16 бит), затем немедленно передавая управление шиной обратно основному ЦП. . Сопроцессор не приостановить выполнение программы до тех пор, пока инструкция сопроцессора не будет завершена, и программа должна была явно синхронизировать два процессора, как объяснено выше (в "Дизайн и развитие "Раздел"). Существовала потенциальная проблема сбоя, если инструкция сопроцессора не могла декодировать ту, которую сопроцессор понимал. Более поздние сопроцессоры Intel не подключались к шинам таким же образом, но получали инструкции через порты ввода-вывода главного процессора. Это привело к сокращению времени выполнения, но потенциальной проблемы сбоя удалось избежать, поскольку главный процессор проигнорирует инструкцию, если сопроцессор откажется ее принять. 8087 смог определить, был ли он подключен к 8088 или 8086, отслеживая данные. шина во время цикла сброса.

Теоретически 8087 мог работать одновременно, а 8086/8 обрабатывал дополнительные инструкции. На практике существует вероятность сбоя программы, если сопроцессор выдает новую команду до того, как завершится последняя. Ассемблер автоматически вставлял команду FWAIT после каждого кода операции сопроцессора, вынуждая 8086/8 останавливать выполнение до тех пор, пока 8087 не сигнализировал о завершении.[16] Это ограничение было снято с более поздних разработок.

Модели и вторые источники

Распиновка математического сопроцессора Intel 8087

Сопроцессоры Intel 8087 были изготовлены в двух вариантах: один с керамическим паяным сбоку DIP (CerDIP) и один в герметичном DIP (PDIP), и были разработаны для работы в следующих температурных диапазонах:

  • Префиксы C, D, QC и QD: от 0 ° C до +70 ° C (коммерческое использование).
  • Префиксы LC, LD, TC и TD: от −40 ° C до +85 ° C (промышленное использование).
  • Префиксы MC и MD: от -55 ° C до +125 ° C (для использования в военных целях).

Все модели 8087 имели 40-контактный ОКУНАТЬ пакет и работал от 5 вольт, потребляя около 2,4 Вт. В отличие от более поздних сопроцессоров Intel, 8087 должен был работать с той же тактовой частотой, что и основной процессор.[7] Суффиксы в номере детали обозначают тактовую частоту:

8087 тактовых частот[6][14]
Номер моделиЧастота
Intel 80875 МГц
Intel 8087-110 МГц
Intel 8087-28 МГц
Intel 8087-34 МГц
Intel 8087-66 МГц

Часть была второй источник к AMD как AMD 8087[2] и по Cyrix как Cyrix 8087.[3]Клон K1810WM87 из 8087 производился в Советский союз.[17]

Преемники

Так же, как процессоры 8088 и 8086 были заменены более поздними компонентами, был заменен и 8087. Другие сопроцессоры Intel были 80287, 80387, а 80187. Начиная с 80486, более поздние процессоры Intel не использовали отдельный сопроцессор с плавающей запятой; практически все они включали его в матрицу главного процессора, за значительным исключением 80486SX, который был модифицированным 80486DX с отключенным FPU. В 80487 был на самом деле полномасштабным 80486DX чип с дополнительным штифтом. При установке отключил процессор 80486SX. В 80486DX, Pentium, и более поздние версии процессоров включают в себя функции с плавающей точкой в ​​ядре ЦП.

Рекомендации

  1. ^ Швец, Геннадий (8 октября 2011 г.). «Модуль с плавающей запятой IBM 8087». CPU Мир. Получено 1 декабря 2011.
  2. ^ а б Швец, Геннадий (8 октября 2011 г.). «Блок AMD 8087 с плавающей запятой». CPU Мир. Получено 1 декабря 2011.
  3. ^ а б Швец, Геннадий (8 октября 2011 г.). "Модуль с плавающей запятой Cyrix 8087". CPU Мир. Получено 1 декабря 2011.
  4. ^ Палмер, Джон Ф. (1980). «Процессор цифровых данных INTEL® 8087» (PDF). AFIPS '80, Труды Национальной компьютерной конференции, 19–22 мая 1980 г.. Анахайм, Калифорния: ACM. С. 887–893. Дои:10.1145/1500518.1500674.
  5. ^ а б "8087". Информация о сопроцессоре. 2007. Архивировано с оригинал 30 сентября 2011 г.. Получено 1 декабря 2011.
  6. ^ а б c «Intel FPU». cpu-collection.de. 2011. Получено 1 декабря 2011.
  7. ^ а б c Мюллер, Скотт (1992). Обновление и ремонт ПК (2-е изд.). Que. С. 395–403. ISBN  0-88022-856-3.
  8. ^ Ширрифф, Кен (май 2020 г.). «Извлечение констант ПЗУ из матрицы математического сопроцессора 8087». righto.com. Самостоятельно опубликовано Кеном Ширриффом. Получено 3 сентября 2020. ПЗУ содержит 16 значений арктангенса, арктанов 2-n. Он также содержит 14 значений журнала, логарифм по основанию 2 из (1 + 2-n). Эти значения могут показаться необычными, но они используются в эффективном алгоритме CORDIC, который был изобретен в 1958 году.
  9. ^ Intel Каталог данных компонентов 1980 г., Номер в каталоге Intel. C-864/280 / 150K / CP, страницы 8-21, 8-28.
  10. ^ Санчес и Кантон 2007, п. 96.
  11. ^ США 4484259, «Шина дроби для использования в числовом процессоре данных» 
  12. ^ США 4270167, «Дуплексная схема синхронизации центрального процессора» 
  13. ^ Лемон, Карен А. (1985). Язык ассемблера и системное программирование для IBM PC и совместимых устройств. Маленький Браун. п. 302. ISBN  978-0-316-52069-0.
  14. ^ а б c Швец, Геннадий (8 октября 2011 г.). «Семейство Intel 8087». CPU Мир. Получено 1 декабря 2011.
  15. ^ Санчес и Кантон 2007, п. 110.
  16. ^ Лемон 1985, п. 300
  17. ^ Фролов, Сергей (10 октября 2006 г.). "Клон i8087 производства СССР". CPU Мир. Получено 1 декабря 2011.

Библиография

  • Санчес, Хулио; Кантон, Мария П. (2007). Программные решения для инженеров и ученых. CRC Press. ISBN  1-4200-4302-1.CS1 maint: ref = harv (связь)

внешняя ссылка