Типы данных дополнения больше, чем слово - PullRequest
0 голосов
/ 11 декабря 2011

Как загружаются большие типы данных (Double / Float) в регистры для арифметических операций? Могут ли регистры содержать больше, чем размер слова? Если для загрузки результата в третий регистр можно добавить только 2 регистра, то что произойдет с типами данных, превышающими один регистр?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2012

Во-первых, ЦП обычно имеют отдельные файлы регистров для целых чисел и чисел с плавающей запятой.

В 80-х годах несколько процессоров пытались использовать единое пространство регистров, но обнаружили, что это узкое место пропускной способности.Поскольку операции с плавающей запятой почти всегда являются многоцикловыми, и всегда имеется достаточное количество смешанного управления потоком на основе целых чисел, более эффективно иметь одновременный доступ к отдельным пространствам регистров.

Во-вторых, для некоторых архитектурФайлы регистров с плавающей запятой - это все 80-битные расширенные числа с плавающей запятой ("long double" в C).Двойные и плавающие числа расширяются до этого формата при загрузке, а расширенный формат округляется и усекается при сохранении.

Для целочисленных операций это зависит от архитектуры.Поскольку 64-битная версия была запоздалой для x86, она перекрывает 8-битные (AL и AH), 16-битные (AX), 32-битные (EAX) и 64-битные (RAX) все в одном физическом регистрек каждому обращаются разные режимы адресации.С другой стороны, некоторые архитектуры RISC рассматривают числа в регистрах как 64-битные для операций MOST, заботясь только о размере слова в загрузках и хранилищах.

0 голосов
/ 12 декабря 2011

Например, в SPARCv8 ABI 64-битные двойные числа загружаются в два 32-битных регистра, а операции FP работают с двумя регистрами одновременно. fsqrtd %f10, %f8 принимает значение в% f10:% f11 и записывает полученный результат в% f8:% f9. На x86_32 вы можете наблюдать нечто подобное при выполнении умножений 32x32-> 64, где результат будет в edx: eax (или около того). То же самое с умножением 16x16-> 32 в режиме 286, где результат переходит к dx: ax.

...