Хотя я тоже ничего не могу найти, я могу дать некоторые объяснения относительно вероятного ответа:
ABI определяет, что при вызове функции стек должен быть пустым, и он должен быть пустым снова при выходе, если только возвращаемое значение не является значением с плавающей запятой, где он будет единственным элементом в стеке.
Поскольку обработчик исключений должен иметь возможность вернуться в любое место, в этих местах должны соблюдаться некоторые критерии. Вопрос в том, знает ли стек разматыватель о стеке FPU функции, имеющей catch ()? Скорее всего, ответ отрицательный, потому что проще и быстрее создать подходящую точку возврата с фиксированными свойствами, чем включать полный стек FPU в разматывание.
Что приводит к вашей проблеме - обычно при возбуждении исключения компилятор заботится о том, чтобы FPU был пустым, но в обработчике SEH компилятор не имеет ни малейшего представления, что он вызвал вход в другую функцию и поэтому не может позаботиться вещей на всякий случай. (кроме того, что это снова ужасно медленно)
Что означает, что, скорее всего, стек FPU должен быть в своем "непротиворечивом" состоянии по возвращении, что означает, что вам, вероятно, нужен эквивалент инструкции EMMS.
Почему EMMS? Ну, если он не поддерживается, он делает следующее:
- очистить стек (который исправляет все оставшиеся аргументы с плавающей запятой)
- очищает теги стека (исправляет неиспользуемый стек при выходе из функции с поддержкой MMX)
Если вы хотите поддерживать Pentium 1 или хуже, вы, конечно, можете использовать if () вокруг EMMS и использовать что-то другое.
Конечно, никаких гарантий, но я надеюсь, что достаточно объяснил причину вероятного ответа.