PowerPC GCC инструкции с плавающей запятой - PullRequest
0 голосов
/ 21 ноября 2018

В настоящее время я занимаюсь разработкой для платы MPC5777 с ядрами e200z7.Большинство вещей идет хорошо, но я застрял с проблемой, которая уже действительно раздражает меня.Я пытаюсь использовать операции с плавающей запятой над частями своего кода, используя поддержку встроенного оборудования.Мой набор инструментов - GCC 6.3 (powerpc-gcc), для которого я использую следующие флаги:

ASFLAGS_BASE = -g -a32 -mbooke -me500 --fatal-warnings

ARCH_FLAGS   = -mpowerpc-gpopt -mfprnd -misel -m32 -mhard-float -mabi=spe -mmfpgpr -mfloat-gprs=single

Обратите внимание на флаг -mfloat-gprs=single.Это то, что вызывает проблемы.

Когда я использую -mfloat-gprs=single, я не могу правильно скомпилировать вещи, так как некоторые функции не реализованы:

undefined reference to `__extendsfdf2`,
undefined reference to `__adddf3`,
undefined reference to `__divdf3`,

- среди других.

Теперь, если я скомпилирую, используя -mfloat-gprs=double, он дойдет до конца и сгенерирует все мои исполняемые файлы.НО, использование этого флага также генерирует дополнительные функции, не реализованные в e200z7.Я не могу сказать наверняка все из них, так как код становится больше, и практически невозможно отследить все сгенерированные сборки.Например, в тот момент, когда мое выполнение застревает, когда оно достигает инструкции efscfd, которая реализуется ядром e500, которое поддерживает двойную точность с плавающей запятой, но не для e200, которое имеет поддержку только одинарной точности.

Итак, любой совет здесь был бы удивительно желанным!

Заранее спасибо,

1 Ответ

0 голосов
/ 28 ноября 2018

В случае, если у кого-то возникнет подобная проблема, я исправил ее с помощью трех флагов:

-mfloat-gprs=single -Wdouble-promotion -fsingle-precision-constant

Что они делают: -mfloat-gprs=single сообщает компиляторуиспользуйте регистр общего назначения для операций с плавающей запятой вместо регистров с плавающей запятой.= single означает, что он имеет одинарную точность

-Wdouble-promotion включает предупреждение компилятора о том, что когда gcc пытается преобразовать один float в двойной float

-fsingle-precision-constant заставляет GCC не преобразовывать одиночный float вdouble float

Я использую -fsingle-precision-constant и -Wdouble-promotion одновременно, чтобы получить 100%, что double не будет использоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...