stringtranslate.com

Интел 8087

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

Intel 8087 кристалл

8087 была усовершенствованной интегральной схемой, расширяющей границы производственных технологий того периода. [ требуется ссылка ] Базовые операции на 8087, такие как сложение и вычитание, могут потребовать более 100 машинных циклов для выполнения, а некоторые инструкции превышают 1000 циклов. [8] В чипе отсутствует аппаратный умножитель, и он реализует вычисления с использованием алгоритма CORDIC . [9]

Продажи 8087 значительно возросли, когда в материнскую плату IBM PC 1981 года был включен сокет сопроцессора . Разработка 8087 привела к стандарту IEEE 754-1985 для арифметики с плавающей точкой. Доступные версии скорости были 4,77 (5), 8 и 10 МГц. [10] Позже появились сопроцессоры x87 для процессоров 80186 , 80286 , 80386 и 80386SX . Начиная с 80486DX , процессоры Intel x86 имели встроенные сопроцессоры с плавающей точкой; функции с плавающей точкой были интегрированы с процессором. Процессоры Intel 486SX имеют отключенный или отсутствующий блок с плавающей точкой, но допускают отдельный 80487.

Intel 80186 и связанные с ним продукты были прекращены 30 марта 2007 года для заказов и 28 сентября 2007 года для поставок. [11]

Варианты

  1. ^ Предлагаемая цена за единицу

Проектирование и разработка

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

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

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

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

8087 имел 65 000 транзисторов и был изготовлен как 4,5 мкм (затем уменьшен до 3 мкм) схема обедненной нагрузки HMOS . Он работал в тандеме с 8086 или 8088 и представил около 60 новых инструкций . Большинство мнемоник ассемблера 8087 начинаются с F, например, FADD, FMUL, FCOM и т. д., что делает их легко отличимыми от инструкций 8086. Двоичные кодировки для всех инструкций 8087 начинаются с битовой комбинации 11011, десятичного 27, того же, что и символ ASCII ESC, хотя и в битах более высокого порядка байта; подобные префиксы инструкций также иногда называют « кодами управления ». Мнемоника инструкций, назначенная Intel для этих инструкций сопроцессора, — «ESC». 8087 был дорогим и сложным в производстве с низким выходом. Кроме того, он сильно нагревался, что вынудило Intel использовать более дорогой керамический корпус для улучшения отвода тепла.

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

Основная программа ЦП продолжала выполняться, пока 8087 выполнял инструкцию; с точки зрения основного ЦП 8086 или 8088 инструкция сопроцессора занимала столько же времени, сколько обработка кода операции и любого цикла операнда памяти (2 такта без операнда, 8 тактов плюс время расчета EA [от 5 до 12 тактов] для операнда памяти [плюс еще 4 такта на 8088], чтобы передать второй байт слова операнда), после чего ЦП начинал выполнять следующую инструкцию программы. Таким образом, система с 8087 была способна к настоящей параллельной обработке, выполняя одну операцию в целочисленном АЛУ основного ЦП и в то же время выполняя операцию с плавающей точкой в ​​сопроцессоре 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 есть два сигнала состояния очереди, подключенных к сопроцессору, чтобы позволить ему синхронизироваться с внутренним временем выполнения инструкций ЦП из его очереди предварительной выборки. 8087 поддерживает свою собственную идентичную очередь предварительной выборки, из которой он считывает коды операций сопроцессора, которые он фактически выполняет. Поскольку очереди предварительной выборки 8086 и 8088 имеют разные размеры и разные алгоритмы управления, 8087 определяет, к какому типу ЦП он подключен, наблюдая за определенной линией шины ЦП при сбросе системы, и 8087 соответствующим образом настраивает свою внутреннюю очередь инструкций. Избыточное дублирование аппаратного обеспечения очереди предварительной выборки в ЦП и сопроцессоре неэффективно с точки зрения энергопотребления и общей площади кристалла, но оно позволило интерфейсу сопроцессора использовать очень мало выделенных выводов ИС, что было важно. В то время, когда был представлен 8086, который определил интерфейс сопроцессора, корпуса ИС с более чем 40 выводами были редки, дороги и страдали от таких проблем, как чрезмерная емкость выводов, что было основным ограничивающим фактором для скоростей сигнализации.

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

┌───────────┬────────────┐ │ 1101 1xxx │ ммxx xrrr │ └───────────┴────────────┘

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

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

Регистры

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

Семейство x87 не использует набор регистров с прямой адресацией , такой как основные регистры процессоров x86; вместо этого регистры x87 образуют восьмиуровневую глубокую стековую структуру [19] в диапазоне от st0 до st7, где st0 является вершиной. Инструкции x87 работают путем помещения, вычисления и извлечения значений из этого стека. Однако диадические операции, такие как FADD, FMUL, FCMP и т. д., могут либо неявно использовать самые верхние st0 и st1, либо могут использовать st0 вместе с явным операндом памяти или регистром; таким образом, регистр st0 может использоваться как аккумулятор ( т. е. как объединенный целевой и левый операнд), а также может обмениваться с любым из восьми регистров стека с помощью инструкции, называемой FXCH st X (коды D9C8–D9CF h ). Это делает стек 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-битные целочисленные типы данных. [19]

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

8087 обрабатывает бесконечные значения либо с помощью аффинного замыкания , либо с помощью проективного замыкания (выбирается регистром состояния). При аффинном замыкании положительные и отрицательные бесконечности рассматриваются как разные значения. При проективном замыкании бесконечность рассматривается как беззнаковое представление для очень малых или очень больших чисел. [20] Эти два метода обработки бесконечности были включены в черновую версию стандарта 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 не подаст сигнал о завершении. [21] Это ограничение было снято в более поздних разработках.

Преемники

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

Ссылки

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

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

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