X87
x87 — це спеціальний набір інструкцій для роботи з математичними обчисленнями, є підмножиною архітектури процесорів x86. Таку назву він отримав, тому що початкові окремі математичні співпроцесорні чипи мали назви, що закінчуються на 87. Як і інші розширення базового набору інструкцій процесора, ці інструкції не є строго необхідними для побудови робочої програми, але загальні математичні завдання вони дозволяють виконувати набагато швидше, коли реалізовані апаратно. Наприклад, у наборі інструкцій x87 присутні команди для розрахунку значень синуса або косинуса.
Опис
Всі процесори Intel і AMD, починаючи з 486DX, мають вбудований математичний співпроцесор, і окремого співпроцесора не потребують (за винятком Intel486SX). Тим не менш, термін x87 все ще використовується для виділення тієї частини інструкцій процесора, яка займається обчисленнями з рухомою комою; компілятори можуть використовувати ці інструкції для генерації коду, який працює швидше, ніж той, що використовує виклики до бібліотек для виконання операцій з рухомою комою.
Інструкції x87 сумісні зі стандартом IEEE 754. Однак, x87 виконують операції не в суворій відповідності з форматами IEEE 754, через використання більш широких регістрів. Тому послідовність арифметичних операцій може виконуватися дещо по-іншому на наборі x87 і на процесорі, який суворо дотримується формату IEEE 754.
x87 організовує свої регістри не як масив, як більшість інших архітектур, а як регістровий стек, що працює за принципом зворотного польського запису. Це означає, що в один момент часу для здійснення операцій доступні тільки два верхніх регістри, а доступ до інших регістрів вимагає маніпуляцій зі стеком. Хоча така організація виходить і зручною для програмістів, вона робить трудомістким побудову ефективного коду x87 для компіляторів.
Починаючи з Pentium III, обчислення за допомогою інструкцій SSE здійснюються з одинарною точністю, а в пізніших версіях — з подвійною точністю форматів IEEE 754. Після появи SSE2, використання x87 значною мірою применшується в 64-розрядних архітектурах x86-64 і пов'язаних з нею 64-бітних реалізаціях операційних систем, таких як Microsoft Windows, Mac OS X, Solaris, FreeBSD та Linux, хоча він як і раніше добре підтримується для повної сумісності зі старими програмами.
Співпроцесори сімейства x87
Для таких процесорів як 8086/88, 186/188, 286, 386, 486 були випущені співпроцесори для операцій з рухомою комою, як правило остання цифра у таких співпроцесорів була 7 (8087, 187, 287, 387, 487). Для установки співпроцесора на платі комп'ютера передбачалось окреме гніздо.
Співпроцесор не є повноцінним процесором, оскільки не вміє виконувати багатьох операцій (наприклад, не вміє працювати з програмою і обчислювати адреси пам'яті), він є всього лише додатком до центрального процесора.
Одна зі схем взаємодії центрального процесора і співпроцесора, використана зокрема в x86, реалізована наступним чином:
- Співпроцесор підключений до шин центрального процесора, а також має декілька спеціальних сигналів для синхронізації процесорів між собою.
- Частина командних кодів центрального процесора зарезервована для співпроцесора, він стежить за потоком команд, ігноруючи інші команди. Центральний процесор, навпаки, ігнорує команди співпроцесора, займаючись тільки обчисленням адреси в пам'яті, якщо команда припускає до неї звернення. Центральний процесор робить цикл фіктивного зчитування, дозволяючи співпроцесору зчитати адресу з адресної шини. Якщо співпроцесору необхідно додаткове звернення до пам'яті (для читання або запису результатів), він виконує його через захоплення шини.
- Після отримання команди і необхідних даних співпроцесор починає її виконання. Поки співпроцесор виконує команду, центральний процесор виконує програму далі, паралельно з обчисленнями співпроцесора. Якщо наступна команда також є командою співпроцесора, процесор зупиняється і чекає завершення виконання співпроцесором попередньої команди.
- Також існує спеціальна команда очікування (FWAIT), що примусово зупиняє центральний процесор до завершення обчислень у співпроцесорі (якщо для продовження програми необхідні їх результати). В даний час[коли?] команда використовується лише для обробки виняткових ситуацій при роботі з рухомою комою, робота процесора і співпроцесора синхронізується прозоро для програміста.
Починаючи з процесора Intel486DX модуль операцій з рухомоюю комою був інтегрований в центральний процесор і названий FPU. У лінійці Intel486SX модуль FPU вимикався (спочатку у цю лінійку потрапляли процесори з бракованим FPU). Для процесорів Intel486SX також випускався «співпроцесор» Intel487SX, але, фактично, він був процесором Intel486DX і при його установці процесор Intel486SX вимикався.
Незважаючи на інтеграцію, FPU в процесорах i486 являє собою незмінний співпроцесор, виконаний на тому ж кристалі, більше того, схема FPU i486 повністю ідентична співпроцесору попереднього покоління 387DX аж до тактової частоти (у два рази меншою, ніж частота центрального процесора). Справжня інтеграція FPU c центральним процесором почалася тільки в процесорах Pentium моделі MMX.
Система команд співпроцесора
Система включає близько 80 команд. Їх класифікація:
- Команди передачі даних
- Дійсні дані
- Цілочисельні дані
- Десяткові дані
- Завантаження констант (0, 1, число Пі, log2 (10), log2 (e), lg (2), ln (2))
- Обмін
- Умовне пересилання (Pentium II / III)
- Команди порівняння даних
- Дійсні дані
- Цілочисельні дані
- Аналіз
- З нулем
- Умовне порівняння (Pentium II / III)
- Арифметичні команди
- Дійсні дані: додавання, віднімання, множення, ділення
- Цілочисельні дані: додавання, віднімання, множення, ділення
- Допоміжні арифметичні команди (квадратний корінь, модуль, зміна знака, виділення порядку і мантиси)
- Трансцендентні команди
- Тригонометрія: синус, косинус, тангенс, арктангенс
- Обчислення логарифмів і степенів
- Команди управління
- Ініціалізація співпроцесора
- Робота з середовищем
- Робота зі стеком
- Перемикання режимів