Главная страница
Предыдущая страница (зачем нужно FPU)
FPU (Floating Point Unit)
Регистры FPU (8 штук) реализованы в виде стека: st=st(0), st(1), st(2), st(3), st(4), st(5), st(6), st(7). Когда мы загружаем число в сопроцессор, оно загружается в st(0), а все другие регистры сдвигаются. Не будем допускать переполнения стека сопроцессора. Я не знаю, что при этом происходит, но описание ошибок выходит за рамки этой работы. В регистрах могут храниться данные в следующих форматах:
Короткое вещественное |
Бит 31 – знак мантиссы. Биты 30-23 – 8-битная_экспонента+127
Биты 22-0 – 23-битная_мантисса без первой цифры |
Длинное вещественное |
Бит 63 – знак мантиссы. Биты 62-52 – 11-битная экспонента+1024
Биты 51-0 – 52-битная мантисса без первой цифры |
Супер вещественное |
Бит 79 – знак мантиссы. Биты 78-64 – 15-битная экспонента+16383
Биты 63-0 – 64-битная мантисса с первой цифрой (бит 63 равен 1) |
Размер, точность и пределы различных типов вещественных чисел:
Тип данных |
Бит |
значащие цифры |
пределы |
Короткое вещественное |
4 |
7 |
|
Длинное вещественное |
8 |
15-16 |
|
Супер вещественное |
10 |
19 |
|
Вообще, сопроцессор выполняет все вычисления в расширенном 80-битном формате, а 32- и 64-битные числа используются для обмена с процессором и оперативной памятью
Также в сопроцессоре есть 2 дополнительных регистра:
1) Регистр состояния SR: |
Бит 14 – C3 (условный флаг 3) |
Бит 8 – С0 (условный флаг 0) |
|
2) Регистр управления CR:
биты 11-10 – RC (управление округлением)
биты 9-8 – PC (управление точностью)
бит 5: PM – маска неточного результата
бит 4: UM – маска антипереполнения
бит 3: OM – маска переполнения
бит 2: ZM – маска деления на ноль
бит 1: DM – маска денормализованного операнда
бит 0: IM – маска недействительной операции
Если какая-либо маска равна нулю, то при происхождении действия, соответствующего маске (например, ZM=0, и произошло деление на ноль), программа вылетает. Если исключительное действие было замаскировано (соответствующая маска равна 1), то программа не вылетает
Значение RC |
Способ округления |
0 |
К ближайшему числу |
1 |
К отрицательной бесконечности |
2 |
К положительной бесконечности |
3 |
К нулю |
Биты PC определяют точность результатов команд: fadd, fsub, fsubr, fmul, fdiv, fdivr, fsqrt
Значение PC |
Точность результатов |
0 |
32-битные числа |
2 |
64-битные числа |
3 |
80-битные числа |
Примечание: если команда оканчивается на “p” (например, fstp faddp fmulp) и существует такая же каманда без оканчания “p” (например, fst, fadd, fmul), то она после себя выталкивает из стека st(0)
Следующая страница (команды загрузки и сохранения FPU)