Merge commit 'c84d1871dc4456539b7b578830268ab3539915d0' into sync_cg_… · rust-lang/rust@d186b49
1+// Most of these tests are copied from https://github.com/japaric/stdsimd/blob/0f4413d01c4f0c3ffbc5a69e9a37fbc7235b31a9/coresimd/arm/neon.rs
2+3+#![feature(portable_simd)]
4+5+#[cfg(target_arch = "aarch64")]
6+use std::arch::aarch64::*;
7+use std::mem::transmute;
8+use std::simd::*;
9+10+#[cfg(target_arch = "aarch64")]
11+unsafe fn test_vpmin_s8() {
12+let a = i8x8::from([1, -2, 3, -4, 5, 6, 7, 8]);
13+let b = i8x8::from([0, 3, 2, 5, 4, 7, 6, 9]);
14+let e = i8x8::from([-2, -4, 5, 7, 0, 2, 4, 6]);
15+let r: i8x8 = transmute(vpmin_s8(transmute(a), transmute(b)));
16+assert_eq!(r, e);
17+}
18+19+#[cfg(target_arch = "aarch64")]
20+unsafe fn test_vpmin_s16() {
21+let a = i16x4::from([1, 2, 3, -4]);
22+let b = i16x4::from([0, 3, 2, 5]);
23+let e = i16x4::from([1, -4, 0, 2]);
24+let r: i16x4 = transmute(vpmin_s16(transmute(a), transmute(b)));
25+assert_eq!(r, e);
26+}
27+28+#[cfg(target_arch = "aarch64")]
29+unsafe fn test_vpmin_s32() {
30+let a = i32x2::from([1, -2]);
31+let b = i32x2::from([0, 3]);
32+let e = i32x2::from([-2, 0]);
33+let r: i32x2 = transmute(vpmin_s32(transmute(a), transmute(b)));
34+assert_eq!(r, e);
35+}
36+37+#[cfg(target_arch = "aarch64")]
38+unsafe fn test_vpmin_u8() {
39+let a = u8x8::from([1, 2, 3, 4, 5, 6, 7, 8]);
40+let b = u8x8::from([0, 3, 2, 5, 4, 7, 6, 9]);
41+let e = u8x8::from([1, 3, 5, 7, 0, 2, 4, 6]);
42+let r: u8x8 = transmute(vpmin_u8(transmute(a), transmute(b)));
43+assert_eq!(r, e);
44+}
45+46+#[cfg(target_arch = "aarch64")]
47+unsafe fn test_vpmin_u16() {
48+let a = u16x4::from([1, 2, 3, 4]);
49+let b = u16x4::from([0, 3, 2, 5]);
50+let e = u16x4::from([1, 3, 0, 2]);
51+let r: u16x4 = transmute(vpmin_u16(transmute(a), transmute(b)));
52+assert_eq!(r, e);
53+}
54+55+#[cfg(target_arch = "aarch64")]
56+unsafe fn test_vpmin_u32() {
57+let a = u32x2::from([1, 2]);
58+let b = u32x2::from([0, 3]);
59+let e = u32x2::from([1, 0]);
60+let r: u32x2 = transmute(vpmin_u32(transmute(a), transmute(b)));
61+assert_eq!(r, e);
62+}
63+64+#[cfg(target_arch = "aarch64")]
65+unsafe fn test_vpmin_f32() {
66+let a = f32x2::from([1., -2.]);
67+let b = f32x2::from([0., 3.]);
68+let e = f32x2::from([-2., 0.]);
69+let r: f32x2 = transmute(vpmin_f32(transmute(a), transmute(b)));
70+assert_eq!(r, e);
71+}
72+73+#[cfg(target_arch = "aarch64")]
74+unsafe fn test_vpmax_s8() {
75+let a = i8x8::from([1, -2, 3, -4, 5, 6, 7, 8]);
76+let b = i8x8::from([0, 3, 2, 5, 4, 7, 6, 9]);
77+let e = i8x8::from([1, 3, 6, 8, 3, 5, 7, 9]);
78+let r: i8x8 = transmute(vpmax_s8(transmute(a), transmute(b)));
79+assert_eq!(r, e);
80+}
81+82+#[cfg(target_arch = "aarch64")]
83+unsafe fn test_vpmax_s16() {
84+let a = i16x4::from([1, 2, 3, -4]);
85+let b = i16x4::from([0, 3, 2, 5]);
86+let e = i16x4::from([2, 3, 3, 5]);
87+let r: i16x4 = transmute(vpmax_s16(transmute(a), transmute(b)));
88+assert_eq!(r, e);
89+}
90+91+#[cfg(target_arch = "aarch64")]
92+unsafe fn test_vpmax_s32() {
93+let a = i32x2::from([1, -2]);
94+let b = i32x2::from([0, 3]);
95+let e = i32x2::from([1, 3]);
96+let r: i32x2 = transmute(vpmax_s32(transmute(a), transmute(b)));
97+assert_eq!(r, e);
98+}
99+100+#[cfg(target_arch = "aarch64")]
101+unsafe fn test_vpmax_u8() {
102+let a = u8x8::from([1, 2, 3, 4, 5, 6, 7, 8]);
103+let b = u8x8::from([0, 3, 2, 5, 4, 7, 6, 9]);
104+let e = u8x8::from([2, 4, 6, 8, 3, 5, 7, 9]);
105+let r: u8x8 = transmute(vpmax_u8(transmute(a), transmute(b)));
106+assert_eq!(r, e);
107+}
108+109+#[cfg(target_arch = "aarch64")]
110+unsafe fn test_vpmax_u16() {
111+let a = u16x4::from([1, 2, 3, 4]);
112+let b = u16x4::from([0, 3, 2, 5]);
113+let e = u16x4::from([2, 4, 3, 5]);
114+let r: u16x4 = transmute(vpmax_u16(transmute(a), transmute(b)));
115+assert_eq!(r, e);
116+}
117+118+#[cfg(target_arch = "aarch64")]
119+unsafe fn test_vpmax_u32() {
120+let a = u32x2::from([1, 2]);
121+let b = u32x2::from([0, 3]);
122+let e = u32x2::from([2, 3]);
123+let r: u32x2 = transmute(vpmax_u32(transmute(a), transmute(b)));
124+assert_eq!(r, e);
125+}
126+127+#[cfg(target_arch = "aarch64")]
128+unsafe fn test_vpmax_f32() {
129+let a = f32x2::from([1., -2.]);
130+let b = f32x2::from([0., 3.]);
131+let e = f32x2::from([1., 3.]);
132+let r: f32x2 = transmute(vpmax_f32(transmute(a), transmute(b)));
133+assert_eq!(r, e);
134+}
135+136+#[cfg(target_arch = "aarch64")]
137+unsafe fn test_vpadd_s16() {
138+let a = i16x4::from([1, 2, 3, 4]);
139+let b = i16x4::from([0, -1, -2, -3]);
140+let r: i16x4 = transmute(vpadd_s16(transmute(a), transmute(b)));
141+let e = i16x4::from([3, 7, -1, -5]);
142+assert_eq!(r, e);
143+}
144+#[cfg(target_arch = "aarch64")]
145+unsafe fn test_vpadd_s32() {
146+let a = i32x2::from([1, 2]);
147+let b = i32x2::from([0, -1]);
148+let r: i32x2 = transmute(vpadd_s32(transmute(a), transmute(b)));
149+let e = i32x2::from([3, -1]);
150+assert_eq!(r, e);
151+}
152+#[cfg(target_arch = "aarch64")]
153+unsafe fn test_vpadd_s8() {
154+let a = i8x8::from([1, 2, 3, 4, 5, 6, 7, 8]);
155+let b = i8x8::from([0, -1, -2, -3, -4, -5, -6, -7]);
156+let r: i8x8 = transmute(vpadd_s8(transmute(a), transmute(b)));
157+let e = i8x8::from([3, 7, 11, 15, -1, -5, -9, -13]);
158+assert_eq!(r, e);
159+}
160+#[cfg(target_arch = "aarch64")]
161+unsafe fn test_vpadd_u16() {
162+let a = u16x4::from([1, 2, 3, 4]);
163+let b = u16x4::from([30, 31, 32, 33]);
164+let r: u16x4 = transmute(vpadd_u16(transmute(a), transmute(b)));
165+let e = u16x4::from([3, 7, 61, 65]);
166+assert_eq!(r, e);
167+}
168+#[cfg(target_arch = "aarch64")]
169+unsafe fn test_vpadd_u32() {
170+let a = u32x2::from([1, 2]);
171+let b = u32x2::from([30, 31]);
172+let r: u32x2 = transmute(vpadd_u32(transmute(a), transmute(b)));
173+let e = u32x2::from([3, 61]);
174+assert_eq!(r, e);
175+}
176+#[cfg(target_arch = "aarch64")]
177+unsafe fn test_vpadd_u8() {
178+let a = u8x8::from([1, 2, 3, 4, 5, 6, 7, 8]);
179+let b = u8x8::from([30, 31, 32, 33, 34, 35, 36, 37]);
180+let r: u8x8 = transmute(vpadd_u8(transmute(a), transmute(b)));
181+let e = u8x8::from([3, 7, 11, 15, 61, 65, 69, 73]);
182+assert_eq!(r, e);
183+}
184+185+#[cfg(target_arch = "aarch64")]
186+unsafe fn test_vqsub_u8() {
187+let a = u8x8::from([1, 2, 3, 4, 5, 6, 7, 0xff]);
188+let b = u8x8::from([30, 1, 1, 1, 34, 0xff, 36, 37]);
189+let r: u8x8 = transmute(vqsub_u8(transmute(a), transmute(b)));
190+let e = u8x8::from([0, 1, 2, 3, 0, 0, 0, 218]);
191+assert_eq!(r, e);
192+}
193+194+#[cfg(target_arch = "aarch64")]
195+unsafe fn test_vqadd_u8() {
196+let a = u8x8::from([1, 2, 3, 4, 5, 6, 7, 0xff]);
197+let b = u8x8::from([30, 1, 1, 1, 34, 0xff, 36, 37]);
198+let r: u8x8 = transmute(vqadd_u8(transmute(a), transmute(b)));
199+let e = u8x8::from([31, 3, 4, 5, 39, 0xff, 43, 0xff]);
200+assert_eq!(r, e);
201+}
202+203+#[cfg(target_arch = "aarch64")]
204+fn main() {
205+unsafe {
206+test_vpmin_s8();
207+test_vpmin_s16();
208+test_vpmin_s32();
209+test_vpmin_u8();
210+test_vpmin_u16();
211+test_vpmin_u32();
212+test_vpmin_f32();
213+test_vpmax_s8();
214+test_vpmax_s16();
215+test_vpmax_s32();
216+test_vpmax_u8();
217+test_vpmax_u16();
218+test_vpmax_u32();
219+test_vpmax_f32();
220+221+test_vpadd_s16();
222+test_vpadd_s32();
223+test_vpadd_s8();
224+test_vpadd_u16();
225+test_vpadd_u32();
226+test_vpadd_u8();
227+228+test_vqsub_u8();
229+test_vqadd_u8();
230+}
231+}
232+233+#[cfg(not(target_arch = "aarch64"))]
234+fn main() {}