1 /* { dg-skip-if "" { arm*-*-* } } */
2
3 #include "arm_neon.h"
4
5 void abort (void);
6
7 void
foo(void)8 foo (void)
9 {
10 /* Test vcvt_high_f32_f64. */
11 float32x2_t arg1;
12 float64x2_t arg2;
13 float32x4_t result;
14 arg1 = vcreate_f32 (UINT64_C (0x3f0db5793f6e1892));
15 arg2 = vcombine_f64 (vcreate_f64 (UINT64_C (0x3fe8e49d23fb575d)),
16 vcreate_f64 (UINT64_C (0x3fd921291b3df73e)));
17 // Expect: "result" = 3ec909483f4724e93f0db5793f6e1892
18 result = vcvt_high_f32_f64 (arg1, arg2);
19 float32_t got;
20 float32_t exp;
21
22 /* Lane 0. */
23 got = vgetq_lane_f32 (result, 0);
24 exp = ((float32_t) 0.9300624132156372);
25 if (((((exp / got) < ((float32_t) 0.999))
26 || ((exp / got) > ((float32_t) 1.001)))
27 && (((exp - got) < ((float32_t) -1.0e-4))
28 || ((exp - got) > ((float32_t) 1.0e-4)))))
29 abort ();
30
31 /* Lane 1. */
32 got = vgetq_lane_f32 (result, 1);
33 exp = ((float32_t) 0.5535503029823303);
34 if (((((exp / got) < ((float32_t) 0.999))
35 || ((exp / got) > ((float32_t) 1.001)))
36 && (((exp - got) < ((float32_t) -1.0e-4))
37 || ((exp - got) > ((float32_t) 1.0e-4)))))
38 abort ();
39
40 /* Lane 2. */
41 got = vgetq_lane_f32 (result, 2);
42 exp = ((float32_t) 0.7779069617051665);
43 if (((((exp / got) < ((float32_t) 0.999))
44 || ((exp / got) > ((float32_t) 1.001)))
45 && (((exp - got) < ((float32_t) -1.0e-4))
46 || ((exp - got) > ((float32_t) 1.0e-4)))))
47 abort ();
48
49 /* Lane 3. */
50 got = vgetq_lane_f32 (result, 3);
51 exp = ((float32_t) 0.3926489606891329);
52 if (((((exp / got) < ((float32_t) 0.999))
53 || ((exp / got) > ((float32_t) 1.001)))
54 && (((exp - got) < ((float32_t) -1.0e-4))
55 || ((exp - got) > ((float32_t) 1.0e-4)))))
56 abort ();
57 }
58
59 void
bar(void)60 bar (void)
61 {
62 /* Test vcvt_high_f64_f32. */
63 float32x4_t arg1;
64 float64x2_t result;
65 arg1 = vcombine_f32 (vcreate_f32 (UINT64_C (0x3f7c5cf13f261f74)),
66 vcreate_f32 (UINT64_C (0x3e3a7bc03f6ccc1d)));
67 // Expect: "result" = 3fc74f78000000003fed9983a0000000
68 result = vcvt_high_f64_f32 (arg1);
69
70 float64_t got;
71 float64_t exp;
72
73 /* Lane 0. */
74 got = vgetq_lane_f64 (result, 0);
75 exp = 0.9249895215034485;
76 if (((((exp / got) < 0.999)
77 || ((exp / got) > 1.001))
78 && (((exp - got) < -1.0e-4)
79 || ((exp - got) > 1.0e-4))))
80 abort ();
81
82 /* Lane 1. */
83 got = vgetq_lane_f64 (result, 1);
84 exp = 0.1821126937866211;
85 if (((((exp / got) < 0.999)
86 || ((exp / got) > 1.001))
87 && (((exp - got) < -1.0e-4)
88 || ((exp - got) > 1.0e-4))))
89 abort ();
90 }
91
92 int
main(int argc,char ** argv)93 main (int argc, char **argv)
94 {
95 foo ();
96 bar ();
97 return 0;
98 }
99