// Copyright 2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. // ignore-emscripten // ignore-android // FIXME: this test fails on arm-android because the NDK version 14 is too old. // It needs at least version 18. We disable it on all android build bots because // there is no way in compile-test to disable it for an (arch,os) pair. // Test that the simd floating-point math intrinsics produce correct results. #![feature(repr_simd, platform_intrinsics)] #![allow(non_camel_case_types)] #[repr(simd)] #[derive(Copy, Clone, PartialEq, Debug)] struct f32x4(pub f32, pub f32, pub f32, pub f32); extern "platform-intrinsic" { fn simd_fsqrt(x: T) -> T; fn simd_fabs(x: T) -> T; fn simd_fsin(x: T) -> T; fn simd_fcos(x: T) -> T; fn simd_ceil(x: T) -> T; fn simd_fexp(x: T) -> T; fn simd_fexp2(x: T) -> T; fn simd_floor(x: T) -> T; fn simd_fma(x: T, y: T, z: T) -> T; fn simd_flog(x: T) -> T; fn simd_flog10(x: T) -> T; fn simd_flog2(x: T) -> T; fn simd_fpow(x: T, y: T) -> T; fn simd_fpowi(x: T, y: i32) -> T; } fn main() { let x = f32x4(1.0, 1.0, 1.0, 1.0); let y = f32x4(-1.0, -1.0, -1.0, -1.0); let z = f32x4(0.0, 0.0, 0.0, 0.0); let h = f32x4(0.5, 0.5, 0.5, 0.5); unsafe { let r = simd_fabs(y); assert_eq!(x, r); let r = simd_fcos(z); assert_eq!(x, r); let r = simd_ceil(h); assert_eq!(x, r); let r = simd_fexp(z); assert_eq!(x, r); let r = simd_fexp2(z); assert_eq!(x, r); let r = simd_floor(h); assert_eq!(z, r); let r = simd_fma(x, h, h); assert_eq!(x, r); let r = simd_fsqrt(x); assert_eq!(x, r); let r = simd_flog(x); assert_eq!(z, r); let r = simd_flog2(x); assert_eq!(z, r); let r = simd_flog10(x); assert_eq!(z, r); let r = simd_fpow(h, x); assert_eq!(h, r); let r = simd_fpowi(h, 1); assert_eq!(h, r); let r = simd_fsin(z); assert_eq!(z, r); } }