Как контролировать, использует ли математика 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? Я не опытный специалист по написанию ассемблера, поэтому, если для этого потребуется написать какую-либо сборку, будет полезен пример кода.