static method in m68k jit compiler

Kiyo Inaba kaffe@rufus.w3.org
Fri, 14 Aug 1998 01:46:25 +0900


I'm now trying to make jit compiler for m68k back on the earth.

One problem I have right now is the mismatch of argument positions
between non static methods and static methods.

By using following calling sequence, let me try to describe.

	java/io/PrintWriter.<clinit>()V:
	+->java/lang/System.getProperty(Ljava/lang/String;)Ljava/lang/String;:
	   +->java/lang/System.getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;:
	      +->java/util/Properties.getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;:
		 +->java/util/Properties.getProperty(Ljava/lang/String;)Ljava/lang/String;:

The head of "java/io/PrintWriter.<clinit>()V:" is,
	0 ldc #30 <String "line.separator">
	2 invokestatic #31 <Method java.lang.String getProperty(java.lang.String)>
and, compiled one is
	0x3607d8:       linkw %fp,#-64
	0x3607dc:       moveal #3736280,%a0     jlString(3736280) = "line.separator"
	0x3607e2:       movel %a0,%sp@-
	0x3607e4:       moveal #698592,%a1      *698592 = 0x2e2ce0
	0x3607ea:       moveal %a1@,%a1
	0x3607ec:       jsr %a1@
	0x3607ee:       addql #4,%sp

Fine, it pushes string on the stack and jumps to the subroutine.

And, the head of "java/lang/System.getProperty(Ljava/lang/String;)Ljava/lang/String;:" is,
	0 aload_0
	1 aconst_null
	2 invokestatic #8 <Method java.lang.String getProperty(java.lang.String, java.lang.String)>
and, compiled one is
	0x2e2ce0:       linkw %fp,#-68
	0x2e2ce4:       moveal %fp@(12),%a0
	0x2e2ce8:       moveal %a0,%a1
	0x2e2cea:       moveal #0,%a2
	0x2e2cf0:       movel %a2,%sp@-
	0x2e2cf2:       movel %a1,%sp@-
	0x2e2cf4:       moveal #698638,%a3
	0x2e2cfa:       moveal %a3@,%a3
	0x2e2cfc:       jsr %a3@
	0x2e2cfe:       addql #8,%sp

Again, it looks fine...

But, actually, the "%fp@(12)" is incorrect. It should be "%fp@(8)" for
the first argument in the stack.

The head of "java/util/Properties.getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;:"
	0 aload_0
	1 aload_1
	2 invokevirtual #16 <Method java.lang.Object get(java.lang.Object)>
and its counterpart
	0x394130:       linkw %fp,#-72
	0x394134:       moveal %fp@(8),%a0
	0x394138:       moveal %a0,%a1
	0x39413a:       moveal %fp@(12),%a2
	0x39413e:       moveal %a2,%a3
	0x394140:       moveal %a1@,%a4
	0x394142:       moveal %a4@(108),%a5
	0x394146:       movel %a3,%sp@-
	0x394148:       movel %a1,%sp@-
	0x39414a:       movel %a4,%fp@(-56)
	0x39414e:       jsr %a5@
	0x394150:       addql #8,%sp
shows you such argument mismatch does not happen for non static method.

So, there should be two possibilities to fix this problem.
	1) fix caller side to add 1 word extra to be pushed.
		or
	2) fix callee side to adjust offset.

But before digging into this problem, I'd like to get some suggestions.

Kiyo