OSDN Git Service

PR c/17844
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / 20020919-1.c
1 /* Copyright (C) 2002  Free Software Foundation.
2    by Hans-Peter Nilsson  <hp@axis.com>
3
4    Making sure that asm clobbers conflicting with asm-declared input
5    operands are detected: ``You may not write a clobber description in a
6    way that overlaps with an input or output operand''.
7
8    You must be this tall ---> fit two long longs in asm-declared registers
9    to enter this amusement.  */
10
11 /* { dg-do compile { target alpha-*-* cris-*-* i?86-*-* mmix-*-* powerpc-*-* rs6000-*-* x86_64-*-* } } */
12 /* { dg-options "-O2" } */
13
14 /* Constructed examples; input/output (same register), output, input, and
15    input and output (different registers).  */
16
17 /* The long longs are used to test overlap overlap for multi-register
18    registers.  REG2 and REG4 must be the second halves (defined as
19    higher-numbered parts) of REG1 and REG3 respectively when two registers
20    are needed.  */
21
22 #if defined (__alpha__)
23 # define REG1 "$1"
24 # define REG2 "$2"
25 #elif defined (__CRIS__)
26 # define REG1 "r10"
27 # define REG2 "r11"
28 # define REG3 "r12"
29 # define REG4 "r13"
30 # define REG5 "r9"
31 #elif defined (__i386__)
32 # define REG1 "%eax"
33 # define REG2 "%edx"
34 # define REG3 "%ecx"
35 # define REG4 "%ebx"
36 #elif defined (__MMIX__)
37 # define REG1 "$8"
38 # define REG2 "$9"
39 #elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) \
40         || defined (__POWERPC__) || defined (PPC) || defined (_IBMR2)
41 # define REG1 "6"
42 # define REG2 "7"
43 # define REG3 "8"
44 # define REG4 "9"
45 #elif defined (__x86_64__)
46 # define REG1 "rax"
47 # define REG2 "rdx"
48 #endif
49
50 /* For readability of the tests.  */
51 #ifdef REG3
52 # define REG1a REG1
53 # define REG1b REG2
54 # define REG2a REG3
55 # define REG2b REG4
56 #else
57 # define REG1a REG1
58 # define REG1b REG1
59 # define REG2a REG2
60 # define REG2b REG2
61 #endif
62
63 /* REG5 is just another reg if there is one; the difference to REG4 is to
64    keep the original set of registers for CRIS.  */
65 #ifndef REG5
66 #define REG5 REG2b
67 #endif
68
69 void *
70 foo (void *p)
71 {
72   register void *q asm (REG1) = p;
73   asm ("foo1 %0" : "=r" (q) : "0" (q) : REG1); /* { dg-error "conflict" } */
74   return q;
75 }
76
77 void *
78 nfoo (void *p)
79 {
80   register void *q asm (REG1) = p;
81   asm ("foo1 %0" : "=r" (q) : "0" (q) : REG2);
82   return q;
83 }
84
85 long long
86 foolla (long long llp)
87 {
88   register long long ll asm (REG1a) = llp;
89   asm ("foo1a %0" : "=r" (ll) : "0" (ll) : REG1a); /* { dg-error "conflict" } */
90   return ll;
91 }
92
93 long long
94 nfoolla (long long llp)
95 {
96   register long long ll asm (REG1a) = llp;
97   asm ("foo1a %0" : "=r" (ll) : "0" (ll) : REG2a);
98   return ll;
99 }
100
101 long long
102 foollb (long long llp)
103 {
104   register long long ll asm (REG1a) = llp;
105   asm ("foo1b %0" : "=r" (ll) : "0" (ll) : REG1b); /* { dg-error "conflict" } */
106   return ll;
107 }
108
109 void *
110 bar (void *p)
111 {
112   register void *q asm (REG1);
113   register void *w asm (REG2) = p;
114   asm ("bar1 %1,%0" : "=r" (q) : "r" (w) : REG1); /* { dg-error "conflict" } */
115   return q;
116 }
117
118 long long
119 barlla (long long llp)
120 {
121   register long long ll asm (REG1a);
122   register long long mm asm (REG2a) = llp;
123   asm ("bar1a %1,%0" : "=r" (ll) : "r" (mm) : REG1b); /* { dg-error "conflict" } */
124   return ll;
125 }
126
127 long long
128 barllb (long long llp)
129 {
130   register long long ll asm (REG1a);
131   register long long mm asm (REG2a) = llp;
132   asm ("bar1b %1,%0" : "=r" (ll) : "r" (mm) : REG2b); /* { dg-error "conflict" } */
133   return ll;
134 }
135
136 void *
137 foobar (void *p)
138 {
139   register void *q asm (REG1);
140   register void *w asm (REG2) = p;
141   asm ("foobar1 %1,%0" : "=r" (q) : "r" (w) : REG2); /* { dg-error "conflict" } */
142   return q;
143 }
144
145 void *
146 nfoobar (void *p)
147 {
148   register void *q asm (REG1);
149   register void *w = p;
150   asm ("foobar1 %1,%0" : "=r" (q) : "r" (w) : REG2);
151   return q;
152 }
153
154 long long
155 foobarlla (long long llp)
156 {
157   register long long ll asm (REG1a);
158   register long long mm asm (REG2a) = llp;
159   asm ("foobar1a %1,%0" : "=r" (ll) : "r" (mm) : REG1b); /* { dg-error "conflict" } */
160   return ll;
161 }
162
163 long long
164 nfoobarlla (long long llp)
165 {
166   register long long ll asm (REG1a);
167   register long long mm = llp;
168   asm ("foobar1a %1,%0" : "=r" (ll) : "r" (mm) : REG2a);
169   return ll;
170 }
171
172 long long
173 foobarllb (long long llp)
174 {
175   register long long ll asm (REG1a);
176   register long long mm asm (REG2a) = llp;
177   asm ("foobar1b %1,%0" : "=r" (ll) : "r" (mm) : REG2b); /* { dg-error "conflict" } */
178   return ll;
179 }
180
181 long long
182 nfoobarllb (long long llp)
183 {
184   register long long ll asm (REG1a);
185   register long long mm = llp;
186   asm ("foobar1b %1,%0" : "=r" (ll) : "r" (mm) : REG2b);
187   return ll;
188 }
189
190 void *
191 baz (void *p)
192 {
193   register void *q asm (REG1);
194   register void *w asm (REG2) = p;
195   asm ("baz1 %1,%0" : "=r" (q) : "r" (w) : REG1, REG2); /* { dg-error "conflict" } */
196   return q;
197 }
198
199 void *
200 nbaz (void *p)
201 {
202   register void *q;
203   register void *w = p;
204   asm ("baz1 %1,%0" : "=r" (q) : "r" (w) : REG1, REG2);
205   return q;
206 }
207
208 void *
209 nbaz2 (void *p)
210 {
211   register void *q asm (REG1);
212   register void *w asm (REG2) = p;
213   asm ("baz1 %1,%0" : "=r" (q) : "r" (w));
214   return q;
215 }
216
217 long long
218 bazlla (long long llp)
219 {
220   register long long ll asm (REG1a);
221   register long long mm asm (REG2a) = llp;
222   asm ("baz1a %1,%0" : "=r" (ll) : "r" (mm) : REG1a, REG2a); /* { dg-error "conflict" } */
223   return ll;
224 }
225
226 long long
227 bazllb (long long llp)
228 {
229   register long long ll asm (REG1a);
230   register long long mm asm (REG2a) = llp;
231   asm ("baz2a %1,%0" : "=r" (ll) : "r" (mm) : REG1b, REG2b); /* { dg-error "conflict" } */
232   return ll;
233 }
234
235 /* Real-world example of bug.  */
236
237 struct stat;
238 int
239 _dl_stat (const char *file_name, struct stat *buf)
240 {
241   register long a asm (REG1) = (long) file_name;
242   register long b asm (REG2) = (long) buf;
243
244   asm volatile ("movu.w %1,$r9\n\tbreak 13" : "=r" (a) : "g" (106), "0" (a), "r" (b) : REG1, REG5); /* { dg-error "conflict" } */
245   if (a >= 0)
246     return (int) a;
247   return (int) -1;
248 }