1343171Sdim/* Copyright (C) 2002  Free Software Foundation.
2343171Sdim
3343171Sdim   Test memset with various combinations of constant pointer alignments and
4353358Sdim   lengths to make sure any optimizations in the compiler are correct.
5353358Sdim
6353358Sdim   Written by Roger Sayle, July 22, 2002.  */
7343171Sdim
8343171Sdim#ifndef MAX_OFFSET
9343171Sdim#define MAX_OFFSET (sizeof (long long))
10343171Sdim#endif
11343171Sdim
12343171Sdim#ifndef MAX_COPY
13343171Sdim#define MAX_COPY 15
14343171Sdim#endif
15343171Sdim
16343171Sdim#ifndef MAX_EXTRA
17343171Sdim#define MAX_EXTRA (sizeof (long long))
18343171Sdim#endif
19343171Sdim
20343171Sdim#define MAX_LENGTH (MAX_OFFSET + MAX_COPY + MAX_EXTRA)
21343171Sdim
22343171Sdimstatic union {
23343171Sdim  char buf[MAX_LENGTH];
24343171Sdim  long long align_int;
25343171Sdim  long double align_fp;
26343171Sdim} u;
27343171Sdim
28343171Sdimchar A = 'A';
29343171Sdim
30343171Sdimvoid reset ()
31343171Sdim{
32343171Sdim  int i;
33343171Sdim
34343171Sdim  for (i = 0; i < MAX_LENGTH; i++)
35343171Sdim    u.buf[i] = 'a';
36343171Sdim}
37343171Sdim
38343171Sdimvoid check (int off, int len, int ch)
39343171Sdim{
40343171Sdim  char *q;
41343171Sdim  int i;
42343171Sdim
43343171Sdim  q = u.buf;
44343171Sdim  for (i = 0; i < off; i++, q++)
45343171Sdim    if (*q != 'a')
46343171Sdim      abort ();
47343171Sdim
48343171Sdim  for (i = 0; i < len; i++, q++)
49343171Sdim    if (*q != ch)
50343171Sdim      abort ();
51343171Sdim
52343171Sdim  for (i = 0; i < MAX_EXTRA; i++, q++)
53343171Sdim    if (*q != 'a')
54343171Sdim      abort ();
55343171Sdim}
56343171Sdim
57343171Sdimint main ()
58343171Sdim{
59343171Sdim  int len;
60343171Sdim  char *p;
61343171Sdim
62343171Sdim  /* off == 0 */
63343171Sdim  for (len = 0; len < MAX_COPY; len++)
64343171Sdim    {
65343171Sdim      reset ();
66343171Sdim
67360784Sdim      p = memset (u.buf, '\0', len);
68343171Sdim      if (p != u.buf) abort ();
69343171Sdim      check (0, len, '\0');
70343171Sdim
71343171Sdim      p = memset (u.buf, A, len);
72343171Sdim      if (p != u.buf) abort ();
73343171Sdim      check (0, len, 'A');
74343171Sdim
75343171Sdim      p = memset (u.buf, 'B', len);
76343171Sdim      if (p != u.buf) abort ();
77343171Sdim      check (0, len, 'B');
78360784Sdim    }
79360784Sdim
80343171Sdim  /* off == 1 */
81343171Sdim  for (len = 0; len < MAX_COPY; len++)
82343171Sdim    {
83343171Sdim      reset ();
84343171Sdim
85343171Sdim      p = memset (u.buf+1, '\0', len);
86343171Sdim      if (p != u.buf+1) abort ();
87343171Sdim      check (1, len, '\0');
88343171Sdim
89343171Sdim      p = memset (u.buf+1, A, len);
90343171Sdim      if (p != u.buf+1) abort ();
91343171Sdim      check (1, len, 'A');
92343171Sdim
93343171Sdim      p = memset (u.buf+1, 'B', len);
94343171Sdim      if (p != u.buf+1) abort ();
95343171Sdim      check (1, len, 'B');
96343171Sdim    }
97343171Sdim
98360784Sdim  /* off == 2 */
99360784Sdim  for (len = 0; len < MAX_COPY; len++)
100360784Sdim    {
101343171Sdim      reset ();
102343171Sdim
103343171Sdim      p = memset (u.buf+2, '\0', len);
104343171Sdim      if (p != u.buf+2) abort ();
105343171Sdim      check (2, len, '\0');
106343171Sdim
107343171Sdim      p = memset (u.buf+2, A, len);
108343171Sdim      if (p != u.buf+2) abort ();
109343171Sdim      check (2, len, 'A');
110343171Sdim
111343171Sdim      p = memset (u.buf+2, 'B', len);
112343171Sdim      if (p != u.buf+2) abort ();
113343171Sdim      check (2, len, 'B');
114343171Sdim    }
115343171Sdim
116343171Sdim  /* off == 3 */
117343171Sdim  for (len = 0; len < MAX_COPY; len++)
118343171Sdim    {
119343171Sdim      reset ();
120343171Sdim
121343171Sdim      p = memset (u.buf+3, '\0', len);
122343171Sdim      if (p != u.buf+3) abort ();
123343171Sdim      check (3, len, '\0');
124360784Sdim
125360784Sdim      p = memset (u.buf+3, A, len);
126343171Sdim      if (p != u.buf+3) abort ();
127343171Sdim      check (3, len, 'A');
128343171Sdim
129343171Sdim      p = memset (u.buf+3, 'B', len);
130343171Sdim      if (p != u.buf+3) abort ();
131360784Sdim      check (3, len, 'B');
132343171Sdim    }
133343171Sdim
134343171Sdim  /* off == 4 */
135343171Sdim  for (len = 0; len < MAX_COPY; len++)
136343171Sdim    {
137343171Sdim      reset ();
138343171Sdim
139343171Sdim      p = memset (u.buf+4, '\0', len);
140343171Sdim      if (p != u.buf+4) abort ();
141343171Sdim      check (4, len, '\0');
142343171Sdim
143343171Sdim      p = memset (u.buf+4, A, len);
144343171Sdim      if (p != u.buf+4) abort ();
145343171Sdim      check (4, len, 'A');
146343171Sdim
147343171Sdim      p = memset (u.buf+4, 'B', len);
148343171Sdim      if (p != u.buf+4) abort ();
149343171Sdim      check (4, len, 'B');
150343171Sdim    }
151343171Sdim
152343171Sdim  /* off == 5 */
153343171Sdim  for (len = 0; len < MAX_COPY; len++)
154343171Sdim    {
155343171Sdim      reset ();
156343171Sdim
157343171Sdim      p = memset (u.buf+5, '\0', len);
158343171Sdim      if (p != u.buf+5) abort ();
159343171Sdim      check (5, len, '\0');
160343171Sdim
161343171Sdim      p = memset (u.buf+5, A, len);
162343171Sdim      if (p != u.buf+5) abort ();
163343171Sdim      check (5, len, 'A');
164343171Sdim
165343171Sdim      p = memset (u.buf+5, 'B', len);
166343171Sdim      if (p != u.buf+5) abort ();
167343171Sdim      check (5, len, 'B');
168343171Sdim    }
169343171Sdim
170343171Sdim  /* off == 6 */
171343171Sdim  for (len = 0; len < MAX_COPY; len++)
172343171Sdim    {
173343171Sdim      reset ();
174343171Sdim
175343171Sdim      p = memset (u.buf+6, '\0', len);
176343171Sdim      if (p != u.buf+6) abort ();
177343171Sdim      check (6, len, '\0');
178343171Sdim
179343171Sdim      p = memset (u.buf+6, A, len);
180343171Sdim      if (p != u.buf+6) abort ();
181343171Sdim      check (6, len, 'A');
182343171Sdim
183343171Sdim      p = memset (u.buf+6, 'B', len);
184343171Sdim      if (p != u.buf+6) abort ();
185343171Sdim      check (6, len, 'B');
186343171Sdim    }
187343171Sdim
188343171Sdim  /* off == 7 */
189343171Sdim  for (len = 0; len < MAX_COPY; len++)
190343171Sdim    {
191343171Sdim      reset ();
192343171Sdim
193343171Sdim      p = memset (u.buf+7, '\0', len);
194343171Sdim      if (p != u.buf+7) abort ();
195343171Sdim      check (7, len, '\0');
196343171Sdim
197343171Sdim      p = memset (u.buf+7, A, len);
198343171Sdim      if (p != u.buf+7) abort ();
199343171Sdim      check (7, len, 'A');
200343171Sdim
201343171Sdim      p = memset (u.buf+7, 'B', len);
202343171Sdim      if (p != u.buf+7) abort ();
203343171Sdim      check (7, len, 'B');
204343171Sdim    }
205343171Sdim
206360784Sdim  exit (0);
207360784Sdim}
208360784Sdim
209360784Sdim