программное обеспечение с плавающей точкой и x87 или sse отключены - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь включить программную плавающую точку в gcc, следуя предложениям в этот вопрос , но я наткнулся на загвоздку:

Флаг -msoft-float вызывает:

/usr/include/c++/4.8.2/bits/basic_string.h: In function ‘long double std::stold(const string&, std::size_t*)’:
/usr/include/c++/4.8.2/bits/basic_string.h:2857:47: error: x87 register return with x87 disabled
   stold(const string& __str, size_t* __idx = 0)
                                               ^

и -mno-sse причины:

/usr/include/c++/4.8.2/bits/basic_string.h: In function ‘float std::stof(const string&, std::size_t*)’:
/usr/include/c++/4.8.2/bits/basic_string.h:2849:46: error: SSE register return with SSE disabled
   stof(const string& __str, size_t* __idx = 0)
                                              ^

Существует пара вопросов , в которых упоминается эта ошибка, но в отношении программирования ядра, которое не помогает.

Все, что происходит в basic_string - это функции, возвращающие числа с плавающей запятой или двойные числа Почему это приводит к сбою компиляции?

Что более важно, что я могу с этим поделать?

Фон

Я обнаружил разницу в поведении приложения C ++ на двух разных платформах:

  • Intel (R) Xeon (R) CPU E5504
  • Процессор Intel (R) Core (TM) i5-3470

Код, скомпилированный изначально на одной машине, работает на другой, но для одного теста поведение зависит от того, на какой машине запущен код.

Разъяснение Исполняемый файл, скомпилированный на компьютере A, ведет себя как исполняемый файл, скомпилированный на компьютере B, когда копируется для запуска на компьютере B и наоборот.

Это может быть неинициализированная переменная или многое другое, но Я подозреваю, что причиной могло быть непереносимое использование плавающей запятой. Возможно, одна машина интерпретирует сборку с плавающей запятой иначе, чем другая? Я хочу проверить свою гипотезу. Я подумал, что если я смогу заставить программу использовать (в идеале строгий IEE 754) программный метод с плавающей запятой, это может подтвердить или исключить это. Это не мой код, и у меня нет желания полностью переписывать его, чтобы проверить это. Перекомпиляция это хорошо, хотя.

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

1 Ответ

2 голосов
/ 22 марта 2019

«Почему это приводит к сбою компиляции?»

Поскольку соответствующий ABI (x87 / x64) определен для возврата значения float в аппаратном плавающем регистре. Очевидно, вам нужен аппаратный с плавающей точкой, чтобы иметь этот регистр.

«Что важнее, что я могу с этим поделать?»

Не очень. В отличие от x87 / x64, ARM имеет ABI софт-FP, поэтому -msoft-float там работает, и это главная причина, по которой GCC все еще имеет софт FP.

...