(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
p9-sign_extend-runnable.c
       1  /* { dg-do run { target { *-*-linux* && { lp64 && p9vector_hw } } } } */
       2  /* { dg-require-effective-target powerpc_p9vector_ok } */
       3  /* { dg-options "-O2 -mdejagnu-cpu=power9 -save-temps" } */
       4  
       5  /* These builtins were not defined until ISA 3.1 but only require ISA 3.0
       6     support.  */
       7  
       8  /* { dg-final { scan-assembler-times {\mvextsb2w\M} 1 } } */
       9  /* { dg-final { scan-assembler-times {\mvextsb2d\M} 1 } } */
      10  /* { dg-final { scan-assembler-times {\mvextsh2w\M} 1 } } */
      11  /* { dg-final { scan-assembler-times {\mvextsh2d\M} 1 } } */
      12  /* { dg-final { scan-assembler-times {\mvextsw2d\M} 1 } } */
      13  
      14  #include <altivec.h>
      15  
      16  #define DEBUG 0
      17  
      18  #if DEBUG
      19  #include <stdio.h>
      20  #include <stdlib.h>
      21  #endif
      22  
      23  void abort (void);
      24  
      25  int main ()
      26  {
      27    int i;
      28  
      29    vector signed char vec_arg_qi, vec_result_qi;
      30    vector signed short int vec_arg_hi, vec_result_hi, vec_expected_hi;
      31    vector signed int vec_arg_wi, vec_result_wi, vec_expected_wi;
      32    vector signed long long vec_result_di, vec_expected_di;
      33  
      34    /* test sign extend byte to word */
      35    vec_arg_qi = (vector signed char) {1, 2, 3, 4, 5, 6, 7, 8,
      36  				     -1, -2, -3, -4, -5, -6, -7, -8};
      37  
      38  #ifdef __BIG_ENDIAN__
      39    vec_expected_wi = (vector signed int) {4, 8, -4, -8};
      40  #else
      41    vec_expected_wi = (vector signed int) {1, 5, -1, -5};
      42  #endif
      43  
      44    vec_result_wi = vec_signexti (vec_arg_qi);
      45  
      46    for (i = 0; i < 4; i++)
      47      if (vec_result_wi[i] != vec_expected_wi[i]) {
      48  #if DEBUG
      49        printf("ERROR: vec_signexti(char, int):  ");
      50        printf("vec_result_wi[%d] != vec_expected_wi[%d]\n",
      51  	     i, i);
      52        printf("vec_result_wi[%d] = %d\n", i, vec_result_wi[i]);
      53        printf("vec_expected_wi[%d] = %d\n", i, vec_expected_wi[i]);
      54  #else
      55        abort();
      56  #endif
      57      }
      58  
      59    /* test sign extend byte to double */
      60    vec_arg_qi = (vector signed char){1, 2, 3, 4, 5, 6, 7, 8,
      61  				    -1, -2, -3, -4, -5, -6, -7, -8};
      62  
      63  #ifdef __BIG_ENDIAN__
      64    vec_expected_di = (vector signed long long int){8, -8};
      65  #else
      66    vec_expected_di = (vector signed long long int){1, -1};
      67  #endif
      68  
      69    vec_result_di = vec_signextll(vec_arg_qi);
      70  
      71    for (i = 0; i < 2; i++)
      72      if (vec_result_di[i] != vec_expected_di[i]) {
      73  #if DEBUG
      74        printf("ERROR: vec_signextll(byte, long long int):  ");
      75        printf("vec_result_di[%d] != vec_expected_di[%d]\n", i, i);
      76        printf("vec_result_di[%d] = %lld\n", i, vec_result_di[i]);
      77        printf("vec_expected_di[%d] = %lld\n", i, vec_expected_di[i]);
      78  #else
      79        abort();
      80  #endif
      81      }
      82  
      83    /* test sign extend short to word */
      84    vec_arg_hi = (vector signed short int){1, 2, 3, 4, -1, -2, -3, -4};
      85  
      86  #ifdef __BIG_ENDIAN__
      87    vec_expected_wi = (vector signed int){2, 4, -2, -4};
      88  #else
      89    vec_expected_wi = (vector signed int){1, 3, -1, -3};
      90  #endif
      91  
      92    vec_result_wi = vec_signexti(vec_arg_hi);
      93  
      94    for (i = 0; i < 4; i++)
      95      if (vec_result_wi[i] != vec_expected_wi[i]) {
      96  #if DEBUG
      97        printf("ERROR: vec_signexti(short, int):  ");
      98        printf("vec_result_wi[%d] != vec_expected_wi[%d]\n", i, i);
      99        printf("vec_result_wi[%d] = %d\n", i, vec_result_wi[i]);
     100        printf("vec_expected_wi[%d] = %d\n", i, vec_expected_wi[i]);
     101  #else
     102        abort();
     103  #endif
     104      }
     105  
     106    /* test sign extend short to double word */
     107    vec_arg_hi = (vector signed short int ){1, 3, 5, 7,  -1, -3, -5, -7};
     108  
     109  #ifdef __BIG_ENDIAN__
     110    vec_expected_di = (vector signed long long int){7, -7};
     111  #else
     112    vec_expected_di = (vector signed long long int){1, -1};
     113  #endif
     114  
     115    vec_result_di = vec_signextll(vec_arg_hi);
     116  
     117    for (i = 0; i < 2; i++)
     118      if (vec_result_di[i] != vec_expected_di[i]) {
     119  #if DEBUG
     120        printf("ERROR: vec_signextll(short, double):  ");
     121        printf("vec_result_di[%d] != vec_expected_di[%d]\n", i, i);
     122        printf("vec_result_di[%d] = %lld\n", i, vec_result_di[i]);
     123        printf("vec_expected_di[%d] = %lld\n", i, vec_expected_di[i]);
     124  #else
     125        abort();
     126  #endif
     127      }
     128  
     129    /* test sign extend word to double word */
     130    vec_arg_wi = (vector signed int ){1, 3, -1, -3};
     131  
     132  #ifdef __BIG_ENDIAN__
     133    vec_expected_di = (vector signed long long int){3, -3};
     134  #else
     135    vec_expected_di = (vector signed long long int){1, -1};
     136  #endif
     137  
     138    vec_result_di = vec_signextll(vec_arg_wi);
     139  
     140    for (i = 0; i < 2; i++)
     141      if (vec_result_di[i] != vec_expected_di[i]) {
     142  #if DEBUG
     143        printf("ERROR: vec_signextll(word, double):  ");
     144        printf("vec_result_di[%d] != vec_expected_di[%d]\n", i, i);
     145        printf("vec_result_di[%d] = %lld\n", i, vec_result_di[i]);
     146        printf("vec_expected_di[%d] = %lld\n", i, vec_expected_di[i]);
     147  #else
     148        abort();
     149  #endif
     150      }
     151  
     152    return 0;
     153  }