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  
       6  #include <altivec.h>
       7  
       8  extern void abort (void);
       9  
      10  #define NumSamples 4
      11  
      12  void
      13  doTests00000001 (vector unsigned short int a_sources [],
      14  		 vector unsigned short int b_sources [],
      15  		 vector unsigned short int c_sources []) {
      16    for (int i = 0; i < NumSamples; i++)
      17      for (int j = 0; j < NumSamples; j++)
      18        for (int k = 0; k < NumSamples; k++)
      19  	{
      20  	  vector unsigned short a = a_sources [i];
      21  	  vector unsigned short b = b_sources [j];
      22  	  vector unsigned short c = c_sources [k];
      23  	  vector unsigned short result = vec_ternarylogic (a, b, c, 0x01);
      24  	  vector unsigned short intended = (a & b & c);
      25  	  if (!vec_all_eq (result, intended))
      26  	    abort ();
      27  	}
      28  }
      29  
      30  void doTests11100101 (vector unsigned short int a_sources [],
      31  		      vector unsigned short int b_sources [],
      32  		      vector unsigned short int c_sources []) {
      33    for (int i = 0; i < NumSamples; i++)
      34      for (int j = 0; j < NumSamples; j++)
      35        for (int k = 0; k < NumSamples; k++)
      36  	{
      37  	  vector unsigned short a = a_sources [i];
      38  	  vector unsigned short b = b_sources [j];
      39  	  vector unsigned short c = c_sources [k];
      40  	  vector unsigned short result = vec_ternarylogic (a, b, c, 0xe5);
      41  	  vector unsigned short intended =
      42  	    { 0, 0, 0, 0, 0, 0, 0, 0 };
      43  	  // Supposed to be a ? c: nand (b,c)
      44  	  for (int l = 0; l < 8; l++)
      45  	    {
      46  	      for (int m = 0; m < 16; m++)
      47  	      {
      48  		unsigned short int bit_selector = (0x01 << m);
      49  		if (a[l] & bit_selector)
      50  		  intended [l] |= c [l] & bit_selector;
      51  		else if ((b [l] & c [l] & bit_selector) == 0)
      52  		  intended [l] |= bit_selector;
      53  	      }
      54  	    }
      55  	  if (!vec_all_eq (result, intended))
      56  	    abort ();
      57  	}
      58  }
      59  
      60  void doTests11110011 (vector unsigned short int a_sources [],
      61  		      vector unsigned short int b_sources [],
      62  		      vector unsigned short int c_sources []) {
      63    for (int i = 0; i < NumSamples; i++)
      64      for (int j = 0; j < NumSamples; j++)
      65        for (int k = 0; k < NumSamples; k++)
      66  	{
      67  	  vector unsigned short a = a_sources [i];
      68  	  vector unsigned short b = b_sources [j];
      69  	  vector unsigned short c = c_sources [k];
      70  	  vector unsigned short result = vec_ternarylogic (a, b, c, 0xfb);
      71  	  vector unsigned short intended = { 0, 0, 0, 0, 0, 0, 0, 0 };
      72  	  for (int i = 0; i < 8; i++)
      73  	    intended [i] = b [i] | ~(a [i] & c [i]);
      74  	  if (!vec_all_eq (result, intended))
      75  	    abort ();
      76  	}
      77  }
      78  
      79  int main (int argc, short *argv [])
      80  {
      81    vector unsigned short int a_sources [NumSamples] = {
      82      { 0x0123, 0x4567, 0x89ab, 0xcdef, 0x1234, 0x5678, 0x9abc, 0xdef0 },
      83      { 0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff },
      84      { 0xcccc, 0xcccc, 0x5555, 0x5555, 0x0000, 0x0000, 0x0000, 0x0000 },
      85      { 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0x6969, 0x6969, 0x6969, 0x6969 },
      86    };
      87    vector unsigned short int b_sources [NumSamples] = {
      88      { 0x0123, 0x4567, 0x89ab, 0xcdef, 0x1234, 0x5678, 0x9abc, 0xdef0 },
      89      { 0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff },
      90      { 0xcccc, 0xcccc, 0x5555, 0x5555, 0x0000, 0x0000, 0x0000, 0x0000 },
      91      { 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0x6969, 0x6969, 0x6969, 0x6969 },
      92    };
      93    vector unsigned short int c_sources [NumSamples] = {
      94      { 0x0123, 0x4567, 0x89ab, 0xcdef, 0x1234, 0x5678, 0x9abc, 0xdef0 },
      95      { 0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff },
      96      { 0xcccc, 0xcccc, 0x5555, 0x5555, 0x0000, 0x0000, 0x0000, 0x0000 },
      97      { 0xe7e7, 0xe7e7, 0xe7e7, 0xe7e7, 0x6969, 0x6969, 0x6969, 0x6969 },
      98    };
      99  
     100    doTests00000001 (a_sources, b_sources, c_sources);
     101    doTests11100101 (a_sources, b_sources, c_sources);
     102    doTests11110011 (a_sources, b_sources, c_sources);
     103  
     104    return 0;
     105  }
     106  
     107  /* { dg-final { scan-assembler {\mxxeval\M} } } */