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 
main()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 
122