Home | History | Annotate | Download | only in arm-neon-tests
      1 /*
      2 
      3 Copyright (c) 2009, 2010, 2011 STMicroelectronics
      4 Written by Christophe Lyon
      5 
      6 Permission is hereby granted, free of charge, to any person obtaining a copy
      7 of this software and associated documentation files (the "Software"), to deal
      8 in the Software without restriction, including without limitation the rights
      9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     10 copies of the Software, and to permit persons to whom the Software is
     11 furnished to do so, subject to the following conditions:
     12 
     13 The above copyright notice and this permission notice shall be included in
     14 all copies or substantial portions of the Software.
     15 
     16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     22 THE SOFTWARE.
     23 
     24 */
     25 
     26 #if defined(__arm__) || defined(__aarch64__)
     27 #include <arm_neon.h>
     28 #else
     29 #include "stm-arm-neon.h"
     30 #endif
     31 
     32 #include "stm-arm-neon-ref.h"
     33 
     34 #define TEST_MSG "VRSHL/VRSHLQ"
     35 void exec_vrshl (void)
     36 {
     37   /* Basic test: v3=vrshl(v1,v2), then store the result.  */
     38 #define TEST_VRSHL(T3, Q, T1, T2, W, N)					\
     39   VECT_VAR(vector_res, T1, W, N) =					\
     40     vrshl##Q##_##T2##W(VECT_VAR(vector, T1, W, N),			\
     41 		       VECT_VAR(vector_shift, T3, W, N));		\
     42   vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), VECT_VAR(vector_res, T1, W, N))
     43 
     44   /* With ARM RVCT, we need to declare variables before any executable
     45      statement */
     46   DECL_VARIABLE_ALL_VARIANTS(vector);
     47   DECL_VARIABLE_ALL_VARIANTS(vector_res);
     48 
     49   DECL_VARIABLE_SIGNED_VARIANTS(vector_shift);
     50 
     51   clean_results ();
     52 
     53   /* Fill input vector with 0, to check behavior on limits */
     54   VDUP(vector, , int, s, 8, 8, 0);
     55   VDUP(vector, , int, s, 16, 4, 0);
     56   VDUP(vector, , int, s, 32, 2, 0);
     57   VDUP(vector, , int, s, 64, 1, 0);
     58   VDUP(vector, , uint, u, 8, 8, 0);
     59   VDUP(vector, , uint, u, 16, 4, 0);
     60   VDUP(vector, , uint, u, 32, 2, 0);
     61   VDUP(vector, , uint, u, 64, 1, 0);
     62   VDUP(vector, q, int, s, 8, 16, 0);
     63   VDUP(vector, q, int, s, 16, 8, 0);
     64   VDUP(vector, q, int, s, 32, 4, 0);
     65   VDUP(vector, q, int, s, 64, 2, 0);
     66   VDUP(vector, q, uint, u, 8, 16, 0);
     67   VDUP(vector, q, uint, u, 16, 8, 0);
     68   VDUP(vector, q, uint, u, 32, 4, 0);
     69   VDUP(vector, q, uint, u, 64, 2, 0);
     70 
     71   /* Choose init value arbitrarily, will be used as shift amount */
     72   /* Use values equal to one-less-than the type width to check
     73      behaviour on limits */
     74   VDUP(vector_shift, , int, s, 8, 8, 7);
     75   VDUP(vector_shift, , int, s, 16, 4, 15);
     76   VDUP(vector_shift, , int, s, 32, 2, 31);
     77   VDUP(vector_shift, , int, s, 64, 1, 63);
     78   VDUP(vector_shift, q, int, s, 8, 16, 7);
     79   VDUP(vector_shift, q, int, s, 16, 8, 15);
     80   VDUP(vector_shift, q, int, s, 32, 4, 31);
     81   VDUP(vector_shift, q, int, s, 64, 2, 63);
     82 
     83   TEST_MACRO_ALL_VARIANTS_1_5(TEST_VRSHL, int);
     84 
     85   dump_results_hex2 (TEST_MSG, " (with input = 0)");
     86 
     87   /* Use negative shift amounts */
     88   VDUP(vector_shift, , int, s, 8, 8, -1);
     89   VDUP(vector_shift, , int, s, 16, 4, -2);
     90   VDUP(vector_shift, , int, s, 32, 2, -3);
     91   VDUP(vector_shift, , int, s, 64, 1, -4);
     92   VDUP(vector_shift, q, int, s, 8, 16, -7);
     93   VDUP(vector_shift, q, int, s, 16, 8, -11);
     94   VDUP(vector_shift, q, int, s, 32, 4, -13);
     95   VDUP(vector_shift, q, int, s, 64, 2, -20);
     96 
     97   TEST_MACRO_ALL_VARIANTS_1_5(TEST_VRSHL, int);
     98 
     99   dump_results_hex2 (TEST_MSG, " (input 0 and negative shift amount)");
    100 
    101   /* Test again, with predefined input values */
    102   TEST_MACRO_ALL_VARIANTS_2_5(VLOAD, vector, buffer);
    103 
    104   /* Choose init value arbitrarily, will be used as shift amount */
    105   VDUP(vector_shift, , int, s, 8, 8, 1);
    106   VDUP(vector_shift, , int, s, 16, 4, 3);
    107   VDUP(vector_shift, , int, s, 32, 2, 8);
    108   VDUP(vector_shift, , int, s, 64, 1, -3);
    109   VDUP(vector_shift, q, int, s, 8, 16, 10);
    110   VDUP(vector_shift, q, int, s, 16, 8, 12);
    111   VDUP(vector_shift, q, int, s, 32, 4, 32);
    112   VDUP(vector_shift, q, int, s, 64, 2, 63);
    113 
    114   TEST_MACRO_ALL_VARIANTS_1_5(TEST_VRSHL, int);
    115 
    116   dump_results_hex (TEST_MSG);
    117 
    118 
    119   /* Use negative shift amounts */
    120   VDUP(vector_shift, , int, s, 8, 8, -1);
    121   VDUP(vector_shift, , int, s, 16, 4, -2);
    122   VDUP(vector_shift, , int, s, 32, 2, -3);
    123   VDUP(vector_shift, , int, s, 64, 1, -4);
    124   VDUP(vector_shift, q, int, s, 8, 16, -7);
    125   VDUP(vector_shift, q, int, s, 16, 8, -11);
    126   VDUP(vector_shift, q, int, s, 32, 4, -13);
    127   VDUP(vector_shift, q, int, s, 64, 2, -20);
    128 
    129   TEST_MACRO_ALL_VARIANTS_1_5(TEST_VRSHL, int);
    130 
    131   dump_results_hex2 (TEST_MSG, " (negative shift amount)");
    132 
    133   /* Fill input vector with max value, to check behavior on limits */
    134   VDUP(vector, , int, s, 8, 8, 0x7F);
    135   VDUP(vector, , int, s, 16, 4, 0x7FFF);
    136   VDUP(vector, , int, s, 32, 2, 0x7FFFFFFF);
    137   VDUP(vector, , int, s, 64, 1, 0x7FFFFFFFFFFFFFFFLL);
    138   VDUP(vector, , uint, u, 8, 8, 0xFF);
    139   VDUP(vector, , uint, u, 16, 4, 0xFFFF);
    140   VDUP(vector, , uint, u, 32, 2, 0xFFFFFFFF);
    141   VDUP(vector, , uint, u, 64, 1, 0xFFFFFFFFFFFFFFFFULL);
    142   VDUP(vector, q, int, s, 8, 16, 0x7F);
    143   VDUP(vector, q, int, s, 16, 8, 0x7FFF);
    144   VDUP(vector, q, int, s, 32, 4, 0x7FFFFFFF);
    145   VDUP(vector, q, int, s, 64, 2, 0x7FFFFFFFFFFFFFFFLL);
    146   VDUP(vector, q, uint, u, 8, 16, 0xFF);
    147   VDUP(vector, q, uint, u, 16, 8, 0xFFFF);
    148   VDUP(vector, q, uint, u, 32, 4, 0xFFFFFFFF);
    149   VDUP(vector, q, uint, u, 64, 2, 0xFFFFFFFFFFFFFFFFULL);
    150 
    151   /* Use -1 shift amount to check overflow with round_const */
    152   VDUP(vector_shift, , int, s, 8, 8, -1);
    153   VDUP(vector_shift, , int, s, 16, 4, -1);
    154   VDUP(vector_shift, , int, s, 32, 2, -1);
    155   VDUP(vector_shift, , int, s, 64, 1, -1);
    156   VDUP(vector_shift, q, int, s, 8, 16, -1);
    157   VDUP(vector_shift, q, int, s, 16, 8, -1);
    158   VDUP(vector_shift, q, int, s, 32, 4, -1);
    159   VDUP(vector_shift, q, int, s, 64, 2, -1);
    160 
    161   TEST_MACRO_ALL_VARIANTS_1_5(TEST_VRSHL, int);
    162 
    163   dump_results_hex2 (TEST_MSG, " (checking round_const overflow: shift by -1)");
    164 
    165   /* Use -3 shift amount to check overflow with round_const */
    166   VDUP(vector_shift, , int, s, 8, 8, -3);
    167   VDUP(vector_shift, , int, s, 16, 4, -3);
    168   VDUP(vector_shift, , int, s, 32, 2, -3);
    169   VDUP(vector_shift, , int, s, 64, 1, -3);
    170   VDUP(vector_shift, q, int, s, 8, 16, -3);
    171   VDUP(vector_shift, q, int, s, 16, 8, -3);
    172   VDUP(vector_shift, q, int, s, 32, 4, -3);
    173   VDUP(vector_shift, q, int, s, 64, 2, -3);
    174 
    175   TEST_MACRO_ALL_VARIANTS_1_5(TEST_VRSHL, int);
    176 
    177   dump_results_hex2 (TEST_MSG, " (checking round_const overflow: shift by -3)");
    178 
    179   /* Use negative shift amount as large as input vector width */
    180   VDUP(vector_shift, , int, s, 8, 8, -8);
    181   VDUP(vector_shift, , int, s, 16, 4, -16);
    182   VDUP(vector_shift, , int, s, 32, 2, -32);
    183   VDUP(vector_shift, , int, s, 64, 1, -64);
    184   VDUP(vector_shift, q, int, s, 8, 16, -8);
    185   VDUP(vector_shift, q, int, s, 16, 8, -16);
    186   VDUP(vector_shift, q, int, s, 32, 4, -32);
    187   VDUP(vector_shift, q, int, s, 64, 2, -64);
    188 
    189   TEST_MACRO_ALL_VARIANTS_1_5(TEST_VRSHL, int);
    190 
    191   dump_results_hex2 (TEST_MSG, " (checking negative shift amount as large as input vector width)");
    192 
    193   /* Test large shift amount */
    194   VDUP(vector_shift, , int, s, 8, 8, 10);
    195   VDUP(vector_shift, , int, s, 16, 4, 20);
    196   VDUP(vector_shift, , int, s, 32, 2, 33);
    197   VDUP(vector_shift, , int, s, 64, 1, 65);
    198   VDUP(vector_shift, q, int, s, 8, 16, 9);
    199   VDUP(vector_shift, q, int, s, 16, 8, 16);
    200   VDUP(vector_shift, q, int, s, 32, 4, 32);
    201   VDUP(vector_shift, q, int, s, 64, 2, 64);
    202 
    203   TEST_MACRO_ALL_VARIANTS_1_5(TEST_VRSHL, int);
    204 
    205   dump_results_hex2 (TEST_MSG, " (large shift amount)");
    206 
    207   /* Test large negative shift amount */
    208   VDUP(vector_shift, , int, s, 8, 8, -10);
    209   VDUP(vector_shift, , int, s, 16, 4, -20);
    210   VDUP(vector_shift, , int, s, 32, 2, -33);
    211   VDUP(vector_shift, , int, s, 64, 1, -65);
    212   VDUP(vector_shift, q, int, s, 8, 16, -9);
    213   VDUP(vector_shift, q, int, s, 16, 8, -16);
    214   VDUP(vector_shift, q, int, s, 32, 4, -32);
    215   VDUP(vector_shift, q, int, s, 64, 2, -64);
    216 
    217   TEST_MACRO_ALL_VARIANTS_1_5(TEST_VRSHL, int);
    218 
    219   dump_results_hex2 (TEST_MSG, " (large negative shift amount)");
    220 }
    221