Обработка стека с плавающей точкой за включенными исключениями с плавающей точкой

Я запустил проект с открытым исходным кодом Осьминожка 3 года назад теперь. Я могу подтвердить по крайней мере 2 вещи из ответов, уже отправленных:

  1. выбирают хорошее имя (как сказано в книга Программного обеспечения с открытым исходным кодом Создания)
  2. выпуск на , Freshmeat помогает

1) Вначале, мне действительно понравилось, когда идея octopussy использование его 8 щупалец поймала все журналы и имела животное для создания "книжного стиля O'Reilly"

, НО

  • ищущий фильм о Джеймсе Бонде возвратов Осьминожки...: (
  • все octopussy доменные имена были зарезервированы так, я выбрал 8pussy.org, который звучит как порносайт...: ((РЕДАКТИРОВАНИЕ: официальный сайт теперь octopussy.pm...:))

2) я сделал свое первое объявление выпуска о [1 114] спустя месяцы Freshmeat 6 после моего первого общедоступного выпуска на [1 115] SourceForge, и я видел различие... переход от 30 загрузок/месяц до 160 загрузок/месяц

[еще 1113], загрузки делают не, обязательно означает больше разработчиков, но это дает больше обратных связей!

6
задан 6 October 2009 в 22:07
поделиться

1 ответ

Пока я тоже ничего не могу найти , Я могу дать некоторые пояснения относительно вероятного ответа:

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

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

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

Это означает, что, скорее всего, стек FPU должен быть в «согласованном» состоянии после возврата, что означает, что вам, вероятно, нужен эквивалент инструкции EMMS.

Почему EMMS? Что ж, если он не поддерживается, он выполняет следующее:

  • очищает стек (который исправляет все оставшиеся аргументы с плавающей запятой)
  • очищает теги стека (что устраняет неиспользуемый стек при выходе из функции с поддержкой MMX)

Если вы хотите поддерживать Pentium 1 или хуже, вы, конечно, можете использовать if () вокруг EMMS и использовать что-нибудь другое.

3
ответ дан 17 December 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: