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

Див. також

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

Джерела

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