(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
builtins-1-p10-runnable.c
       1  /* { dg-do run } */
       2  /* { dg-require-effective-target power10_hw } */
       3  /* { dg-options "-mdejagnu-cpu=power10 -save-temps" } */
       4  
       5  /* { dg-final { scan-assembler-times {\mvdivsw\M} 1 } } */
       6  /* { dg-final { scan-assembler-times {\mvdivuw\M} 1 } } */
       7  /* { dg-final { scan-assembler-times {\mvdivsd\M} 1 } } */
       8  /* { dg-final { scan-assembler-times {\mvdivud\M} 1 } } */
       9  /* { dg-final { scan-assembler-times {\mvdivesw\M} 1 } } */
      10  /* { dg-final { scan-assembler-times {\mvdiveuw\M} 1 } } */
      11  /* { dg-final { scan-assembler-times {\mvdivesd\M} 1 } } */
      12  /* { dg-final { scan-assembler-times {\mvdiveud\M} 1 } } */
      13  /* { dg-final { scan-assembler-times {\mvmodsw\M} 1 } } */
      14  /* { dg-final { scan-assembler-times {\mvmoduw\M} 1 } } */
      15  /* { dg-final { scan-assembler-times {\mvmodsd\M} 1 } } */
      16  /* { dg-final { scan-assembler-times {\mvmodud\M} 1 } } */
      17  /* { dg-final { scan-assembler-times {\mvmulhsw\M} 1 } } */
      18  /* { dg-final { scan-assembler-times {\mvmulhuw\M} 1 } } */
      19  /* { dg-final { scan-assembler-times {\mvmulhsd\M} 1 } } */
      20  /* { dg-final { scan-assembler-times {\mvmulhud\M} 1 } } */
      21  /* { dg-final { scan-assembler-times {\mvmulld\M} 2 } } */
      22  
      23  #include <stdint.h>
      24  #include <stdio.h>
      25  #include <math.h>
      26  #include <altivec.h>
      27  
      28  #define DEBUG 0
      29  
      30  #ifdef DEBUG
      31  #include <stdio.h>
      32  #endif
      33  
      34  void abort (void);
      35  
      36  int main()
      37    {
      38      int i;
      39      vector int i_arg1, i_arg2;
      40      vector unsigned int u_arg1, u_arg2;
      41      vector long long int d_arg1, d_arg2;
      42      vector long long unsigned int ud_arg1, ud_arg2;
      43     
      44      vector int vec_i_expected, vec_i_result;
      45      vector unsigned int vec_u_expected, vec_u_result;
      46      vector long long int vec_d_expected, vec_d_result;
      47      vector long long unsigned int vec_ud_expected, vec_ud_result;
      48    
      49      /* Signed word divide */
      50      i_arg1 = (vector int){ 20, 40, 60, 80};
      51      i_arg2 = (vector int){ 2, 2, 2, 2};
      52      vec_i_expected = (vector int){10, 20, 30, 40};
      53  
      54      vec_i_result = vec_div (i_arg1, i_arg2);
      55  
      56      for (i = 0; i < 4; i++)
      57        {
      58          if (vec_i_expected[i] != vec_i_result[i])
      59  #ifdef DEBUG
      60             printf("ERROR vec_div signed result[%d] = %d != "
      61  		  "expected[%d] = %d\n",
      62  		  i, vec_i_result[i],  i, vec_i_expected[i]);
      63  #else
      64          abort();
      65  #endif
      66        }
      67  
      68      /* Unsigned word divide */
      69      u_arg1 = (vector unsigned int){ 20, 40, 60, 80};
      70      u_arg2 = (vector unsigned int){ 2, 2, 2, 2};
      71      vec_u_expected = (vector unsigned int){10, 20, 30, 40};
      72  
      73      vec_u_result = vec_div (u_arg1, u_arg2);
      74  
      75      for (i = 0; i < 4; i++)
      76        {
      77          if (vec_u_expected[i] != vec_u_result[i])
      78  #ifdef DEBUG
      79             printf("ERROR vec_div unsigned result[%d] = %d != "
      80  		  "expected[%d] = %d\n",
      81  		  i, vec_u_result[i],  i, vec_u_expected[i]);
      82  #else
      83          abort();
      84  #endif
      85        }
      86  
      87      /* Signed double word divide */
      88      d_arg1 = (vector long long){ 24, 68};
      89      d_arg2 = (vector long long){ 2, 2};
      90      vec_d_expected = (vector long long){12, 34};
      91  
      92      vec_d_result = vec_div (d_arg1, d_arg2);
      93  
      94      for (i = 0; i < 2; i++)
      95        {
      96          if (vec_d_expected[i] != vec_d_result[i])
      97  #ifdef DEBUG
      98  	  printf("ERROR vec_div signed result[%d] = %d != "
      99  		 "expected[%d] = %d\n",
     100  		 i, vec_d_result[i],  i, vec_d_expected[i]);
     101  #else
     102          abort();
     103  #endif
     104        }
     105  
     106      /* Unsigned double word divide */
     107      ud_arg1 = (vector unsigned long long){ 24, 68};
     108      ud_arg2 = (vector unsigned long long){ 2, 2};
     109      vec_ud_expected = (vector unsigned long long){12, 34};
     110  
     111      vec_ud_result = vec_div (ud_arg1, ud_arg2);
     112  
     113      for (i = 0; i < 2; i++)
     114        {
     115          if (vec_ud_expected[i] != vec_ud_result[i])
     116  #ifdef DEBUG
     117             printf("ERROR vec_div unsigned result[%d] = %d != "
     118  		  "expected[%d] = %d\n",
     119  		  i, vec_ud_result[i],  i, vec_ud_expected[i]);
     120  #else
     121          abort();
     122  #endif
     123        }
     124  
     125      /* Divide Extended signed word  result = (arg1 << 32)/arg2 */
     126      i_arg1 = (vector int){ 2, 4, 6, 8};
     127      i_arg2 = (vector int){ 2048, 2048, 2048, 2048};
     128      vec_i_expected = (vector int){4194304, 8388608, 12582912, 16777216};
     129  
     130      vec_i_result = vec_dive (i_arg1, i_arg2);
     131  
     132      for (i = 0; i < 4; i++)
     133        {
     134          if (vec_i_expected[i] != vec_i_result[i])
     135  #ifdef DEBUG
     136             printf("ERROR vec_dive signed result[%d] = %d != "
     137  		  "expected[%d] = %d\n",
     138  		  i, vec_i_result[i],  i, vec_i_expected[i]);
     139  #else
     140          abort();
     141  #endif
     142        }
     143  
     144      /* Divide Extended unsigned word  result = (arg1 << 32)/arg2 */
     145      u_arg1 = (vector unsigned int){ 2, 4, 6, 8};
     146      u_arg2 = (vector unsigned int){ 2048, 2048, 2048, 2048};
     147      vec_u_expected = (vector unsigned int){4194304, 8388608,
     148  					   12582912, 16777216};
     149  
     150      vec_u_result = vec_dive (u_arg1, u_arg2);
     151  
     152      for (i = 0; i < 4; i++)
     153        {
     154          if (vec_u_expected[i] != vec_u_result[i])
     155  #ifdef DEBUG
     156             printf("ERROR vec_dive unsigned result[%d] = %d != "
     157  		  "expected[%d] = %d\n",
     158  		  i, vec_u_result[i],  i, vec_u_expected[i]);
     159  #else
     160          abort();
     161  #endif
     162        }
     163  
     164      /* Divide Extended double signed  esult = (arg1 << 64)/arg2 */
     165      d_arg1 = (vector long long int){ 2, 4};
     166      d_arg2 = (vector long long int){ 4294967296, 4294967296};
     167  
     168      vec_d_expected = (vector long long int){8589934592, 17179869184};
     169  
     170      vec_d_result = vec_dive (d_arg1, d_arg2);
     171  
     172      for (i = 0; i < 2; i++)
     173        {
     174          if (vec_d_expected[i] != vec_d_result[i])
     175  #ifdef DEBUG
     176             printf("ERROR vec_dive signed result[%d] = %lld != "
     177  		  "expected[%d] = %lld\n",
     178  		  i, vec_d_result[i],  i, vec_d_expected[i]);
     179  #else
     180          abort();
     181  #endif
     182        }
     183  
     184      /* Divide Extended double unsigned result = (arg1 << 64)/arg2 */
     185      ud_arg1 = (vector long long unsigned int){ 2, 4};
     186      ud_arg2 = (vector long long unsigned int){ 4294967296, 4294967296};
     187  
     188      vec_ud_expected = (vector long long unsigned int){8589934592,
     189  						      17179869184};
     190  
     191      vec_ud_result = vec_dive (ud_arg1, ud_arg2);
     192  
     193      for (i = 0; i < 2; i++)
     194        {
     195          if (vec_ud_expected[i] != vec_ud_result[i])
     196  #ifdef DEBUG
     197             printf("ERROR vec_dive unsigned result[%d] = %lld != "
     198  		  "expected[%d] = %lld\n",
     199  		  i, vec_ud_result[i],  i, vec_ud_expected[i]);
     200  #else
     201          abort();
     202  #endif
     203        }
     204  
     205      /* Signed word modulo */
     206      i_arg1 = (vector int){ 23, 45, 61, 89};
     207      i_arg2 = (vector int){ 2, 2, 2, 2};
     208      vec_i_expected = (vector int){1, 1, 1, 1};
     209  
     210      vec_i_result = vec_mod (i_arg1, i_arg2);
     211  
     212      for (i = 0; i < 4; i++)
     213        {
     214          if (vec_i_expected[i] != vec_i_result[i])
     215  #ifdef DEBUG
     216             printf("ERROR vec_mod signed result[%d] = %d != "
     217  		  "expected[%d] = %d\n",
     218  		  i, vec_i_result[i],  i, vec_i_expected[i]);
     219  #else
     220          abort();
     221  #endif
     222        }
     223  
     224      /* Unsigned word modulo */
     225      u_arg1 = (vector unsigned int){ 25, 41, 67, 86};
     226      u_arg2 = (vector unsigned int){ 3, 3, 3, 3};
     227      vec_u_expected = (vector unsigned int){1, 2, 1, 2};
     228  
     229      vec_u_result = vec_mod (u_arg1, u_arg2);
     230  
     231      for (i = 0; i < 4; i++)
     232        {
     233          if (vec_u_expected[i] != vec_u_result[i])
     234  #ifdef DEBUG
     235             printf("ERROR vec_mod unsigned result[%d] = %d != "
     236  		  "expected[%d] = %d\n",
     237  		  i, vec_u_result[i],  i, vec_u_expected[i]);
     238  #else
     239          abort();
     240  #endif
     241        }
     242  
     243      /* Signed double word modulo */
     244      d_arg1 = (vector long long){ 24, 68};
     245      d_arg2 = (vector long long){ 7, 7};
     246      vec_d_expected = (vector long long){3, 5};
     247  
     248      vec_d_result = vec_mod (d_arg1, d_arg2);
     249  
     250      for (i = 0; i < 2; i++)
     251        {
     252          if (vec_d_expected[i] != vec_d_result[i])
     253  #ifdef DEBUG
     254             printf("ERROR vec_mod signed result[%d] = %d != "
     255  		  "expected[%d] = %d\n",
     256  		  i, vec_d_result[i],  i, vec_d_expected[i]);
     257  #else
     258          abort();
     259  #endif
     260        }
     261  
     262      /* Unsigned double word modulo */
     263      ud_arg1 = (vector unsigned long long){ 24, 68};
     264      ud_arg2 = (vector unsigned long long){ 8, 8};
     265      vec_ud_expected = (vector unsigned long long){0, 4};
     266  
     267      vec_ud_result = vec_mod (ud_arg1, ud_arg2);
     268  
     269      for (i = 0; i < 2; i++)
     270        {
     271          if (vec_ud_expected[i] != vec_ud_result[i])
     272  #ifdef DEBUG
     273             printf("ERROR vecmod unsigned result[%d] = %d != "
     274  		  "expected[%d] = %d\n",
     275  		  i, vec_ud_result[i],  i, vec_ud_expected[i]);
     276  #else
     277          abort();
     278  #endif
     279        }
     280  
     281      /* Signed word multiply high */
     282      i_arg1 = (vector int){ 2147483648, 2147483648, 2147483648, 2147483648 };
     283      i_arg2 = (vector int){ 2, 3, 4, 5};
     284      //    vec_i_expected = (vector int){-1, -2, -2, -3};
     285      vec_i_expected = (vector int){1, -2, -2, -3};
     286  
     287      vec_i_result = vec_mulh (i_arg1, i_arg2);
     288  
     289      for (i = 0; i < 4; i++)
     290        {
     291          if (vec_i_expected[i] != vec_i_result[i])
     292  #ifdef DEBUG
     293             printf("ERROR vec_mulh signed result[%d] = %d != "
     294  		  "expected[%d] = %d\n",
     295  		  i, vec_i_result[i],  i, vec_i_expected[i]);
     296  #else
     297          abort();
     298  #endif
     299        }
     300  
     301      /* Unsigned word multiply high */
     302      u_arg1 = (vector unsigned int){ 2147483648, 2147483648,
     303  				    2147483648, 2147483648 };
     304      u_arg2 = (vector unsigned int){ 4, 5, 6, 7 };
     305      vec_u_expected = (vector unsigned int){2, 2, 3, 3 };
     306  
     307      vec_u_result = vec_mulh (u_arg1, u_arg2);
     308  
     309      for (i = 0; i < 4; i++)
     310        {
     311          if (vec_u_expected[i] != vec_u_result[i])
     312  #ifdef DEBUG
     313             printf("ERROR vec_mulh unsigned result[%d] = %d != "
     314  		  "expected[%d] = %d\n",
     315  		  i, vec_u_result[i],  i, vec_u_expected[i]);
     316  #else
     317          abort();
     318  #endif
     319        }
     320  
     321      /* Signed double word multiply high */
     322      d_arg1 = (vector long long int){  2305843009213693951,
     323  				      4611686018427387903 };
     324      d_arg2 = (vector long long int){ 12, 20 };
     325      vec_d_expected = (vector long long int){ 1, 4 };
     326  
     327      vec_d_result = vec_mulh (d_arg1, d_arg2);
     328  
     329      for (i = 0; i < 2; i++)
     330        {
     331          if (vec_d_expected[i] != vec_d_result[i])
     332  #ifdef DEBUG
     333             printf("ERROR vec_mulh signed result[%d] = %d != "
     334  		  "expected[%d] = %d\n",
     335  		  i, vec_d_result[i],  i, vec_d_expected[i]);
     336  #else
     337          abort();
     338  #endif
     339        }
     340  
     341      /* Unsigned double word multiply high */
     342      ud_arg1 = (vector unsigned long long int){ 2305843009213693951,
     343  					       4611686018427387903 };
     344      ud_arg2 = (vector unsigned long long int){ 32, 10 };
     345      vec_ud_expected = (vector unsigned long long int){ 3, 2 };
     346  
     347      vec_ud_result = vec_mulh (ud_arg1, ud_arg2);
     348  
     349      for (i = 0; i < 2; i++)
     350        {
     351          if (vec_ud_expected[i] != vec_ud_result[i])
     352  #ifdef DEBUG
     353             printf("ERROR vec_mulh unsigned result[%d] = %d != "
     354  		  "expected[%d] = %d\n",
     355  		  i, vec_ud_result[i],  i, vec_ud_expected[i]);
     356  #else
     357          abort();
     358  #endif
     359        }
     360  
     361      /* Unsigned double word multiply low */
     362      ud_arg1 = (vector unsigned long long int){ 2048, 4096 };
     363      ud_arg2 = (vector unsigned long long int){ 2, 4 };
     364      vec_ud_expected = (vector unsigned long long int){ 4096, 16384 };
     365  
     366      vec_ud_result = vec_mul (ud_arg1, ud_arg2);
     367  
     368      for (i = 0; i < 2; i++)
     369        {
     370          if (vec_ud_expected[i] != vec_ud_result[i])
     371  #ifdef DEBUG
     372             printf("ERROR vec_mul unsigned result[%d] = %d != "
     373  		  "expected[%d] = %d\n",
     374  		  i, vec_ud_result[i],  i, vec_ud_expected[i]);
     375  #else
     376          abort();
     377  #endif
     378        }
     379  
     380      /* Signed double word multiply low */
     381      d_arg1 = (vector signed long long int){ 2048, 4096 };
     382      d_arg2 = (vector signed long long int){ 2, 4 };
     383      vec_d_expected = (vector signed long long int){ 4096, 16384 };
     384  
     385      vec_d_result = vec_mul (d_arg1, d_arg2);
     386  
     387      for (i = 0; i < 2; i++)
     388        {
     389          if (vec_d_expected[i] != vec_d_result[i])
     390  #ifdef DEBUG
     391             printf("ERROR vec_mul signed result[%d] = %d != "
     392  		  "expected[%d] = %d\n",
     393  		  i, vec_d_result[i],  i, vec_d_expected[i]);
     394  #else
     395          abort();
     396  #endif
     397        }
     398    }