File tree 2 files changed +12
-0
lines changed
library/core/src/num/dec2flt
2 files changed +12
-0
lines changed Original file line number Diff line number Diff line change @@ -8,6 +8,17 @@ pub use fpu_precision::set_precision;
8
8
// round to 80 bits causing double rounding to happen when values are eventually represented as
9
9
// 32/64 bit float values. To overcome this, the FPU control word can be set so that the
10
10
// computations are performed in the desired precision.
11
+ //
12
+ // Note that normally, it is Undefined Behavior to alter the FPU control word while Rust code runs.
13
+ // The compiler assumes that the control word is always in its default state. However, in this
14
+ // particular case the semantics with the altered control word are actually *more faithful*
15
+ // to Rust semantics than the default -- arguably it is all the code that runs *outside* of the scope
16
+ // of a `set_precision` guard that is wrong.
17
+ // In other words, we are only using this to work around <https://github.com/rust-lang/rust/issues/114479>.
18
+ // Sometimes killing UB with UB actually works...
19
+ // (If this is used to set 32bit precision, there is still a risk that the compiler moves some 64bit
20
+ // operation into the scope of the `set_precision` guard. So it's not like this is totally sound.
21
+ // But it's not really any less sound than the default state of 80bit precision...)
11
22
#[ cfg( all( target_arch = "x86" , not( target_feature = "sse2" ) ) ) ]
12
23
mod fpu_precision {
13
24
use core:: arch:: asm;
Original file line number Diff line number Diff line change @@ -51,6 +51,7 @@ impl Number {
51
51
/// There is an exception: disguised fast-path cases, where we can shift
52
52
/// powers-of-10 from the exponent to the significant digits.
53
53
pub fn try_fast_path < F : RawFloat > ( & self ) -> Option < F > {
54
+ // Here we need to work around <https://github.com/rust-lang/rust/issues/114479>.
54
55
// The fast path crucially depends on arithmetic being rounded to the correct number of bits
55
56
// without any intermediate rounding. On x86 (without SSE or SSE2) this requires the precision
56
57
// of the x87 FPU stack to be changed so that it directly rounds to 64/32 bit.
You can’t perform that action at this time.
0 commit comments