Skip to content
This repository was archived by the owner on Apr 28, 2025. It is now read-only.

Commit 9b6f469

Browse files
author
Peter Michael Green
committed
allow force_eval! to produce a result and use that result to more explicitly force rounding on x87.
1 parent 1606eea commit 9b6f469

File tree

6 files changed

+17
-11
lines changed

6 files changed

+17
-11
lines changed

src/math/fma.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,8 @@ mod tests {
220220

221221
let result = fma(-0.992, -0.992, -0.992);
222222
//force rounding to storage format on x87 to prevent superious errors.
223-
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]force_eval!(result);
223+
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]
224+
let result = force_eval!(result);
224225
assert_eq!(result, -0.007936000000000007,);
225226
}
226227

src/math/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
macro_rules! force_eval {
22
($e:expr) => {
33
unsafe {
4-
::core::ptr::read_volatile(&$e);
4+
::core::ptr::read_volatile(&$e)
55
}
66
};
77
}

src/math/pow.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -484,8 +484,10 @@ mod tests {
484484
let exp = expected(*val);
485485
let res = computed(*val);
486486

487-
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]force_eval!(exp);
488-
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]force_eval!(res);
487+
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]
488+
let exp = force_eval!(exp);
489+
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]
490+
let res = force_eval!(res);
489491
assert!(
490492
if exp.is_nan() {
491493
res.is_nan()

src/math/rem_pio2.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ pub(crate) fn rem_pio2(x: f64) -> (i32, f64, f64) {
5353
let tmp = x as f64 * INV_PIO2 + TO_INT;
5454
// force rounding of tmp to it's storage format on x87 to avoid
5555
// excess precision issues.
56-
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]force_eval!(tmp);
56+
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]
57+
let tmp = force_eval!(tmp);
5758
let f_n = tmp - TO_INT;
5859
let n = f_n as i32;
5960
let mut r = x - f_n * PIO2_1;
@@ -195,25 +196,25 @@ mod tests {
195196
#[test]
196197
fn test_near_pi() {
197198
let arg = 3.141592025756836;
198-
force_eval!(arg);
199+
let arg = force_eval!(arg);
199200
assert_eq!(
200201
rem_pio2(arg),
201202
(2, -6.278329573009626e-7, -2.1125998133974653e-23)
202203
);
203204
let arg = 3.141592033207416;
204-
force_eval!(arg);
205+
let arg = force_eval!(arg);
205206
assert_eq!(
206207
rem_pio2(arg),
207208
(2, -6.20382377148128e-7, -2.1125998133974653e-23)
208209
);
209210
let arg = 3.141592144966125;
210-
force_eval!(arg);
211+
let arg = force_eval!(arg);
211212
assert_eq!(
212213
rem_pio2(arg),
213214
(2, -5.086236681942706e-7, -2.1125998133974653e-23)
214215
);
215216
let arg = 3.141592979431152;
216-
force_eval!(arg);
217+
let arg = force_eval!(arg);
217218
assert_eq!(
218219
rem_pio2(arg),
219220
(2, 3.2584135866119817e-7, -2.1125998133974653e-23)

src/math/rem_pio2f.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ pub(crate) fn rem_pio2f(x: f32) -> (i32, f64) {
4646
let tmp = x64 * INV_PIO2 + TOINT;
4747
// force rounding of tmp to it's storage format on x87 to avoid
4848
// excess precision issues.
49-
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]force_eval!(tmp);
49+
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]
50+
let tmp = force_eval!(tmp);
5051
let f_n = tmp - TOINT;
5152
return (f_n as i32, x64 - f_n * PIO2_1 - f_n * PIO2_1T);
5253
}

src/math/sin.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ fn test_near_pi() {
8282
let x = f64::from_bits(0x400921fb000FD5DD); // 3.141592026217707
8383
let sx = f64::from_bits(0x3ea50d15ced1a4a2); // 6.273720864039205e-7
8484
let result = sin(x);
85-
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]force_eval!(result);
85+
#[cfg(all(target_arch = "x86", not(target_feature = "sse2")))]
86+
let result = force_eval!(result);
8687
assert_eq!(result, sx);
8788
}

0 commit comments

Comments
 (0)