]> git.proxmox.com Git - rustc.git/blame - src/test/run-pass/intrinsics-math.rs
Imported Upstream version 1.0.0~beta.3
[rustc.git] / src / test / run-pass / intrinsics-math.rs
CommitLineData
1a4d82fc 1// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
223e47cc
LB
2// file at the top-level directory of this distribution and at
3// http://rust-lang.org/COPYRIGHT.
4//
5// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8// option. This file may not be copied, modified, or distributed
9// except according to those terms.
10
c34b1796
AL
11
12#![feature(intrinsics, core)]
1a4d82fc
JJ
13
14macro_rules! assert_approx_eq {
15 ($a:expr, $b:expr) => ({
1a4d82fc
JJ
16 let (a, b) = (&$a, &$b);
17 assert!((*a - *b).abs() < 1.0e-6,
18 "{} is not approximately equal to {}", *a, *b);
19 })
20}
223e47cc
LB
21
22mod rusti {
1a4d82fc
JJ
23 extern "rust-intrinsic" {
24 pub fn sqrtf32(x: f32) -> f32;
25 pub fn sqrtf64(x: f64) -> f64;
26 pub fn powif32(a: f32, x: i32) -> f32;
27 pub fn powif64(a: f64, x: i32) -> f64;
28 pub fn sinf32(x: f32) -> f32;
29 pub fn sinf64(x: f64) -> f64;
30 pub fn cosf32(x: f32) -> f32;
31 pub fn cosf64(x: f64) -> f64;
32 pub fn powf32(a: f32, x: f32) -> f32;
33 pub fn powf64(a: f64, x: f64) -> f64;
34 pub fn expf32(x: f32) -> f32;
35 pub fn expf64(x: f64) -> f64;
36 pub fn exp2f32(x: f32) -> f32;
37 pub fn exp2f64(x: f64) -> f64;
38 pub fn logf32(x: f32) -> f32;
39 pub fn logf64(x: f64) -> f64;
40 pub fn log10f32(x: f32) -> f32;
41 pub fn log10f64(x: f64) -> f64;
42 pub fn log2f32(x: f32) -> f32;
43 pub fn log2f64(x: f64) -> f64;
44 pub fn fmaf32(a: f32, b: f32, c: f32) -> f32;
45 pub fn fmaf64(a: f64, b: f64, c: f64) -> f64;
46 pub fn fabsf32(x: f32) -> f32;
47 pub fn fabsf64(x: f64) -> f64;
48 pub fn floorf32(x: f32) -> f32;
49 pub fn floorf64(x: f64) -> f64;
50 pub fn ceilf32(x: f32) -> f32;
51 pub fn ceilf64(x: f64) -> f64;
52 pub fn truncf32(x: f32) -> f32;
53 pub fn truncf64(x: f64) -> f64;
223e47cc
LB
54 }
55}
56
57pub fn main() {
58 unsafe {
59 use rusti::*;
60
970d7e83
LB
61 use std::f32;
62 use std::f64;
63
1a4d82fc
JJ
64 assert_approx_eq!(sqrtf32(64f32), 8f32);
65 assert_approx_eq!(sqrtf64(64f64), 8f64);
223e47cc 66
c34b1796
AL
67 assert_approx_eq!(powif32(25f32, -2), 0.0016f32);
68 assert_approx_eq!(powif64(23.2f64, 2), 538.24f64);
223e47cc 69
1a4d82fc
JJ
70 assert_approx_eq!(sinf32(0f32), 0f32);
71 assert_approx_eq!(sinf64(f64::consts::PI / 2f64), 1f64);
223e47cc 72
1a4d82fc
JJ
73 assert_approx_eq!(cosf32(0f32), 1f32);
74 assert_approx_eq!(cosf64(f64::consts::PI * 2f64), 1f64);
223e47cc 75
1a4d82fc
JJ
76 assert_approx_eq!(powf32(25f32, -2f32), 0.0016f32);
77 assert_approx_eq!(powf64(400f64, 0.5f64), 20f64);
223e47cc 78
1a4d82fc
JJ
79 assert_approx_eq!(fabsf32(expf32(1f32) - f32::consts::E), 0f32);
80 assert_approx_eq!(expf64(1f64), f64::consts::E);
223e47cc 81
1a4d82fc
JJ
82 assert_approx_eq!(exp2f32(10f32), 1024f32);
83 assert_approx_eq!(exp2f64(50f64), 1125899906842624f64);
223e47cc 84
1a4d82fc
JJ
85 assert_approx_eq!(fabsf32(logf32(f32::consts::E) - 1f32), 0f32);
86 assert_approx_eq!(logf64(1f64), 0f64);
223e47cc 87
1a4d82fc
JJ
88 assert_approx_eq!(log10f32(10f32), 1f32);
89 assert_approx_eq!(log10f64(f64::consts::E), f64::consts::LOG10_E);
223e47cc 90
1a4d82fc
JJ
91 assert_approx_eq!(log2f32(8f32), 3f32);
92 assert_approx_eq!(log2f64(f64::consts::E), f64::consts::LOG2_E);
223e47cc 93
1a4d82fc
JJ
94 assert_approx_eq!(fmaf32(1.0f32, 2.0f32, 5.0f32), 7.0f32);
95 assert_approx_eq!(fmaf64(0.0f64, -2.0f64, f64::consts::E), f64::consts::E);
223e47cc 96
1a4d82fc
JJ
97 assert_approx_eq!(fabsf32(-1.0f32), 1.0f32);
98 assert_approx_eq!(fabsf64(34.2f64), 34.2f64);
970d7e83 99
1a4d82fc
JJ
100 assert_approx_eq!(floorf32(3.8f32), 3.0f32);
101 assert_approx_eq!(floorf64(-1.1f64), -2.0f64);
223e47cc
LB
102
103 // Causes linker error
104 // undefined reference to llvm.ceil.f32/64
105 //assert!((ceilf32(-2.3f32) == -2.0f32));
106 //assert!((ceilf64(3.8f64) == 4.0f64));
970d7e83 107
223e47cc
LB
108 // Causes linker error
109 // undefined reference to llvm.trunc.f32/64
110 //assert!((truncf32(0.1f32) == 0.0f32));
111 //assert!((truncf64(-0.1f64) == 0.0f64));
112 }
113
114}