Sono entrato nell'assemblaggio delle funzioni matematiche trascendentali della libreria C con MSVC in modalità fp: strict. Sembrano tutti seguire lo stesso schema, ecco cosa succede per sin
.Come determinare se C matematica utilizza SSE2?
Prima c'è una routine di invio da un file chiamato "disp_pentium4.inc". Controlla se è stata impostata la variabile ___use_sse2_mathfcns
; in tal caso, chiama __sin_pentium4
, altrimenti chiama __sin_default
.
__sin_pentium4
(in "sin_pentium4.asm") inizia trasferendo l'argomento da x87 fpu al registro xmm0, esegue il calcolo utilizzando le istruzioni SSE2 e carica nuovamente il risultato in fpu.
__sin_default
(in "sin.asm") mantiene la variabile sullo stack x87 e chiama semplicemente fsin
.
Quindi, in entrambi i casi, l'operando viene inserito nello stack x87 e riportato su di esso, rendendolo trasparente al chiamante, ma se è stato definito ___use_sse2_mathfcns
, l'operazione viene effettivamente eseguita in SSE2 anziché in x87.
Questo comportamento è molto interessante per me perché le funzioni trascendentali x87 sono famose per avere comportamenti leggermente diversi a seconda dell'implementazione, mentre un dato pezzo di codice SSE2 dovrebbe sempre fornire risultati riproducibili.
C'è un modo per determinare per certo, in fase di compilazione o in fase di esecuzione, che verrà utilizzato il percorso del codice SSE2? Non sono abile a scrivere assembly, quindi se ciò comporta la scrittura di un assembly, un esempio di codice sarebbe apprezzato.
In che directory si trovano questi file? –
"f: \ dd \ vctools \ crt_bld \ SELF_X86 \ crt \ prebuild \ tran \ i386 \" - questo è proprio quello che vedo nel disassemblaggio, non ho i file stessi. – Asik
Nah, impossibile, una domanda decente su SO ... Sento un imbarazzante bisogno di andare avanti. –