Skip to content

Commit ca983f5

Browse files
author
Steven Gu
committed
Implments intrinsics::copysignf32 and intrinsics::copysignf64.
1 parent 86f4738 commit ca983f5

File tree

2 files changed

+24
-10
lines changed

2 files changed

+24
-10
lines changed

src/shims/intrinsics.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -291,24 +291,26 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
291291
this.binop_ignore_overflow(op, a, b, dest)?;
292292
}
293293

294-
"minnumf32" | "maxnumf32" => {
294+
"minnumf32" | "maxnumf32" | "copysignf32" => {
295295
let a = this.read_scalar(args[0])?.to_f32()?;
296296
let b = this.read_scalar(args[1])?.to_f32()?;
297-
let res = if intrinsic_name.starts_with("min") {
298-
a.min(b)
299-
} else {
300-
a.max(b)
297+
let res = match intrinsic_name {
298+
"minnumf32" => a.min(b),
299+
"maxnumf32" => a.max(b),
300+
"copysignf32" => a.copy_sign(b),
301+
_ => bug!(),
301302
};
302303
this.write_scalar(Scalar::from_f32(res), dest)?;
303304
}
304305

305-
"minnumf64" | "maxnumf64" => {
306+
"minnumf64" | "maxnumf64" | "copysignf64" => {
306307
let a = this.read_scalar(args[0])?.to_f64()?;
307308
let b = this.read_scalar(args[1])?.to_f64()?;
308-
let res = if intrinsic_name.starts_with("min") {
309-
a.min(b)
310-
} else {
311-
a.max(b)
309+
let res = match intrinsic_name {
310+
"minnumf64" => a.min(b),
311+
"maxnumf64" => a.max(b),
312+
"copysignf64" => a.copy_sign(b),
313+
_ => bug!(),
312314
};
313315
this.write_scalar(Scalar::from_f64(res), dest)?;
314316
}

tests/run-pass/floats.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,16 @@ fn main() {
2525
assert_eq!(std::f64::NAN.max(-9.0), -9.0);
2626
assert_eq!((9.0 as f64).min(std::f64::NAN), 9.0);
2727
assert_eq!((-9.0 as f64).max(std::f64::NAN), -9.0);
28+
29+
assert_eq!(3.5_f32.copysign(0.42), 3.5_f32);
30+
assert_eq!(3.5_f32.copysign(-0.42), -3.5_f32);
31+
assert_eq!((-3.5_f32).copysign(0.42), 3.5_f32);
32+
assert_eq!((-3.5_f32).copysign(-0.42), -3.5_f32);
33+
assert!(std::f32::NAN.copysign(1.0).is_nan());
34+
35+
assert_eq!(3.5_f64.copysign(0.42), 3.5_f64);
36+
assert_eq!(3.5_f64.copysign(-0.42), -3.5_f64);
37+
assert_eq!((-3.5_f64).copysign(0.42), 3.5_f64);
38+
assert_eq!((-3.5_f64).copysign(-0.42), -3.5_f64);
39+
assert!(std::f64::NAN.copysign(1.0).is_nan());
2840
}

0 commit comments

Comments
 (0)