[testsuite] require sqrt_insn effective target where needed
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / vec-addec.c
blob3090cc73b079978635d2540ead49762b787dc0db
1 /* { dg-do run { target { powerpc*-*-* && p8vector_hw } } } */
2 /* { dg-options "-mdejagnu-cpu=power8 -O3" } */
4 /* Test that the vec_addec builtin works as expected. */
6 #include "altivec.h"
8 #define N 4096
10 void abort ();
12 #define define_test_functions(STYPE, NAMESUFFIX) \
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]; \
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 = vec_vsx_ld (0, &addend1_##NAMESUFFIX[i]); \
28 v2 = vec_vsx_ld (0, &addend2_##NAMESUFFIX[i]); \
29 v3 = vec_vsx_ld (0, &carry_##NAMESUFFIX[i]); \
31 tmp = vec_addec (v1, v2, v3); \
32 vec_vsx_st (tmp, 0, &result_##NAMESUFFIX[i]); \
33 } \
34 } \
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] = 0xfffffffd; \
45 addend2_##NAMESUFFIX[i] = 1; \
46 carry_##NAMESUFFIX[i] = 1; \
47 expected_##NAMESUFFIX[i] = 0; \
48 } \
49 else if (i%6 == 1) \
50 { \
51 addend1_##NAMESUFFIX[i] = 0xffffffff; \
52 addend2_##NAMESUFFIX[i] = 1; \
53 carry_##NAMESUFFIX[i] = 0; \
54 expected_##NAMESUFFIX[i] = 1; \
55 } \
56 else if (i%6 == 2) \
57 { \
58 addend1_##NAMESUFFIX[i] = 0xffffffff; \
59 addend2_##NAMESUFFIX[i] = 0; \
60 carry_##NAMESUFFIX[i] = 3; /* 3 should work like 1 here. */ \
61 expected_##NAMESUFFIX[i] = 1; \
62 } \
63 else if (i%6 == 3) \
64 { \
65 addend1_##NAMESUFFIX[i] = 1; \
66 addend2_##NAMESUFFIX[i] = 0xffffffff; \
67 carry_##NAMESUFFIX[i] = 2; /* 2 should work like 0 here. */ \
68 expected_##NAMESUFFIX[i] = 1; \
69 } \
70 else if (i%6 == 4) \
71 { \
72 addend1_##NAMESUFFIX[i] = 0; \
73 addend2_##NAMESUFFIX[i] = 0xffffffff; \
74 carry_##NAMESUFFIX[i] = 1; \
75 expected_##NAMESUFFIX[i] = 1; \
76 } \
77 else if (i%6 == 5) \
78 { \
79 addend1_##NAMESUFFIX[i] = 0xffff0000; \
80 addend2_##NAMESUFFIX[i] = 0x0000ffff; \
81 carry_##NAMESUFFIX[i] = 1; \
82 expected_##NAMESUFFIX[i] = 1; \
83 } \
84 } \
85 } \
87 __attribute__((noinline)) void verify_results_##NAMESUFFIX () \
88 { \
89 int i; \
90 for (i = 0; i < N; ++i) \
91 { \
92 if (result_##NAMESUFFIX[i] != expected_##NAMESUFFIX[i]) \
93 abort (); \
94 } \
98 #define execute_test_functions(STYPE, NAMESUFFIX) \
99 { \
100 init_##NAMESUFFIX (); \
101 vector_tests_##NAMESUFFIX (); \
102 verify_results_##NAMESUFFIX (); \
106 define_test_functions (signed int, si);
107 define_test_functions (unsigned int, ui);
109 int main ()
111 execute_test_functions (signed int, si);
112 execute_test_functions (unsigned int, ui);
114 return 0;