Математически копроцесор
Математически копроцесоре копроцесор за разширяване на набора от инструкции на централния процесор и предоставянето му на функционалността наблок с плаваща запетаяза процесори, които нямат интегриран модул.
Блок с плаваща запетая(илис плаваща запетая; английски floating point unit (FPU) ) е част от процесора за извършване на широк набор от математически операции върху реални числа.
Простите "целочислени" процесори за работа с реални числа и математически операции изискват подходящи поддържащи процедури и време за тяхното изпълнение. Модулът за операции с плаваща запетая поддържа работа с тях на примитивно ниво - зареждането, разтоварването на реално число (към / от специализирани регистри) или математическа операция върху тях се извършва с една команда, поради което се постига значително ускоряване на такива операции.
Съдържание
x87е специален набор от математически инструкции, който е подмножество от процесорната архитектура x86. Той получи това име, защото оригиналните индивидуални математически копроцесорни чипове имаха имена, завършващи на87. Подобно на други разширения на основния набор от инструкции на процесора, тези инструкции не са строго необходими за изграждане на работеща програма, но когато са внедрени в хардуера, те позволяват общите математически задачи да се изпълняват много по-бързо. Например, в набора от инструкцииx87има инструкции за изчисляване на синусови или косинусови стойности.
Intel x86 копроцесори
За процесорите от семейството x86 8086/8088 до 386 модулът с плаваща запетая беше отделен в отделен чип, нареченматематически копроцесор. За да инсталирате копроцесор на компютърната платка, беше осигурен отделен конектор.
Една от схемите за взаимодействие между централния процесор и копроцесора, използвана по-специално в копроцесорите x86, се реализира, както следва:
Започвайки с процесора Intel486DX, модулът с плаваща запетая беше интегриран в процесора и наречен FPU. В линията Intel486SX FPU модулът беше деактивиран (първоначално процесорите с дефектен FPU попаднаха в тази линия). За процесорите Intel486SX беше пуснат и "копроцесор" Intel487SX, но всъщност това беше процесор Intel486DX и при инсталирането му процесорът Intel486SX беше деактивиран.
Въпреки интеграцията, FPU в процесорите i486 е непроменен копроцесор, направен на същия чип, освен това веригата FPU i486 е напълно идентична с копроцесора от предишното поколение 387DX до тактовата честота (половината от честотата на централния процесор). Истинската интеграция на FPU с CPU започна едва с процесорите Pentium MMX.
x86 копроцесори на трети страни
Редица други компании също произвеждат различни несъвместими математически копроцесори, свързани с тях чрез I/O портове или BIOS прекъсвания, но те не са широко използвани.
Компаниите за клонинги произвеждат копроцесори, съвместими с 80287 80387, които работят по-бързо от подобни на Intel. Тези компании включват Cyrix, AMD, Chips & Технологии (C&T). Понякога наборът от инструкции на тези копроцесори се разширява с няколко несъвместими, например аналогът 80287 на C&T съдържа инструкции за работа с вектор от четири стойности с плаваща запетая. Силна подкрепа отдоставчиците на софтуер не са получили тези разширени команди.
Процесорите EMC87 на Cyrix могат да работят както в режим на съвместимост със софтуера Intel 80387, така и в техен собствен несъвместим режим на програмиране. За тях беше осигурена хардуерна съвместимост с гнездото на копроцесора 80387.
В СССР е произведена микросхема (KM) 1810VM87, която е аналог на 8087.
Други платформи
По същия начин дънните платки за персонални компютри, изградени върху процесори Motorola, преди разработването на процесора MC68040 (в който е вграден копроцесорът) от тази компания, съдържаха математически копроцесор. По правило като FPU се използва копроцесор 68881 16 MHz или 68882 25 MHz. Почти всеки съвременен процесор има вграден копроцесор.
Weitek също произвежда математически копроцесори за платформите 68000 и MIPS.
Всички процесори на Intel и AMD, като се започне от 486DX, имат вграден математически копроцесор и не се нуждаят от отделен копроцесор (с изключение на Intel486SX). Въпреки това, терминътx87все още се използва за обозначаване на частта от инструкциите на процесора, която се занимава с изчисления с плаваща запетая; компилаторите могат да използват тези инструкции, за да създадат код, който работи по-бързо от този, който използва библиотечни извиквания за извършване на операции с плаваща запетая.
Инструкциитеx87са съвместими с IEEE-754. Операциитеx87обаче не следват стриктно форматите IEEE-754 поради използването на по-широки регистри. Следователно последователността от аритметични операции може да бъде изпълнена малко по-различно на комплектаx87и на процесор, който стриктно следва формата IEEE-754.
x87организира своите регистри не като масив,като повечето други архитектури, но като регистров стек, който работи на принципа на обратната полска нотация. Това означава, че само горните два регистъра са налични за операции едновременно, а достъпът до другите регистри изисква манипулиране на стека. Въпреки че тази организация е удобна за програмистите, тя затруднява изграждането на ефективенx87код за компилаторите.
Започвайки с Pentium III, изчисленията с помощта на SSE инструкции се извършват с единична точност, а в по-късните версии - с двойна точност IEEE-754 формати. От появата на SSE2, използването наx87е до голяма степен тихо в x86-64 64-битовите архитектури и свързаните с тях 64-битови реализации на операционни системи като Microsoft Windows, Mac OS X, Solaris, FreeBSD и Linux, въпреки че все още се поддържа добре за пълна съвместимост с по-стари приложения.
Формати на данни
Вътре в FPU числата се съхраняват в 80-битов формат с плаваща запетая, за запис или четене от паметта те могат да се използват:
- Реални числа в три формата: кратък (32 бита), дълъг (64 бита) и разширен (80 бита).
- Цели двоични числа в три формата: 16, 32 и 64 бита.
- Пакетирани цели десетични числа (BCD) – Максималната дължина на числото е 18 пакетирани десетични цифри (72 бита).
FPU поддържа и специални цифрови стойности:
- Денормализираните реални числа са числа, които са по-малки от минималното нормализирано число. Когато такава стойност се формира в някой стеков регистър, се формира специална стойност (10) в регистровия таг TWR, съответстващ на този регистър.
- Възниква безкрайност (положителна и отрицателна).при деление на нула с ненулева стойност, както и при преливане. Когато такава стойност се формира в някой стеков регистър, се формира специална стойност (10) в регистровия таг TWR, съответстващ на този регистър.
- нечисло (англ. not-a-number (NaN)). Има два вида не-числа:
- SNaN (Signaling Non a Number) - сигнализира не-числа. Копроцесорът реагира на появата на това число в регистъра на стека, като повдига изключение за невалидна операция. Копроцесорът не генерира числа на сигнала. Програмистите формират такива числа умишлено, за да предизвикат изключение в правилната ситуация.
- QNaN (Quiet Non a Number) - тихи (тихи) не-числа. Копроцесорът може да генерира тихи не-числа в отговор на определени изключения, като например число с реална несигурност.
Във FPU има три групи регистри:
- Процесорен стек: регистрира R0..R7. Размерът на всеки регистър: 80 бита.
- Сервизни регистри
- Регистър за състоянието на процесора SWR (Status Word Register) - информация за текущото състояние на копроцесора. Размер: 16 бита.
- Контролният регистър на CWR копроцесора (Control Word Register) е управлението на режимите на работа на копроцесора. Размер: 16 бита.
- Tag word register TWR (Tags Word Register) - контрол върху регистрите R0..R7 (например за определяне на възможността за запис).Размер: 16 бита.
Набор от инструкции за копроцесор
Системата включва около 80 команди. Тяхната класификация:
- Команди за трансфер на данни
- Реални данни
- целочислени данни
- Десетични данни
- Зареждане на константи (0, 1, pi, log2(10), log2(e), lg(2), ln(2))
- Размяна
- Условно препращане (Pentium II/III)