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