Intel 8087
Intel 8087 — первый математический сопроцессор для линейки процессоров 8086, реализующий архитектуру набора команд x87 и выпущенный в 1980 году компанией Intel[3][4].
Intel 8087 | |
---|---|
Центральный процессор | |
| |
Производство | 1980 |
Разработчик | Intel |
Производители | |
Частота ЦП | 4—10 MHz |
Технология производства | 3 μm (3 мкм) мкм |
Наборы инструкций | x86, x87 |
Число ядер | 1 |
Разъём | |
Ядра | |
Сопроцессор 8087 был предназначен для увеличения быстродействия при вычислениях с плавающей точкой за счёт ускорения таких операций как сложение, вычитание, деление и извлечение квадратного корня. Он также мог вычислять трансцендентные функции, например экспоненциальную функцию, логарифмы и тригонометрические функции. Прирост производительности от установки сопроцессора составлял от 20 % до 500 %, в зависимости от специфики задач. Intel 8087 имел производительность около 50000 Флопс[3] и потреблял примерно 2,4 Ватт[4]. Выгода от установки 8087 проявлялась только при выполнении математических операций. Компьютеры, использовавшиеся, например, для обработки текстов, не выигрывали от дополнительных расходов (примерно $150[5]) и увеличения потребляемой мощности.
С выпуском фирмой IBM компьютера IBM PC, имевшего сокет для установки сопроцессора, продажи 8087 значительно повысились. Появление сопроцессора привело к созданию стандарта IEEE 754-1985 для арифметики с плавающей точкой. Поздние процессоры Intel, начиная с 80486, имеют встроенный арифметический сопроцессор (за исключением 486SX — для них выпускался сопроцессор 487SX, который можно было не устанавливать).
История создания и устройство
Ранее компанией Intel выпускались микросхемы 8231 «Арифметического процессора» и 8232 «Процессора операций с плавающей точкой». Они были разработаны для использования с процессором 8080 или его аналогами и использовали 8-битную шину данных. Основной процессор взаимодействовал с ними через инструкции ввода-вывода, либо через контроллер DMA[6].
Первые шаги в разработке 8087 предпринял Билл Полман (англ. Bill Pohlman) — менеджер проекта, контролировавший разработку микропроцессора 8086 в Intel. Он обеспечил поддержку математического сопроцессора, который ещё только предстояло разработать, со стороны 8086.
В 1977 году Полман получил «зелёный свет» на разработку математического сопроцессора 8087. Архитектором был назначен Брюс Ревенел (англ. Bruce Ravenel), в качестве помощника архитектора и математика проекта был нанят Джон Палмер (англ. John Palmer). Вместе они разработали новаторскую архитектуру, предусматривавшую использование для промежуточных вычислений 80-битного вещественного числа с 64-битной мантиссой и 16-битной экспонентой, стековую организацию сопроцессора с восемью 80-битными регистрами и набор инструкций, обеспечивающий вычисление большого числа математических функций. 80-битный формат решал ряд известных трудностей организации вычислений и создания программного обеспечения для числовой обработки: было значительно снижено влияние ошибок округления при работе с 64-битными вещественными операндами, а также обеспечена точность вычислений для 18-значных двоично-десятичных и целых 64-битных чисел. Палмер отмечал, что большое влияние на проект оказали публикации Уильяма Кэхэна по вычислениям с плавающей точкой[7].
Руководство Intel в Санта-Кларе прохладно отнеслось к проекту 8087 из-за его высоких требований. В конце концов, разработка была передана в израильское отделение компании, а руководителем, ответственным за изготовление микросхемы был назначен Рафи Неф (англ. Rafi Nave). Палмеру, Ревенелу и Нефу был выдан патент на архитектуру сопроцессора[8]. Роберту Келеру (англ. Robert Koehler) и Джону Бейлису (англ. John Bayliss) был выдан патент на способ передачи сопроцессору инструкций с определенной битовой комбинацией[9].
Сопроцессорор 8087 был выпущен в 1980 году и содержал 45000 транзисторов. Он был изготовлен по техпроцессу 3 мкм. Производство Intel 8087 осуществлялось в Малайзии[4].
Для сопроцессора было введено более 60 новых инструкций, название которых начиналось на «F», для того, чтобы отличать их от целочисленных инструкций Intel 8086. Например, аналоги команд ADD/MUL/CMP, в 8087 выглядели как FADD/FMUL/FCOM. Бинарные кодировки для всех новых инструкций начинались с комбинации битов 11011. Эта комбинация соответствует числу 27 в десятичной системе, совпадающему с кодом ASCII символа ESC, поэтому она иногда называлась Escape-кодом. Код инструкции занимает 6 бит в двух байтах, начинающихся с указанной комбинации:
┌───────────┬───────────┐ │ 1101 1xxx │ mmxx xrrr │ └───────────┴───────────┘
Значения битов:
- x — код инструкции
- m — режим адресации
- r — регистр-операнд или набор регистров, участвующих в вычислении смещения[10]
Приложения должны были быть специально написаны для использования инструкций с плавающей точкой. Во время запуска программа должна была определить наличие сопроцессора и использовать его для этих инструкций; в противном случае, инструкции сопроцессора должны были эмулироваться программно[5].
Регистры
Семейство сопроцессоров x87 вместо непосредственно адресуемых регистров как в архитектуре x86, использует восьмиуровневый стек регистров[11], при этом возможно обращаться к любому элементу стека по индексу от st0 до st7, где st0 — вершина стека. Положение вершины стека задается полем ST регистра состояния. Инструкции при выполнении извлекают операнды с вершины стека и проталкивают результаты в стек. Инструкции с двумя операндами типа FADD, FMUL, FCOM могут оперировать как с двумя верхними элементами стека, так и напрямую брать один из операндов из произвольной позиции стека.
Стандарт IEEE для чисел с плавающей точкой
При создании сопроцессора 8087 компания Intel рассчитывала стандартизировать формат чисел с плавающей точкой для последующих разработок. С исторической точки зрения важность 8087 состоит в том, что он стал основой для стандарта с плавающей точкой IEEE 754. Поскольку стандарт IEEE 754 находился в разработке до 1985 года, сопроцессор 8087 не полностью ему соответствовал, однако уже в сопроцессоре Intel 80387 было достигнуто полное соответствие стандарту. 8087 обеспечивал два основных типа данных с плавающей точкой (32-битный с одинарной точностью и 64-битный с двойной точностью), а также расширенный 80-битный формат для повышения точности больших и сложных расчётов. Помимо этого, 8087 предлагал 80-битный/18-значный двоично-десятичный формат, а также 16, 32 и 64-битные целочисленные типы[11].
Управление бесконечностью
8087 обрабатывает значения бесконечности через аффинное или проективное замыкание (режим выбирается через регистр состояния). В режиме аффинного замыкания положительная и отрицательная бесконечности рассматриваются как разные значения. В режиме проективного замыкания обе бесконечности считаются равными[12]. Эти два режима работы с бесконечностью были предложены в черновике стандарта IEEE 754. Однако из итоговой версии стандарта режим проективного замыкания был исключен. В сопроцессоре 80287 режим проективного замыкания был сохранён как опция, а сопроцессор 80387 и последующие (включая 80187) поддерживали только режим аффинного замыкания.
Подключение сопроцессора
Сопроцессор 8087 отличается от более поздних моделей сопроцессоров Intel тем, что он напрямую подключается к шинам адреса и данных. Процессоры 8086 и 8088 при нахождении инструкций, начинающихся с последовательности '11011' передают управление сопроцессору. Сопроцессор содержит такую же очередь инструкций как и процессор (настройка очереди на параметры процессора 8086 или 8088 производится путём анализа сигнала BHE после аппаратного сброса). Если инструкция требует обмена данными с памятью, процессоры 8088 или 8086 вычисляют их адрес и выполняют фиктивный цикл чтения, игнорируя сами данные. Фактическое чтение данных выполняет сопроцессор. Если требуется чтение более одного слова (байта), сопроцессор запрашивает управление шиной и выполняет чтение оставшейся части операнда, последовательно наращивая адрес[13].
После передачи сопроцессору инструкции основной процессор немедленно приступает к обработке следующей. Поэтому процессоры 8086 или 8088 могут работать параллельно с сопроцессором 8087. Однако, это может привести к двум нежелательным ситуациям:
- если подряд идут несколько инструкций с плавающей точкой, сопроцессор может быть не готов к приёму очередной инструкции
- если основной процессор должен обратиться к тем же данным, которые должна изменить инструкция сопроцессора, он может выполнить это обращение раньше, чем закончится инструкция сопроцессора[14]
Для синхронизации процессора и сопроцессора используется инструкция FWAIT, останавливающая работу основного процессора до появления сигнала от сопроцессора о том, что он завершил обработку. Транслятор с языка ассемблера автоматически вставляет эту инструкцию перед каждой инструкцией сопроцессора 8087[10]. В более поздних моделях сопроцессоров необходимость добавлять инструкцию FWAIT перед каждой инструкцией с плавающей точкой отпала, однако инструкция всё ещё нужна для синхронизации процессоров в случае их обращения к одним и тем же данным[15].
Существует риск отказа программы в случае невозможности декодирования инструкции сопроцессором. В более поздних моделях сопроцессоров Intel не использовалось такое подключение к шинам, а инструкции передавались сопроцессору основным процессором. Хотя это приводило к задержке выполнения инструкций, в то же время это позволяло избежать риска отказа программы, поскольку основной процессор проигнорирует инструкцию, которую не принял сопроцессор.
Варианты исполнения и аналоги
Сопроцессоры Intel 8087 выпускались в керамических корпусах типов CerDIP и 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-выводных DIP корпусах и работали при напряжении 5 Вольт, потребляя около 2,4 Ватт. В отличие от более поздних сопроцессоров Intel, 8087 должен был работать на той же тактовой частоте, что и основной процессор[5]. Суффиксы в обозначении микросхем определяли максимальную тактовую частоту:
Обозначение микросхемы | Частота |
---|---|
Intel 8087 | 5 МГц |
Intel 8087-1 | 10 МГц |
Intel 8087-2 | 8 МГц |
Intel 8087-3 | 4 МГц |
Intel 8087-6 | 6 МГц |
Сопроцессор выпускался по лицензии фирмами AMD под обозначением AMD 8087[1] и Cyrix под обозначением Cyrix 8087[2]. В СССР выпускался аналог 8087 под обозначением К1810ВМ87[16].
Другие поколения сопроцессоров
Как и в случае с процессорами 8088 и 8086, сопроцессор 8087 был вытеснен новыми поколениями сопроцессоров Intel. К ним относятся 80287, 80387 и 80187. Начиная с 80486, процессоры Intel больше не требовали отдельного сопроцессора с плавающей точкой. Практически у всех у них сопроцессор был встроен в ядро процессора. Единственным исключением был процессор 80486SX, который представлял собой модификацию 80486DX с отключённым сопроцессором. Сопроцессор 80487 фактически был полноценным процессором i486DX, имевшим дополнительный контакт. При установке он отключал 80486SX.
Примечания
- Shvets, Gennadiy AMD 8087 floating-point unit (недоступная ссылка). CPU World (8 October 2011). Дата обращения: 1 декабря 2011. Архивировано 25 января 2013 года.
- Shvets, Gennadiy Cyrix 8087 floating-point unit (недоступная ссылка). CPU World (8 October 2011). Дата обращения: 1 декабря 2011. Архивировано 25 января 2013 года.
- 8087 (недоступная ссылка). Coprocessor Dot Info (2007). Дата обращения: 1 декабря 2011. Архивировано 7 июня 2008 года.
- Intel FPU (недоступная ссылка). cpu-collection.de (2011). Дата обращения: 1 декабря 2011. Архивировано 25 января 2013 года.
- Scott Mueller. Upgrading and repairing PCs, second edition. — Que Books, 1992. — С. 395-403. — ISBN 0-88022-856-3.
- Intel Component Data Catalog 1980, Intel catalog no. C-864/280/150K/CP, pages 8-21, 8-28
- Sanchez, Canton, 2007, с. 96.
- Патент США № 4484259
- Патент США № 4270167
- Karen A. Lemone. Assembly Language and Systems Programming for the IBM PC and Compatibles. — Little, Brown and Comp., 1985. — С. 300. — ISBN 0-316-52069-1.
- Shvets, Gennadiy Intel 8087 family (недоступная ссылка). CPU World (8 октября 2011). Дата обращения: 1 декабря 2011. Архивировано 1 сентября 2013 года.
- Sanchez, Canton, 2007, с. 110.
- Михаил Гук. Процессоры Intel: от 8086 до Pentium II. — СПб.: Питер, 1997. — С. 24. — 224 с. — ISBN 5-88782-398-4.
- M. Krishna Kumar. Микропроцессоры и микроконтроллеры/Сопроцессор Замечания к лекциям (недоступная ссылка). Дата обращения: 21 августа 2016. Архивировано 28 мая 2016 года.
- Морс С.П., Алберт Д.Д. Архитектура микропроцессора 80286 = The 80286 architecture. — М.: Радио и связь, 1990. — С. 160. — 304 с. — ISBN 5-256-00466-2.
- Нефедов А.В. Интегральные микросхемы и их зарубежные аналоги: Справочник.. — М.: ИП РадиоСофт, 2001. — Т. 11. — С. 500. — 512 с. — ISBN 5-93037-049-4.
Литература
- Julio Sanchez, Maria P. Canton. Software Solutions for Engineers and Scientists. — CRC Press, 2007. — С. 96. — 944 с. — ISBN 1-4200-4302-1.
Ссылки
- Intel FPU — Математические сопроцессоры Intel 80x87 на сайте cpu-collection.de (англ.)
- Coprocessor.info: 8087 math coprocessor history information and pictures (англ.)
- Datasheet for the Intel 8087 Math Coprocessor (англ.)