(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
advsimd-intrinsics/
vqdmull_n.c
       1  #include <arm_neon.h>
       2  #include "arm-neon-ref.h"
       3  #include "compute-ref-data.h"
       4  
       5  
       6  /* Expected results.  */
       7  VECT_VAR_DECL(expected,int,32,4) [] = { 0x44000, 0x44000,
       8  					0x44000, 0x44000 };
       9  VECT_VAR_DECL(expected,int,64,2) [] = { 0xaa000, 0xaa000 };
      10  
      11  /* Expected results when saturation occurs.  */
      12  VECT_VAR_DECL(expected2,int,32,4) [] = { 0x7fffffff, 0x7fffffff,
      13  					 0x7fffffff, 0x7fffffff };
      14  VECT_VAR_DECL(expected2,int,64,2) [] = { 0x7fffffffffffffff,
      15  					 0x7fffffffffffffff };
      16  
      17  #define INSN_NAME vqdmull
      18  #define TEST_MSG "VQDMULL_N"
      19  
      20  #define FNNAME1(NAME) exec_ ## NAME
      21  #define FNNAME(NAME) FNNAME1(NAME)
      22  
      23  void FNNAME (INSN_NAME) (void)
      24  {
      25    int i;
      26  
      27    /* vector_res = vqdmull_n(vector,val), then store the result.  */
      28  #define TEST_VQDMULL_N2(INSN, T1, T2, W, W2, N, L, CMT) \
      29    Set_Neon_Cumulative_Sat(0, VECT_VAR(vector_res, T1, W2, N));	\
      30    VECT_VAR(vector_res, T1, W2, N) =				\
      31      INSN##_n_##T2##W(VECT_VAR(vector, T1, W, N),		\
      32  		     L);					\
      33    vst1q_##T2##W2(VECT_VAR(result, T1, W2, N),			\
      34  		 VECT_VAR(vector_res, T1, W2, N))
      35  
      36    /* Two auxliary macros are necessary to expand INSN.  */
      37  #define TEST_VQDMULL_N1(INSN, T1, T2, W, W2, N, L, CMT) \
      38    TEST_VQDMULL_N2(INSN, T1, T2, W, W2, N, L, CMT)
      39  
      40  #define TEST_VQDMULL_N(T1, T2, W, W2, N, L, CMT) \
      41    TEST_VQDMULL_N1(INSN_NAME, T1, T2, W, W2, N, L, CMT)
      42  
      43    DECL_VARIABLE(vector, int, 16, 4);
      44    DECL_VARIABLE(vector, int, 32, 2);
      45    DECL_VARIABLE(vector2, int, 16, 4);
      46    DECL_VARIABLE(vector2, int, 32, 2);
      47  
      48    DECL_VARIABLE(vector_res, int, 32, 4);
      49    DECL_VARIABLE(vector_res, int, 64, 2);
      50  
      51    clean_results ();
      52  
      53    /* Initialize vector.  */
      54    VDUP(vector, , int, s, 16, 4, 0x1000);
      55    VDUP(vector, , int, s, 32, 2, 0x1000);
      56  
      57    /* Initialize vector2.  */
      58    VDUP(vector2, , int, s, 16, 4, 0x4);
      59    VDUP(vector2, , int, s, 32, 2, 0x2);
      60  
      61    /* Choose multiplier arbitrarily.  */
      62    TEST_VQDMULL_N(int, s, 16, 32, 4, 0x22, "");
      63    TEST_VQDMULL_N(int, s, 32, 64, 2, 0x55, "");
      64  
      65    CHECK(TEST_MSG, int, 32, 4, PRIx32, expected, "");
      66    CHECK(TEST_MSG, int, 64, 2, PRIx64, expected, "");
      67  
      68    VDUP(vector, , int, s, 16, 4, 0x8000);
      69    VDUP(vector, , int, s, 32, 2, 0x80000000);
      70  
      71  #define TEST_MSG2 "with saturation"
      72    TEST_VQDMULL_N(int, s, 16, 32, 4, 0x8000, TEST_MSG2);
      73    TEST_VQDMULL_N(int, s, 32, 64, 2, 0x80000000, TEST_MSG2);
      74  
      75    CHECK(TEST_MSG, int, 32, 4, PRIx32, expected2, TEST_MSG2);
      76    CHECK(TEST_MSG, int, 64, 2, PRIx64, expected2, TEST_MSG2);
      77  }
      78  
      79  int main (void)
      80  {
      81    FNNAME (INSN_NAME) ();
      82    return 0;
      83  }