1 /* Copyright (C) 2002 Free Software Foundation.
2
3 Test memset with various combinations of constant pointer alignments and
4 lengths to make sure any optimizations in the compiler are correct.
5
6 Written by Roger Sayle, July 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 len;
60 char *p;
61
62 /* off == 0 */
63 for (len = 0; len < MAX_COPY; len++)
64 {
65 reset ();
66
67 p = memset (u.buf, '\0', len);
68 if (p != u.buf) abort ();
69 check (0, len, '\0');
70
71 p = memset (u.buf, A, len);
72 if (p != u.buf) abort ();
73 check (0, len, 'A');
74
75 p = memset (u.buf, 'B', len);
76 if (p != u.buf) abort ();
77 check (0, len, 'B');
78 }
79
80 /* off == 1 */
81 for (len = 0; len < MAX_COPY; len++)
82 {
83 reset ();
84
85 p = memset (u.buf+1, '\0', len);
86 if (p != u.buf+1) abort ();
87 check (1, len, '\0');
88
89 p = memset (u.buf+1, A, len);
90 if (p != u.buf+1) abort ();
91 check (1, len, 'A');
92
93 p = memset (u.buf+1, 'B', len);
94 if (p != u.buf+1) abort ();
95 check (1, len, 'B');
96 }
97
98 /* off == 2 */
99 for (len = 0; len < MAX_COPY; len++)
100 {
101 reset ();
102
103 p = memset (u.buf+2, '\0', len);
104 if (p != u.buf+2) abort ();
105 check (2, len, '\0');
106
107 p = memset (u.buf+2, A, len);
108 if (p != u.buf+2) abort ();
109 check (2, len, 'A');
110
111 p = memset (u.buf+2, 'B', len);
112 if (p != u.buf+2) abort ();
113 check (2, len, 'B');
114 }
115
116 /* off == 3 */
117 for (len = 0; len < MAX_COPY; len++)
118 {
119 reset ();
120
121 p = memset (u.buf+3, '\0', len);
122 if (p != u.buf+3) abort ();
123 check (3, len, '\0');
124
125 p = memset (u.buf+3, A, len);
126 if (p != u.buf+3) abort ();
127 check (3, len, 'A');
128
129 p = memset (u.buf+3, 'B', len);
130 if (p != u.buf+3) abort ();
131 check (3, len, 'B');
132 }
133
134 /* off == 4 */
135 for (len = 0; len < MAX_COPY; len++)
136 {
137 reset ();
138
139 p = memset (u.buf+4, '\0', len);
140 if (p != u.buf+4) abort ();
141 check (4, len, '\0');
142
143 p = memset (u.buf+4, A, len);
144 if (p != u.buf+4) abort ();
145 check (4, len, 'A');
146
147 p = memset (u.buf+4, 'B', len);
148 if (p != u.buf+4) abort ();
149 check (4, len, 'B');
150 }
151
152 /* off == 5 */
153 for (len = 0; len < MAX_COPY; len++)
154 {
155 reset ();
156
157 p = memset (u.buf+5, '\0', len);
158 if (p != u.buf+5) abort ();
159 check (5, len, '\0');
160
161 p = memset (u.buf+5, A, len);
162 if (p != u.buf+5) abort ();
163 check (5, len, 'A');
164
165 p = memset (u.buf+5, 'B', len);
166 if (p != u.buf+5) abort ();
167 check (5, len, 'B');
168 }
169
170 /* off == 6 */
171 for (len = 0; len < MAX_COPY; len++)
172 {
173 reset ();
174
175 p = memset (u.buf+6, '\0', len);
176 if (p != u.buf+6) abort ();
177 check (6, len, '\0');
178
179 p = memset (u.buf+6, A, len);
180 if (p != u.buf+6) abort ();
181 check (6, len, 'A');
182
183 p = memset (u.buf+6, 'B', len);
184 if (p != u.buf+6) abort ();
185 check (6, len, 'B');
186 }
187
188 /* off == 7 */
189 for (len = 0; len < MAX_COPY; len++)
190 {
191 reset ();
192
193 p = memset (u.buf+7, '\0', len);
194 if (p != u.buf+7) abort ();
195 check (7, len, '\0');
196
197 p = memset (u.buf+7, A, len);
198 if (p != u.buf+7) abort ();
199 check (7, len, 'A');
200
201 p = memset (u.buf+7, 'B', len);
202 if (p != u.buf+7) abort ();
203 check (7, len, 'B');
204 }
205
206 exit (0);
207 }
208
209