(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vec-ternarylogic-10.c
       1  /* { dg-do compile } */
       2  /* { dg-require-effective-target int128 } */
       3  /* { dg-options "-mdejagnu-cpu=power10" } */
       4  
       5  #include <altivec.h>
       6  
       7  extern void abort (void);
       8  
       9  #define NumSamples 4
      10  
      11  /* vec_all_eq not yet supported for arguments of type
      12     vector unsigned __int128.  */
      13  int
      14  vector_equal (vector unsigned __int128 a, vector unsigned __int128 b)
      15  {
      16    return a[0] == b[0];
      17  }
      18  
      19  void
      20  doTests00000001 (vector unsigned __int128 a_sources [],
      21  		 vector unsigned __int128 b_sources [],
      22  		 vector unsigned __int128 c_sources []) {
      23    for (int i = 0; i < NumSamples; i++)
      24      for (int j = 0; j < NumSamples; j++)
      25        for (int k = 0; k < NumSamples; k++)
      26  	{
      27  	  vector unsigned __int128 a = a_sources [i];
      28  	  vector unsigned __int128 b = b_sources [j];
      29  	  vector unsigned __int128 c = c_sources [k];
      30  	  vector unsigned __int128 result;
      31  	  result = vec_ternarylogic (a, b, c, 0xfff); /* { dg-error "literal between 0 and 255, inclusive" } */
      32  	  vector unsigned __int128 intended = (a & b & c);
      33  	  if (!vector_equal (result, intended))
      34  	    abort ();
      35  	}
      36  }
      37  
      38  void
      39  doTests11100101 (vector unsigned __int128 a_sources [],
      40  		 vector unsigned __int128 b_sources [],
      41  		 vector unsigned __int128 c_sources []) {
      42    for (int i = 0; i < NumSamples; i++)
      43      for (int j = 0; j < NumSamples; j++)
      44        for (int k = 0; k < NumSamples; k++)
      45  	{
      46  	  vector unsigned __int128 a = a_sources [i];
      47  	  vector unsigned __int128 b = b_sources [j];
      48  	  vector unsigned __int128 c = c_sources [k];
      49  	  vector unsigned __int128 result;
      50  	  result = vec_ternarylogic (a, b, c, -1); /* { dg-error "literal between 0 and 255, inclusive" } */
      51  	  vector unsigned __int128 intended = { 0 };
      52  	  // Supposed to be a ? c: nand (b,c)
      53  	  for (int l = 0; l < 1; l++)
      54  	    {
      55  	      for (int m = 0; m < 128; m++)
      56  	      {
      57  		unsigned __int128 bit_selector = 0x01;
      58  		bit_selector = bit_selector << m;
      59  
      60  		if (a[l] & bit_selector)
      61  		  intended [l] |= c [l] & bit_selector;
      62  		else if ((b [l] & c [l] & bit_selector) == 0)
      63  		  intended [l] |= bit_selector;
      64  	      }
      65  	    }
      66  	  if (!vector_equal (result, intended))
      67  	    abort ();
      68  	}
      69  }
      70  
      71  void
      72  doTests11110011 (vector unsigned __int128 a_sources [],
      73  		 vector unsigned __int128 b_sources [],
      74  		 vector unsigned __int128 c_sources []) {
      75    for (int i = 0; i < NumSamples; i++)
      76      for (int j = 0; j < NumSamples; j++)
      77        for (int k = 0; k < NumSamples; k++)
      78  	{
      79  	  vector unsigned __int128 a = a_sources [i];
      80  	  vector unsigned __int128 b = b_sources [j];
      81  	  vector unsigned __int128 c = c_sources [k];
      82  	  vector unsigned __int128 result;
      83  	  result = vec_ternarylogic (a, b, c, i);  /* { dg-error "literal between 0 and 255, inclusive" } */
      84  	  vector unsigned __int128 intended = { 0 };
      85  	  for (int i = 0; i < 1; i++)
      86  	    intended [i] = b [i] | ~(a [i] & c [i]);
      87  	  if (!vector_equal (result, intended))
      88  	    abort ();
      89  	}
      90  }
      91  
      92  int main (int argc, int *argv [])
      93  {
      94    vector unsigned __int128 a_sources [NumSamples];
      95    vector unsigned __int128 b_sources [NumSamples];
      96    vector unsigned __int128 c_sources [NumSamples];
      97  
      98    a_sources [0][0] = 0x0123456789abcdefull;
      99    a_sources [0][0] = a_sources [0][0] << 64 | 0x123456789abcdef0ull;
     100    a_sources [1][0] = 0x5555555555555555ull;
     101    a_sources [1][0] = a_sources [1][0] << 64 | 0xffffffffffffffffull;
     102    a_sources [2][0] = 0xcccccccc55555555ull;
     103    a_sources [2][0] = a_sources [2][0] << 64 | 0x0000000000000000ull;
     104    a_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
     105    a_sources [3][0] = a_sources [3][0] << 64 | 0x6969696969696969ull;
     106  
     107    b_sources [0][0] = 0x0123456789abcdefull;
     108    b_sources [0][0] = b_sources [0][0] << 64 | 0x123456789abcdef0ull;
     109    b_sources [1][0] = 0x5555555555555555ull;
     110    b_sources [1][0] = b_sources [1][0] << 64 | 0xffffffffffffffffull;
     111    b_sources [2][0] = 0xcccccccc55555555ull;
     112    b_sources [2][0] = b_sources [2][0] << 64 | 0x0000000000000000ull;
     113    b_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
     114    b_sources [3][0] = b_sources [3][0] << 64 | 0x6969696969696969ull;
     115  
     116    c_sources [0][0] = 0x0123456789abcdefull;
     117    c_sources [0][0] = c_sources [0][0] << 64 | 0x123456789abcdef0ull;
     118    c_sources [1][0] = 0x5555555555555555ull;
     119    c_sources [1][0] = c_sources [1][0] << 64 | 0xffffffffffffffffull;
     120    c_sources [2][0] = 0xcccccccc55555555ull;
     121    c_sources [2][0] = c_sources [2][0] << 64 | 0x0000000000000000ull;
     122    c_sources [3][0] = 0xe7e7e7e7e7e7e7e7ull;
     123    c_sources [3][0] = c_sources [3][0] << 64 | 0x6969696969696969ull;
     124  
     125    doTests00000001 (a_sources, b_sources, c_sources);
     126    doTests11100101 (a_sources, b_sources, c_sources);
     127    doTests11110011 (a_sources, b_sources, c_sources);
     128  
     129    return 0;
     130  }