5 // FIXME: this test fails on arm-android because the NDK version 14 is too old.
6 // It needs at least version 18. We disable it on all android build bots because
7 // there is no way in compile-test to disable it for an (arch,os) pair.
9 // Test that the simd floating-point math intrinsics produce correct results.
11 #![feature(repr_simd, platform_intrinsics)]
12 #![allow(non_camel_case_types)]
15 #[derive(Copy, Clone, PartialEq, Debug)]
16 struct f32x4(pub f32, pub f32, pub f32, pub f32);
18 extern "platform-intrinsic" {
19 fn simd_fsqrt<T>(x: T) -> T;
20 fn simd_fabs<T>(x: T) -> T;
21 fn simd_fsin<T>(x: T) -> T;
22 fn simd_fcos<T>(x: T) -> T;
23 fn simd_fexp<T>(x: T) -> T;
24 fn simd_fexp2<T>(x: T) -> T;
25 fn simd_fma<T>(x: T, y: T, z: T) -> T;
26 fn simd_flog<T>(x: T) -> T;
27 fn simd_flog10<T>(x: T) -> T;
28 fn simd_flog2<T>(x: T) -> T;
29 fn simd_fpow<T>(x: T, y: T) -> T;
30 fn simd_fpowi<T>(x: T, y: i32) -> T;
33 fn simd_ceil<T>(x: T) -> T;
34 fn simd_floor<T>(x: T) -> T;
35 fn simd_round<T>(x: T) -> T;
36 fn simd_trunc<T>(x: T) -> T;
39 macro_rules! assert_approx_eq_f32 {
40 ($a:expr, $b:expr) => ({
41 let (a, b) = (&$a, &$b);
42 assert!((*a - *b).abs() < 1.0e-6,
43 "{} is not approximately equal to {}", *a, *b);
46 macro_rules! assert_approx_eq {
47 ($a:expr, $b:expr) => ({
50 assert_approx_eq_f32!(a.0, b.0);
51 assert_approx_eq_f32!(a.1, b.1);
52 assert_approx_eq_f32!(a.2, b.2);
53 assert_approx_eq_f32!(a.3, b.3);
58 let x = f32x4(1.0, 1.0, 1.0, 1.0);
59 let y = f32x4(-1.0, -1.0, -1.0, -1.0);
60 let z = f32x4(0.0, 0.0, 0.0, 0.0);
62 let h = f32x4(0.5, 0.5, 0.5, 0.5);
66 assert_approx_eq!(x, r);
69 assert_approx_eq!(x, r);
72 assert_approx_eq!(x, r);
74 let r = simd_fexp2(z);
75 assert_approx_eq!(x, r);
77 let r = simd_fma(x, h, h);
78 assert_approx_eq!(x, r);
80 let r = simd_fsqrt(x);
81 assert_approx_eq!(x, r);
84 assert_approx_eq!(z, r);
86 let r = simd_flog2(x);
87 assert_approx_eq!(z, r);
89 let r = simd_flog10(x);
90 assert_approx_eq!(z, r);
92 let r = simd_fpow(h, x);
93 assert_approx_eq!(h, r);
95 let r = simd_fpowi(h, 1);
96 assert_approx_eq!(h, r);
99 assert_approx_eq!(z, r);
101 // rounding functions
102 let r = simd_floor(h);
105 let r = simd_ceil(h);
108 let r = simd_round(h);
111 let r = simd_trunc(h);