(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
advsimd-intrinsics/
vmulx_f16_1.c
       1  /* { dg-do run } */
       2  /* { dg-require-effective-target arm_v8_2a_fp16_neon_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  /* Expected results for vmulx.  */
      30  VECT_VAR_DECL (expected_static, hfloat, 16, 4) []
      31    = { 0x629B /* A * E.  */, 0x4000 /* FP16_C (2.0f).  */,
      32        0x5939 /* C * G.  */, 0xC000 /* FP16_C (-2.0f).  */ };
      33  
      34  VECT_VAR_DECL (expected_static, hfloat, 16, 8) []
      35    = { 0x629B /* A * E.  */, 0x4000 /* FP16_C (2.0f).  */,
      36        0x5939 /* C * G.  */, 0xC000 /* FP16_C (-2.0f).  */,
      37        0x53A0 /* I * M.  */, 0x4000 /* FP16_C (2.0f).  */,
      38        0xCA2C /* K * O.  */, 0x615C /* L * P.  */ };
      39  
      40  void exec_vmulx_f16 (void)
      41  {
      42  #undef TEST_MSG
      43  #define TEST_MSG "VMULX (FP16)"
      44    clean_results ();
      45  
      46    DECL_VARIABLE(vsrc_1, float, 16, 4);
      47    DECL_VARIABLE(vsrc_2, float, 16, 4);
      48    VECT_VAR_DECL (buf_src_1, float, 16, 4) [] = {A, B, C, D};
      49    VECT_VAR_DECL (buf_src_2, float, 16, 4) [] = {E, F, G, H};
      50    VLOAD (vsrc_1, buf_src_1, , float, f, 16, 4);
      51    VLOAD (vsrc_2, buf_src_2, , float, f, 16, 4);
      52    DECL_VARIABLE (vector_res, float, 16, 4)
      53      = vmulx_f16 (VECT_VAR (vsrc_1, float, 16, 4),
      54  		 VECT_VAR (vsrc_2, float, 16, 4));
      55    vst1_f16 (VECT_VAR (result, float, 16, 4),
      56  	    VECT_VAR (vector_res, float, 16, 4));
      57  
      58    CHECK_FP (TEST_MSG, float, 16, 4, PRIx16, expected_static, "");
      59  
      60  #undef TEST_MSG
      61  #define TEST_MSG "VMULXQ (FP16)"
      62    clean_results ();
      63  
      64    DECL_VARIABLE(vsrc_1, float, 16, 8);
      65    DECL_VARIABLE(vsrc_2, float, 16, 8);
      66    VECT_VAR_DECL (buf_src_1, float, 16, 8) [] = {A, B, C, D, I, J, K, L};
      67    VECT_VAR_DECL (buf_src_2, float, 16, 8) [] = {E, F, G, H, M, N, O, P};
      68    VLOAD (vsrc_1, buf_src_1, q, float, f, 16, 8);
      69    VLOAD (vsrc_2, buf_src_2, q, float, f, 16, 8);
      70    DECL_VARIABLE (vector_res, float, 16, 8)
      71      = vmulxq_f16 (VECT_VAR (vsrc_1, float, 16, 8),
      72  		  VECT_VAR (vsrc_2, float, 16, 8));
      73    vst1q_f16 (VECT_VAR (result, float, 16, 8),
      74  	     VECT_VAR (vector_res, float, 16, 8));
      75  
      76    CHECK_FP (TEST_MSG, float, 16, 8, PRIx16, expected_static, "");
      77  }
      78  
      79  int
      80  main (void)
      81  {
      82    exec_vmulx_f16 ();
      83    return 0;
      84  }