
Мікрокод і датапас додавання та віднімання з рухомою комою у процесорі Intel 8087
Чип Intel 8087 прискорив додавання з рухомою комою майже в 100 разів і використовував мікрокод, цілочисельний суматор, зсувач, логіку експоненти та 80-бітний тимчасовий реальний формат для додавання та віднімання.
Чому 8087 мав значення
Intel представила 8087 у 1980 році, щоб прискорити операції з рухомою комою в IBM PC та інших системах. Чип підтримував розширені операції, такі як тангенси, квадратні корені та логарифми, але додавання і віднімання показують, як працював датапас. 8087 прискорив додавання майже в 100 разів порівняно з процесором 8086, а складні операції ще більше.
Усередині чипа мікрокод ROM містив 1648 мікроінструкцій. Нижня половина кристала була датапасом, де оброблялися 80-бітні значення. Ключовим блоком був 69-бітний цілочисельний суматор біля центру. Він отримував один аргумент з регістра B, а інший з блоків, таких як тимчасові регістри або регістри стека, а потім відправляв результат у регістр суми.
Блоки датапасу для базової арифметики
Додавання з рухомою комою спочатку вирівнює двійкові крапки, зсунувши значення з меншим показником до тих пір, поки показники не збіжуться. Після того як мантиси додаються як цілі числа, результат може потребувати нормалізації, щоб мантиса починалася з біта 1. Якщо додавання дало зайвий старший біт, значення зсувається вправо, а показник збільшується. Віднімання може дати додатний, від'ємний або нульовий результат, і нормалізація може вимагати великого зсуву вліво. Від'ємна мантиса ставала додатною, а знак змінювався на протилежний; нульовий результат повертав плюс або мінус нуль залежно від ситуації.
Зсувач переміщував 68-бітне значення на довільну кількість позицій вліво або вправо і займав багато місця на кристалі, тому що зсуви мали бути швидкими. Схема підрахунку старших нулів рахувала нульові біти або байти зліва, щоб їх можна було змістити. Перетворювач показника обробляв показники та виявляв переповнення та антипереповнення. Для вирівнювання мікропідпрограма CREATE_DENORM зсувала другий аргумент на різницю показників, передану в регістрі суми.
Регістри, потік мікрокоду та спеціальні значення
Всередині 8087 використовував 80-бітний тимчасовий реальний формат із бітом знака, 15-бітним показником зі зсувом 16383 та 64-бітною мантисою. Вісім регістрів утворювали стек, і кожне значення мало тег: нуль, дійсне, спеціальне або порожнє. Внутрішні тимчасові регістри включали tmpA і tmpB, а також tmpC з 68-бітною мантисою та бітами захисту, округлення та липкості.
Базові математичні операції починалися з адреси мікрокоду 0001, переміщували два аргументи в tmpA і tmpB, а потім викликав ціль, вибрану типом інструкції. Додавання і віднімання виконувалися з адреси 0232. Мікрокод обробляв нульові випадки, порівнював показники, при необхідності міняв аргументи місцями та відстежував зміни знака в защіпці знака. Потім він обирав додавання без знака або віднімання без знака на основі знаків операндів і операції.
На шляху додавання без знака вирівняні мантиси додавалися, переніс викликав зсув на один біт вправо та коригування показника, точність обрізалася для 80, 64 або 32-бітних значень, а показник перевірявся на переповнення або антипереповнення. При відніманні без знака суматор обчислював tmpA мінус tmpB, біти округлення могли встановити молодший біт результату, а обробка старших нулів давала зсуви байтів і бітів. Спільний код також обробляв нескінченності, значення не число, денормалі, нулі, поведінку витягування зі стека та переривання для денормалізованих значень.
Джерела: righto.com
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.