2 #![allow(non_camel_case_types)]
6 // Test that the simd_reduce_{op} intrinsics produce the correct results.
8 #![feature(repr_simd, platform_intrinsics)]
9 #[allow(non_camel_case_types)]
12 #[derive(Copy, Clone)]
13 struct i32x4(pub i32, pub i32, pub i32, pub i32);
16 #[derive(Copy, Clone)]
17 struct u32x4(pub u32, pub u32, pub u32, pub u32);
20 #[derive(Copy, Clone)]
21 struct f32x4(pub f32, pub f32, pub f32, pub f32);
24 #[derive(Copy, Clone)]
25 struct b8x4(pub i8, pub i8, pub i8, pub i8);
28 #[derive(Copy, Clone)]
30 pub i8, pub i8, pub i8, pub i8,
31 pub i8, pub i8, pub i8, pub i8,
32 pub i8, pub i8, pub i8, pub i8,
33 pub i8, pub i8, pub i8, pub i8
36 extern "platform-intrinsic" {
37 fn simd_reduce_add_unordered<T, U>(x: T) -> U;
38 fn simd_reduce_mul_unordered<T, U>(x: T) -> U;
39 fn simd_reduce_add_ordered<T, U>(x: T, acc: U) -> U;
40 fn simd_reduce_mul_ordered<T, U>(x: T, acc: U) -> U;
41 fn simd_reduce_min<T, U>(x: T) -> U;
42 fn simd_reduce_max<T, U>(x: T) -> U;
43 fn simd_reduce_min_nanless<T, U>(x: T) -> U;
44 fn simd_reduce_max_nanless<T, U>(x: T) -> U;
45 fn simd_reduce_and<T, U>(x: T) -> U;
46 fn simd_reduce_or<T, U>(x: T) -> U;
47 fn simd_reduce_xor<T, U>(x: T) -> U;
48 fn simd_reduce_all<T>(x: T) -> bool;
49 fn simd_reduce_any<T>(x: T) -> bool;
54 let x = i32x4(1, -2, 3, 4);
55 let r: i32 = simd_reduce_add_unordered(x);
57 let r: i32 = simd_reduce_mul_unordered(x);
58 assert_eq!(r, -24_i32);
59 let r: i32 = simd_reduce_add_ordered(x, -1);
61 let r: i32 = simd_reduce_mul_ordered(x, -1);
62 assert_eq!(r, 24_i32);
64 let r: i32 = simd_reduce_min(x);
65 assert_eq!(r, -2_i32);
66 let r: i32 = simd_reduce_max(x);
69 let x = i32x4(-1, -1, -1, -1);
70 let r: i32 = simd_reduce_and(x);
71 assert_eq!(r, -1_i32);
72 let r: i32 = simd_reduce_or(x);
73 assert_eq!(r, -1_i32);
74 let r: i32 = simd_reduce_xor(x);
77 let x = i32x4(-1, -1, 0, -1);
78 let r: i32 = simd_reduce_and(x);
80 let r: i32 = simd_reduce_or(x);
81 assert_eq!(r, -1_i32);
82 let r: i32 = simd_reduce_xor(x);
83 assert_eq!(r, -1_i32);
87 let x = u32x4(1, 2, 3, 4);
88 let r: u32 = simd_reduce_add_unordered(x);
89 assert_eq!(r, 10_u32);
90 let r: u32 = simd_reduce_mul_unordered(x);
91 assert_eq!(r, 24_u32);
92 let r: u32 = simd_reduce_add_ordered(x, 1);
93 assert_eq!(r, 11_u32);
94 let r: u32 = simd_reduce_mul_ordered(x, 2);
95 assert_eq!(r, 48_u32);
97 let r: u32 = simd_reduce_min(x);
99 let r: u32 = simd_reduce_max(x);
100 assert_eq!(r, 4_u32);
103 let x = u32x4(t, t, t, t);
104 let r: u32 = simd_reduce_and(x);
106 let r: u32 = simd_reduce_or(x);
108 let r: u32 = simd_reduce_xor(x);
109 assert_eq!(r, 0_u32);
111 let x = u32x4(t, t, 0, t);
112 let r: u32 = simd_reduce_and(x);
113 assert_eq!(r, 0_u32);
114 let r: u32 = simd_reduce_or(x);
116 let r: u32 = simd_reduce_xor(x);
121 let x = f32x4(1., -2., 3., 4.);
122 let r: f32 = simd_reduce_add_unordered(x);
123 assert_eq!(r, 6_f32);
124 let r: f32 = simd_reduce_mul_unordered(x);
125 assert_eq!(r, -24_f32);
126 let r: f32 = simd_reduce_add_ordered(x, 0.);
127 assert_eq!(r, 6_f32);
128 let r: f32 = simd_reduce_mul_ordered(x, 1.);
129 assert_eq!(r, -24_f32);
130 let r: f32 = simd_reduce_add_ordered(x, 1.);
131 assert_eq!(r, 7_f32);
132 let r: f32 = simd_reduce_mul_ordered(x, 2.);
133 assert_eq!(r, -48_f32);
135 let r: f32 = simd_reduce_min(x);
136 assert_eq!(r, -2_f32);
137 let r: f32 = simd_reduce_max(x);
138 assert_eq!(r, 4_f32);
139 let r: f32 = simd_reduce_min_nanless(x);
140 assert_eq!(r, -2_f32);
141 let r: f32 = simd_reduce_max_nanless(x);
142 assert_eq!(r, 4_f32);
146 let x = b8x4(!0, !0, !0, !0);
147 let r: bool = simd_reduce_all(x);
149 let r: bool = simd_reduce_any(x);
152 let x = b8x4(!0, !0, 0, !0);
153 let r: bool = simd_reduce_all(x);
154 assert_eq!(r, false);
155 let r: bool = simd_reduce_any(x);
158 let x = b8x4(0, 0, 0, 0);
159 let r: bool = simd_reduce_all(x);
160 assert_eq!(r, false);
161 let r: bool = simd_reduce_any(x);
162 assert_eq!(r, false);