1  #include <arm_neon.h>
       2  #include "arm-neon-ref.h"
       3  #include "compute-ref-data.h"
       4  
       5  /* Expected results for vrev16.  */
       6  VECT_VAR_DECL(expected_vrev16,int,8,8) [] = { 0xf1, 0xf0, 0xf3, 0xf2,
       7  					      0xf5, 0xf4, 0xf7, 0xf6 };
       8  VECT_VAR_DECL(expected_vrev16,uint,8,8) [] = { 0xf1, 0xf0, 0xf3, 0xf2,
       9  					       0xf5, 0xf4, 0xf7, 0xf6 };
      10  VECT_VAR_DECL(expected_vrev16,poly,8,8) [] = { 0xf1, 0xf0, 0xf3, 0xf2,
      11  					       0xf5, 0xf4, 0xf7, 0xf6 };
      12  VECT_VAR_DECL(expected_vrev16,int,8,16) [] = { 0xf1, 0xf0, 0xf3, 0xf2,
      13  					       0xf5, 0xf4, 0xf7, 0xf6,
      14  					       0xf9, 0xf8, 0xfb, 0xfa,
      15  					       0xfd, 0xfc, 0xff, 0xfe };
      16  VECT_VAR_DECL(expected_vrev16,uint,8,16) [] = { 0xf1, 0xf0, 0xf3, 0xf2,
      17  						0xf5, 0xf4, 0xf7, 0xf6,
      18  						0xf9, 0xf8, 0xfb, 0xfa,
      19  						0xfd, 0xfc, 0xff, 0xfe };
      20  VECT_VAR_DECL(expected_vrev16,poly,8,16) [] = { 0xf1, 0xf0, 0xf3, 0xf2,
      21  						0xf5, 0xf4, 0xf7, 0xf6,
      22  						0xf9, 0xf8, 0xfb, 0xfa,
      23  						0xfd, 0xfc, 0xff, 0xfe };
      24  
      25  /* Expected results for vrev32.  */
      26  VECT_VAR_DECL(expected_vrev32,int,8,8) [] = { 0xf3, 0xf2, 0xf1, 0xf0,
      27  					      0xf7, 0xf6, 0xf5, 0xf4 };
      28  VECT_VAR_DECL(expected_vrev32,int,16,4) [] = { 0xfff1, 0xfff0, 0xfff3, 0xfff2 };
      29  VECT_VAR_DECL(expected_vrev32,uint,8,8) [] = { 0xf3, 0xf2, 0xf1, 0xf0,
      30  					       0xf7, 0xf6, 0xf5, 0xf4 };
      31  VECT_VAR_DECL(expected_vrev32,uint,16,4) [] = { 0xfff1, 0xfff0, 0xfff3, 0xfff2 };
      32  VECT_VAR_DECL(expected_vrev32,poly,8,8) [] = { 0xf3, 0xf2, 0xf1, 0xf0,
      33  					       0xf7, 0xf6, 0xf5, 0xf4 };
      34  VECT_VAR_DECL(expected_vrev32,poly,16,4) [] = { 0xfff1, 0xfff0, 0xfff3, 0xfff2 };
      35  VECT_VAR_DECL(expected_vrev32,int,8,16) [] = { 0xf3, 0xf2, 0xf1, 0xf0,
      36  					       0xf7, 0xf6, 0xf5, 0xf4,
      37  					       0xfb, 0xfa, 0xf9, 0xf8,
      38  					       0xff, 0xfe, 0xfd, 0xfc };
      39  VECT_VAR_DECL(expected_vrev32,int,16,8) [] = { 0xfff1, 0xfff0, 0xfff3, 0xfff2,
      40  					       0xfff5, 0xfff4, 0xfff7, 0xfff6 };
      41  VECT_VAR_DECL(expected_vrev32,uint,8,16) [] = { 0xf3, 0xf2, 0xf1, 0xf0,
      42  						0xf7, 0xf6, 0xf5, 0xf4,
      43  						0xfb, 0xfa, 0xf9, 0xf8,
      44  						0xff, 0xfe, 0xfd, 0xfc };
      45  VECT_VAR_DECL(expected_vrev32,uint,16,8) [] = { 0xfff1, 0xfff0, 0xfff3, 0xfff2,
      46  						0xfff5, 0xfff4, 0xfff7, 0xfff6 };
      47  VECT_VAR_DECL(expected_vrev32,poly,8,16) [] = { 0xf3, 0xf2, 0xf1, 0xf0,
      48  						0xf7, 0xf6, 0xf5, 0xf4,
      49  						0xfb, 0xfa, 0xf9, 0xf8,
      50  						0xff, 0xfe, 0xfd, 0xfc };
      51  VECT_VAR_DECL(expected_vrev32,poly,16,8) [] = { 0xfff1, 0xfff0, 0xfff3, 0xfff2,
      52  						0xfff5, 0xfff4, 0xfff7, 0xfff6 };
      53  
      54  /* Expected results for vrev64.  */
      55  VECT_VAR_DECL(expected_vrev64,int,8,8) [] = { 0xf7, 0xf6, 0xf5, 0xf4,
      56  					      0xf3, 0xf2, 0xf1, 0xf0 };
      57  VECT_VAR_DECL(expected_vrev64,int,16,4) [] = { 0xfff3, 0xfff2, 0xfff1, 0xfff0 };
      58  VECT_VAR_DECL(expected_vrev64,int,32,2) [] = { 0xfffffff1, 0xfffffff0 };
      59  VECT_VAR_DECL(expected_vrev64,uint,8,8) [] = { 0xf7, 0xf6, 0xf5, 0xf4, 0xf3,
      60  					       0xf2, 0xf1, 0xf0 };
      61  VECT_VAR_DECL(expected_vrev64,uint,16,4) [] = { 0xfff3, 0xfff2, 0xfff1, 0xfff0 };
      62  VECT_VAR_DECL(expected_vrev64,uint,32,2) [] = { 0xfffffff1, 0xfffffff0 };
      63  VECT_VAR_DECL(expected_vrev64,poly,8,8) [] = { 0xf7, 0xf6, 0xf5, 0xf4,
      64  					       0xf3, 0xf2, 0xf1, 0xf0 };
      65  VECT_VAR_DECL(expected_vrev64,poly,16,4) [] = { 0xfff3, 0xfff2, 0xfff1, 0xfff0 };
      66  #if defined (FP16_SUPPORTED)
      67  VECT_VAR_DECL (expected_vrev64, hfloat, 16, 4) [] = { 0xca80, 0xcb00,
      68  						      0xcb80, 0xcc00 };
      69  #endif
      70  VECT_VAR_DECL(expected_vrev64,hfloat,32,2) [] = { 0xc1700000, 0xc1800000 };
      71  VECT_VAR_DECL(expected_vrev64,int,8,16) [] = { 0xf7, 0xf6, 0xf5, 0xf4,
      72  					       0xf3, 0xf2, 0xf1, 0xf0,
      73  					       0xff, 0xfe, 0xfd, 0xfc,
      74  					       0xfb, 0xfa, 0xf9, 0xf8 };
      75  VECT_VAR_DECL(expected_vrev64,int,16,8) [] = { 0xfff3, 0xfff2, 0xfff1, 0xfff0,
      76  					       0xfff7, 0xfff6, 0xfff5, 0xfff4 };
      77  VECT_VAR_DECL(expected_vrev64,int,32,4) [] = { 0xfffffff1, 0xfffffff0,
      78  					       0xfffffff3, 0xfffffff2 };
      79  VECT_VAR_DECL(expected_vrev64,uint,8,16) [] = { 0xf7, 0xf6, 0xf5, 0xf4,
      80  						0xf3, 0xf2, 0xf1, 0xf0,
      81  						0xff, 0xfe, 0xfd, 0xfc,
      82  						0xfb, 0xfa, 0xf9, 0xf8 };
      83  VECT_VAR_DECL(expected_vrev64,uint,16,8) [] = { 0xfff3, 0xfff2, 0xfff1, 0xfff0,
      84  						0xfff7, 0xfff6, 0xfff5, 0xfff4 };
      85  VECT_VAR_DECL(expected_vrev64,uint,32,4) [] = { 0xfffffff1, 0xfffffff0,
      86  						0xfffffff3, 0xfffffff2 };
      87  VECT_VAR_DECL(expected_vrev64,poly,8,16) [] = { 0xf7, 0xf6, 0xf5, 0xf4,
      88  						0xf3, 0xf2, 0xf1, 0xf0,
      89  						0xff, 0xfe, 0xfd, 0xfc,
      90  						0xfb, 0xfa, 0xf9, 0xf8 };
      91  VECT_VAR_DECL(expected_vrev64,poly,16,8) [] = { 0xfff3, 0xfff2, 0xfff1, 0xfff0,
      92  						0xfff7, 0xfff6, 0xfff5, 0xfff4 };
      93  #if defined (FP16_SUPPORTED)
      94  VECT_VAR_DECL (expected_vrev64, hfloat, 16, 8) [] = { 0xca80, 0xcb00,
      95  						      0xcb80, 0xcc00,
      96  						      0xc880, 0xc900,
      97  						      0xc980, 0xca00 };
      98  #endif
      99  VECT_VAR_DECL(expected_vrev64,hfloat,32,4) [] = { 0xc1700000, 0xc1800000,
     100  						  0xc1500000, 0xc1600000 };
     101  
     102  void exec_vrev (void)
     103  {
     104    /* Basic test: y=vrev(x), then store the result.  */
     105  #define TEST_VREV(Q, T1, T2, W, N, W2)					\
     106    VECT_VAR(vector_res, T1, W, N) =					\
     107      vrev##W2##Q##_##T2##W(VECT_VAR(vector, T1, W, N));			\
     108    vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), VECT_VAR(vector_res, T1, W, N))
     109  
     110    DECL_VARIABLE_ALL_VARIANTS(vector);
     111    DECL_VARIABLE_ALL_VARIANTS(vector_res);
     112  
     113    clean_results ();
     114  
     115    /* Initialize input "vector" from "buffer".  */
     116    TEST_MACRO_ALL_VARIANTS_2_5(VLOAD, vector, buffer);
     117  #if defined (FP16_SUPPORTED)
     118    VLOAD (vector, buffer, , float, f, 16, 4);
     119    VLOAD (vector, buffer, q, float, f, 16, 8);
     120  #endif
     121    VLOAD(vector, buffer, , float, f, 32, 2);
     122    VLOAD(vector, buffer, q, float, f, 32, 4);
     123  
     124    /* Check vrev in each of the existing combinations.  */
     125  #define TEST_MSG "VREV16"
     126    TEST_VREV(, int, s, 8, 8, 16);
     127    TEST_VREV(, uint, u, 8, 8, 16);
     128    TEST_VREV(, poly, p, 8, 8, 16);
     129    TEST_VREV(q, int, s, 8, 16, 16);
     130    TEST_VREV(q, uint, u, 8, 16, 16);
     131    TEST_VREV(q, poly, p, 8, 16, 16);
     132  
     133    CHECK(TEST_MSG, int, 8, 8, PRIx8, expected_vrev16, "");
     134    CHECK(TEST_MSG, uint, 8, 8, PRIx8, expected_vrev16, "");
     135    CHECK_POLY(TEST_MSG, poly, 8, 8, PRIx8, expected_vrev16, "");
     136    CHECK(TEST_MSG, int, 8, 16, PRIx8, expected_vrev16, "");
     137    CHECK(TEST_MSG, uint, 8, 16, PRIx8, expected_vrev16, "");
     138    CHECK_POLY(TEST_MSG, poly, 8, 16, PRIx8, expected_vrev16, "");
     139  
     140  #undef TEST_MSG
     141  #define TEST_MSG "VREV32"
     142    TEST_VREV(, int, s, 8, 8, 32);
     143    TEST_VREV(, int, s, 16, 4, 32);
     144    TEST_VREV(, uint, u, 8, 8, 32);
     145    TEST_VREV(, uint, u, 16, 4, 32);
     146    TEST_VREV(, poly, p, 8, 8, 32);
     147    TEST_VREV(, poly, p, 16, 4, 32);
     148    TEST_VREV(q, int, s, 8, 16, 32);
     149    TEST_VREV(q, int, s, 16, 8, 32);
     150    TEST_VREV(q, uint, u, 8, 16, 32);
     151    TEST_VREV(q, uint, u, 16, 8, 32);
     152    TEST_VREV(q, poly, p, 8, 16, 32);
     153    TEST_VREV(q, poly, p, 16, 8, 32);
     154  
     155    CHECK(TEST_MSG, int, 8, 8, PRIx8, expected_vrev32, "");
     156    CHECK(TEST_MSG, int, 16, 4, PRIx16, expected_vrev32, "");
     157    CHECK(TEST_MSG, uint, 8, 8, PRIx8, expected_vrev32, "");
     158    CHECK(TEST_MSG, uint, 16, 4, PRIx16, expected_vrev32, "");
     159    CHECK_POLY(TEST_MSG, poly, 8, 8, PRIx8, expected_vrev32, "");
     160    CHECK_POLY(TEST_MSG, poly, 16, 4, PRIx16, expected_vrev32, "");
     161    CHECK(TEST_MSG, int, 8, 16, PRIx8, expected_vrev32, "");
     162    CHECK(TEST_MSG, int, 16, 8, PRIx16, expected_vrev32, "");
     163    CHECK(TEST_MSG, uint, 8, 16, PRIx8, expected_vrev32, "");
     164    CHECK(TEST_MSG, uint, 16, 8, PRIx16, expected_vrev32, "");
     165    CHECK_POLY(TEST_MSG, poly, 8, 16, PRIx8, expected_vrev32, "");
     166    CHECK_POLY(TEST_MSG, poly, 16, 8, PRIx16, expected_vrev32, "");
     167  
     168  #undef TEST_MSG
     169  #define TEST_MSG "VREV64"
     170    TEST_VREV(, int, s, 8, 8, 64);
     171    TEST_VREV(, int, s, 16, 4, 64);
     172    TEST_VREV(, int, s, 32, 2, 64);
     173    TEST_VREV(, uint, u, 8, 8, 64);
     174    TEST_VREV(, uint, u, 16, 4, 64);
     175    TEST_VREV(, uint, u, 32, 2, 64);
     176    TEST_VREV(, poly, p, 8, 8, 64);
     177    TEST_VREV(, poly, p, 16, 4, 64);
     178    TEST_VREV(q, int, s, 8, 16, 64);
     179    TEST_VREV(q, int, s, 16, 8, 64);
     180    TEST_VREV(q, int, s, 32, 4, 64);
     181    TEST_VREV(q, uint, u, 8, 16, 64);
     182    TEST_VREV(q, uint, u, 16, 8, 64);
     183    TEST_VREV(q, uint, u, 32, 4, 64);
     184    TEST_VREV(q, poly, p, 8, 16, 64);
     185    TEST_VREV(q, poly, p, 16, 8, 64);
     186  
     187    CHECK(TEST_MSG, int, 8, 8, PRIx8, expected_vrev64, "");
     188    CHECK(TEST_MSG, int, 16, 4, PRIx16, expected_vrev64, "");
     189    CHECK(TEST_MSG, int, 32, 2, PRIx32, expected_vrev64, "");
     190    CHECK(TEST_MSG, uint, 8, 8, PRIx8, expected_vrev64, "");
     191    CHECK(TEST_MSG, uint, 16, 4, PRIx16, expected_vrev64, "");
     192    CHECK(TEST_MSG, uint, 32, 2, PRIx32, expected_vrev64, "");
     193    CHECK_POLY(TEST_MSG, poly, 8, 8, PRIx8, expected_vrev64, "");
     194    CHECK_POLY(TEST_MSG, poly, 16, 4, PRIx16, expected_vrev64, "");
     195    CHECK(TEST_MSG, int, 8, 16, PRIx8, expected_vrev64, "");
     196    CHECK(TEST_MSG, int, 16, 8, PRIx16, expected_vrev64, "");
     197    CHECK(TEST_MSG, int, 32, 4, PRIx32, expected_vrev64, "");
     198    CHECK(TEST_MSG, uint, 8, 16, PRIx8, expected_vrev64, "");
     199    CHECK(TEST_MSG, uint, 16, 8, PRIx16, expected_vrev64, "");
     200    CHECK(TEST_MSG, uint, 32, 4, PRIx32, expected_vrev64, "");
     201    CHECK_POLY(TEST_MSG, poly, 8, 16, PRIx8, expected_vrev64, "");
     202    CHECK_POLY(TEST_MSG, poly, 16, 8, PRIx16, expected_vrev64, "");
     203  
     204  #if defined (FP16_SUPPORTED)
     205    TEST_VREV (, float, f, 16, 4, 64);
     206    TEST_VREV (q, float, f, 16, 8, 64);
     207    CHECK_FP(TEST_MSG, float, 16, 4, PRIx32, expected_vrev64, "");
     208    CHECK_FP(TEST_MSG, float, 16, 8, PRIx32, expected_vrev64, "");
     209  #endif
     210    TEST_VREV(, float, f, 32, 2, 64);
     211    TEST_VREV(q, float, f, 32, 4, 64);
     212    CHECK_FP(TEST_MSG, float, 32, 2, PRIx32, expected_vrev64, "");
     213    CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected_vrev64, "");
     214  }
     215  
     216  int main (void)
     217  {
     218    exec_vrev ();
     219    return 0;
     220  }