Как выполнялось преобразование с плавающей запятой до изобретения FPU и SSE?

Я пытаюсь понять, как преобразование с плавающей запятой обрабатывается на низком уровне. Итак, насколько я понимаю, это реализовано аппаратно. Так, например, SSE предоставляет инструкцию cvttss2si, которая преобразует число с плавающей запятой в int.

Но у меня вопрос: всегда ли выполнялось преобразование с плавающей запятой таким образом? А как насчет того, чтобы до изобретения FPU и SSE расчет выполнялся вручную с использованием кода сборки?


person John    schedule 27.12.2014    source источник
comment
На Intel 80286 я использовал эмулятор 8087 (EM87.COM) от Рона Кимбалла. Теперь я нашел файл документа на этой странице: docs1.chomikuj.pl/ 1816123580, PL, 0,0, EM87.DOC   -  person Dirk Wolfgang Glomp    schedule 27.12.2014


Ответы (8)


Это зависит от процессора, а за эти годы было огромное количество различных процессоров.

FPU означает «модуль с плавающей запятой». Это более или менее общий термин, который может относиться к аппаратному модулю с плавающей запятой для любой компьютерной системы. Некоторые системы могут иметь операции с плавающей запятой, встроенные в ЦП. У других может быть отдельный чип. А у других может вообще не быть аппаратной поддержки операций с плавающей запятой. Если вы укажете в своем коде преобразование с плавающей запятой, компилятор сгенерирует все инструкции ЦП, необходимые для выполнения необходимых вычислений. В некоторых системах это может быть вызов подпрограммы, которая выполняет любые необходимые битовые манипуляции.

SSE означает «Streaming SIMD Extensions» и относится к семейству процессоров x86. Для процессоров, отличных от x86, нет SSE «до» или «после»; SSE просто не применяется.

person Keith Thompson    schedule 27.12.2014

Преобразование из числа с плавающей запятой в целое число считается достаточно базовой операцией, так что в наборе команд 387 уже была такая инструкция FIST, хотя она не полезна для компиляции конструкции (int)f программ C, поскольку эта инструкция использовала текущий режим округления.

Некоторые наборы команд RISC всегда считали, что выделенная инструкция преобразования из числа с плавающей запятой в целое число была ненужной роскошью и что это можно было сделать с помощью нескольких инструкций, обращающихся к представлению с плавающей запятой IEEE 754. Одна базовая схема может выглядеть как это сообщение в блоге , хотя сообщение в блоге посвящено округлению числа с плавающей запятой до числа с плавающей запятой, представляющего ближайшее целое число.

person Pascal Cuoq    schedule 27.12.2014

До стандартизации арифметики IEEE 754 существовало множество конкурирующих способов выполнения арифметики с плавающей запятой, зависящих от производителя. У них были разные диапазоны, точность и разное поведение в отношении переполнения, потери значимости, нулей со знаком и неопределенных результатов, таких как 0/0 или sqrt (-1).

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

Сегодня все еще существуют программные FPU, в основном во встроенных системах. Не так давно это было обычным явлением для мобильных устройств, но программные FPU по-прежнему являются нормой для небольших систем.

person Dietrich Epp    schedule 27.12.2014

Действительно, операции с плавающей запятой являются проблемой для инженеров по аппаратному обеспечению, поскольку они требуют большого количества оборудования (что приводит к более высокой стоимости конечного продукта) и потребляют много энергии. Есть некоторые архитектуры, которые не содержат модуль с плавающей запятой. Есть также архитектуры, которые не предоставляют инструкций даже для базовых операций, таких как целочисленное деление. Архитектура ARM является примером этого, где вы должны реализовать разделение в программном обеспечении. Кроме того, в этой архитектуре модуль с плавающей запятой является дополнительным сопроцессором. Об этом стоит задуматься, учитывая тот факт, что ARM - это основная архитектура, используемая во встраиваемых системах.

IEEE 754 (стандарт с плавающей запятой, используемый сегодня в большинстве приложений) - не единственный способ представления действительных чисел. Вы также можете представить их в формате с фиксированной точкой. Например, если у вас 32-битная машина, вы можете предположить, что у вас есть десятичная точка между 15 и 16 битами, и выполнять операции, помня об этом. Это простой способ представления чисел с плавающей запятой, и с ним легко справиться с помощью программного обеспечения.

person Paul92    schedule 27.12.2014

Это зависит от реализации компилятора. Вы можете реализовать математику с плавающей запятой практически на любом языке (пример на C: http://www.jhauser.us/arithmetic/SoftFloat.html), и поэтому обычно библиотека времени выполнения компилятора будет включать программную реализацию таких вещей, как математика с плавающей запятой (или, возможно, целевое оборудование всегда поддерживало собственные инструкции для этого - опять же, зависит от на аппаратном обеспечении), а инструкции, предназначенные для FPU или использующие SSE, предлагаются в качестве оптимизации.

person Brad Peabody    schedule 27.12.2014

До появления единиц с плавающей запятой на самом деле не применимо, поскольку некоторые из самых ранних компьютеров, выпущенных еще в 1940-х годах, поддерживали числа с плавающей запятой: wiki - первые электромеханические компьютеры.

На процессорах без оборудования с плавающей запятой операции с плавающей запятой реализованы программно или на некоторых компьютерах в микрокоде, а не полностью аппаратно: wiki - микрокод, или операции могут выполняться отдельными аппаратными компонентами, такими как серия Intel x87: wiki - x87.

person rcgldr    schedule 27.12.2014

Но у меня вопрос: всегда ли выполнялось преобразование с плавающей запятой таким образом?

Нет, на архитектурах, отличных от x86, нет x87 или SSE, поэтому cvttss2si тоже

Все, что вы можете делать с помощью программного обеспечения, вы можете делать и с помощью оборудования, и наоборот.

То же самое с преобразованием числа с плавающей запятой. Если у вас нет аппаратной поддержки, просто попробуйте немного взломать. Здесь нет ничего низкого уровня, поэтому вы можете легко сделать это на C или любом другом языке. На SO уже много решений

person phuclv    schedule 27.12.2014

да. Показатель был изменен на 0 путем сдвига мантиссы, денормализации числа. Если результат был слишком большим для int, генерировалось исключение. В противном случае денормализованное число (за вычетом фракционной части и, возможно, округленное) является целочисленным эквивалентом.

person Dwayne Towell    schedule 27.12.2014