(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vec-addec-int128.c
       1  /* { dg-do run { target { powerpc*-*-* && { p8vector_hw && int128 } } } } */
       2  /* { dg-options "-mdejagnu-cpu=power8 -O3" } */
       3  
       4  /* Test that the vec_addec builtin works as expected.  */
       5  
       6  #include "altivec.h"
       7  
       8  #define N 4096
       9  
      10  void abort ();
      11  
      12  #define define_test_functions(STYPE, NAMESUFFIX) \
      13  \
      14  STYPE result_##NAMESUFFIX[N]; \
      15  STYPE addend1_##NAMESUFFIX[N]; \
      16  STYPE addend2_##NAMESUFFIX[N]; \
      17  STYPE carry_##NAMESUFFIX[N]; \
      18  STYPE expected_##NAMESUFFIX[N]; \
      19  \
      20  __attribute__((noinline)) void vector_tests_##NAMESUFFIX () \
      21  { \
      22    vector STYPE v1, v2, v3, tmp; \
      23    int i; \
      24    for (i = 0; i < N; i+=16/sizeof (STYPE)) \
      25      { \
      26        /* result=carry of addend1+addend2+(carry & 0x1).  */ \
      27        v1 = (vector STYPE) { addend1_##NAMESUFFIX[i] }; \
      28        v2 = (vector STYPE) { addend2_##NAMESUFFIX[i] }; \
      29        v3 = (vector STYPE) { carry_##NAMESUFFIX[i] }; \
      30  \
      31        tmp = vec_addec (v1, v2, v3); \
      32        result_##NAMESUFFIX[i] = tmp[0]; \
      33      } \
      34  } \
      35  \
      36  __attribute__((noinline)) void init_##NAMESUFFIX () \
      37  { \
      38    int i; \
      39    for (i = 0; i < N; ++i) \
      40      { \
      41        result_##NAMESUFFIX[i] = 0; \
      42        if (i%6 == 0) \
      43  	{ \
      44  	  addend1_##NAMESUFFIX[i] = ((__int128)0xffffffffffffffff << 64); \
      45  	  addend2_##NAMESUFFIX[i] =  0xfffffffffffffffe; \
      46  	  carry_##NAMESUFFIX[i] = 1; \
      47  	  expected_##NAMESUFFIX[i] = 0; \
      48  	} \
      49        else if (i%6 == 1) \
      50  	{ \
      51  	  addend1_##NAMESUFFIX[i] = ((__int128)0xffffffffffffffff << 64) + \
      52  				    0xffffffffffffffff; \
      53  	  addend2_##NAMESUFFIX[i] = 1; \
      54  	  carry_##NAMESUFFIX[i] = 0; \
      55  	  expected_##NAMESUFFIX[i] = 1; \
      56  	} \
      57        else if (i%6 == 2) \
      58  	{ \
      59  	  addend1_##NAMESUFFIX[i] = ((__int128)0xffffffffffffffff << 64) + \
      60  				    0xffffffffffffffff; \
      61  	  addend2_##NAMESUFFIX[i] = 0; \
      62  	  carry_##NAMESUFFIX[i] = 3; /* 3 should work like 1 here.  */ \
      63  	  expected_##NAMESUFFIX[i] = 1; \
      64  	}  \
      65        else if (i%6 == 3) \
      66  	{ \
      67  	  addend1_##NAMESUFFIX[i] = 1; \
      68  	  addend2_##NAMESUFFIX[i] = ((__int128)0xffffffffffffffff << 64) + \
      69  				    0xffffffffffffffff; \
      70  	  carry_##NAMESUFFIX[i] = 2; /* 2 should work like 0 here.  */ \
      71  	  expected_##NAMESUFFIX[i] = 1; \
      72  	} \
      73        else if (i%6 == 4) \
      74  	{ \
      75  	  addend1_##NAMESUFFIX[i] = 0; \
      76  	  addend2_##NAMESUFFIX[i] = ((__int128)0xffffffffffffffff << 64) + \
      77  				    0xffffffffffffffff; \
      78  	  carry_##NAMESUFFIX[i] = 1; \
      79  	  expected_##NAMESUFFIX[i] = 1; \
      80  	} \
      81        else if (i%6 == 5) \
      82  	{ \
      83  	  addend1_##NAMESUFFIX[i] = ((__int128)0xffffffffffffffff << 64); \
      84  	  addend2_##NAMESUFFIX[i] = 0xffffffffffffffff; \
      85  	  carry_##NAMESUFFIX[i] = 1; \
      86  	  expected_##NAMESUFFIX[i] = 1; \
      87  	} \
      88      } \
      89  } \
      90  \
      91  __attribute__((noinline)) void verify_results_##NAMESUFFIX () \
      92  { \
      93    int i; \
      94    for (i = 0; i < N; ++i) \
      95      { \
      96        if (result_##NAMESUFFIX[i] != expected_##NAMESUFFIX[i]) \
      97  	abort (); \
      98      } \
      99  }
     100  
     101  
     102  #define execute_test_functions(STYPE, NAMESUFFIX) \
     103  { \
     104    init_##NAMESUFFIX (); \
     105    vector_tests_##NAMESUFFIX (); \
     106    verify_results_##NAMESUFFIX (); \
     107  }
     108  
     109  
     110  define_test_functions (signed __int128, si128);
     111  define_test_functions (unsigned __int128, ui128);
     112  
     113  int main ()
     114  {
     115    execute_test_functions (signed __int128, si128);
     116    execute_test_functions (unsigned __int128, ui128);
     117  
     118    return 0;
     119  }
     120  
     121