blob: 27c6b574abcda246874a6a789631f826d1494c4d [file] [log] [blame]
/* { dg-skip-if "" { arm*-*-* } } */
#include "arm_neon.h"
void abort (void);
void
foo (void)
{
/* Test vcvt_high_f32_f64. */
float32x2_t arg1;
float64x2_t arg2;
float32x4_t result;
arg1 = vcreate_f32 (UINT64_C (0x3f0db5793f6e1892));
arg2 = vcombine_f64 (vcreate_f64 (UINT64_C (0x3fe8e49d23fb575d)),
vcreate_f64 (UINT64_C (0x3fd921291b3df73e)));
// Expect: "result" = 3ec909483f4724e93f0db5793f6e1892
result = vcvt_high_f32_f64 (arg1, arg2);
float32_t got;
float32_t exp;
/* Lane 0. */
got = vgetq_lane_f32 (result, 0);
exp = ((float32_t) 0.9300624132156372);
if (((((exp / got) < ((float32_t) 0.999))
|| ((exp / got) > ((float32_t) 1.001)))
&& (((exp - got) < ((float32_t) -1.0e-4))
|| ((exp - got) > ((float32_t) 1.0e-4)))))
abort ();
/* Lane 1. */
got = vgetq_lane_f32 (result, 1);
exp = ((float32_t) 0.5535503029823303);
if (((((exp / got) < ((float32_t) 0.999))
|| ((exp / got) > ((float32_t) 1.001)))
&& (((exp - got) < ((float32_t) -1.0e-4))
|| ((exp - got) > ((float32_t) 1.0e-4)))))
abort ();
/* Lane 2. */
got = vgetq_lane_f32 (result, 2);
exp = ((float32_t) 0.7779069617051665);
if (((((exp / got) < ((float32_t) 0.999))
|| ((exp / got) > ((float32_t) 1.001)))
&& (((exp - got) < ((float32_t) -1.0e-4))
|| ((exp - got) > ((float32_t) 1.0e-4)))))
abort ();
/* Lane 3. */
got = vgetq_lane_f32 (result, 3);
exp = ((float32_t) 0.3926489606891329);
if (((((exp / got) < ((float32_t) 0.999))
|| ((exp / got) > ((float32_t) 1.001)))
&& (((exp - got) < ((float32_t) -1.0e-4))
|| ((exp - got) > ((float32_t) 1.0e-4)))))
abort ();
}
void
bar (void)
{
/* Test vcvt_high_f64_f32. */
float32x4_t arg1;
float64x2_t result;
arg1 = vcombine_f32 (vcreate_f32 (UINT64_C (0x3f7c5cf13f261f74)),
vcreate_f32 (UINT64_C (0x3e3a7bc03f6ccc1d)));
// Expect: "result" = 3fc74f78000000003fed9983a0000000
result = vcvt_high_f64_f32 (arg1);
float64_t got;
float64_t exp;
/* Lane 0. */
got = vgetq_lane_f64 (result, 0);
exp = 0.9249895215034485;
if (((((exp / got) < 0.999)
|| ((exp / got) > 1.001))
&& (((exp - got) < -1.0e-4)
|| ((exp - got) > 1.0e-4))))
abort ();
/* Lane 1. */
got = vgetq_lane_f64 (result, 1);
exp = 0.1821126937866211;
if (((((exp / got) < 0.999)
|| ((exp / got) > 1.001))
&& (((exp - got) < -1.0e-4)
|| ((exp - got) > 1.0e-4))))
abort ();
}
int
main (int argc, char **argv)
{
foo ();
bar ();
return 0;
}