Sto lavorando su una cassa di ruggine che cambia la modalità di arrotondamento (+ inf, -inf, più vicino o troncato).Quali pass LLVM sono responsabili delle ottimizzazioni in virgola mobile?
Le funzioni che cambiano la modalità di arrotondamento sono scritti utilizzando assembly inline:
fn upward() {
let cw: u32 = 0;
unsafe {
asm!("stmxcsr $0;
mov $0, %eax;
or $$0x4000, %eax;
mov %eax, $0;
ldmxcsr $0;"
: "=*m"(&cw)
: "*m"(&cw)
: "{eax}"
);
}
}
Quando compilo il codice in modalità debug funziona come previsto, ottengo ,3333333333337 per un terzo quando si aggira verso l'infinito positivo, ma quando compilo in modalità di rilascio ottengo lo stesso risultato, indipendentemente dalla modalità di arrotondamento impostata. Immagino che questo comportamento sia dovuto alle ottimizzazioni fatte dal backend LLVM.
Se sapessi quali pass LLVM sono responsabili di questa ottimizzazione, posso disabilitarli poiché non vedo altre soluzioni al momento.
Ho paura che questa informazione possa dipendere molto dalla versione di LLVM (che è gratuita per aggiungere/rimuovere passaggi), e come risultato legato alla versione di 'rustc'. Quale versione di 'rustc' stai usando? Ti dispiace se questo si rompe durante l'aggiornamento? –
Sto usando Rust 1.10 ogni notte. Non mi dispiace se si rompe. Se capisco che cosa sta causando questo comportamento, posso fare un po 'di fatica con un po' di duro lavoro. –
Dopo alcune letture penso che ci siano dei passaggi di programmazione che stanno spostando l'istruzione di divisione prima della chiamata di funzione verso l'alto(). (solo una supposizione), correggimi se sbaglio. –