1 /* Copyright (C) 2002 Free Software Foundation.
2
3 Test memset with various combinations of pointer alignments and constant
4 lengths to make sure any optimizations in the compiler are correct.
5
6 Written by Roger Sayle, April 22, 2002. */
7
8 #ifndef MAX_OFFSET
9 #define MAX_OFFSET (sizeof (long long))
10 #endif
11
12 #ifndef MAX_COPY
13 #define MAX_COPY 15
14 #endif
15
16 #ifndef MAX_EXTRA
17 #define MAX_EXTRA (sizeof (long long))
18 #endif
19
20 #define MAX_LENGTH (MAX_OFFSET + MAX_COPY + MAX_EXTRA)
21
22 static union {
23 char buf[MAX_LENGTH];
24 long long align_int;
25 long double align_fp;
26 } u;
27
28 char A = 'A';
29
reset()30 void reset ()
31 {
32 int i;
33
34 for (i = 0; i < MAX_LENGTH; i++)
35 u.buf[i] = 'a';
36 }
37
check(int off,int len,int ch)38 void check (int off, int len, int ch)
39 {
40 char *q;
41 int i;
42
43 q = u.buf;
44 for (i = 0; i < off; i++, q++)
45 if (*q != 'a')
46 abort ();
47
48 for (i = 0; i < len; i++, q++)
49 if (*q != ch)
50 abort ();
51
52 for (i = 0; i < MAX_EXTRA; i++, q++)
53 if (*q != 'a')
54 abort ();
55 }
56
main()57 int main ()
58 {
59 int off;
60 char *p;
61
62 /* len == 1 */
63 for (off = 0; off < MAX_OFFSET; off++)
64 {
65 reset ();
66
67 p = memset (u.buf + off, '\0', 1);
68 if (p != u.buf + off) abort ();
69 check (off, 1, '\0');
70
71 p = memset (u.buf + off, A, 1);
72 if (p != u.buf + off) abort ();
73 check (off, 1, 'A');
74
75 p = memset (u.buf + off, 'B', 1);
76 if (p != u.buf + off) abort ();
77 check (off, 1, 'B');
78 }
79
80 /* len == 2 */
81 for (off = 0; off < MAX_OFFSET; off++)
82 {
83 reset ();
84
85 p = memset (u.buf + off, '\0', 2);
86 if (p != u.buf + off) abort ();
87 check (off, 2, '\0');
88
89 p = memset (u.buf + off, A, 2);
90 if (p != u.buf + off) abort ();
91 check (off, 2, 'A');
92
93 p = memset (u.buf + off, 'B', 2);
94 if (p != u.buf + off) abort ();
95 check (off, 2, 'B');
96 }
97
98 /* len == 3 */
99 for (off = 0; off < MAX_OFFSET; off++)
100 {
101 reset ();
102
103 p = memset (u.buf + off, '\0', 3);
104 if (p != u.buf + off) abort ();
105 check (off, 3, '\0');
106
107 p = memset (u.buf + off, A, 3);
108 if (p != u.buf + off) abort ();
109 check (off, 3, 'A');
110
111 p = memset (u.buf + off, 'B', 3);
112 if (p != u.buf + off) abort ();
113 check (off, 3, 'B');
114 }
115
116 /* len == 4 */
117 for (off = 0; off < MAX_OFFSET; off++)
118 {
119 reset ();
120
121 p = memset (u.buf + off, '\0', 4);
122 if (p != u.buf + off) abort ();
123 check (off, 4, '\0');
124
125 p = memset (u.buf + off, A, 4);
126 if (p != u.buf + off) abort ();
127 check (off, 4, 'A');
128
129 p = memset (u.buf + off, 'B', 4);
130 if (p != u.buf + off) abort ();
131 check (off, 4, 'B');
132 }
133
134 /* len == 5 */
135 for (off = 0; off < MAX_OFFSET; off++)
136 {
137 reset ();
138
139 p = memset (u.buf + off, '\0', 5);
140 if (p != u.buf + off) abort ();
141 check (off, 5, '\0');
142
143 p = memset (u.buf + off, A, 5);
144 if (p != u.buf + off) abort ();
145 check (off, 5, 'A');
146
147 p = memset (u.buf + off, 'B', 5);
148 if (p != u.buf + off) abort ();
149 check (off, 5, 'B');
150 }
151
152 /* len == 6 */
153 for (off = 0; off < MAX_OFFSET; off++)
154 {
155 reset ();
156
157 p = memset (u.buf + off, '\0', 6);
158 if (p != u.buf + off) abort ();
159 check (off, 6, '\0');
160
161 p = memset (u.buf + off, A, 6);
162 if (p != u.buf + off) abort ();
163 check (off, 6, 'A');
164
165 p = memset (u.buf + off, 'B', 6);
166 if (p != u.buf + off) abort ();
167 check (off, 6, 'B');
168 }
169
170 /* len == 7 */
171 for (off = 0; off < MAX_OFFSET; off++)
172 {
173 reset ();
174
175 p = memset (u.buf + off, '\0', 7);
176 if (p != u.buf + off) abort ();
177 check (off, 7, '\0');
178
179 p = memset (u.buf + off, A, 7);
180 if (p != u.buf + off) abort ();
181 check (off, 7, 'A');
182
183 p = memset (u.buf + off, 'B', 7);
184 if (p != u.buf + off) abort ();
185 check (off, 7, 'B');
186 }
187
188 /* len == 8 */
189 for (off = 0; off < MAX_OFFSET; off++)
190 {
191 reset ();
192
193 p = memset (u.buf + off, '\0', 8);
194 if (p != u.buf + off) abort ();
195 check (off, 8, '\0');
196
197 p = memset (u.buf + off, A, 8);
198 if (p != u.buf + off) abort ();
199 check (off, 8, 'A');
200
201 p = memset (u.buf + off, 'B', 8);
202 if (p != u.buf + off) abort ();
203 check (off, 8, 'B');
204 }
205
206 /* len == 9 */
207 for (off = 0; off < MAX_OFFSET; off++)
208 {
209 reset ();
210
211 p = memset (u.buf + off, '\0', 9);
212 if (p != u.buf + off) abort ();
213 check (off, 9, '\0');
214
215 p = memset (u.buf + off, A, 9);
216 if (p != u.buf + off) abort ();
217 check (off, 9, 'A');
218
219 p = memset (u.buf + off, 'B', 9);
220 if (p != u.buf + off) abort ();
221 check (off, 9, 'B');
222 }
223
224 /* len == 10 */
225 for (off = 0; off < MAX_OFFSET; off++)
226 {
227 reset ();
228
229 p = memset (u.buf + off, '\0', 10);
230 if (p != u.buf + off) abort ();
231 check (off, 10, '\0');
232
233 p = memset (u.buf + off, A, 10);
234 if (p != u.buf + off) abort ();
235 check (off, 10, 'A');
236
237 p = memset (u.buf + off, 'B', 10);
238 if (p != u.buf + off) abort ();
239 check (off, 10, 'B');
240 }
241
242 /* len == 11 */
243 for (off = 0; off < MAX_OFFSET; off++)
244 {
245 reset ();
246
247 p = memset (u.buf + off, '\0', 11);
248 if (p != u.buf + off) abort ();
249 check (off, 11, '\0');
250
251 p = memset (u.buf + off, A, 11);
252 if (p != u.buf + off) abort ();
253 check (off, 11, 'A');
254
255 p = memset (u.buf + off, 'B', 11);
256 if (p != u.buf + off) abort ();
257 check (off, 11, 'B');
258 }
259
260 /* len == 12 */
261 for (off = 0; off < MAX_OFFSET; off++)
262 {
263 reset ();
264
265 p = memset (u.buf + off, '\0', 12);
266 if (p != u.buf + off) abort ();
267 check (off, 12, '\0');
268
269 p = memset (u.buf + off, A, 12);
270 if (p != u.buf + off) abort ();
271 check (off, 12, 'A');
272
273 p = memset (u.buf + off, 'B', 12);
274 if (p != u.buf + off) abort ();
275 check (off, 12, 'B');
276 }
277
278 /* len == 13 */
279 for (off = 0; off < MAX_OFFSET; off++)
280 {
281 reset ();
282
283 p = memset (u.buf + off, '\0', 13);
284 if (p != u.buf + off) abort ();
285 check (off, 13, '\0');
286
287 p = memset (u.buf + off, A, 13);
288 if (p != u.buf + off) abort ();
289 check (off, 13, 'A');
290
291 p = memset (u.buf + off, 'B', 13);
292 if (p != u.buf + off) abort ();
293 check (off, 13, 'B');
294 }
295
296 /* len == 14 */
297 for (off = 0; off < MAX_OFFSET; off++)
298 {
299 reset ();
300
301 p = memset (u.buf + off, '\0', 14);
302 if (p != u.buf + off) abort ();
303 check (off, 14, '\0');
304
305 p = memset (u.buf + off, A, 14);
306 if (p != u.buf + off) abort ();
307 check (off, 14, 'A');
308
309 p = memset (u.buf + off, 'B', 14);
310 if (p != u.buf + off) abort ();
311 check (off, 14, 'B');
312 }
313
314 /* len == 15 */
315 for (off = 0; off < MAX_OFFSET; off++)
316 {
317 reset ();
318
319 p = memset (u.buf + off, '\0', 15);
320 if (p != u.buf + off) abort ();
321 check (off, 15, '\0');
322
323 p = memset (u.buf + off, A, 15);
324 if (p != u.buf + off) abort ();
325 check (off, 15, 'A');
326
327 p = memset (u.buf + off, 'B', 15);
328 if (p != u.buf + off) abort ();
329 check (off, 15, 'B');
330 }
331
332 exit (0);
333 }
334
335