# New Ticket Created by Stephane Peiry # Please include the string: [perl #32535] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org:80/rt3/Ticket/Display.html?id=32535 >
This patch implements (some) jitted vtables for the sun4/sparc platform. That is all of them except the ones on conditions or handling return values, these are: Parrot_jit_vtable1_op Parrot_jit_vtable_111_op Parrot_jit_vtable_112_op Parrot_jit_vtable_221_op Parrot_jit_vtable_1121_op Parrot_jit_vtable_1123_op Parrot_jit_vtable_2231_op ! :) Thanks, Stephane
Index: jit/sun4/jit_emit.h =================================================================== RCS file: /cvs/public/parrot/jit/sun4/jit_emit.h,v retrieving revision 1.31 diff -u -r1.31 jit_emit.h --- jit/sun4/jit_emit.h 29 Oct 2004 08:58:04 -0000 1.31 +++ jit/sun4/jit_emit.h 21 Nov 2004 14:48:05 -0000 @@ -772,32 +772,194 @@ } # ifndef NO_JIT_VTABLE_OPS -/* -# undef Parrot_jit_vtable1_op -# undef Parrot_jit_vtable1r_op -# undef Parrot_jit_vtable2rk_op -# undef Parrot_jit_vtable3k_op +# undef Parrot_jit_vtable1_op +/* # undef Parrot_jit_vtable1r_op */ + +# undef Parrot_jit_vtable_111_op # undef Parrot_jit_vtable_112_op # undef Parrot_jit_vtable_221_op # undef Parrot_jit_vtable_1121_op # undef Parrot_jit_vtable_1123_op # undef Parrot_jit_vtable_2231_op - +/* # undef Parrot_jit_vtable_1r223_op # undef Parrot_jit_vtable_1r332_op - + # undef Parrot_jit_vtable_ifp_op # undef Parrot_jit_vtable_unlessp_op # undef Parrot_jit_vtable_newp_ic_op +*/ +/* emit a call to a vtable func + * $X->vtable(interp, $X [, $Y...] ) + */ +static void +Parrot_jit_vtable_n_op(Parrot_jit_info_t *jit_info, + Interp *interpreter, int n, int *args) +{ + int nvtable = op_jit[*jit_info->cur_op].extcall; + op_info_t *op_info = &interpreter->op_info_table[*jit_info->cur_op]; + + int pmc = 0; /* pmc saves the left most Pi */ + int rdx = 1; /* native (outgoing) register index */ + + int idx, pi, i; + size_t offset; + + offset = offsetof(struct _vtable, init); + offset += nvtable * sizeof(void *); + + for (idx = 1; idx <= n; idx++) { + i = args[idx - 1]; + pi = *(jit_info->cur_op + i); + + switch (op_info->types[i]) { + case PARROT_ARG_S: + emitm_ld_i(jit_info->native_ptr, Parrot_jit_regbase, + REG_OFFS_STR(pi), emitm_o(rdx)); + break; + case PARROT_ARG_K: + case PARROT_ARG_P: + emitm_ld_i(jit_info->native_ptr, Parrot_jit_regbase, + REG_OFFS_PMC(pi), emitm_o(rdx)); + if (! pmc) { pmc = rdx; } + break; + case PARROT_ARG_KI: + case PARROT_ARG_I: + emitm_ld_i(jit_info->native_ptr, Parrot_jit_regbase, + REG_OFFS_INT(pi), emitm_o(rdx)); + break; + case PARROT_ARG_KIC: + case PARROT_ARG_IC: + if (emitm_simm13_const(pi)) { + emitm_mov_i(jit_info->native_ptr, pi, emitm_o(rdx)); + } else { + emitm_sethi(jit_info->native_ptr, emitm_hi22(pi), emitm_o(rdx)); + emitm_or_i(jit_info->native_ptr, emitm_o(rdx), emitm_lo10(pi), emitm_o(rdx)); + } + break; + case PARROT_ARG_N: + emitm_ld_i(jit_info->native_ptr, Parrot_jit_regbase, + REG_OFFS_NUM(pi), emitm_o(rdx)); + emitm_ld_i(jit_info->native_ptr, Parrot_jit_regbase, + REG_OFFS_NUM(pi) + 4, emitm_o(++rdx)); + break; + case PARROT_ARG_NC: +# define NC_addr &interpreter->code->const_table->constants[pi]->u.number + emitm_sethi(jit_info->native_ptr, emitm_hi22(NC_addr), XSR1); + emitm_or_i(jit_info->native_ptr, XSR1, emitm_lo10(NC_addr), XSR1); + + emitm_ld_i(jit_info->native_ptr, XSR1, 0, emitm_o(rdx)); + emitm_ld_i(jit_info->native_ptr, XSR1, 4, emitm_o(++rdx)); + break; + case PARROT_ARG_SC: +# define SC_addr &interpreter->code->const_table->constants[pi]->u.string + emitm_sethi(jit_info->native_ptr, emitm_hi22(SC_addr), XSR1); + emitm_or_i(jit_info->native_ptr, XSR1, emitm_lo10(SC_addr), XSR1); + + emitm_ld_i(jit_info->native_ptr, XSR1, 0, emitm_o(rdx)); + break; + case PARROT_ARG_KC: +# define KC_addr &interpreter->code->const_table->constants[pi]->u.key + emitm_sethi(jit_info->native_ptr, emitm_hi22(KC_addr), XSR1); + emitm_or_i(jit_info->native_ptr, XSR1, emitm_lo10(KC_addr), XSR1); + + emitm_ld_i(jit_info->native_ptr, XSR1, 0, emitm_o(rdx)); + break; + default: + internal_exception(1, + "jit_vtable_n_op: unimp type %d, arg %d vtable %d", + op_info->types[i], i, nvtable); + break; + } + rdx++; + } + emitm_ld_i(jit_info->native_ptr, emitm_o(pmc), offsetof(struct PMC, vtable), XSR1); + emitm_ld_i(jit_info->native_ptr, XSR1, offset, XSR1); + + emitm_jumpl_i(jit_info->native_ptr, XSR1, 0, emitm_o(7)); + emitm_mov_r(jit_info->native_ptr, Parrot_jit_intrp, emitm_o(0)); +} + +/* emit a call to a vtable func + * $1->vtable(interp, $1) + */ static void Parrot_jit_vtable1_op(Parrot_jit_info_t *jit_info, - Interp *interpreter) + Interp * interpreter) { + int a[] = { 1 }; + Parrot_jit_vtable_n_op(jit_info, interpreter, 1, a); } -*/ + +/* emit a call to a vtable func + * $1->vtable(interp, $1, $2) + */ +static void +Parrot_jit_vtable_112_op(Parrot_jit_info_t *jit_info, + Interp * interpreter) +{ + int a[] = { 1, 2 }; + Parrot_jit_vtable_n_op(jit_info, interpreter, 2, a); +} + +/* emit a call to a vtable func + * $1->vtable(interp, $1, $1) + */ +static void +Parrot_jit_vtable_111_op(Parrot_jit_info_t *jit_info, + Interp * interpreter) +{ + int a[] = { 1, 1 }; + Parrot_jit_vtable_n_op(jit_info, interpreter, 2, a); +} + +/* emit a call to a vtable func + * $2->vtable(interp, $2, $1) + */ +static void +Parrot_jit_vtable_221_op(Parrot_jit_info_t *jit_info, + Interp * interpreter) +{ + int a[] = { 2, 1 }; + Parrot_jit_vtable_n_op(jit_info, interpreter, 2, a); +} + +/* emit a call to a vtable func + * $2->vtable(interp, $2, $3, $1) + */ +static void +Parrot_jit_vtable_2231_op(Parrot_jit_info_t *jit_info, + Interp * interpreter) +{ + int a[] = { 2, 3, 1 }; + Parrot_jit_vtable_n_op(jit_info, interpreter, 3, a); +} + +/* emit a call to a vtable func + * $1->vtable(interp, $1, $2, $3) + */ +static void +Parrot_jit_vtable_1123_op(Parrot_jit_info_t *jit_info, + Interp * interpreter) +{ + int a[] = { 1, 2, 3 }; + Parrot_jit_vtable_n_op(jit_info, interpreter, 3, a); +} + +/* emit a call to a vtable func + * $1->vtable(interp, $1, $2, $1) + */ +static void +Parrot_jit_vtable_1121_op(Parrot_jit_info_t *jit_info, + Interp * interpreter) +{ + int a[] = { 1, 2, 1 }; + Parrot_jit_vtable_n_op(jit_info, interpreter, 3, a); +} + #endif /* NO_JIT_VTABLE_OPS */ #else