problem in config/i386/jit.h

Per Bothner bothner at
Tue May 20 12:00:58 PDT 1997

> I'm having a problem with CALL_KAFFE_FUNCTION_VARARGS() on an i386
> (Freebsd 2.1) The inline asm uses %eax as a temporary register (for
> looping through the args to the method), but there is no way to
> declare this usage to the compiler.

Well, the:
	: "eax", "cc"
is supposed to tell gcc that eax is clobbered.  However. I am told that
it does not follow that Gcc canot use it as an input argument.

> Thus, as far as GCC can tell, it
> can use %eax for one of the "r" registers.  This just hasn't happened
> yet.  It bit me when I changed the -O to -g on the gcc command line

I ran into the same problem, and since I didn't see any obviou way to
fix it, and since people normally compile with -O2, it didn't seem urgent.

However, it really ought to be fixed, if we can.

> I tried adding a temp variable (in place of eax)

Did you try this?  If not, could you try it?

#define	CALL_KAFFE_FUNCTION_VARARGS(meth, obj, nargs, argptr, retval)	\
{ register int _nargs = nargs; \
	asm volatile ("							\n\
1:		cmpl $0,%3						\n\
		je 2f							\n\
		decl %3							\n\
		pushl (%4,%3,4)						\n\
		jmp 1b							\n\
2:									\n\
		pushl %2						\n\
		call *%1						\n\
		movl %%eax,%0						\n\
		" : "=r" (retval) :					\
	    "r" (meth->ncode), "r" (obj), "r" (_nargs), "r" (argptr)	\
	    : "eax", "cc" );						\
	asm volatile ("							\n\
		addl %0,%%esp" : : "r" (4*(nargs+1)) : "cc"); }

Please try this (for both optimized and not), and if it works,
send a patch to Tim.

	--Per Bothner
Cygnus Solutions     bothner at

More information about the kaffe mailing list