On Mon, 1 Aug 2011, Georg-Johann Lay wrote:
> Michael Walle schrieb:
> > Hi list,
> >
> > consider the following test code:
> > static void inline f1(int arg)
> > {
> > register int a1 asm("r8") = 10;
> > register int a2 asm("r1") = arg;
> >
> > asm("scall" : : "r"(a1), "r"(a2));
> > }
> >
> > void f2(int arg)
> > {
> > f1(arg >> 10);
> > }
> >
> >
> > If you compile this code with 'lm32-gcc -O1 -S -c test.c' (see end of this
> > email), the a1 = 10; assignment is optimized away.
>
> Your asm has no output operands and no side effects, with more aggressive
> optimization the whole ask would disappear.
No, for the record that's not supposed to happen for asms
*without outputs*.
"If an @code{asm} has output operands, GCC assumes for
optimization purposes the instruction has no side effects except
to change the output
operands."
> What you want is maybe something like
>
> asm volatile ("scall" : : "r"(a1), "r"(a2));
For the code at hand, the scall should be described to both have
an output and be marked volatile, since the system call is a
side effect that GCC can't see and might otherwise optimize away
if the system call return value is unused. A plain volatile
marking as the above should not be necessary, modulo gcc bugs.
The real problem is quite worrysome. I don't think a port
(lm32) should have to solve it with constraints; the (inline)
function parameter *should* cause a non-clobbering temporary to
hold any intermediate operations, but it looks as if you'll
otherwise have to debug it yourself.
brgds, H-P