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) [] = { 0xf, 0xe, 0xd, 0xc,
       7  				       0xb, 0xa, 0x9, 0x8 };
       8  VECT_VAR_DECL(expected,int,16,4) [] = { 0xf, 0xe, 0xd, 0xc };
       9  VECT_VAR_DECL(expected,int,32,2) [] = { 0xf, 0xe };
      10  VECT_VAR_DECL(expected,uint,8,8) [] = { 0xf, 0xe, 0xd, 0xc,
      11  					0xb, 0xa, 0x9, 0x8 };
      12  VECT_VAR_DECL(expected,uint,16,4) [] = { 0xf, 0xe, 0xd, 0xc };
      13  VECT_VAR_DECL(expected,uint,32,2) [] = { 0xf, 0xe };
      14  VECT_VAR_DECL(expected,poly,8,8) [] = { 0xf, 0xe, 0xd, 0xc,
      15  					0xb, 0xa, 0x9, 0x8 };
      16  VECT_VAR_DECL(expected,int,8,16) [] = { 0xf, 0xe, 0xd, 0xc,
      17  					0xb, 0xa, 0x9, 0x8,
      18  					0x7, 0x6, 0x5, 0x4,
      19  					0x3, 0x2, 0x1, 0x0 };
      20  VECT_VAR_DECL(expected,int,16,8) [] = { 0xf, 0xe, 0xd, 0xc,
      21  					0xb, 0xa, 0x9, 0x8 };
      22  VECT_VAR_DECL(expected,int,32,4) [] = { 0xf, 0xe, 0xd, 0xc };
      23  VECT_VAR_DECL(expected,uint,8,16) [] = { 0xf, 0xe, 0xd, 0xc,
      24  					 0xb, 0xa, 0x9, 0x8,
      25  					 0x7, 0x6, 0x5, 0x4,
      26  					 0x3, 0x2, 0x1, 0x0 };
      27  VECT_VAR_DECL(expected,uint,16,8) [] = { 0xf, 0xe, 0xd, 0xc,
      28  					 0xb, 0xa, 0x9, 0x8 };
      29  VECT_VAR_DECL(expected,uint,32,4) [] = { 0xf, 0xe, 0xd, 0xc };
      30  VECT_VAR_DECL(expected,poly,8,16) [] = { 0xf, 0xe, 0xd, 0xc,
      31  					 0xb, 0xa, 0x9, 0x8,
      32  					 0x7, 0x6, 0x5, 0x4,
      33  					 0x3, 0x2, 0x1, 0x0 };
      34  
      35  #define INSN_NAME vmvn
      36  #define TEST_MSG "VMVN/VMVNQ"
      37  
      38  #define FNNAME1(NAME) void exec_ ## NAME (void)
      39  #define FNNAME(NAME) FNNAME1(NAME)
      40  
      41  FNNAME (INSN_NAME)
      42  {
      43    /* Basic test: y=OP(x), then store the result.  */
      44  #define TEST_UNARY_OP1(INSN, Q, T1, T2, W, N)				\
      45    VECT_VAR(vector_res, T1, W, N) =					\
      46      INSN##Q##_##T2##W(VECT_VAR(vector, T1, W, N));			\
      47    vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), VECT_VAR(vector_res, T1, W, N))
      48  
      49  #define TEST_UNARY_OP(INSN, Q, T1, T2, W, N)				\
      50    TEST_UNARY_OP1(INSN, Q, T1, T2, W, N)					\
      51  
      52    /* No need for 64 bits variants.  */
      53    DECL_VARIABLE(vector, int, 8, 8);
      54    DECL_VARIABLE(vector, int, 16, 4);
      55    DECL_VARIABLE(vector, int, 32, 2);
      56    DECL_VARIABLE(vector, uint, 8, 8);
      57    DECL_VARIABLE(vector, uint, 16, 4);
      58    DECL_VARIABLE(vector, uint, 32, 2);
      59    DECL_VARIABLE(vector, poly, 8, 8);
      60    DECL_VARIABLE(vector, int, 8, 16);
      61    DECL_VARIABLE(vector, int, 16, 8);
      62    DECL_VARIABLE(vector, int, 32, 4);
      63    DECL_VARIABLE(vector, uint, 8, 16);
      64    DECL_VARIABLE(vector, uint, 16, 8);
      65    DECL_VARIABLE(vector, uint, 32, 4);
      66    DECL_VARIABLE(vector, poly, 8, 16);
      67  
      68    DECL_VARIABLE(vector_res, int, 8, 8);
      69    DECL_VARIABLE(vector_res, int, 16, 4);
      70    DECL_VARIABLE(vector_res, int, 32, 2);
      71    DECL_VARIABLE(vector_res, uint, 8, 8);
      72    DECL_VARIABLE(vector_res, uint, 16, 4);
      73    DECL_VARIABLE(vector_res, uint, 32, 2);
      74    DECL_VARIABLE(vector_res, poly, 8, 8);
      75    DECL_VARIABLE(vector_res, int, 8, 16);
      76    DECL_VARIABLE(vector_res, int, 16, 8);
      77    DECL_VARIABLE(vector_res, int, 32, 4);
      78    DECL_VARIABLE(vector_res, uint, 8, 16);
      79    DECL_VARIABLE(vector_res, uint, 16, 8);
      80    DECL_VARIABLE(vector_res, uint, 32, 4);
      81    DECL_VARIABLE(vector_res, poly, 8, 16);
      82  
      83    clean_results ();
      84  
      85    /* Initialize input "vector" from "buffer".  */
      86    VLOAD(vector, buffer, , int, s, 8, 8);
      87    VLOAD(vector, buffer, , int, s, 16, 4);
      88    VLOAD(vector, buffer, , int, s, 32, 2);
      89    VLOAD(vector, buffer, , uint, u, 8, 8);
      90    VLOAD(vector, buffer, , uint, u, 16, 4);
      91    VLOAD(vector, buffer, , uint, u, 32, 2);
      92    VLOAD(vector, buffer, , poly, p, 8, 8);
      93    VLOAD(vector, buffer, q, int, s, 8, 16);
      94    VLOAD(vector, buffer, q, int, s, 16, 8);
      95    VLOAD(vector, buffer, q, int, s, 32, 4);
      96    VLOAD(vector, buffer, q, uint, u, 8, 16);
      97    VLOAD(vector, buffer, q, uint, u, 16, 8);
      98    VLOAD(vector, buffer, q, uint, u, 32, 4);
      99    VLOAD(vector, buffer, q, poly, p, 8, 16);
     100  
     101    /* Apply a unary operator named INSN_NAME.  */
     102    TEST_UNARY_OP(INSN_NAME, , int, s, 8, 8);
     103    TEST_UNARY_OP(INSN_NAME, , int, s, 16, 4);
     104    TEST_UNARY_OP(INSN_NAME, , int, s, 32, 2);
     105    TEST_UNARY_OP(INSN_NAME, , uint, u, 8, 8);
     106    TEST_UNARY_OP(INSN_NAME, , uint, u, 16, 4);
     107    TEST_UNARY_OP(INSN_NAME, , uint, u, 32, 2);
     108    TEST_UNARY_OP(INSN_NAME, , poly, p, 8, 8);
     109    TEST_UNARY_OP(INSN_NAME, q, int, s, 8, 16);
     110    TEST_UNARY_OP(INSN_NAME, q, int, s, 16, 8);
     111    TEST_UNARY_OP(INSN_NAME, q, int, s, 32, 4);
     112    TEST_UNARY_OP(INSN_NAME, q, uint, u, 8, 16);
     113    TEST_UNARY_OP(INSN_NAME, q, uint, u, 16, 8);
     114    TEST_UNARY_OP(INSN_NAME, q, uint, u, 32, 4);
     115    TEST_UNARY_OP(INSN_NAME, q, poly, p, 8, 16);
     116  
     117    CHECK(TEST_MSG, int, 8, 8, PRIx8, expected, "");
     118    CHECK(TEST_MSG, int, 16, 4, PRIx16, expected, "");
     119    CHECK(TEST_MSG, int, 32, 2, PRIx32, expected, "");
     120    CHECK(TEST_MSG, uint, 8, 8, PRIx8, expected, "");
     121    CHECK(TEST_MSG, uint, 16, 4, PRIx16, expected, "");
     122    CHECK(TEST_MSG, uint, 32, 2, PRIx32, expected, "");
     123    CHECK_POLY(TEST_MSG, poly, 8, 8, PRIx8, expected, "");
     124    CHECK(TEST_MSG, int, 8, 16, PRIx8, expected, "");
     125    CHECK(TEST_MSG, int, 16, 8, PRIx16, expected, "");
     126    CHECK(TEST_MSG, int, 32, 4, PRIx32, expected, "");
     127    CHECK(TEST_MSG, uint, 8, 16, PRIx8, expected, "");
     128    CHECK(TEST_MSG, uint, 16, 8, PRIx16, expected, "");
     129    CHECK(TEST_MSG, uint, 32, 4, PRIx32, expected, "");
     130    CHECK_POLY(TEST_MSG, poly, 8, 16, PRIx8, expected, "");
     131  }
     132  
     133  int main (void)
     134  {
     135    exec_vmvn ();
     136    return 0;
     137  }