Intel 8087 — Вікіпедія

Intel 8087
Розробник:Intel Редагувати інформацію у Вікіданих
Виробник(и):Intel Редагувати інформацію у Вікіданих
Набір команд:x87 Редагувати інформацію у Вікіданих

Intel 8087, анонсований у 1980 році, був першим співпроцесором з рухомою комою для лінійки мікропроцесорів 8086.[1][2][3] Мікросхема призначалася для прискорення арифметичних операцій з рухомою комою, таких як додавання, віднімання, множення, ділення та квадратний корінь. 8087 також обчислює трансцендентні функції, такі як експоненціальні, логарифмічні або тригонометричні обчислення. Підвищення швидкодії таких обчислень становило приблизно від 20% до понад 500% залежно від конкретного застосування. 8087 міг виконувати близько 50 000 FLOPS[2] і споживав приблизно 2,4 Вт.[3]

Кристал Intel 8087

8087 була передовою інтегральною схемою, яка розсувала межі виробничих технологій того періоду.[джерело?] Для виконання базових операцій на 8087, таких як додавання та віднімання, може знадобитися понад 100 машинних циклів, а деякі команди перевищують 1000 циклів.[4] Мікросхема не має апаратного помножувача і виконує обчислення за алгоритмом CORDIC.

Продажі 8087 пішли угору з виходом комп'ютера IBM PC 1981 року, на системній платі якого був передбачений сокет для співпроцесора. Розробка 8087 призвела до появи стандарту IEEE 754-1985 для арифметики з рухомою комою. Мікросхема могла працювати з тактовою частотою 4,77 (5), 8 і 10 МГц. Пізніше з'явилися співпроцесори x87 для процесорів 80186, 80286, 80386 і 80386SX. Починаючи з 80486DX, співпроцесор для операцій з рухомою комою вбудовується у сам мікропроцесор — за винятком Intel 486SX, де такий співпроцесор або відсутній, або вимкнений (468SX допускають встановлення окремого 80487).

Варіанти

[ред. | ред. код]
Номер моделі Частота Назва моделі (USD)
8087 5 МГц BOX8087 142 долари США
8087-2 8 МГц BOX8087-2 205 доларів США
8087-1 10 МГц BOX8087-1 270 доларів США

Дизайн і розробка

[ред. | ред. код]

До появи 8087 Intel виробляла арифметичний процесор 8231 і процесор 8232 з рухомою комою. Вони були розроблені для використання з 8080 або подібними процесорами та використовували 8-розрядну шину даних. Інтерфейс з хост-системою здійснювався або за допомогою звичайного вводу/виводу (англ. programmed input/output), або через контролер DMA .

8087 спочатку був задуманий Біллом Полманом, менеджером з інжиніринґу фірми Intel, який керував розробкою чіпа 8086. Білл вжив заходів, щоб переконатися, що чіп 8086 може підтримувати математичний чіп, який ще належить розробити.

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

Спочатку дизайн 8087 прохолодно прийняли у Санта-Кларі. Згодом розробку було доручено Intel Israel, а Рафі Наве доручили очолити впровадження чіпа. Палмер, Равенель і Наве отримали патенти на дизайн. [6] Роберт Келер і Джон Бейліс також отримали патент на технологію, за якою виконання деяких інструкції з певним бітовим шаблоном передається співпроцесорові. [7]

8087 мав 65 000 транзисторів і виготовлявся за 4,5-мкм HMOS-техпроцесом (згодом вдосконалено до 3 мкм). Співпроцесор призначався для роботи у тандемі з 8086 або 8088 і надавав близько 60 нових інструкцій . Більшість мнемонік складання 8087 починаються з F, наприклад FADD, FMUL, FCOM тощо, що легко вирізняє їх від інструкцій 8086. Двійкове кодування для всіх інструкцій 8087 починається з бітового шаблону 11011, десяткового 27, такого ж, як символ ASCII ESC, але в бітах вищого порядку байта; подібні префікси інструкцій також іноді називають « escape-кодами ». Мнемоніка інструкції, призначена 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 тактів плюс час обчислення ефективної адреси [від 5 до 12 тактів] для операнда пам’яті [плюс ще 4 такти на 8088] для передавання другого байта слово операнда), після чого центральний процесор починає виконувати наступну інструкцію програми. Таким чином, система з 8087 була здатна до справжньої паралельної обробки, виконуючи одну операцію в цілочисельному ALU головного ЦП, одночасно виконуючи операцію з рухомою комою в співпроцесорі 8087. Оскільки 8086 або 8088 виключно контролювали потік і хронометраж інструкцій і не мали прямого доступу до внутрішнього стану 8087, а також оскільки 8087 міг виконувати лише одну інструкцію за раз, програми для об’єднаної системи 8086/8087 або 8088/8087 повинні були гарантувати, що 8087 мав час для виконання останньої інструкції, наданої їй перед тим, як вона була завершена. Саме для цієї мети існувала інструкція WAIT основного ЦП, і більшість асемблерів неявно вставляли інструкцію WAIT перед викликом більшості інструкцій співпроцесора з рухомою комою.[a] Інструкція WAIT інструкція чекала, поки сигнал −TEST процесора 8086/8088 встановиться на низькому рівні, і цей контакт під'єднувався до виводу BUSY співпроцесора 8087 у всіх системах, які мали 8087.

Оскільки черги попередньої вибірки інструкцій 8086 і 8088 роблять час виконання інструкції не завжди таким же, як час її вибірки, такий співпроцесор, як 8087, не може визначити, коли інструкція сама по собі є наступною інструкцією, яка буде виконана, просто спостерігаючи за шиною процесора. 8086 і 8088 мають два сигнали стану черги, під'єднані до співпроцесора, щоб дозволити співпроцесору синхронізуватися з внутрішнім таймінгом виконання інструкцій ЦП з його черги попередньої вибірки. 8087 підтримує свою власну ідентичну чергу попередньої вибірки, з якої він зчитує коди операцій співпроцесора, які він фактично виконує. Оскільки черги попередньої вибірки 8086 і 8088 мають різні розміри та різні алгоритми керування, 8087 визначає, до якого типу ЦП він під'єднаний, спостерігаючи за певною лінією шини ЦП під час скидання системи, і 8087 відповідно регулює свою внутрішню чергу інструкцій. Надлишкове дублювання схеми черги попередньої вибірки в центральному процесорі та співпроцесорі неефективно з точки зору енергоспоживання та загальної площі кристала, але це дозволило інтерфейсу співпроцесора використовувати дуже мало виділених контактів мікросхеми, що було важливо. У той час, коли був представлений 8086, який визначав інтерфейс співпроцесора, корпуси мікросхем з більш ніж 40 контактами були рідкісними, дорогими та страждали від таких проблем, як надмірна ємність виводів, головний обмежувальний фактор для швидкості сигналізації.

Операційні коди співпроцесора закодовані в 6 біт через 2 байти, починаючи з escape-послідовності:

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

Перші три біти «x» — це перші три біти коду операції з рухомою комою. Потім два біти «m», потім останні три біти коду операції з рухомою комою, а потім три біти «r». Біти "m" і "r" визначають інформацію про режим адресації.[8]

Прикладні програми мали були спеціально написані для використання спеціальних інструкцій з рухомою комою. Під час виконання програмне забезпечення може виявити співпроцесор і використовувати його для операцій з рухомою комою. У разі виявлення відсутності подібні функції обчислюються програмно, або весь співпроцесор можна емулювати програмно для більш точної чисельної сумісності.[9]

Регістри

[ред. | ред. код]
Спрощена мікроархітектура 8087

У сімействі x87 не використовується набір регістрів з прямою адресацією (як у архітектурі команд x86). Замість цього регістри x87 утворюють восьмирівневу стекову структуру, елементи якої позначаються від st0 до st7 (st0 є вершиною). Інструкції x87 працюють, заштовхуючи (push), обчислюючи та витягуючи (pop) значення з цього стеку. Однак, діадні операції, такі як FADD, FMUL, FCMP і так далі, можуть або неявно використовувати верхні st0 і st1, або використовувати st0 разом з явним операндом пам'яті або регістром; таким чином, регістр st0 може використовуватися як акумулятор (тобто як комбінований операнд призначення і лівий операнд), а також може обмінюватися з будь-яким з восьми регістрів стеку за допомогою інструкції FXCH stX (коди D9C8-D9CFh). Це дозволяє використовувати стек 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-бітні цілі типи даних. [10]

8087 типів даних
7 9 ... 7 1 ... 6 7 ... 6 3 ... 5 0 ... 3 1 ... 2 2 ... 1 5 ... 0 0 (позиція біта)
± Експонента дріб 80-бітний реальний розширеної точності
± Експонента дріб 64-розрядний реальний код подвійної точності
± Експонента дріб 32-розрядний реальний код одинарної точності
± BCD Ціле число 18-значне десяткове ціле число
± Ціле число 64-розрядне двійкове ціле число
± Ціле число 32-розрядне двійкове ціле число
± Ціле число 16-розрядне двійкове ціле число

Нескінченність

[ред. | ред. код]

8087 обробляє нескінченні значення за допомогою афінного замикання або проективного замикання (вибирається регістром стану). З афінним замиканням додатні та від’ємні нескінченності розглядаються як різні значення. З проективним замиканням нескінченність розглядається як представлення без знака для дуже малих або дуже великих чисел.[5]:110 Ці два методи обробки нескінченності були включені в чернетку стандарту IEEE 754 з рухомою комою. Однак проективне замикання ( проективно розширена дійсна система чисел ) було вилучено з пізнішого офіційного випуску IEEE 754-1985. 80287 зберіг проективне замикання як опцію, але 80387 і наступні процесори з рухомою комою (включно з 80187) підтримували лише афінне замикання.

Інтерфейс співпроцесора

[ред. | ред. код]

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

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

Наступники

[ред. | ред. код]

Разом з еволюцією 8086/8088 еволюціонував і математичний співпроцесор: спочатку 80C287 (на час випуску Intel перейшла на процес CMOS, звідки й літера «C» у назві), 80187 (для процесорів 80186/88) і 80387. Починаючи з 80486, співпроцесор інтегрується в кристал основного процесора, за винятком 80486SX, який був модифікованим 80486DX з вимкненим FPU. 80487 насправді був повноцінним чипом 80486DX із додатковим контактом. Після встановлення він вимикав ЦП 80486SX.

Нотатки

[ред. | ред. код]
  1. Необов’язково використовувати інструкцію WAIT перед операцією 8087, якщо програма використовує інші засоби для забезпечення того, щоб між виданням чутливих до часу інструкцій 8087 пройшло достатньо часу, щоб 8087 ніколи не міг отримати таку інструкцію, перш ніж завершить попередню. Також необов’язково, якщо WAIT використовується, щоб воно передувало безпосередньо наступній інструкції 8087.

Джерела

[ред. | ред. код]
  1. Palmer, John F. (1980). The INTEL® 8087 Numeric Data Processor (PDF). Anaheim, California: ACM. с. 887—893. doi:10.1145/1500518.1500674.
  2. а б 8087. 2007. Архів оригіналу за 30 вересня 2011. Процитовано 1 грудня 2011.
  3. а б Intel FPU. cpu-collection.de (англ.). 2011. Процитовано 1 грудня 2011.
  4. Intel 8087 Datasheet.
  5. а б Sanchez, Julio; Canton, Maria P. (2007). Software Solutions for Engineers and Scientists (англ.). CRC Press. ISBN 978-1-4200-4302-0.
  6. US 4484259, "Fraction bus for use in a numeric data processor" 
  7. US 4270167, "Duplex central processing unit synchronization circuit" 
  8. а б Lemone, Karen A. (1985). Assembly Language and Systems Programming for the IBM PC and Compatibles (англ.). Little Brown. с. 302. ISBN 978-0-316-52069-0.
  9. Mueller, Scott (1992). Upgrading and repairing PCs (вид. 2nd). Que. с. 395—403. ISBN 0-88022-856-3.
  10. Shvets, Gennadiy (8 жовтня 2011). Intel 8087 family. CPU World. Процитовано 1 грудня 2011.

Зовнішні посилання

[ред. | ред. код]