(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vec-replace-word-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  
       6  #include <altivec.h>
       7  
       8  #define DEBUG 0
       9  
      10  #if DEBUG
      11  #include <stdio.h>
      12  #endif
      13  
      14  extern void abort (void);
      15  
      16  int
      17  main (int argc, char *argv [])
      18  {
      19    int i;
      20    unsigned char ch;
      21    unsigned int index;
      22  
      23    vector unsigned int vresult_uint;
      24    vector unsigned int expected_vresult_uint;
      25    vector unsigned int src_va_uint;
      26    vector unsigned int src_vb_uint;
      27    unsigned int src_a_uint;
      28  
      29    vector int vresult_int;
      30    vector int expected_vresult_int;
      31    vector int src_va_int;
      32    vector int src_vb_int;
      33    int src_a_int;
      34  
      35    vector unsigned long long int vresult_ullint;
      36    vector unsigned long long int expected_vresult_ullint;
      37    vector unsigned long long int src_va_ullint;
      38    vector unsigned long long int src_vb_ullint;
      39    unsigned int long long src_a_ullint;
      40  
      41    vector long long int vresult_llint;
      42    vector long long int expected_vresult_llint;
      43    vector long long int src_va_llint;
      44    vector long long int src_vb_llint;
      45    long long int src_a_llint;
      46  
      47    vector float vresult_float;
      48    vector float expected_vresult_float;
      49    vector float src_va_float;
      50    float src_a_float;
      51  
      52    vector double vresult_double;
      53    vector double expected_vresult_double;
      54    vector double src_va_double;
      55    double src_a_double;
      56  
      57    vector unsigned char vresult_uchar;
      58  
      59    /* Vector replace 32-bit element */
      60    src_a_uint = 345;
      61    src_va_uint = (vector unsigned int) { 0, 1, 2, 3 };
      62    vresult_uint = (vector unsigned int) { 0, 0, 0, 0 };
      63    expected_vresult_uint = (vector unsigned int) { 0, 1, 345, 3 };
      64  						 
      65    vresult_uint = vec_replace_elt (src_va_uint, src_a_uint, 2);
      66  
      67    if (!vec_all_eq (vresult_uint,  expected_vresult_uint)) {
      68  #if DEBUG
      69      printf("ERROR, vec_replace_elt (src_vb_uint, src_va_uint, index)\n");
      70      for(i = 0; i < 4; i++)
      71        printf(" vresult_uint[%d] = %d, expected_vresult_uint[%d] = %d\n",
      72  	     i, vresult_uint[i], i, expected_vresult_uint[i]);
      73  #else
      74      abort();
      75  #endif
      76    }
      77  
      78    src_a_int = 234;
      79    src_va_int = (vector int) { 0, 1, 2, 3 };
      80    vresult_int = (vector int) { 0, 0, 0, 0 };
      81    expected_vresult_int = (vector int) { 0, 234, 2, 3 };
      82  						 
      83    vresult_int = vec_replace_elt (src_va_int, src_a_int, 1);
      84  
      85    if (!vec_all_eq (vresult_int,  expected_vresult_int)) {
      86  #if DEBUG
      87      printf("ERROR, vec_replace_elt (src_vb_int, src_va_int, index)\n");
      88      for(i = 0; i < 4; i++)
      89        printf(" vresult_int[%d] = %d, expected_vresult_int[%d] = %d\n",
      90  	     i, vresult_int[i], i, expected_vresult_int[i]);
      91  #else
      92      abort();
      93  #endif
      94    }
      95    
      96    src_a_float = 34.0;
      97    src_va_float = (vector float) { 0.0, 10.0, 20.0, 30.0 };
      98    vresult_float = (vector float) { 0.0, 0.0, 0.0, 0.0 };
      99    expected_vresult_float = (vector float) { 0.0, 34.0, 20.0, 30.0 };
     100  						 
     101    vresult_float = vec_replace_elt (src_va_float, src_a_float, 1);
     102  
     103    if (!vec_all_eq (vresult_float,  expected_vresult_float)) {
     104  #if DEBUG
     105      printf("ERROR, vec_replace_elt (src_vb_float, src_va_float, index)\n");
     106      for(i = 0; i < 4; i++)
     107        printf(" vresult_float[%d] = %f, expected_vresult_float[%d] = %f\n",
     108  	     i, vresult_float[i], i, expected_vresult_float[i]);
     109  #else
     110      abort();
     111  #endif
     112    }
     113  
     114    /* Vector replace 64-bit element */
     115    src_a_ullint = 456;
     116    src_va_ullint = (vector unsigned long long int) { 0, 1 };
     117    vresult_ullint = (vector unsigned long long int) { 0, 0 };
     118    expected_vresult_ullint = (vector unsigned long long int) { 0, 456 };
     119  						 
     120    vresult_ullint = vec_replace_elt (src_va_ullint, src_a_ullint, 1);
     121  
     122    if (!vec_all_eq (vresult_ullint,  expected_vresult_ullint)) {
     123  #if DEBUG
     124      printf("ERROR, vec_replace_elt (src_vb_ullint, src_va_ullint, index)\n");
     125      for(i = 0; i < 2; i++)
     126        printf(" vresult_ullint[%d] = %d, expected_vresult_ullint[%d] = %d\n",
     127  	     i, vresult_ullint[i], i, expected_vresult_ullint[i]);
     128  #else
     129      abort();
     130  #endif
     131    }
     132  
     133    src_a_llint = 678;
     134    src_va_llint = (vector long long int) { 0, 1 };
     135    vresult_llint = (vector long long int) { 0, 0 };
     136    expected_vresult_llint = (vector long long int) { 0, 678 };
     137  						 
     138    vresult_llint = vec_replace_elt (src_va_llint, src_a_llint, 1);
     139  
     140    if (!vec_all_eq (vresult_llint,  expected_vresult_llint)) {
     141  #if DEBUG
     142      printf("ERROR, vec_replace_elt (src_vb_llint, src_va_llint, index)\n");
     143      for(i = 0; i < 2; i++)
     144        printf(" vresult_llint[%d] = %d, expected_vresult_llint[%d] = %d\n",
     145  	     i, vresult_llint[i], i, expected_vresult_llint[i]);
     146  #else
     147      abort();
     148  #endif
     149    }
     150    
     151    src_a_double = 678.0;
     152    src_va_double = (vector double) { 0.0, 50.0 };
     153    vresult_double = (vector double) { 0.0, 0.0 };
     154    expected_vresult_double = (vector double) { 0.0, 678.0 };
     155  						 
     156    vresult_double = vec_replace_elt (src_va_double, src_a_double, 1);
     157  
     158    if (!vec_all_eq (vresult_double,  expected_vresult_double)) {
     159  #if DEBUG
     160      printf("ERROR, vec_replace_elt (src_vb_double, src_va_double, index)\n");
     161      for(i = 0; i < 2; i++)
     162        printf(" vresult_double[%d] = %f, expected_vresult_double[%d] = %f\n",
     163  	     i, vresult_double[i], i, expected_vresult_double[i]);
     164  #else
     165      abort();
     166  #endif
     167    }
     168  
     169  
     170    /* Vector replace 32-bit element, unaligned */
     171    src_a_uint = 345;
     172    src_va_uint = (vector unsigned int) { 1, 2, 0, 0 };
     173    vresult_uint = (vector unsigned int) { 0, 0, 0, 0 };
     174    /* Byte index 7 will overwrite part of elements 2 and 3 */
     175    expected_vresult_uint = (vector unsigned int) { 1, 2, 345*256, 0 };
     176  						 
     177    vresult_uchar = vec_replace_unaligned (src_va_uint, src_a_uint, 3);
     178    vresult_uint = (vector unsigned int) vresult_uchar;
     179  
     180    if (!vec_all_eq (vresult_uint,  expected_vresult_uint)) {
     181  #if DEBUG
     182      printf("ERROR, vec_replace_unaligned (src_vb_uint, src_va_uint, index)\n");
     183      for(i = 0; i < 4; i++)
     184        printf(" vresult_uint[%d] = %d, expected_vresult_uint[%d] = %d\n",
     185  	     i, vresult_uint[i], i, expected_vresult_uint[i]);
     186  #else
     187      abort();
     188  #endif
     189    }
     190  
     191    src_a_int = 234;
     192    src_va_int = (vector int) { 1, 0, 3, 4 };
     193    vresult_int = (vector int) { 0, 0, 0, 0 };
     194    /* Byte index 7 will over write part of elements 1 and 2 */
     195    expected_vresult_int = (vector int) { 1, 234*256, 0, 4 };
     196  						 
     197    vresult_uchar = vec_replace_unaligned (src_va_int, src_a_int, 7);
     198    vresult_int = (vector signed int) vresult_uchar;
     199  
     200    if (!vec_all_eq (vresult_int,  expected_vresult_int)) {
     201  #if DEBUG
     202      printf("ERROR, vec_replace_unaligned (src_vb_int, src_va_int, index)\n");
     203      for(i = 0; i < 4; i++)
     204        printf(" vresult_int[%d] = %d, expected_vresult_int[%d] = %d\n",
     205  	     i, vresult_int[i], i, expected_vresult_int[i]);
     206  #else
     207      abort();
     208  #endif
     209    }
     210  
     211    src_a_float = 34.0;
     212    src_va_float = (vector float) { 0.0, 10.0, 20.0, 30.0 };
     213    vresult_float = (vector float) { 0.0, 0.0, 0.0, 0.0 };
     214    expected_vresult_float = (vector float) { 0.0, 34.0, 20.0, 30.0 };
     215  						 
     216    vresult_uchar = vec_replace_unaligned (src_va_float, src_a_float, 8);
     217    vresult_float = (vector float) vresult_uchar;
     218  
     219    if (!vec_all_eq (vresult_float,  expected_vresult_float)) {
     220  #if DEBUG
     221      printf("ERROR, vec_replace_unaligned (src_vb_float, src_va_float, "
     222  	   "index)\n");
     223      for(i = 0; i < 4; i++)
     224        printf(" vresult_float[%d] = %f, expected_vresult_float[%d] = %f\n",
     225  	     i, vresult_float[i], i, expected_vresult_float[i]);
     226  #else
     227      abort();
     228  #endif
     229    }
     230  
     231    /* Vector replace 64-bit element, unaligned  */
     232    src_a_ullint = 456;
     233    src_va_ullint = (vector unsigned long long int) { 0, 0x222 };
     234    vresult_ullint = (vector unsigned long long int) { 0, 0 };
     235    expected_vresult_ullint = (vector unsigned long long int) { 456*256,
     236  							      0x200 };
     237  						 
     238    /* Byte index 7 will over write least significant byte of  element 0  */
     239    vresult_uchar = vec_replace_unaligned (src_va_ullint, src_a_ullint, 7);
     240    vresult_ullint = (vector unsigned long long) vresult_uchar;
     241  
     242    if (!vec_all_eq (vresult_ullint,  expected_vresult_ullint)) {
     243  #if DEBUG
     244      printf("ERROR, vec_replace_unaligned (src_vb_ullint, src_va_ullint, "
     245  	   "index)\n");
     246      for(i = 0; i < 2; i++)
     247        printf(" vresult_ullint[%d] = %d, expected_vresult_ullint[%d] = %d\n",
     248  	     i, vresult_ullint[i], i, expected_vresult_ullint[i]);
     249  #else
     250      abort();
     251  #endif
     252    }
     253  
     254    src_a_llint = 678;
     255    src_va_llint = (vector long long int) { 0, 0x101 };
     256    vresult_llint = (vector long long int) { 0, 0 };
     257    /* Byte index 7 will over write least significant byte of  element 0  */
     258    expected_vresult_llint = (vector long long int) { 678*256, 0x100 };
     259  						 
     260    vresult_uchar = vec_replace_unaligned (src_va_llint, src_a_llint, 7);
     261    vresult_llint = (vector signed long long) vresult_uchar;
     262  
     263    if (!vec_all_eq (vresult_llint,  expected_vresult_llint)) {
     264  #if DEBUG
     265      printf("ERROR, vec_replace_unaligned (src_vb_llint, src_va_llint, "
     266  	   "index)\n");
     267      for(i = 0; i < 2; i++)
     268        printf(" vresult_llint[%d] = %d, expected_vresult_llint[%d] = %d\n",
     269  	     i, vresult_llint[i], i, expected_vresult_llint[i]);
     270  #else
     271      abort();
     272  #endif
     273    }
     274    
     275    src_a_double = 678.0;
     276    src_va_double = (vector double) { 0.0, 50.0 };
     277    vresult_double = (vector double) { 0.0, 0.0 };
     278    expected_vresult_double = (vector double) { 0.0, 678.0 };
     279  						 
     280    vresult_uchar = vec_replace_unaligned (src_va_double, src_a_double, 0);
     281    vresult_double = (vector double) vresult_uchar;
     282  
     283    if (!vec_all_eq (vresult_double,  expected_vresult_double)) {
     284  #if DEBUG
     285      printf("ERROR, vec_replace_unaligned (src_vb_double, src_va_double, "
     286  	   "index)\n");
     287      for(i = 0; i < 2; i++)
     288        printf(" vresult_double[%d] = %f, expected_vresult_double[%d] = %f\n",
     289  	     i, vresult_double[i], i, expected_vresult_double[i]);
     290  #else
     291      abort();
     292  #endif
     293    }
     294      
     295    return 0;
     296  }
     297  
     298  /* { dg-final { scan-assembler-times {\mvinsw\M} 6 } } */
     299  /* { dg-final { scan-assembler-times {\mvinsd\M} 6 } } */
     300  
     301