1 /* Copyright (C) 2002 Free Software Foundation.
2 by Hans-Peter Nilsson <hp@axis.com>
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''.
8 You must be this tall ---> fit two long longs in asm-declared registers
9 to enter this amusement. */
11 /* { dg-do compile { target alpha-*-* cris-*-* i?86-*-* mmix-*-* powerpc-*-* rs6000-*-* x86_64-*-* } } */
12 /* { dg-options "-O2" } */
14 /* Constructed examples; input/output (same register), output, input, and
15 input and output (different registers). */
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
22 #if defined (__alpha__)
25 #elif defined (__CRIS__)
31 #elif defined (__i386__)
36 #elif defined (__MMIX__)
39 #elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) \
40 || defined (__POWERPC__) || defined (PPC) || defined (_IBMR2)
45 #elif defined (__x86_64__)
50 /* For readability of the tests. */
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. */
72 register void *q asm (REG1) = p;
73 asm ("foo1 %0" : "=r" (q) : "0" (q) : REG1); /* { dg-error "conflict" } */
80 register void *q asm (REG1) = p;
81 asm ("foo1 %0" : "=r" (q) : "0" (q) : REG2);
86 foolla (long long llp)
88 register long long ll asm (REG1a) = llp;
89 asm ("foo1a %0" : "=r" (ll) : "0" (ll) : REG1a); /* { dg-error "conflict" } */
94 nfoolla (long long llp)
96 register long long ll asm (REG1a) = llp;
97 asm ("foo1a %0" : "=r" (ll) : "0" (ll) : REG2a);
102 foollb (long long llp)
104 register long long ll asm (REG1a) = llp;
105 asm ("foo1b %0" : "=r" (ll) : "0" (ll) : REG1b); /* { dg-error "conflict" } */
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" } */
119 barlla (long long llp)
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" } */
128 barllb (long long llp)
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" } */
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" } */
148 register void *q asm (REG1);
149 register void *w = p;
150 asm ("foobar1 %1,%0" : "=r" (q) : "r" (w) : REG2);
155 foobarlla (long long llp)
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" } */
164 nfoobarlla (long long llp)
166 register long long ll asm (REG1a);
167 register long long mm = llp;
168 asm ("foobar1a %1,%0" : "=r" (ll) : "r" (mm) : REG2a);
173 foobarllb (long long llp)
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" } */
182 nfoobarllb (long long llp)
184 register long long ll asm (REG1a);
185 register long long mm = llp;
186 asm ("foobar1b %1,%0" : "=r" (ll) : "r" (mm) : REG2b);
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" } */
203 register void *w = p;
204 asm ("baz1 %1,%0" : "=r" (q) : "r" (w) : REG1, REG2);
211 register void *q asm (REG1);
212 register void *w asm (REG2) = p;
213 asm ("baz1 %1,%0" : "=r" (q) : "r" (w));
218 bazlla (long long llp)
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" } */
227 bazllb (long long llp)
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" } */
235 /* Real-world example of bug. */
239 _dl_stat (const char *file_name, struct stat *buf)
241 register long a asm (REG1) = (long) file_name;
242 register long b asm (REG2) = (long) buf;
244 asm volatile ("movu.w %1,$r9\n\tbreak 13" : "=r" (a) : "g" (106), "0" (a), "r" (b) : REG1, REG5); /* { dg-error "conflict" } */