1  /* { dg-skip-if "" { arm*-*-* } } */
       2  
       3  #include "arm_neon.h"
       4  
       5  void abort (void);
       6  
       7  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
      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
      93  main (int argc, char **argv)
      94  {
      95    foo ();
      96    bar ();
      97    return 0;
      98  }