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