Ich trat in den Zusammenbau der transzendentalen mathematischen Funktionen der C-Bibliothek mit MSVC im fp: strict-Modus. Sie alle scheinen dem gleichen Muster zu folgen, hier ist, was passiert für sin
.Wie zu bestimmen, ob C Math SSE2 verwendet?
Zuerst gibt es eine Dispatch-Routine aus einer Datei namens "disp_pentium4.inc". Es prüft, ob die Variable ___use_sse2_mathfcns
gesetzt wurde; wenn ja, ruft __sin_pentium4
, sonst ruft __sin_default
.
__sin_pentium4
(in "sin_pentium4.asm") beginnt mit der Übertragung des Arguments von der x87 fpu in das xmm0-Register, führt die Berechnung mit SSE2-Anweisungen durch und lädt das Ergebnis zurück in den fpu.
__sin_default
(in "sin.asm") behält die Variable auf dem x87-Stack und ruft einfach fsin
.
In beiden Fällen wird der Operand auf den Stack x87 geschoben und zurückgegeben, so dass er für den Aufrufer transparent ist, aber wenn ___use_sse2_mathfcns
definiert ist, wird die Operation tatsächlich in SSE2 und nicht in x87 ausgeführt.
Dieses Verhalten ist sehr interessant für mich, weil die x87 transzendentalen Funktionen dafür bekannt sind, je nach Implementierung etwas unterschiedliche Verhaltensweisen zu haben, während ein gegebener Teil des SSE2-Codes immer reproduzierbare Ergebnisse liefern sollte.
Gibt es eine Möglichkeit, entweder beim Kompilieren oder während der Laufzeit festzustellen, ob der SSE2-Codepfad verwendet wird? Ich bin nicht in der Lage, Assembly zu schreiben, wenn also eine Assembly geschrieben wird, wäre ein Codebeispiel wünschenswert.
In welchem Verzeichnis befinden sich diese Dateien? –
"f: \ dd \ vctools \ crt_bld \ SELF_X86 \ crt \ vorkompilierte \ tran \ i386 \" - das ist genau das, was ich im Zerlegen sehen, ich habe nicht die Dateien selbst. – Asik
Nein, unmöglich, eine anständige Frage auf SO ... Ich fühle mich eine peinliche upvote drängen. –