Как контролировать, использует ли математика C SSE2?

Я вступил в сборку трансцендентных математических функций библиотеки C с MSVC в режиме fp: strict. Кажется, что все они следуют одной и той же схеме, вот что происходит дляsin.

Сначала идет процедура отправки из файла с именем «disp_pentium4.inc». Проверяет, является ли переменная___use_sse2_mathfcns был установлен; если так, звонит__sin_pentium4иначе звонит__sin_default.

__sin_pentium4 (в "sin_pentium4.asm") начинается с передачи аргумента из fpu x87 в регистр xmm0, выполняет вычисления с использованием инструкций SSE2 и загружает результат обратно в fpu.

__sin_default (в "sin.asm") хранит переменную в стеке x87 и просто вызываетfsin.

Таким образом, в обоих случаях операнд помещается в стек x87 и возвращается в него, что делает его прозрачным для вызывающей стороны, но если___use_sse2_mathfcns определяется, операция фактически выполняется в SSE2, а не в x87.

Это поведение очень интересно для меня, потому что трансцендентные функции x87 печально известны тем, что они немного отличаются в зависимости от реализации, в то время как определенный фрагмент кода SSE2 всегда должен давать воспроизводимые результаты.

Есть ли способ точно определить, во время компиляции или во время выполнения, что будет использоваться путь кода SSE2? Я не опытный специалист по написанию ассемблера, поэтому, если для этого потребуется написать какую-либо сборку, будет полезен пример кода.

Ответы на вопрос(3)

Ваш ответ на вопрос