| Розробник: | Intel |
|---|---|
| Виробник(и): | Intel |
| Набір команд: | x87 |
Intel 8087, анонсований у 1980 році, був першимспівпроцесоромз рухомою комою для лінійки мікропроцесорів8086.[1][2][3] Мікросхема призначалася для прискорення арифметичних операцій з рухомою комою, таких якдодавання,віднімання,множення,ділення таквадратний корінь. 8087 також обчислюєтрансцендентні функції, такі якекспоненціальні,логарифмічні аботригонометричні обчислення. Підвищення швидкодії таких обчислень становило приблизно від 20% до понад 500% залежно від конкретного застосування. 8087 міг виконувати близько 50 000 FLOPS[2] і споживав приблизно 2,4 Вт.[3]
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]

У сімействі x87 не використовується набір регістрів з прямою адресацією (як у архітектурі команд x86). Замість цього регістри x87 утворюють восьмирівневустекову структуру, елементи якої позначаються від st0 до st7 (st0 є вершиною). Інструкції x87 працюють, заштовхуючи (push), обчислюючи та витягуючи (pop) значення з цього стеку. Однак, діадні операції, такі як FADD, FMUL, FCMP і так далі, можуть або неявно використовувати верхні st0 і st1, або використовувати st0 разом з явним операндом пам'яті або регістром; таким чином, регістр st0 може використовуватися як акумулятор (тобто як комбінований операнд призначення і лівий операнд), а також може обмінюватися з будь-яким з восьми регістрів стеку за допомогою інструкції FXCH stX (коди D9C8-D9CFh). Це дозволяє використовувати стек x87 як сім вільно адресованих регістрів плюс акумулятор. Це особливо актуально для суперскалярних процесорів x86 (Pentium 1993 року і пізніших), де затримка у виконанні цих інструкцій обміну зведена до нуля.
Коли Intel розробляла 8087, вона мала на меті створити стандартний формат числа з рухомою комою для майбутніх проектів. Важливим аспектом 8087 з історичної точки зору було те, що він став основою для стандарту IEEE 754. 8087 не реалізував майбутній стандарт IEEE 754 у всіх його деталях, оскільки стандарт не був завершений до 1985 року, але це зробив80387. 8087 забезпечив два основних32 /64-розрядних типи даних з рухомою комою та додатковий розширений 80-розрядний внутрішній тимчасовий формат (який також міг зберігатися в пам’яті) для підвищення точності великих і складних обчислень. Окрім цього, 8087 пропонував 80-бітний/18-розрядний упакований формат BCD (десятковий двійковий код ) і 16-, 32- та 64-бітні цілі типи даних.[10]
| 8087 типів даних | |||||||||||||||||
| 79 | ... | 71 | ... | 67 | ... | 63 | ... | 50 | ... | 31 | ... | 22 | ... | 15 | ... | 00 | (позиція біта) |
| ± | Експонента | дріб | 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.