I would do a cisc.jit and a risc.jit to avoid the #ifdef forest.
The problem is when you want to implement an opcode like div, which is easy in 
ppc but not in arm.... ideas?

I was sort of going in that direction, mips/core.jit is almost like 
ppc/core.jit (If everything is on schedule I'll find some time to finish it 
on december).

Daniel Grunblatt.

On Tuesday 19 November 2002 10:04, Leopold Toetsch wrote:
> Currently all architecures have there own core.jit. These are very
> similar, e.g. checking for MAPped registers, but differ depending on
> the processor architecure: basically we have 3 register machines
> (alpha, arm, ppc, sparc) and a 2 register machine (i386).
>
> My proposal is to write a universal core.jit, which provides the basic
> functionality.
>
> e.g.
>
> Parrot_add_i_i_i {
>      if (MAP[1] && MAP[2] && MAP[3]) {
> #ifdef jit_emit_add_rrr_i     /* 3 reg machine */
>       jit_emit_add_rrr_i(MAP(2), MAP(3), MAP(1));
> #else
>       jit_emit_mov_rr_i(MAP(2), MAP(1));
>       jit_emit_add_rr_i(MAP(3), MAP(1));
> #endif
>      }
>      ...
>
> The implementation of these jit_emit_ops would stay in jit_emit.h.
>
> Proposed naming of ops:
>
>    jit_emit_<op>_<rmi>_<in>(...)
>
>    <op> operations mov, add, sub, mul, ...
>    <rmi> register, memory, immediate, for all parameters
>         (source, dest) or (source, source, dest)
>    <in>  integer (or pointer...) or number
>
>    jit_emit_mov_rm_n(<reg>, <mem>)
>      (store processor reg to parrot num_reg at mem)
>    jit_emit_mov_mr_i(<mem>, <reg>)
>      (load processor reg from parrot int_reg at mem)
>
>    The <reg>s would be taken from a list of processor regs, either the
>    MAPed ones, or 1 or 2 scratch registers, depending on architecture.
>
>
>    jit_emit_jmp_p(<cond>, offset)
>    jit_emit_call_p(offset)
>
>    Jump to or call parrot funcs at offset.
>    <cond> : cond_always, cond_lt,le,gt,ge,eq,ne
>
>    jit_emit_push_<rm>(.., &SP_diff)
>    jit_emit_call_c(addr)
>    jit_emit_call_vtable(mem_of_pmc_reg, int n)
>    jit_emit_add_SP(SP_diff)
>    jit_emit_ret
>
>    Push (or whatever) params on stack, preparing for a native call,
>    correct SP after return.
>
>
> With these ops, all the current functionality could be in one file,
> all the register mapping would be centralized.
> If something doesn't fit, it could be undefined for this architecture,
> the implementation would then be in jit_emit.h.
>
> Comments welcome
> leo

Reply via email to