1  #include <arm_neon.h>
       2  #include "arm-neon-ref.h"
       3  #include "compute-ref-data.h"
       4  
       5  /* Expected results.  */
       6  VECT_VAR_DECL(expected,int,8,8) [] = { 0x12, 0x12, 0x12, 0x12,
       7  				       0x12, 0x12, 0x12, 0x12 };
       8  VECT_VAR_DECL(expected,int,16,4) [] = { 0x1278, 0x1278, 0x1278, 0x1278 };
       9  VECT_VAR_DECL(expected,int,32,2) [] = { 0x12345678, 0x12345678 };
      10  VECT_VAR_DECL(expected,uint,8,8) [] = { 0x82, 0x82, 0x82, 0x82,
      11  					0x82, 0x82, 0x82, 0x82 };
      12  VECT_VAR_DECL(expected,uint,16,4) [] = { 0x8765, 0x8765, 0x8765, 0x8765 };
      13  VECT_VAR_DECL(expected,uint,32,2) [] = { 0x87654321, 0x87654321 };
      14  
      15  /* Expected results when saturation occurs.  */
      16  VECT_VAR_DECL(expected1,int,8,8) [] = { 0x7f, 0x7f, 0x7f, 0x7f,
      17  					0x7f, 0x7f, 0x7f, 0x7f };
      18  VECT_VAR_DECL(expected1,int,16,4) [] = { 0x7fff, 0x7fff, 0x7fff, 0x7fff };
      19  VECT_VAR_DECL(expected1,int,32,2) [] = { 0x7fffffff, 0x7fffffff };
      20  VECT_VAR_DECL(expected1,uint,8,8) [] = { 0xff, 0xff, 0xff, 0xff,
      21  					 0xff, 0xff, 0xff, 0xff };
      22  VECT_VAR_DECL(expected1,uint,16,4) [] = { 0xffff, 0xffff, 0xffff, 0xffff };
      23  VECT_VAR_DECL(expected1,uint,32,2) [] = { 0xffffffff, 0xffffffff };
      24  
      25  #define INSN_NAME vqmovn
      26  #define TEST_MSG "VQMOVN"
      27  
      28  #define FNNAME1(NAME) void exec_ ## NAME (void)
      29  #define FNNAME(NAME) FNNAME1(NAME)
      30  
      31  FNNAME (INSN_NAME)
      32  {
      33    /* Basic test: y=OP(x), then store the result.  */
      34  #define TEST_UNARY_OP1(INSN, T1, T2, W, W2, N, CMT) \
      35    Set_Neon_Cumulative_Sat(0, VECT_VAR(vector_res, T1, W, N));		\
      36    VECT_VAR(vector_res, T1, W, N) =					\
      37      INSN##_##T2##W2(VECT_VAR(vector, T1, W2, N));			\
      38    vst1##_##T2##W(VECT_VAR(result, T1, W, N),				\
      39  		 VECT_VAR(vector_res, T1, W, N))
      40  
      41  #define TEST_UNARY_OP(INSN, T1, T2, W, W2, N, CMT) \
      42    TEST_UNARY_OP1(INSN, T1, T2, W, W2, N, CMT)
      43  
      44    /* No need for 64 bits variants.  */
      45    DECL_VARIABLE(vector, int, 16, 8);
      46    DECL_VARIABLE(vector, int, 32, 4);
      47    DECL_VARIABLE(vector, int, 64, 2);
      48    DECL_VARIABLE(vector, uint, 16, 8);
      49    DECL_VARIABLE(vector, uint, 32, 4);
      50    DECL_VARIABLE(vector, uint, 64, 2);
      51  
      52    DECL_VARIABLE(vector_res, int, 8, 8);
      53    DECL_VARIABLE(vector_res, int, 16, 4);
      54    DECL_VARIABLE(vector_res, int, 32, 2);
      55    DECL_VARIABLE(vector_res, uint, 8, 8);
      56    DECL_VARIABLE(vector_res, uint, 16, 4);
      57    DECL_VARIABLE(vector_res, uint, 32, 2);
      58  
      59    clean_results ();
      60  
      61    /* Fill input vector with arbitrary values.  */
      62    VDUP(vector, q, int, s, 16, 8, 0x12);
      63    VDUP(vector, q, int, s, 32, 4, 0x1278);
      64    VDUP(vector, q, int, s, 64, 2, 0x12345678);
      65    VDUP(vector, q, uint, u, 16, 8, 0x82);
      66    VDUP(vector, q, uint, u, 32, 4, 0x8765);
      67    VDUP(vector, q, uint, u, 64, 2, 0x87654321);
      68  
      69    /* Apply a unary operator named INSN_NAME.  */
      70  #define CMT ""
      71    TEST_UNARY_OP(INSN_NAME, int, s, 8, 16, 8, CMT);
      72    TEST_UNARY_OP(INSN_NAME, int, s, 16, 32, 4, CMT);
      73    TEST_UNARY_OP(INSN_NAME, int, s, 32, 64, 2, CMT);
      74    TEST_UNARY_OP(INSN_NAME, uint, u, 8, 16, 8, CMT);
      75    TEST_UNARY_OP(INSN_NAME, uint, u, 16, 32, 4, CMT);
      76    TEST_UNARY_OP(INSN_NAME, uint, u, 32, 64, 2, CMT);
      77  
      78    CHECK(TEST_MSG, int, 8, 8, PRIx8, expected, CMT);
      79    CHECK(TEST_MSG, int, 16, 4, PRIx16, expected, CMT);
      80    CHECK(TEST_MSG, int, 32, 2, PRIx32, expected, CMT);
      81    CHECK(TEST_MSG, uint, 8, 8, PRIx8, expected, CMT);
      82    CHECK(TEST_MSG, uint, 16, 4, PRIx16, expected, CMT);
      83    CHECK(TEST_MSG, uint, 32, 2, PRIx32, expected, CMT);
      84  
      85  
      86    /* Fill input vector with arbitrary values which cause cumulative
      87       saturation.  */
      88    VDUP(vector, q, int, s, 16, 8, 0x1234);
      89    VDUP(vector, q, int, s, 32, 4, 0x12345678);
      90    VDUP(vector, q, int, s, 64, 2, 0x1234567890ABLL);
      91    VDUP(vector, q, uint, u, 16, 8, 0x8234);
      92    VDUP(vector, q, uint, u, 32, 4, 0x87654321);
      93    VDUP(vector, q, uint, u, 64, 2, 0x8765432187654321ULL);
      94  
      95    /* Apply a unary operator named INSN_NAME.  */
      96  #undef CMT
      97  #define CMT " (with saturation)"
      98    TEST_UNARY_OP(INSN_NAME, int, s, 8, 16, 8, CMT);
      99    TEST_UNARY_OP(INSN_NAME, int, s, 16, 32, 4, CMT);
     100    TEST_UNARY_OP(INSN_NAME, int, s, 32, 64, 2, CMT);
     101    TEST_UNARY_OP(INSN_NAME, uint, u, 8, 16, 8, CMT);
     102    TEST_UNARY_OP(INSN_NAME, uint, u, 16, 32, 4, CMT);
     103    TEST_UNARY_OP(INSN_NAME, uint, u, 32, 64, 2, CMT);
     104  
     105    CHECK(TEST_MSG, int, 8, 8, PRIx8, expected1, CMT);
     106    CHECK(TEST_MSG, int, 16, 4, PRIx16, expected1, CMT);
     107    CHECK(TEST_MSG, int, 32, 2, PRIx32, expected1, CMT);
     108    CHECK(TEST_MSG, uint, 8, 8, PRIx8, expected1, CMT);
     109    CHECK(TEST_MSG, uint, 16, 4, PRIx16, expected1, CMT);
     110    CHECK(TEST_MSG, uint, 32, 2, PRIx32, expected1, CMT);
     111  }
     112  
     113  int main (void)
     114  {
     115    exec_vqmovn ();
     116    return 0;
     117  }