(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vec-blend-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 blend */
      60    vsrc_c_uchar = (vector unsigned char) { 0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80,
      61  					  0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80 };
      62  
      63    vsrc_a_char = (vector signed char) { -1, 3, 5, 7, 9, 11, 13, 15,
      64                                         17, 19, 21, 23, 25, 27, 29 };
      65    vsrc_b_char = (vector signed char) { 2, -4, 6, 8, 10, 12, 14, 16,
      66  				       18, 20, 22, 24, 26, 28, 30, 32 };
      67    vsrc_c_uchar = (vector unsigned char) { 0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80,
      68  					  0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80 };
      69    vresult_char = (vector signed char) { 0, 0, 0, 0, 0, 0, 0, 0,
      70  					0, 0, 0, 0, 0, 0, 0, 0 };
      71    expected_vresult_char = (vector signed char) { -1, -4, 5, 8,
      72  						 9, 12, 13, 16,
      73  						 17, 20, 21, 24,
      74  						 25, 28, 29, 32 };
      75  						 
      76    vresult_char = vec_blendv (vsrc_a_char, vsrc_b_char, vsrc_c_uchar);
      77  
      78    if (!vec_all_eq (vresult_char,  expected_vresult_char)) {
      79  #if DEBUG
      80      printf("ERROR, vec_blendv (vsrc_a_char, vsrc_b_char, vsrc_c_uchar)\n");
      81      for(i = 0; i < 16; i++)
      82        printf(" vresult_char[%d] = %d, expected_vresult_char[%d] = %d\n",
      83  	     i, vresult_char[i], i, expected_vresult_char[i]);
      84  #else
      85      abort();
      86  #endif
      87    }
      88  
      89    vsrc_a_uchar = (vector unsigned char) { 1, 3, 5, 7, 9, 11, 13, 15,
      90  					  17, 19, 21, 23, 25, 27, 29 };
      91    vsrc_b_uchar = (vector unsigned char) { 2, 4, 6, 8, 10, 12, 14, 16,
      92  					  18, 20, 22, 24, 26, 28, 30, 32 };
      93    vsrc_c_uchar = (vector unsigned char) { 0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80,
      94  					  0, 0x80, 0, 0x80, 0, 0x80, 0, 0x80 };
      95    vresult_uchar = (vector unsigned char) { 0, 0, 0, 0, 0, 0, 0, 0,
      96  					   0, 0, 0, 0, 0, 0, 0, 0 };
      97    expected_vresult_uchar = (vector unsigned char) { 1, 4, 5, 8,
      98  						    9, 12, 13, 16,
      99  						    17, 20, 21, 24,
     100  						    25, 28, 29, 32 };
     101  						 
     102    vresult_uchar = vec_blendv (vsrc_a_uchar, vsrc_b_uchar, vsrc_c_uchar);
     103  
     104    if (!vec_all_eq (vresult_uchar,  expected_vresult_uchar)) {
     105  #if DEBUG
     106      printf("ERROR, vec_blendv (vsrc_a_uchar, vsrc_b_uchar, vsrc_c_uchar)\n");
     107      for(i = 0; i < 16; i++)
     108        printf(" vresult_uchar[%d] = %d, expected_vresult_uchar[%d] = %d\n",
     109  	     i, vresult_uchar[i], i, expected_vresult_uchar[i]);
     110  #else
     111      abort();
     112  #endif
     113    }
     114  
     115    vsrc_a_short = (vector signed short) { -1, 3, 5, 7, 9, 11, 13, 15 };
     116    vsrc_b_short = (vector signed short) { 2, -4, 6, 8, 10, 12, 14, 16 };
     117    vsrc_c_ushort = (vector unsigned short) { 0, 0x8000, 0, 0x8000,
     118  					    0, 0x8000, 0, 0x8000 };
     119    vresult_short = (vector signed short) { 0, 0, 0, 0, 0, 0, 0, 0 };
     120    expected_vresult_short = (vector signed short) { -1, -4, 5, 8,
     121  						   9, 12, 13, 16 };
     122  
     123    vresult_short = vec_blendv (vsrc_a_short, vsrc_b_short, vsrc_c_ushort);
     124  
     125    if (!vec_all_eq (vresult_short,  expected_vresult_short)) {
     126  #if DEBUG
     127      printf("ERROR, vec_blendv (vsrc_a_short, vsrc_b_short, vsrc_c_ushort)\n");
     128      for(i = 0; i < 8; i++)
     129        printf(" vresult_short[%d] = %d, expected_vresult_short[%d] = %d\n",
     130  	     i, vresult_short[i], i, expected_vresult_short[i]);
     131  #else
     132      abort();
     133  #endif
     134    }
     135  
     136    vsrc_a_ushort = (vector unsigned short) { 1, 3, 5, 7, 9, 11, 13, 15 };
     137    vsrc_b_ushort = (vector unsigned short) { 2, 4, 6, 8, 10, 12, 14, 16 };
     138    vsrc_c_ushort = (vector unsigned short) { 0, 0x8000, 0, 0x8000,
     139  					    0, 0x8000, 0, 0x8000 };
     140    vresult_ushort = (vector unsigned short) { 0, 0, 0, 0, 0, 0, 0, 0 };
     141    expected_vresult_ushort = (vector unsigned short) { 1, 4, 5, 8,
     142  						      9, 12, 13, 16 };
     143  						 
     144    vresult_ushort = vec_blendv (vsrc_a_ushort, vsrc_b_ushort, vsrc_c_ushort);
     145  
     146    if (!vec_all_eq (vresult_ushort,  expected_vresult_ushort)) {
     147  #if DEBUG
     148      printf("ERROR, vec_blendv (vsrc_a_ushort, vsrc_b_ushort, "
     149  	   "vsrc_c_ushort)\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_uint = (vector unsigned int) { 0, 0x80000000, 0, 0x80000000};
     161    vresult_int = (vector signed int) { 0, 0, 0, 0 };
     162    expected_vresult_int = (vector signed int) { -1, 4, -5, 8 };
     163  						 
     164    vresult_int = vec_blendv (vsrc_a_int, vsrc_b_int, vsrc_c_uint);
     165  
     166    if (!vec_all_eq (vresult_int,  expected_vresult_int)) {
     167  #if DEBUG
     168      printf("ERROR, vec_blendv (vsrc_a_int, vsrc_b_int, vsrc_c_uint)\n");
     169      for(i = 0; i < 4; i++)
     170        printf(" vresult_int[%d] = %d, expected_vresult_int[%d] = %d\n",
     171  	     i, vresult_int[i], i, expected_vresult_int[i]);
     172  #else
     173      abort();
     174  #endif
     175    }
     176  
     177    vsrc_a_uint = (vector unsigned int) { 1, 3, 5, 7 };
     178    vsrc_b_uint = (vector unsigned int) { 2, 4, 6, 8 };
     179    vsrc_c_uint = (vector unsigned int) { 0, 0x80000000, 0, 0x80000000 };
     180    vresult_uint = (vector unsigned int) { 0, 0, 0, 0 };
     181    expected_vresult_uint = (vector unsigned int) { 1, 4, 5, 8 };
     182  						 
     183    vresult_uint = vec_blendv (vsrc_a_uint, vsrc_b_uint, vsrc_c_uint);
     184  
     185    if (!vec_all_eq (vresult_uint,  expected_vresult_uint)) {
     186  #if DEBUG
     187      printf("ERROR, vec_blendv (vsrc_a_uint, vsrc_b_uint, vsrc_c_uint)\n");
     188      for(i = 0; i < 4; i++)
     189        printf(" vresult_uint[%d] = %d, expected_vresult_uint[%d] = %d\n",
     190  	     i, vresult_uint[i], i, expected_vresult_uint[i]);
     191  #else
     192      abort();
     193  #endif
     194    }
     195  
     196    vsrc_a_ll = (vector signed long long int) { -1, -3 };
     197    vsrc_b_ll = (vector signed long long int) { 2, 4,  };
     198    vsrc_c_ull = (vector unsigned long long int) { 0, 0x8000000000000000ULL };
     199    vresult_ll = (vector signed long long int) { 0, 0 };
     200    expected_vresult_ll = (vector signed long long int) { -1, 4 };
     201  						 
     202    vresult_ll = vec_blendv (vsrc_a_ll, vsrc_b_ll, vsrc_c_ull);
     203  
     204    if (!vec_all_eq (vresult_ll,  expected_vresult_ll)) {
     205  #if DEBUG
     206      printf("ERROR, vec_blendv (vsrc_a_ll, vsrc_b_ll, vsrc_c_ull)\n");
     207      for(i = 0; i < 2; i++)
     208        printf(" vresult_ll[%d] = %d, expected_vresult_ll[%d] = %d\n",
     209  	     i, vresult_ll[i], i, expected_vresult_ll[i]);
     210  #else
     211      abort();
     212  #endif
     213    }
     214  
     215    vsrc_a_ull = (vector unsigned long long) { 1, 3 };
     216    vsrc_b_ull = (vector unsigned long long) { 2, 4 };
     217    vsrc_c_ull = (vector unsigned long long int) { 0, 0x8000000000000000ULL };
     218    vresult_ull = (vector unsigned long long) { 0, 0 };
     219    expected_vresult_ull = (vector unsigned long long) { 1, 4 };
     220  						 
     221    vresult_ull = vec_blendv (vsrc_a_ull, vsrc_b_ull, vsrc_c_ull);
     222  
     223    if (!vec_all_eq (vresult_ull,  expected_vresult_ull)) {
     224  #if DEBUG
     225      printf("ERROR, vec_blendv (vsrc_a_ull, vsrc_b_ull, vsrc_c_ull)\n");
     226      for(i = 0; i < 2; i++)
     227        printf(" vresult_ull[%d] = %d, expected_vresult_ull[%d] = %d\n",
     228  	     i, vresult_ull[i], i, expected_vresult_ull[i]);
     229  #else
     230      abort();
     231  #endif
     232    }
     233  
     234    vsrc_a_f = (vector float) { -1.0, -3.0, -5.0, -7.0 };
     235    vsrc_b_f = (vector float) { 2.0, 4.0, 6.0, 8.0 };
     236    vsrc_c_uint = (vector unsigned int) { 0, 0x80000000, 0, 0x80000000};
     237    vresult_f = (vector float) { 0, 0, 0, 0 };
     238    expected_vresult_f = (vector float) { -1, 4, -5, 8 };
     239  						 
     240    vresult_f = vec_blendv (vsrc_a_f, vsrc_b_f, vsrc_c_uint);
     241  
     242    if (!vec_all_eq (vresult_f,  expected_vresult_f)) {
     243  #if DEBUG
     244      printf("ERROR, vec_blendv (vsrc_a_f, vsrc_b_f, vsrc_c_uint)\n");
     245      for(i = 0; i < 4; i++)
     246        printf(" vresult_f[%d] = %d, expected_vresult_f[%d] = %d\n",
     247  	     i, vresult_f[i], i, expected_vresult_f[i]);
     248  #else
     249      abort();
     250  #endif
     251    }
     252  
     253    vsrc_a_d = (vector double) { -1.0, -3.0 };
     254    vsrc_b_d = (vector double) { 2.0, 4.0 };
     255    vsrc_c_ull = (vector unsigned long long int) { 0, 0x8000000000000000ULL };
     256    vresult_d = (vector double) { 0, 0 };
     257    expected_vresult_d = (vector double) { -1, 4 };
     258  						 
     259    vresult_d = vec_blendv (vsrc_a_d, vsrc_b_d, vsrc_c_ull);
     260  
     261    if (!vec_all_eq (vresult_d,  expected_vresult_d)) {
     262  #if DEBUG
     263      printf("ERROR, vec_blendv (vsrc_a_d, vsrc_b_d, vsrc_c_ull)\n");
     264      for(i = 0; i < 4; i++)
     265        printf(" vresult_d[%d] = %d, expected_vresult_d[%d] = %d\n",
     266  	     i, vresult_d[i], i, expected_vresult_d[i]);
     267  #else
     268      abort();
     269  #endif
     270    }
     271  
     272    return 0;
     273  }
     274  
     275  /* { dg-final { scan-assembler-times {\mxxblendvb\M} 2 } } */
     276  /* { dg-final { scan-assembler-times {\mxxblendvh\M} 2 } } */
     277  /* { dg-final { scan-assembler-times {\mxxblendvw\M} 3 } } */
     278  /* { dg-final { scan-assembler-times {\mxxblendvd\M} 3 } } */