(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
cmpccxadd-2.c
       1  /* { dg-do run { target { ! ia32 } } } */
       2  /* { dg-options "-O2 -mcmpccxadd" } */
       3  /* { dg-require-effective-target cmpccxadd } */
       4  
       5  #include <stdlib.h>
       6  #include <x86gprintrin.h>
       7  
       8  int
       9  main()
      10  {
      11    if (!__builtin_cpu_supports("cmpccxadd"))
      12      return 0;
      13  	
      14    int srcdest1[16] = { -2147483648,1,1,1,1,2,1,2,1,2,4,2,1,1,1,2 };
      15    int srcdest2[16] = { 1,1,2,1,1,1,1,1,2,1,1,1,2,1,1,1 };
      16    int src3[16] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 };
      17    int _srcdest1[16], _srcdest2[16], res[16], cond[16];
      18    long long srcdest1_64[16] = { -9223372036854775807LL-1,1,1,1,1,2,1,2,1,2,4,2,1,1,1,2 };
      19    long long srcdest2_64[16] = { 1,1,2,1,1,1,1,1,2,1,1,1,2,1,1,1 };
      20    long long src3_64[16] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 };
      21    long long _srcdest1_64[16], _srcdest2_64[16], res_64[16], cond_64[16];
      22  
      23    int tmp2[16];
      24    long long tmp2_64[16];
      25  
      26    int cf[16] = { 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 };
      27    int of[16] = { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
      28    int sf[16] = { 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0 };
      29    int zf[16] = { 0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0 };
      30    int af[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
      31    int pf[16] = { 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 };
      32  
      33    for (int i = 0; i < 16; i++)
      34    {
      35      tmp2[i] = srcdest1[i] + src3[i];
      36      tmp2_64[i] = srcdest1_64[i] + src3_64[i];
      37    }
      38  
      39    cond[0] = of[0] == 1 ? 1 : 0;
      40    cond[1] = of[1] == 0 ? 1 : 0;
      41    cond[2] = cf[2] == 1 ? 1 : 0;
      42    cond[3] = cf[3] == 0 ? 1 : 0;
      43    cond[4] = zf[4] == 1 ? 1 : 0;
      44    cond[5] = zf[5] == 0 ? 1 : 0;
      45    cond[6] = (cf[6] || zf[6]) == 1 ? 1 : 0;
      46    cond[7] = (cf[7] || zf[7]) == 0 ? 1 : 0;
      47    cond[8] = sf[8] == 1 ? 1 : 0;
      48    cond[9] = sf[9] == 0 ? 1 : 0;
      49    cond[10] = pf[10] == 1 ? 1 : 0;
      50    cond[11] = pf[11] == 0 ? 1 : 0;
      51    cond[12] = ((sf[12] && !of[12]) || (!sf[12] && of[12])) == 1 ? 1 : 0;
      52    cond[13] = ((sf[13] && !of[13]) || (!sf[13] && of[13])) == 0 ? 1 : 0;
      53    cond[14] = (((sf[14] && !of[14]) || (!sf[14] && of[14])) || zf[14]) == 1 ? 1 : 0;
      54    cond[15] = (((sf[15] && !of[15]) || (!sf[15] && of[15])) || zf[15]) == 0 ? 1 : 0;
      55  
      56    cond_64[0] = of[0] == 1 ? 1 : 0;
      57    cond_64[1] = of[1] == 0 ? 1 : 0;
      58    cond_64[2] = cf[2] == 1 ? 1 : 0;
      59    cond_64[3] = cf[3] == 0 ? 1 : 0;
      60    cond_64[4] = zf[4] == 1 ? 1 : 0;
      61    cond_64[5] = zf[5] == 0 ? 1 : 0;
      62    cond_64[6] = (cf[6] || zf[6]) == 1 ? 1 : 0;
      63    cond_64[7] = (cf[7] || zf[7]) == 0 ? 1 : 0;
      64    cond_64[8] = sf[8] == 1 ? 1 : 0;
      65    cond_64[9] = sf[9] == 0 ? 1 : 0;
      66    cond_64[10] = pf[10] == 1 ? 1 : 0;
      67    cond_64[11] = pf[11] == 0 ? 1 : 0;
      68    cond_64[12] = ((sf[12] && !of[12]) || (!sf[12] && of[12])) == 1 ? 1 : 0;
      69    cond_64[13] = ((sf[13] && !of[13]) || (!sf[13] && of[13])) == 0 ? 1 : 0;
      70    cond_64[14] = (((sf[14] && !of[14]) || (!sf[14] && of[14])) || zf[14]) == 1 ? 1 : 0;
      71    cond_64[15] = (((sf[15] && !of[15]) || (!sf[15] && of[15])) || zf[15]) == 0 ? 1 : 0;
      72  
      73    for (int i = 0; i < 16; i++)
      74    {
      75      if (cond[i] == 1)
      76      {
      77        _srcdest1[i] = tmp2[i];
      78      }
      79      else
      80      {
      81        _srcdest1[i] = srcdest1[i];
      82      }
      83      if (cond_64[i] == 1)
      84      {
      85        _srcdest1_64[i] = tmp2_64[i];
      86      }
      87      else
      88      {
      89        _srcdest1_64[i] = srcdest1_64[i];
      90      }
      91      _srcdest2[i] = srcdest1[i];
      92      _srcdest2_64[i] = srcdest1_64[i];
      93    }
      94  
      95    res[0] = _cmpccxadd_epi32 (&srcdest1[0], srcdest2[0], src3[0], _CMPCCX_O);
      96    res[1] = _cmpccxadd_epi32 (&srcdest1[1], srcdest2[1], src3[1], _CMPCCX_NO);
      97    res[2] = _cmpccxadd_epi32 (&srcdest1[2], srcdest2[2], src3[2], _CMPCCX_B);
      98    res[3] = _cmpccxadd_epi32 (&srcdest1[3], srcdest2[3], src3[3], _CMPCCX_NB);
      99    res[4] = _cmpccxadd_epi32 (&srcdest1[4], srcdest2[4], src3[4], _CMPCCX_Z);
     100    res[5] = _cmpccxadd_epi32 (&srcdest1[5], srcdest2[5], src3[5], _CMPCCX_NZ);
     101    res[6] = _cmpccxadd_epi32 (&srcdest1[6], srcdest2[6], src3[6], _CMPCCX_BE);
     102    res[7] = _cmpccxadd_epi32 (&srcdest1[7], srcdest2[7], src3[7], _CMPCCX_NBE);
     103    res[8] = _cmpccxadd_epi32 (&srcdest1[8], srcdest2[8], src3[8], _CMPCCX_S);
     104    res[9] = _cmpccxadd_epi32 (&srcdest1[9], srcdest2[9], src3[9], _CMPCCX_NS);
     105    res[10] = _cmpccxadd_epi32 (&srcdest1[10], srcdest2[10], src3[10], _CMPCCX_P);
     106    res[11] = _cmpccxadd_epi32 (&srcdest1[11], srcdest2[11], src3[11], _CMPCCX_NP);
     107    res[12] = _cmpccxadd_epi32 (&srcdest1[12], srcdest2[12], src3[12], _CMPCCX_L);
     108    res[13] = _cmpccxadd_epi32 (&srcdest1[13], srcdest2[13], src3[13], _CMPCCX_NL);
     109    res[14] = _cmpccxadd_epi32 (&srcdest1[14], srcdest2[14], src3[14], _CMPCCX_LE);
     110    res[15] = _cmpccxadd_epi32 (&srcdest1[15], srcdest2[15], src3[15], _CMPCCX_NLE);
     111  
     112    res_64[0] = _cmpccxadd_epi64 (&srcdest1_64[0], srcdest2_64[0], src3_64[0], _CMPCCX_O);
     113    res_64[1] = _cmpccxadd_epi64 (&srcdest1_64[1], srcdest2_64[1], src3_64[1], _CMPCCX_NO);
     114    res_64[2] = _cmpccxadd_epi64 (&srcdest1_64[2], srcdest2_64[2], src3_64[2], _CMPCCX_B);
     115    res_64[3] = _cmpccxadd_epi64 (&srcdest1_64[3], srcdest2_64[3], src3_64[3], _CMPCCX_NB);
     116    res_64[4] = _cmpccxadd_epi64 (&srcdest1_64[4], srcdest2_64[4], src3_64[4], _CMPCCX_Z);
     117    res_64[5] = _cmpccxadd_epi64 (&srcdest1_64[5], srcdest2_64[5], src3_64[5], _CMPCCX_NZ);
     118    res_64[6] = _cmpccxadd_epi64 (&srcdest1_64[6], srcdest2_64[6], src3_64[6], _CMPCCX_BE);
     119    res_64[7] = _cmpccxadd_epi64 (&srcdest1_64[7], srcdest2_64[7], src3_64[7], _CMPCCX_NBE);
     120    res_64[8] = _cmpccxadd_epi64 (&srcdest1_64[8], srcdest2_64[8], src3_64[8], _CMPCCX_S);
     121    res_64[9] = _cmpccxadd_epi64 (&srcdest1_64[9], srcdest2_64[9], src3_64[9], _CMPCCX_NS);
     122    res_64[10] = _cmpccxadd_epi64 (&srcdest1_64[10], srcdest2_64[10], src3_64[10], _CMPCCX_P);
     123    res_64[11] = _cmpccxadd_epi64 (&srcdest1_64[11], srcdest2_64[11], src3_64[11], _CMPCCX_NP);
     124    res_64[12] = _cmpccxadd_epi64 (&srcdest1_64[12], srcdest2_64[12], src3_64[12], _CMPCCX_L);
     125    res_64[13] = _cmpccxadd_epi64 (&srcdest1_64[13], srcdest2_64[13], src3_64[13], _CMPCCX_NL);
     126    res_64[14] = _cmpccxadd_epi64 (&srcdest1_64[14], srcdest2_64[14], src3_64[14], _CMPCCX_LE);
     127    res_64[15] = _cmpccxadd_epi64 (&srcdest1_64[15], srcdest2_64[15], src3_64[15], _CMPCCX_NLE);
     128  
     129    for (int i = 0; i < 16; i++)
     130    {
     131      if ((srcdest1[i] != _srcdest1[i]) || (res[i] != _srcdest2[i]))
     132        abort();
     133      if ((srcdest1_64[i] != _srcdest1_64[i]) || (res_64[i] != _srcdest2_64[i]))
     134        abort();
     135    }
     136  
     137    return 0;
     138  }