1  /* { dg-do run } */
       2  /* { dg-require-effective-target arm_v8_2a_fp16_scalar_hw } */
       3  /* { dg-add-options arm_v8_2a_fp16_neon } */
       4  /* { dg-skip-if "" { arm*-*-* } } */
       5  
       6  #include <arm_neon.h>
       7  #include "arm-neon-ref.h"
       8  #include "compute-ref-data.h"
       9  
      10  #define FP16_C(a) ((__fp16) a)
      11  #define A FP16_C (13.4)
      12  #define B FP16_C (__builtin_inff ())
      13  #define C FP16_C (-34.8)
      14  #define D FP16_C (-__builtin_inff ())
      15  #define E FP16_C (63.1)
      16  #define F FP16_C (0.0)
      17  #define G FP16_C (-4.8)
      18  #define H FP16_C (0.0)
      19  
      20  #define I FP16_C (0.7)
      21  #define J FP16_C (-__builtin_inff ())
      22  #define K FP16_C (11.23)
      23  #define L FP16_C (98)
      24  #define M FP16_C (87.1)
      25  #define N FP16_C (-0.0)
      26  #define O FP16_C (-1.1)
      27  #define P FP16_C (7)
      28  
      29  extern void abort ();
      30  
      31  float16_t src1[8] = { A, B, C, D, I, J, K, L };
      32  VECT_VAR_DECL (src2, float, 16, 4) [] = { E, F, G, H };
      33  VECT_VAR_DECL (src2, float, 16, 8) [] = { E, F, G, H, M, N, O, P };
      34  
      35  /* Expected results for vmulxh_lane.  */
      36  uint16_t expected[4] = { 0x629B /* A * E.  */,
      37  			 0x4000 /* FP16_C (2.0f).  */,
      38  			 0x5939 /* C * G.  */,
      39  			 0xC000 /* FP16_C (-2.0f).  */ };
      40  
      41  /* Expected results for vmulxh_lane.  */
      42  uint16_t expected_laneq[8] = { 0x629B /* A * E.  */,
      43  			       0x4000 /* FP16_C (2.0f).  */,
      44  			       0x5939 /* C * G.  */,
      45  			       0xC000 /* FP16_C (-2.0f).  */,
      46  			       0x53A0 /* I * M.  */,
      47  			       0x4000 /* FP16_C (2.0f).  */,
      48  			       0xCA2C /* K * O.  */,
      49  			       0x615C /* L * P.  */ };
      50  
      51  void exec_vmulxh_lane_f16 (void)
      52  {
      53  #define CHECK_LANE(N)\
      54    ret = vmulxh_lane_f16 (src1[N], VECT_VAR (vsrc2, float, 16, 4), N);\
      55    if (*(uint16_t *) &ret != expected[N])\
      56      abort ();
      57  
      58    DECL_VARIABLE(vsrc2, float, 16, 4);
      59    VLOAD (vsrc2, src2, , float, f, 16, 4);
      60    float16_t ret;
      61  
      62    CHECK_LANE(0)
      63    CHECK_LANE(1)
      64    CHECK_LANE(2)
      65    CHECK_LANE(3)
      66  
      67  #undef CHECK_LANE
      68  #define CHECK_LANE(N)\
      69    ret = vmulxh_laneq_f16 (src1[N], VECT_VAR (vsrc2, float, 16, 8), N);\
      70    if (*(uint16_t *) &ret != expected_laneq[N])\
      71      abort ();
      72  
      73    DECL_VARIABLE(vsrc2, float, 16, 8);
      74    VLOAD (vsrc2, src2, q, float, f, 16, 8);
      75  
      76    CHECK_LANE(0)
      77    CHECK_LANE(1)
      78    CHECK_LANE(2)
      79    CHECK_LANE(3)
      80    CHECK_LANE(4)
      81    CHECK_LANE(5)
      82    CHECK_LANE(6)
      83    CHECK_LANE(7)
      84  }
      85  
      86  int
      87  main (void)
      88  {
      89    exec_vmulxh_lane_f16 ();
      90    return 0;
      91  }