(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vec-ternarylogic-4.c
       1  /* { dg-do compile } */
       2  /* { dg-options "-mdejagnu-cpu=power10" } */
       3  
       4  #include <altivec.h>
       5  
       6  extern void abort (void);
       7  
       8  #define NumSamples 4
       9  
      10  void
      11  doTests00000001 (vector unsigned int a_sources [],
      12  		 vector unsigned int b_sources [],
      13  		 vector unsigned int c_sources []) {
      14    for (int i = 0; i < NumSamples; i++)
      15      for (int j = 0; j < NumSamples; j++)
      16        for (int k = 0; k < NumSamples; k++)
      17  	{
      18  	  vector unsigned int a = a_sources [i];
      19  	  vector unsigned int b = b_sources [j];
      20  	  vector unsigned int c = c_sources [k];
      21  	  vector unsigned int result = vec_ternarylogic (a, b, c, 0x01);
      22  	  vector unsigned int intended = (a & b & c);
      23  	  if (!vec_all_eq (result, intended))
      24  	    abort ();
      25  	}
      26  }
      27  
      28  void doTests11100101 (vector unsigned int a_sources [],
      29  		      vector unsigned int b_sources [],
      30  		      vector unsigned int c_sources []) {
      31    for (int i = 0; i < NumSamples; i++)
      32      for (int j = 0; j < NumSamples; j++)
      33        for (int k = 0; k < NumSamples; k++)
      34  	{
      35  	  vector unsigned int a = a_sources [i];
      36  	  vector unsigned int b = b_sources [j];
      37  	  vector unsigned int c = c_sources [k];
      38  	  vector unsigned int result = vec_ternarylogic (a, b, c, 0xe5);
      39  	  vector unsigned int intended = { 0, 0, 0, 0 };
      40  	  // Supposed to be a ? c: nand (b,c)
      41  	  for (int l = 0; l < 4; l++)
      42  	    {
      43  	      for (int m = 0; m < 32; m++)
      44  	      {
      45  		unsigned int bit_selector = (0x01 << m);
      46  		if (a[l] & bit_selector)
      47  		  intended [l] |= c [l] & bit_selector;
      48  		else if ((b [l] & c [l] & bit_selector) == 0)
      49  		  intended [l] |= bit_selector;
      50  	      }
      51  	    }
      52  	  if (!vec_all_eq (result, intended))
      53  	    abort ();
      54  	}
      55  }
      56  
      57  void doTests11110011 (vector unsigned int a_sources [],
      58  		      vector unsigned int b_sources [],
      59  		      vector unsigned int c_sources []) {
      60    for (int i = 0; i < NumSamples; i++)
      61      for (int j = 0; j < NumSamples; j++)
      62        for (int k = 0; k < NumSamples; k++)
      63  	{
      64  	  vector unsigned int a = a_sources [i];
      65  	  vector unsigned int b = b_sources [j];
      66  	  vector unsigned int c = c_sources [k];
      67  	  vector unsigned int result = vec_ternarylogic (a, b, c, 0xfb);
      68  	  vector unsigned int intended = { 0, 0, 0, 0 };
      69  	  for (int i = 0; i < 4; i++)
      70  	    intended [i] = b [i] | ~(a [i] & c [i]);
      71  	  if (!vec_all_eq (result, intended))
      72  	    abort ();
      73  	}
      74  }
      75  
      76  int main (int argc, int *argv [])
      77  {
      78    vector unsigned int a_sources [NumSamples] = {
      79      { 0x01234567, 0x89abcdef, 0x12345678, 0x9abcdef0 },
      80      { 0x55555555, 0x55555555, 0xffffffff, 0xffffffff },
      81      { 0xcccccccc, 0x55555555, 0x00000000, 0x00000000 },
      82      { 0xe7e7e7e7, 0xe7e7e7e7, 0x69696969, 0x69696969 },
      83    };
      84    vector unsigned int b_sources [NumSamples] = {
      85      { 0x01234567, 0x89abcdef, 0x12345678, 0x9abcdef0 },
      86      { 0x55555555, 0x55555555, 0xffffffff, 0xffffffff },
      87      { 0xcccccccc, 0x55555555, 0x00000000, 0x00000000 },
      88      { 0xe7e7e7e7, 0xe7e7e7e7, 0x69696969, 0x69696969 },
      89    };
      90    vector unsigned int c_sources [NumSamples] = {
      91      { 0x01234567, 0x89abcdef, 0x12345678, 0x9abcdef0 },
      92      { 0x55555555, 0x55555555, 0xffffffff, 0xffffffff },
      93      { 0xcccccccc, 0x55555555, 0x00000000, 0x00000000 },
      94      { 0xe7e7e7e7, 0xe7e7e7e7, 0x69696969, 0x69696969 },
      95    };
      96  
      97    doTests00000001 (a_sources, b_sources, c_sources);
      98    doTests11100101 (a_sources, b_sources, c_sources);
      99    doTests11110011 (a_sources, b_sources, c_sources);
     100  
     101    return 0;
     102  }
     103  
     104  /* { dg-final { scan-assembler {\mxxeval\M} } } */