/* { 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; }