Przystąpiłem do złożenia transcendentalnych funkcji matematycznych biblioteki C z MSVC w trybie fp: strict. Wszystkie wydają się mieć ten sam wzór, oto co się stanie dla sin
.Jak ustalić, czy matematyka C używa SSE2?
Najpierw jest procedura wysyłkowa z pliku o nazwie "disp_pentium4.inc". Sprawdza, czy ustawiono zmienną ___use_sse2_mathfcns
; jeśli tak, wywołuje __sin_pentium4
, w przeciwnym razie wywołuje __sin_default
.
__sin_pentium4
(w "sin_pentium4.asm") rozpoczyna się od przeniesienia argumentu z x87 fpu do rejestru xmm0, wykonuje obliczenia za pomocą instrukcji SSE2 i ładuje wynik z powrotem do fpu.
__sin_default
(w "sin.asm") utrzymuje zmienną na stosie x87 i po prostu wywołuje fsin
.
W obu przypadkach operand jest pchany na stosie x87 i zwracany na nim, dzięki czemu jest on przezroczysty dla osoby dzwoniącej, ale jeśli zdefiniowano ___use_sse2_mathfcns
, operacja jest faktycznie wykonywana w SSE2 zamiast x87.
To zachowanie jest dla mnie bardzo interesujące, ponieważ funkcje transcendentalne x87 są znane z nieco innych zachowań w zależności od implementacji, podczas gdy dany fragment kodu SSE2 powinien zawsze dawać odtwarzalne wyniki.
Czy istnieje sposób, aby ustalić, na pewno, podczas kompilacji lub wykonywania, że ścieżka kodu SSE2 zostanie wykorzystana? Nie jestem biegle piszącym zespołem, więc jeśli dotyczy to pisania jakiegokolwiek zespołu, przykład kodu będzie mile widziany.
W jakim katalogu znajdują się te pliki? –
"f: \ dd \ vctools \ crt_bld \ SELF_X86 \ crt \ prebuild \ tran \ i386 \" - to jest to, co widzę w procesie demontażu, nie mam plików samodzielnie. – Asik
Nie, niemożliwe, przyzwoite pytanie na temat SO ... Czuję zażartą chęć przegłosowania. –