Merge from mainline (167278:168000).
[official-gcc/graphite-test-results.git] / gcc / testsuite / gcc.dg / vect / vect-shift-2.c
blob83211eba49f326da7516ae43b4f9550506513a72
1 /* { dg-require-effective-target vect_shift } */
2 /* { dg-require-effective-target vect_int } */
3 /* Check the standard integer types for left and right shifts to see if the
4 compiler replaced a scalar instruction with a vector instruction whether the
5 correct value is generated. */
7 #ifdef TRACE
8 #endif
10 #include <stdarg.h>
11 #include "tree-vect.h"
13 #ifndef ALIGN
14 #define ALIGN __attribute__((__aligned__(__BIGGEST_ALIGNMENT__)))
15 #endif
17 #ifndef NOINLINE
18 #define NOINLINE __attribute__((__noinline__))
19 #endif
21 #ifdef TRACE
22 #define TRACE_FUNC(PREFIX, NAME) printf (#PREFIX #NAME "\n")
23 #define TRACE_DONE() printf ("done!\n")
24 #define TRACE_ABORT(I,E,G) \
25 do { \
26 printf ("Element %d, expected 0x%lx, got 0x%lx\n", \
27 I, (long)(E), (long)(G)); \
28 abort (); \
29 } while (0)
31 #else
32 #define TRACE_FUNC(PREFIX, A)
33 #define TRACE_DONE()
34 #define TRACE_ABORT(I,E,G) abort ()
35 #endif
37 #define NAME(A,B) A ## B
39 #define VECT_TESTS(PREFIX, TYPE, N) \
40 /* Restrict the optimizer from optimizing the setup loops. */ \
41 volatile TYPE NAME (PREFIX, zero) = 0; \
43 TYPE NAME (PREFIX, a)[N] ALIGN; \
44 TYPE NAME (PREFIX, b)[N] ALIGN; \
45 TYPE NAME (PREFIX, c)[N] ALIGN; \
46 TYPE NAME (PREFIX, d)[N] ALIGN; \
48 static void NOINLINE \
49 NAME (PREFIX, lshift_2) (void) \
50 { \
51 int i; \
53 TRACE_FUNC (PREFIX, lshift_2); \
54 for (i = 0; i < N; i++) \
55 NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] << 2; \
56 } \
58 static void NOINLINE \
59 NAME (PREFIX, lshift_var) (int shift) \
60 { \
61 int i; \
63 TRACE_FUNC (PREFIX, lshift_var); \
64 for (i = 0; i < N; i++) \
65 NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] << shift; \
66 } \
68 static void NOINLINE \
69 NAME (PREFIX, lshift_vect) (void) \
70 { \
71 int i; \
73 TRACE_FUNC (PREFIX, lshift_vect); \
74 for (i = 0; i < N; i++) \
75 NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] << NAME (PREFIX, c)[i]; \
76 } \
78 static void NOINLINE \
79 NAME (PREFIX, rshift_2) (void) \
80 { \
81 int i; \
83 TRACE_FUNC (PREFIX, rshift_2); \
84 for (i = 0; i < N; i++) \
85 NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] >> 2; \
86 } \
88 static void NOINLINE \
89 NAME (PREFIX, rshift_var) (int shift) \
90 { \
91 int i; \
93 TRACE_FUNC (PREFIX, rshift_var); \
94 for (i = 0; i < N; i++) \
95 NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] >> shift; \
96 } \
98 static void NOINLINE \
99 NAME (PREFIX, rshift_vect) (void) \
101 int i; \
103 TRACE_FUNC (PREFIX, rshift_vect); \
104 for (i = 0; i < N; i++) \
105 NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] >> NAME (PREFIX, c)[i]; \
108 static void NOINLINE \
109 NAME (PREFIX, check) (void) \
111 int i; \
113 TRACE_FUNC (PREFIX, check); \
114 for (i = 0; i < N; i++) \
115 if (NAME (PREFIX, a)[i] != NAME (PREFIX, d)[i]) \
116 TRACE_ABORT (i, NAME (PREFIX, d)[i], NAME (PREFIX, a)[i]); \
119 static void NOINLINE \
120 NAME (PREFIX, tests) (void) \
122 int i; \
124 TRACE_FUNC (PREFIX, tests); \
125 for (i = 0; i < N; i++) \
127 NAME (PREFIX, b)[i] = (i + NAME (PREFIX, zero)); \
128 NAME (PREFIX, c)[i] = 2; \
129 NAME (PREFIX, d)[i] = (i + NAME (PREFIX, zero)) << 2; \
132 NAME (PREFIX, lshift_2) (); \
133 NAME (PREFIX, check) (); \
135 NAME (PREFIX, lshift_var) (2); \
136 NAME (PREFIX, check) (); \
138 NAME (PREFIX, lshift_vect) (); \
139 NAME (PREFIX, check) (); \
141 for (i = 0; i < N; i++) \
143 NAME (PREFIX, b)[i] = ((i + NAME (PREFIX, zero)) << 4) \
144 | (((TYPE)0x80) << ((sizeof (TYPE) * 8) - 8)); \
145 NAME (PREFIX, c)[i] = 2; \
146 NAME (PREFIX, d)[i] = (TYPE)((NAME (PREFIX, b)[i] \
147 + NAME (PREFIX, zero)) >> 2); \
150 NAME (PREFIX, rshift_2) (); \
151 NAME (PREFIX, check) (); \
153 NAME (PREFIX, rshift_var) (2); \
154 NAME (PREFIX, check) (); \
156 NAME (PREFIX, rshift_vect) (); \
157 NAME (PREFIX, check) (); \
160 VECT_TESTS(uc_, unsigned char, 16)
161 VECT_TESTS(us_, unsigned short, 32)
162 VECT_TESTS(ui_, unsigned int, 32)
163 VECT_TESTS(ul_, unsigned long, 32)
165 VECT_TESTS(sc_, signed char, 16)
166 VECT_TESTS(ss_, short, 32)
167 VECT_TESTS(si_, int, 32)
168 VECT_TESTS(sl_, long, 32)
170 int main ()
172 int i;
174 check_vect ();
176 uc_tests ();
177 us_tests ();
178 ui_tests ();
179 ul_tests ();
181 sc_tests ();
182 ss_tests ();
183 si_tests ();
184 sl_tests ();
186 TRACE_DONE ();
187 return 0;
190 /* { dg-final { cleanup-tree-dump "vect" } } */