(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vec-permute-ext-runnable.c
       1  /* { dg-do run { target { power10_hw } } } */
       2  /* { dg-do link { target { ! power10_hw } } } */
       3  /* { dg-require-effective-target power10_ok } */
       4  /* { dg-options "-mdejagnu-cpu=power10 -save-temps" } */
       5  #include <altivec.h>
       6  
       7  #define DEBUG 0
       8  
       9  #if DEBUG
      10  #include <stdio.h>
      11  #endif
      12  
      13  extern void abort (void);
      14  
      15  int
      16  main (int argc, char *argv [])
      17  {
      18    int i;
      19    vector signed char vsrc_a_char, vsrc_b_char;
      20    vector signed char vresult_char;
      21    vector signed char expected_vresult_char;
      22  
      23    vector unsigned char vsrc_a_uchar, vsrc_b_uchar, vsrc_c_uchar;
      24    vector unsigned char vresult_uchar;
      25    vector unsigned char expected_vresult_uchar;
      26  
      27    vector signed short vsrc_a_short, vsrc_b_short, vsrc_c_short;
      28    vector signed short vresult_short;
      29    vector signed short expected_vresult_short;
      30  
      31    vector unsigned short vsrc_a_ushort, vsrc_b_ushort, vsrc_c_ushort;
      32    vector unsigned short vresult_ushort;
      33    vector unsigned short expected_vresult_ushort;
      34  
      35    vector int vsrc_a_int, vsrc_b_int, vsrc_c_int;
      36    vector int vresult_int;
      37    vector int expected_vresult_int;
      38  
      39    vector unsigned int vsrc_a_uint, vsrc_b_uint, vsrc_c_uint;
      40    vector unsigned int vresult_uint;
      41    vector unsigned int expected_vresult_uint;
      42  
      43    vector long long int vsrc_a_ll, vsrc_b_ll, vsrc_c_ll;
      44    vector long long int vresult_ll;
      45    vector long long int expected_vresult_ll;
      46  
      47    vector unsigned long long int vsrc_a_ull,  vsrc_b_ull,  vsrc_c_ull;
      48    vector unsigned long long int vresult_ull;
      49    vector unsigned long long int expected_vresult_ull;
      50  
      51    vector float vresult_f;
      52    vector float expected_vresult_f;
      53    vector float vsrc_a_f, vsrc_b_f;
      54  
      55    vector double vsrc_a_d, vsrc_b_d;
      56    vector double vresult_d;
      57    vector double expected_vresult_d;
      58   
      59    /* Vector permx */
      60    vsrc_a_char = (vector signed char) { -1, 3, 5, 7, 9, 11, 13, 15,
      61                                         17, 19, 21, 23, 25, 27, 29 };
      62    vsrc_b_char = (vector signed char) { 2, -4, 6, 8, 10, 12, 14, 16,
      63  				       18, 20, 22, 24, 26, 28, 30, 32 };
      64    vsrc_c_uchar = (vector unsigned char) { 0x0, 0x7, 0, 0x5, 0, 0x3, 0, 0x1,
      65  					  0, 0x2, 0, 0x4, 0, 0x6, 0, 0x0 };
      66    vresult_char = (vector signed char) { 0, 0, 0, 0, 0, 0, 0, 0,
      67  					0, 0, 0, 0, 0, 0, 0, 0 };
      68    expected_vresult_char = (vector signed char) { -1, 15, -1, 11,
      69  						 -1, 7, -1, 3,
      70  						 -1, 5, -1, 9,
      71  						 -1, 13, -1, -1 };
      72  						 
      73    vresult_char = vec_permx (vsrc_a_char, vsrc_b_char, vsrc_c_uchar, 0);
      74  
      75    if (!vec_all_eq (vresult_char,  expected_vresult_char)) {
      76  #if DEBUG
      77      printf("ERROR, vec_permx (vsrc_a_char, vsrc_b_char, vsrc_c_uchar)\n");
      78      for(i = 0; i < 16; i++)
      79        printf(" vresult_char[%d] = %d, expected_vresult_char[%d] = %d\n",
      80  	     i, vresult_char[i], i, expected_vresult_char[i]);
      81  #else
      82      abort();
      83  #endif
      84    }
      85  
      86    vsrc_a_uchar = (vector unsigned char) { 1, 3, 5, 7, 9, 11, 13, 15,
      87  					  17, 19, 21, 23, 25, 27, 29 };
      88    vsrc_b_uchar = (vector unsigned char) { 2, 4, 6, 8, 10, 12, 14, 16,
      89  					  18, 20, 22, 24, 26, 28, 30, 32 };
      90    vsrc_c_uchar = (vector unsigned char) { 0x0, 0x7, 0, 0x5, 0, 0x3, 0, 0x1,
      91  					  0, 0x2, 0, 0x4, 0, 0x6, 0, 0x0 };
      92    vresult_uchar = (vector unsigned char) { 0, 0, 0, 0, 0, 0, 0, 0,
      93  					   0, 0, 0, 0, 0, 0, 0, 0 };
      94    expected_vresult_uchar = (vector unsigned char) { 1, 15, 1, 11,
      95  						    1, 7, 1, 3,
      96  						    1, 5, 1, 9,
      97  						    1, 13, 1, 1 };
      98  						 
      99    vresult_uchar = vec_permx (vsrc_a_uchar, vsrc_b_uchar, vsrc_c_uchar, 0);
     100  
     101    if (!vec_all_eq (vresult_uchar,  expected_vresult_uchar)) {
     102  #if DEBUG
     103      printf("ERROR, vec_permx (vsrc_a_uchar, vsrc_b_uchar, vsrc_c_uchar)\n");
     104      for(i = 0; i < 16; i++)
     105        printf(" vresult_uchar[%d] = %d, expected_vresult_uchar[%d] = %d\n",
     106  	     i, vresult_uchar[i], i, expected_vresult_uchar[i]);
     107  #else
     108      abort();
     109  #endif
     110    }
     111  
     112    vsrc_a_short = (vector signed short int) { 1, -3, 5, 7, 9, 11, 13, 15 };
     113    vsrc_b_short = (vector signed short int) { 2, 4, -6, 8, 10, 12, 14, 16 };
     114    vsrc_c_uchar = (vector unsigned char) { 0x0, 0x1, 0x2, 0x3,
     115  					  0x4, 0x5, 0x2, 0x3,
     116  					  0x8, 0x9, 0x2, 0x3,
     117  					  0x1E, 0x1F, 0x2, 0x3 };
     118    vresult_short = (vector signed short int) { 0, 0, 0, 0, 0, 0, 0, 0 };
     119    expected_vresult_short = (vector signed short int) { 1, -3, 5, -3,
     120  						       9, -3, 16, -3 };
     121  						 
     122    vresult_short = vec_permx (vsrc_a_short, vsrc_b_short, vsrc_c_uchar, 0);
     123  
     124    if (!vec_all_eq (vresult_short,  expected_vresult_short)) {
     125  #if DEBUG
     126      printf("ERROR, vec_permx (vsrc_a_short, vsrc_b_short, vsrc_c_uchar)\n");
     127      for(i = 0; i < 8; i++)
     128        printf(" vresult_short[%d] = %d, expected_vresult_short[%d] = %d\n",
     129  	     i, vresult_short[i], i, expected_vresult_short[i]);
     130  #else
     131      abort();
     132  #endif
     133    }
     134  
     135    vsrc_a_ushort = (vector unsigned short int) { 1, 3, 5, 7, 9, 11, 13, 15 };
     136    vsrc_b_ushort = (vector unsigned short int) { 2, 4, 6, 8, 10, 12, 14, 16 };
     137    vsrc_c_uchar = (vector unsigned char) { 0x0, 0x1, 0x2, 0x3,
     138  					  0x4, 0x5, 0x2, 0x3,
     139  					  0x8, 0x9, 0x2, 0x3,
     140  					  0x1E, 0x1F, 0x2, 0x3 };
     141    vresult_ushort = (vector unsigned short int) { 0, 0, 0, 0, 0, 0, 0, 0 };
     142    expected_vresult_ushort = (vector unsigned short int) { 1, 3, 5, 3,
     143  							  9, 3, 16, 3 };
     144  						 
     145    vresult_ushort = vec_permx (vsrc_a_ushort, vsrc_b_ushort, vsrc_c_uchar, 0);
     146  
     147    if (!vec_all_eq (vresult_ushort,  expected_vresult_ushort)) {
     148  #if DEBUG
     149      printf("ERROR, vec_permx (vsrc_a_ushort, vsrc_b_ushort, vsrc_c_uchar)\n");
     150      for(i = 0; i < 8; i++)
     151        printf(" vresult_ushort[%d] = %d, expected_vresult_ushort[%d] = %d\n",
     152  	     i, vresult_ushort[i], i, expected_vresult_ushort[i]);
     153  #else
     154      abort();
     155  #endif
     156    }
     157  
     158    vsrc_a_int = (vector signed int) { 1, -3, 5, 7 };
     159    vsrc_b_int = (vector signed int) { 2, 4, -6, 8 };
     160    vsrc_c_uchar = (vector unsigned char) { 0x0, 0x1, 0x2, 0x3,
     161  					  0x4, 0x5, 0x6, 0x7,
     162  					  0x18, 0x19, 0x1A, 0x1B,
     163  					  0x1C, 0x1D, 0x1E, 0x1F };
     164    vresult_int = (vector signed int) { 0, 0, 0, 0 };
     165    expected_vresult_int = (vector signed int) { 1, -3, -6, 8 };
     166  						 
     167    vresult_int = vec_permx (vsrc_a_int, vsrc_b_int, vsrc_c_uchar, 0);
     168  
     169    if (!vec_all_eq (vresult_int,  expected_vresult_int)) {
     170  #if DEBUG
     171      printf("ERROR, vec_permx (vsrc_a_int, vsrc_b_int, vsrc_c_uchar)\n");
     172      for(i = 0; i < 4; i++)
     173        printf(" vresult_int[%d] = %d, expected_vresult_int[%d] = %d\n",
     174  	     i, vresult_int[i], i, expected_vresult_int[i]);
     175  #else
     176      abort();
     177  #endif
     178    }
     179  
     180    vsrc_a_uint = (vector unsigned int) { 1, 3, 5, 7 };
     181    vsrc_b_uint = (vector unsigned int) { 10, 12, 14, 16 };
     182    vsrc_c_uchar = (vector unsigned char) { 0x0, 0x1, 0x2, 0x3,
     183  					  0x4, 0x5, 0x6, 0x7,
     184  					  0x18, 0x19, 0x1A, 0x1B,
     185  					  0x1C, 0x1D, 0x1E, 0x1F };
     186    vresult_uint = (vector unsigned int) { 0, 0, 0, 0 };
     187    expected_vresult_uint = (vector unsigned int) { 1, 3, 14, 16 };
     188  						 
     189    vresult_uint = vec_permx (vsrc_a_uint, vsrc_b_uint, vsrc_c_uchar, 0);
     190  
     191    if (!vec_all_eq (vresult_uint,  expected_vresult_uint)) {
     192  #if DEBUG
     193      printf("ERROR, vec_permx (vsrc_a_uint, vsrc_b_uint, vsrc_c_uchar)\n");
     194      for(i = 0; i < 4; i++)
     195        printf(" vresult_uint[%d] = %d, expected_vresult_uint[%d] = %d\n",
     196  	     i, vresult_uint[i], i, expected_vresult_uint[i]);
     197  #else
     198      abort();
     199  #endif
     200    }
     201  
     202    vsrc_a_ll = (vector signed long long int) { 1, -3 };
     203    vsrc_b_ll = (vector signed long long int) { 2, -4 };
     204    vsrc_c_uchar = (vector unsigned char) { 0x0, 0x1, 0x2, 0x3,
     205  					  0x4, 0x5, 0x6, 0x7,
     206  					  0x18, 0x19, 0x1A, 0x1B,
     207  					  0x1C, 0x1D, 0x1E, 0x1F };
     208    vresult_ll = (vector signed long long int) { 0, 0};
     209    expected_vresult_ll = (vector signed long long int) { 1, -4 };
     210  						 
     211    vresult_ll = vec_permx (vsrc_a_ll, vsrc_b_ll, vsrc_c_uchar, 0);
     212  
     213    if (!vec_all_eq (vresult_ll,  expected_vresult_ll)) {
     214  #if DEBUG
     215      printf("ERROR, vec_permx (vsrc_a_ll, vsrc_b_ll, vsrc_c_uchar)\n");
     216      for(i = 0; i < 2; i++)
     217        printf(" vresult_ll[%d] = %lld, expected_vresult_ll[%d] = %lld\n",
     218  	     i, vresult_ll[i], i, expected_vresult_ll[i]);
     219  #else
     220      abort();
     221  #endif
     222    }
     223  
     224    vsrc_a_ull = (vector unsigned long long int) { 1, 3 };
     225    vsrc_b_ull = (vector unsigned long long int) { 10, 12 };
     226    vsrc_c_uchar = (vector unsigned char) { 0x0, 0x1, 0x2, 0x3,
     227  					  0x4, 0x5, 0x6, 0x7,
     228  					  0x18, 0x19, 0x1A, 0x1B,
     229  					  0x1C, 0x1D, 0x1E, 0x1F };
     230    vresult_ull = (vector unsigned long long int) { 0, 0 };
     231    expected_vresult_ull = (vector unsigned long long int) { 1, 12 };
     232  						 
     233    vresult_ull = vec_permx (vsrc_a_ull, vsrc_b_ull, vsrc_c_uchar, 0);
     234  
     235    if (!vec_all_eq (vresult_ull,  expected_vresult_ull)) {
     236  #if DEBUG
     237      printf("ERROR, vec_permx (vsrc_a_ull, vsrc_b_ull, vsrc_c_uchar)\n");
     238      for(i = 0; i < 2; i++)
     239        printf(" vresult_ull[%d] = %d, expected_vresult_ull[%d] = %d\n",
     240  	     i, vresult_ull[i], i, expected_vresult_ull[i]);
     241  #else
     242      abort();
     243  #endif
     244    }
     245  
     246    vsrc_a_f = (vector float) { -3.0, 5.0, 7.0, 9.0 };
     247    vsrc_b_f = (vector float) { 2.0,  4.0, 6.0, 8.0  };
     248    vsrc_c_uchar = (vector unsigned char) { 0x0, 0x1, 0x2, 0x3,
     249  					  0x4, 0x5, 0x6, 0x7,
     250  					  0x18, 0x19, 0x1A, 0x1B,
     251  					  0x1C, 0x1D, 0x1E, 0x1F };
     252    vresult_f = (vector float) { 0.0, 0.0, 0.0, 0.0 };
     253    expected_vresult_f = (vector float) { -3.0, 5.0, 6.0, 8.0 };
     254  						 
     255    vresult_f = vec_permx (vsrc_a_f, vsrc_b_f, vsrc_c_uchar, 0);
     256  
     257    if (!vec_all_eq (vresult_f,  expected_vresult_f)) {
     258  #if DEBUG
     259      printf("ERROR, vec_permx (vsrc_a_f, vsrc_b_f, vsrc_c_uchar)\n");
     260      for(i = 0; i < 4; i++)
     261        printf(" vresult_f[%d] = %f, expected_vresult_f[%d] = %f\n",
     262  	     i, vresult_f[i], i, expected_vresult_f[i]);
     263  #else
     264      abort();
     265  #endif
     266    }
     267  
     268    vsrc_a_d = (vector double) { 1.0, -3.0 };
     269    vsrc_b_d = (vector double) { 2.0, -4.0 };
     270    vsrc_c_uchar = (vector unsigned char) { 0x0, 0x1, 0x2, 0x3,
     271  					  0x4, 0x5, 0x6, 0x7,
     272  					  0x1A, 0x1B, 0x1C, 0x1B,
     273  					  0x1C, 0x1D, 0x1E, 0x1F };
     274    vresult_d = (vector double) { 0.0, 0.0 };
     275    expected_vresult_d = (vector double) { 1.0, -4.0 };
     276  						 
     277    vresult_d = vec_permx (vsrc_a_d, vsrc_b_d, vsrc_c_uchar, 0);
     278  
     279    if (!vec_all_eq (vresult_d,  expected_vresult_d)) {
     280  #if DEBUG
     281      printf("ERROR, vec_permx (vsrc_a_d, vsrc_b_d, vsrc_c_uchar)\n");
     282      for(i = 0; i < 2; i++)
     283        printf(" vresult_d[%d] = %f, expected_vresult_d[%d] = %f\n",
     284  	     i, vresult_d[i], i, expected_vresult_d[i]);
     285  #else
     286      abort();
     287  #endif
     288    }
     289  
     290    return 0;
     291  }
     292  
     293  /* { dg-final { scan-assembler-times {\mxxpermx\M} 10 } } */
     294  
     295