OSDN Git Service

Index: gcc/ChangeLog
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / i386-memset-1.c
1 /* Copyright (C) 2002  Free Software Foundation.
2
3    Test -minline-all-stringops memset with various combinations of pointer
4    alignments and lengths to make sure builtin optimizations are correct.
5    PR target/6456.
6
7    Written by Michael Meissner, March 9, 2002.
8    Target by Roger Sayle, April 25, 2002.  */
9
10 /* { dg-do run { target "i?86-*-*" } } */
11 /* { dg-options "-O2 -minline-all-stringops" } */
12
13 extern void *memset (void *, int, __SIZE_TYPE__);
14 extern void abort (void);
15 extern void exit (int);
16
17 #ifndef MAX_OFFSET
18 #define MAX_OFFSET (sizeof (long long))
19 #endif
20
21 #ifndef MAX_COPY
22 #define MAX_COPY (8 * sizeof (long long))
23 #endif
24
25 #ifndef MAX_EXTRA
26 #define MAX_EXTRA (sizeof (long long))
27 #endif
28
29 #define MAX_LENGTH (MAX_OFFSET + MAX_COPY + MAX_EXTRA)
30
31 static union {
32   char buf[MAX_LENGTH];
33   long long align_int;
34   long double align_fp;
35 } u;
36
37 char A = 'A';
38
39 main ()
40 {
41   int off, len, i;
42   char *p, *q;
43
44   for (off = 0; off < MAX_OFFSET; off++)
45     for (len = 1; len < MAX_COPY; len++)
46       {
47         for (i = 0; i < MAX_LENGTH; i++)
48           u.buf[i] = 'a';
49
50         p = memset (u.buf + off, '\0', len);
51         if (p != u.buf + off)
52           abort ();
53
54         q = u.buf;
55         for (i = 0; i < off; i++, q++)
56           if (*q != 'a')
57             abort ();
58
59         for (i = 0; i < len; i++, q++)
60           if (*q != '\0')
61             abort ();
62
63         for (i = 0; i < MAX_EXTRA; i++, q++)
64           if (*q != 'a')
65             abort ();
66
67         p = memset (u.buf + off, A, len);
68         if (p != u.buf + off)
69           abort ();
70
71         q = u.buf;
72         for (i = 0; i < off; i++, q++)
73           if (*q != 'a')
74             abort ();
75
76         for (i = 0; i < len; i++, q++)
77           if (*q != 'A')
78             abort ();
79
80         for (i = 0; i < MAX_EXTRA; i++, q++)
81           if (*q != 'a')
82             abort ();
83
84         p = memset (u.buf + off, 'B', len);
85         if (p != u.buf + off)
86           abort ();
87
88         q = u.buf;
89         for (i = 0; i < off; i++, q++)
90           if (*q != 'a')
91             abort ();
92
93         for (i = 0; i < len; i++, q++)
94           if (*q != 'B')
95             abort ();
96
97         for (i = 0; i < MAX_EXTRA; i++, q++)
98           if (*q != 'a')
99             abort ();
100       }
101
102   exit(0);
103 }
104