X87

Ця стаття не містить посилань на джерела. Ви можете допомогти поліпшити цю статтю, додавши посилання на надійні (авторитетні) джерела. Матеріал без джерел може бути піддано сумніву та вилучено. (травень 2019)

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)
  • Арифметичні команди
    • Дійсні дані: додавання, віднімання, множення, ділення
    • Цілочисельні дані: додавання, віднімання, множення, ділення
    • Допоміжні арифметичні команди (квадратний корінь, модуль, зміна знака, виділення порядку і мантиси)
  • Трансцендентні команди
    • Тригонометрія: синус, косинус, тангенс, арктангенс
    • Обчислення логарифмів і степенів
  • Команди управління
    • Ініціалізація співпроцесора
    • Робота з середовищем
    • Робота зі стеком
    • Перемикання режимів

Див. також

Джерела

Ця стаття є заготовкою. Ви можете допомогти проєкту, доробивши її. Це повідомлення варто замінити точнішим.