libsoxr в платформе Windows x64 с встроенным asm не компилируется

Я пытаюсь скомпилировать libsoxr (он получен из библиотеки libsox командой Audacity team). Я могу скомпилировать osx 32, osx 64 и win32. Они используют inline asm, а платформа Windows x64 не поддерживает встроенный asm. Проблема заключается в следующем:

#if HAVE_FENV_H
  #include 
#elif defined _MSC_VER
  #define FE_INVALID    1
  #define FE_DIVBYZERO  4
  #define FE_OVERFLOW   8
  #define FE_UNDERFLOW  16
  #define FE_INEXACT    32
  #define FE_ALL_EXCEPT (FE_INEXACT|FE_DIVBYZERO|FE_UNDERFLOW|FE_OVERFLOW|FE_INVALID)
  static __inline int fetestexcept(int excepts)
  {
    short status_word;
    __asm fnstsw status_word
    return status_word & excepts & FE_ALL_EXCEPT;
  }

  static __inline int feclearexcept(int excepts)
  {
    int16_t status[14];
    __asm fnstenv status
    status[2] &= ~(excepts & FE_ALL_EXCEPT);
    __asm fldenv status
    return 0;
  }
#endif

Я не знаю, что делать fnstenv и fldenv . Может кто-нибудь посоветует мне сделать совместимость с x64?

1
добавлено отредактировано
Просмотры: 1
de
Эти инструкции работают над состоянием x87. Windows x64 обычно не использует плавучую точку x87, но инструкции с плавающей запятой SSE.
добавлено автор Bo Persson, источник
Я использую Visual C ++ express edition 2012.
добавлено автор Volkan Ozyilmaz, источник

2 ответы

Предполагая, что вы компилируете компилятор Microsoft, вы можете использовать функции RTL вместо встроенной сборки.

Для проверки определенных флагов состояния с плавающей точкой вызовите _statusfp . Чтобы очистить флаги состояния с плавающей запятой, вызовите _clearfp ,

Чтобы использовать _statusfp , вам нужно перевести из необработанных флагов 8087 в абстрактные флаги, используемые _statusfp .

<�Сильный> Обновление

Код в вопросе представляет собой реализацию небольшой части fenv.h , которая является частью C99. Это необходимо для компилятора MS, поскольку он реализует только C89. На мой взгляд, вам будет намного лучше использовать настоящий компилятор C99. Это будет реализовано с помощью fenv.h .

2
добавлено
Hmm, feclearexcept позволяет очистить выбранные исключения, но _clearfp удаляет все исключения. Я не уверен, что MSVC RTL поддерживает очистку только некоторых исключений. Но было бы странно лишь прояснить некоторые. Уверен, что все вызовы feclearexcept очищают их все.
добавлено автор David Heffernan, источник
fnstsw соответствует _statusfp . Но вам нужно позаботиться о том, чтобы макросы FE_XXX отображались правильно.
добавлено автор David Heffernan, источник
Спасибо за ваш ответ. Я посмотрел fnstenv , и он занимает 28 байтов, но _statusfp возвращает только int (4 бит). В коде они используют только второй 16 бит с побитовой работой. Как вы думаете, мне нужно попробовать _statusfp2? потому что он принимает указатель int unsigned int. Я не могу найти информацию о том, сколько байтов требуется.
добавлено автор Volkan Ozyilmaz, источник
Теперь я вижу, что это. Я могу попробовать _clearfp и посмотреть результаты. Возможно, они очищают только второй 16-битный из-за производительности. Что вы думаете о fnstsw ? Является ли это функцией, которую я могу использовать для одной и той же работы?
добавлено автор Volkan Ozyilmaz, источник
Спасибо, я могу скомпилировать 64-битную версию с компилятором MinGW64 :)
добавлено автор Volkan Ozyilmaz, источник

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

#elif определено _MSC_VER

директива, которая обертывает этот код для вашего компилятора (_M_X64), чтобы не использовать эти встроенные версии сборки - по умолчанию (медленный) код должен вступить в силу.

2
добавлено
Две функции в вопросе являются частью стандарта C? В самом деле? Где в стандарте?
добавлено автор David Heffernan, источник
@Rob А, я сейчас добираюсь! Код в Q представляет собой реализацию fenv.h для MSVC, которая не является компилятором C99. +1
добавлено автор David Heffernan, источник
@Rob Спасибо. На самом деле мне не нужно использовать компилятор MS. Я тоже могу использовать gcc. Это проект dll. У меня нет работы gcc в Windows. Я загрузил компиляторы MinGW64. Существует проблема с cmake и MinGW64. Вы когда-нибудь использовали fenv.h с 64-битной Windows с gcc?
добавлено автор Volkan Ozyilmaz, источник
@Rob Спасибо, Роб :)
добавлено автор Volkan Ozyilmaz, источник
Извините, я не знаю номер страницы! Быстрый Google показывает pubs.opengroup.org/onlinepubs/007904875/functions/… , который имеет следующую ссылку: ISO/IEC 9899: 1999 AFAIK, эти функции также представлены в новых версиях стандартов C & C ++ в 2011 году.
добавлено автор Rob, источник