Kaffe's JIT mechanism description
Raffaele Sena
raff at aromatic.com
Tue Nov 10 05:52:23 PST 1998
On Tue, 10 Nov 1998, Godmar Back wrote:
> I know of no such document, although I agree with you that it is badly
> needed, especially to aid JIT porters to new platforms.
>
> - Godmar
>
I asked the same question to Peter Mehlitz at the Atlanta Linux Showcase.
He showed me a slide that explains the structure of the JIT, with some
code from (if I remember well) kaffe/kaffevm/jit.c.
If that slide could be made available it could be a start (I think
Peter said it should be online, but I cannot find it).
Also, I'm currently trying to write the JIT for ARM Linux. I started
from the m68k jit (I would have preferred to start from a RISC port,
but SPARC assembly look awkword to me, I think the ALPHA port is not
complete - or it wasn't when I started - and the 68k is pretty
straightforward).
Basically I took all the jit related files from the m68k directory and
copied in the arm directory.
I changed some obvious things (registers names and so), I haked
jit-icode.h for the things I could understand (which instructions
you processor support), and I'm slowly rewriting the code in
jit-<processor>.def.
For what I could understand, you declare the instructions you support
in jit-icode.h:
#define HAVE_load_int loadi_RxR
then you declare the instruction in jit-<processor>.def:
define_insn(load_int, loadi_RxR)
{
int r = rreg_ref(2);
int w = wreg_int(0);
op_movel_Id(r, w);
}
And then you generate the code for that instruction:
static inline void
op_movel_Id(int src, int dst)
{
debug(("movel (%s), %s\n", regname(src), regname(dst)));
assert_dreg(src);
assert_dreg(dst);
WOUT = (0x2000 | ((dst & 7) << 9) | (MODE_d << 6)
| (MODE_ind << 3) | (src & 7));
}
(it looks like I didn't implement this one yet. I still have the 68k
code ):
To generate the instructions, you do:
WOUT = opcode
or
LOUT = opcode
or (I suppose)
BOUT = opcode
depending on the instruction/parameter size you are generetating
[ B/L/W are byte (8 bits), word (16 bits), long (32 bits) values ]
I have a few questions that maybe somebody can answer (then we can
collect these in a FAQ or a 'JIT porting notes for dummies' :)
- Is there a complete list of all the instructions supported by the
JIT (all the values for HAVE_<instrution>) ?
- The instructions are defined with 3-registers parameter (op1, op2,
destination). How do I specificy my processor supports the 3-registers
architecture ? The m68k code simply check the first operand is the
same as the destination. For my arm port I simply use all 3 parameters.
Is that enough ?
- jit-icode.h defines some range checking macros/
I have a few of them: HAVE_add_int_const_rangecheck(),
HAVE_sub_const_rangecheck(), etc.
Are there more of them I could/should define ?
Also, the arm processor embed small constant in the opcode (0-255
and some more values if I can generate them with some shift/rotate
operations).
If I implement the right rangecheck macros, can I assume the the
instruction with immediate values will always be generated with
the constant value in the range I specified ? (that means bigger
values will generate Java code to put the value in a register)
This I think is all for now. Again, if somebody can answer to these
(and more to come) questions, I'm willing to collect the answers and put
them in a single "document".
Thanks,
Raffaele
-------------------------------------------------------------------------
raff at aromatic.com (::) http://www.aromatic.com/~raff/
http://www.aromatic.com/
More information about the kaffe
mailing list