cvsuser 02/11/19 07:47:27
Modified: . MANIFEST jit2h.pl
docs jit.pod
jit/i386 core.jit jit_emit.h
Added: t/op jit.t
Log:
JIT/i386 more vtable funcs + a lot of bugfixes
Revision Changes Path
1.253 +1 -0 parrot/MANIFEST
Index: MANIFEST
===================================================================
RCS file: /cvs/public/parrot/MANIFEST,v
retrieving revision 1.252
retrieving revision 1.253
diff -u -w -r1.252 -r1.253
--- MANIFEST 16 Nov 2002 15:12:17 -0000 1.252
+++ MANIFEST 19 Nov 2002 15:47:23 -0000 1.253
@@ -1611,6 +1611,7 @@
t/op/info.t
t/op/integer.t
t/op/interp.t
+t/op/jit.t
t/op/lexicals.t
t/op/macro.t
t/op/number.t
1.27 +76 -7 parrot/jit2h.pl
Index: jit2h.pl
===================================================================
RCS file: /cvs/public/parrot/jit2h.pl,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -w -r1.26 -r1.27
--- jit2h.pl 18 Nov 2002 10:11:40 -0000 1.26
+++ jit2h.pl 19 Nov 2002 15:47:23 -0000 1.27
@@ -2,7 +2,7 @@
#
# jit2h.pl
#
-# $Id: jit2h.pl,v 1.26 2002/11/18 10:11:40 leo Exp $
+# $Id: jit2h.pl,v 1.27 2002/11/19 15:47:23 leo Exp $
#
use strict;
@@ -52,7 +52,8 @@
$header .= $line;
next;
}
- next if (($line =~ m/^[#;]/) || ($line =~ m/^\s*$/));
+ # ignore comment and empty lines
+ next if (($line =~ m/^;/) || ($line =~ m/^\s*$/));
if (!defined($function)) {
$line =~ m/(extern\s*)?([^\s]*)\s*{/;
$extern = (defined($1))? 1 : 0;
@@ -89,7 +90,7 @@
return $i if ($entry->[1] eq $meth);
$i++;
}
- return 1;
+ die("vtable not found for $meth\n");
}
open JITCPU, ">$ARGV[0]" or die;
@@ -113,8 +114,12 @@
*define default jit_funcs, if architecture doesn't have these optimizations
*/
#define Parrot_jit_vtable1_op Parrot_jit_normal_op
+#define Parrot_jit_vtable1r_op Parrot_jit_normal_op
+#define Parrot_jit_vtable2_op Parrot_jit_normal_op
+#define Parrot_jit_vtable3_op Parrot_jit_normal_op
#define Parrot_jit_vtable_ifp_op Parrot_jit_cpcf_op
#define Parrot_jit_vtable_unlessp_op Parrot_jit_cpcf_op
+#define Parrot_jit_vtable_newp_ic_op Parrot_jit_normal_op
#include"parrot/jit_emit.h"
@@ -150,7 +155,7 @@
$extern = 1;
my $opbody = $op->body;
# jitable vtable funcs:
- # 1) $1->vtable->{vtable}(interp, $1)
+ # *) $1->vtable->{vtable}(interp, $1)
if ($opbody =~ /
core.ops"\s+
{{\@1}}->vtable->
@@ -162,19 +167,83 @@
\s+{{\+=\d}}/xm) {
$jit_func = "Parrot_jit_vtable1_op";
$extern = vtable_num($1);
- print "$jit_func $extern\n";
+ #print $op->full_name .": $jit_func $extern\n";
}
+ # *) $1 = $2->vtable->{vtable}(interp, $2)
+ elsif ($opbody =~ /
+ core.ops"\s+
+ {{\@1}}\s*=\s*
+ {{\@2}}->vtable->
+ (\w+)
+ \(interpreter,
+ \s*
+ {{\@2}}
+ \);
+ \s+{{\+=\d}}/xm) {
+ $jit_func = "Parrot_jit_vtable1r_op";
+ $extern = vtable_num($1);
+ print $op->full_name .": $jit_func $extern\n";
+ }
+ # *) $1->vtable->{vtable}(interp, $1, $2)
+ elsif ($opbody =~ /
+ core.ops"\s+
+ {{\@1}}->vtable->
+ (\w+)
+ \(interpreter,
+ \s*
+ {{\@1}},\s*{{\@2}}
+ \);
+ \s+{{\+=\d}}/xm) {
+ $jit_func = "Parrot_jit_vtable2_op";
+ $extern = vtable_num($1);
+ #print $op->full_name .": $jit_func $extern\n";
+ }
+ # *) $1->vtable->{vtable}(interp, $1, $2, $1)
+ elsif ($opbody =~ /
+ core.ops"\s+
+ {{\@1}}->vtable->
+ (\w+)
+ \(interpreter,
+ \s*
+ {{\@1}},\s*{{\@2}},\s*{{\@1}}
+ \);
+ \s+{{\+=\d}}/xm) {
+ $jit_func = "Parrot_jit_vtable3_op";
+ $extern = vtable_num($1);
+ #print $op->full_name .": $jit_func $extern\n";
+ }
+ # *) $2->vtable->{vtable}(interp, $2, $3, $1)
+ elsif ($opbody =~ /
+ core.ops"\s+
+ {{\@2}}->vtable->
+ (\w+)
+ \(interpreter,
+ \s*
+ {{\@2}},\s*{{\@3}},\s*{{\@1}}
+ \);
+ \s+{{\+=\d}}/xm) {
+ $jit_func = "Parrot_jit_vtable3_op";
+ $extern = vtable_num($1);
+ #print $op->full_name .": $jit_func $extern ($1)\n";
+ }
+ # some specials
elsif ($op->full_name eq 'if_p_ic') {
$jit_func = "Parrot_jit_vtable_ifp_op";
$opbody =~ /vtable->(\w+)/;
$extern = vtable_num($1);
- print "$jit_func $extern\n";
+ #print "$jit_func $extern\n";
}
elsif ($op->full_name eq 'unless_p_ic') {
$jit_func = "Parrot_jit_vtable_unlessp_op";
$opbody =~ /vtable->(\w+)/;
$extern = vtable_num($1);
- print "$jit_func $extern\n";
+ #print "$jit_func $extern\n";
+ }
+ elsif ($op->full_name eq 'new_p_ic') {
+ $jit_func = "Parrot_jit_vtable_newp_ic_op";
+ $opbody =~ /vtable->(\w+)/;
+ $extern = vtable_num($1);
+ #print "$jit_func $extern\n";
}
elsif ($op->jump) {
1.7 +20 -15 parrot/docs/jit.pod
Index: jit.pod
===================================================================
RCS file: /cvs/public/parrot/docs/jit.pod,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -w -r1.6 -r1.7
--- jit.pod 21 Aug 2002 08:01:22 -0000 1.6
+++ jit.pod 19 Nov 2002 15:47:24 -0000 1.7
@@ -135,6 +135,11 @@
syntax code which may contain any of the identifiers listed in the following
section.
+=item Comment lines
+
+Comments are marked with a I<;> in the first column. These and empty
+lines are ignored.
+
=item Identifiers
In general, prefixing an identifier with I<&> yields the address of the
1.29 +30 -17 parrot/jit/i386/core.jit
Index: core.jit
===================================================================
RCS file: /cvs/public/parrot/jit/i386/core.jit,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -w -r1.28 -r1.29
--- core.jit 18 Nov 2002 10:11:38 -0000 1.28
+++ core.jit 19 Nov 2002 15:47:26 -0000 1.29
@@ -1,7 +1,7 @@
;
; i386/core.jit
;
-; $Id: core.jit,v 1.28 2002/11/18 10:11:38 leo Exp $
+; $Id: core.jit,v 1.29 2002/11/19 15:47:26 leo Exp $
;
# TODO complete this
@@ -69,8 +69,8 @@
}
else if (MAP[2]) {
emit_movl_m_r(NATIVECODE, emit_EAX, &INT_REG[1]);
- emitm_movl_r_r(NATIVECODE, MAP[2], emit_EAX);
- emit_movl_r_m(NATIVECODE, MAP[2], &INT_REG[1]);
+ emitm_smull_r_r(NATIVECODE, MAP[2], emit_EAX);
+ emit_movl_r_m(NATIVECODE, emit_EAX, &INT_REG[1]);
}
else {
emit_movl_m_r(NATIVECODE, emit_EAX, &INT_REG[1]);
@@ -374,11 +374,11 @@
}
else if (MAP[1] && MAP[2]) {
emitm_movl_r_r(NATIVECODE, MAP[2], MAP[1]);
- emit_addl_r_m(NATIVECODE, MAP[1], &INT_REG[3]);
+ emit_addl_m_r(NATIVECODE, MAP[1], &INT_REG[3]);
}
else if (MAP[1] && MAP[3]) {
emitm_movl_r_r(NATIVECODE, MAP[3], MAP[1]);
- emit_addl_r_m(NATIVECODE, MAP[1], &INT_REG[2]);
+ emit_addl_m_r(NATIVECODE, MAP[1], &INT_REG[2]);
}
else if (MAP[2] && MAP[3]) {
emitm_movl_r_r(NATIVECODE, MAP[3], emit_EAX);
@@ -387,16 +387,16 @@
}
else if (MAP[1]) {
emit_movl_m_r(NATIVECODE, MAP[1], &INT_REG[2]);
- emit_addl_r_m(NATIVECODE, MAP[1], &INT_REG[3]);
+ emit_addl_m_r(NATIVECODE, MAP[1], &INT_REG[3]);
}
else if (MAP[2]) {
emitm_movl_r_r(NATIVECODE, MAP[2], emit_EAX);
- emit_addl_r_m(NATIVECODE, emit_EAX, &INT_REG[3]);
+ emit_addl_m_r(NATIVECODE, emit_EAX, &INT_REG[3]);
emit_movl_r_m(NATIVECODE, emit_EAX, &INT_REG[1]);
}
else if (MAP[3]) {
emitm_movl_r_r(NATIVECODE, MAP[3], emit_EAX);
- emit_addl_r_m(NATIVECODE, emit_EAX, &INT_REG[2]);
+ emit_addl_m_r(NATIVECODE, emit_EAX, &INT_REG[2]);
emit_movl_r_m(NATIVECODE, emit_EAX, &INT_REG[1]);
}
else {
@@ -514,13 +514,11 @@
}
else if (MAP[1] && MAP[2]) {
emitm_movl_r_r(NATIVECODE, MAP[2], MAP[1]);
- emit_subl_r_m(NATIVECODE, MAP[1], &INT_REG[3]);
+ emit_subl_m_r(NATIVECODE, MAP[1], &INT_REG[3]);
}
else if (MAP[1] && MAP[3]) {
- if (MAP[1] != MAP[3]) {
- emitm_movl_r_r(NATIVECODE, MAP[3], MAP[1]);
- }
- emit_subl_r_m(NATIVECODE, MAP[1], &INT_REG[2]);
+ emit_movl_m_r(NATIVECODE, MAP[1], &INT_REG[2]);
+ emitm_subl_r_r(NATIVECODE, MAP[3], MAP[1]);
}
else if (MAP[2] && MAP[3]) {
emitm_movl_r_r(NATIVECODE, MAP[3], emit_EAX);
@@ -529,16 +527,16 @@
}
else if (MAP[1]) {
emit_movl_m_r(NATIVECODE, MAP[1], &INT_REG[2]);
- emit_subl_r_m(NATIVECODE, MAP[1], &INT_REG[3]);
+ emit_subl_m_r(NATIVECODE, MAP[1], &INT_REG[3]);
}
else if (MAP[2]) {
emitm_movl_r_r(NATIVECODE, MAP[2], emit_EAX);
- emit_subl_r_m(NATIVECODE, emit_EAX, &INT_REG[3]);
+ emit_subl_m_r(NATIVECODE, emit_EAX, &INT_REG[3]);
emit_movl_r_m(NATIVECODE, emit_EAX, &INT_REG[1]);
}
else if (MAP[3]) {
- emitm_movl_r_r(NATIVECODE, MAP[3], emit_EAX);
- emit_subl_r_m(NATIVECODE, emit_EAX, &INT_REG[2]);
+ emit_movl_m_r(NATIVECODE, emit_EAX, &INT_REG[2]);
+ emitm_subl_r_r(NATIVECODE, MAP[3], emit_EAX);
emit_movl_r_m(NATIVECODE, emit_EAX, &INT_REG[1]);
}
else {
@@ -634,6 +632,21 @@
emit_cmpl_r_m(NATIVECODE, emit_EAX, &INT_REG[2]);
}
emit_jcc(jit_info, emitm_jg, *INT_CONST[3]);
+}
+
+Parrot_gt_n_n_ic {
+ /* s. Pentium4.pdf 8.1 */
+ emit_fldl(NATIVECODE, &NUM_REG[1]);
+/* emit_fldl(NATIVECODE, &NUM_REG[2]); */
+/* emitm_fcompp(NATIVECODE); */
+ emitm_fcomp_m(NATIVECODE, emit_None, emit_None, emit_None, &NUM_REG[2]);
+ emitm_fstw(NATIVECODE);
+
+ emitm_andl_i_r(NATIVECODE, 0x4500, emit_EAX);
+ emit_jcc(jit_info, emitm_jz, *INT_CONST[3]);
+
+/* emitm_sahf(NATIVECODE); doesn't work ??? */
+/* emit_jcc(jit_info, emitm_jg, *INT_CONST[3]); */
}
Parrot_ge_ic_ic_ic {
1.17 +211 -38 parrot/jit/i386/jit_emit.h
Index: jit_emit.h
===================================================================
RCS file: /cvs/public/parrot/jit/i386/jit_emit.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -w -r1.16 -r1.17
--- jit_emit.h 18 Nov 2002 10:11:38 -0000 1.16
+++ jit_emit.h 19 Nov 2002 15:47:26 -0000 1.17
@@ -3,7 +3,7 @@
*
* i386
*
- * $Id: jit_emit.h,v 1.16 2002/11/18 10:11:38 leo Exp $
+ * $Id: jit_emit.h,v 1.17 2002/11/19 15:47:26 leo Exp $
*/
#include <assert.h>
@@ -657,9 +657,11 @@
/* Comparisions */
-#define emitm_fcom(pc, sti) emitm_fl_3(pc, emit_b000, emit_b010, sti)
+#define emitm_fcom(pc, sti) emitm_fl_3(pc, emit_b010, emit_b010, sti)
-#define emitm_fcomp(pc, sti) emitm_fl_3(pc, emit_b000, emit_b011, sti)
+#define emitm_fcomp(pc, sti) emitm_fl_3(pc, emit_b010, emit_b011, sti)
+
+#define emitm_fcompp(pc) { *((pc)++) = 0xde; *((pc)++) = 0xd9; }
#define emitm_fcom_m(pc,b,i,s,d) \
emitm_fl_2(pc, emit_b10, 0, emit_b010, b, i, s, d)
@@ -994,45 +996,192 @@
Parrot_emit_jump_to_eax(jit_info, interpreter);
}
+#ifndef NO_JIT_VTABLE_OPS
+
#undef Parrot_jit_vtable1_op
+#undef Parrot_jit_vtable1r_op
+#undef Parrot_jit_vtable2_op
+#undef Parrot_jit_vtable3_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
- * $1->vtable(interp, $1)
+ * $1->vtable(interp, $1, ...) (ret == 0)
+ * $2->vtable(interp, $2, $3, $1)
+ * $1 = $2->vtable(interp, $2, ...) (ret == 1)
*/
static void
-Parrot_jit_vtable1_op(Parrot_jit_info_t *jit_info,
- struct Parrot_Interp * interpreter)
+Parrot_jit_vtable_n_op(Parrot_jit_info_t *jit_info,
+ struct Parrot_Interp * interpreter, int n, int ret)
{
int nvtable = op_jit[*jit_info->cur_op].extcall;
size_t offset;
op_info_t *op_info = &interpreter->op_info_table[*jit_info->cur_op];
- int p1;
+ int p[PARROT_MAX_ARGS];
+ int idx, i;
+ int st = 0;
- if (nvtable <= 1) {
- Parrot_jit_normal_op(jit_info, interpreter);
- return;
- }
/* get the offset of the first vtable func */
offset = offsetof(struct _vtable, init);
offset += nvtable * sizeof(void *);
- /* get first param $1 */
- assert(op_info->types[1] == PARROT_ARG_P);
- p1 = *(jit_info->cur_op + 1);
- assert(p1 >= 0 && p1 < NUM_REGISTERS);
- /* get $1 to EAX */
+ /* get params $i, 0 is opcode */
+ for (idx = n; idx > ret; idx--) {
+ i = idx;
+ if (op_info->arg_count == 3 && i == 3) /* e.g. ->vtable($1, $2, $1) */
+ i = 1;
+ else if (op_info->arg_count == 4) { /* $2->vtable($2, $3, $1) */
+ if (idx == 3)
+ i = 1;
+ else
+ i = idx + 1;
+ }
+ p[i] = *(jit_info->cur_op + i);
+ switch (op_info->types[i]) {
+ case PARROT_ARG_I:
+ case PARROT_ARG_KI:
+ case PARROT_ARG_S:
+ case PARROT_ARG_P:
+ assert(p[i] >= 0 && p[i] < NUM_REGISTERS);
+ /* get $i to EAX */
+ switch (op_info->types[i]) {
+ case PARROT_ARG_KI:
+ case PARROT_ARG_I:
emit_movl_m_r(jit_info->native_ptr, emit_EAX,
- &interpreter->ctx.pmc_reg.registers[p1]);
- /* push $1 */
+ &interpreter->ctx.int_reg.registers[p[i]]);
+ break;
+ case PARROT_ARG_S:
+ emit_movl_m_r(jit_info->native_ptr, emit_EAX,
+ &interpreter->ctx.string_reg.registers[p[i]]);
+ break;
+ case PARROT_ARG_P:
+ emit_movl_m_r(jit_info->native_ptr, emit_EAX,
+ &interpreter->ctx.pmc_reg.registers[p[i]]);
+ break;
+ default:
+ break;
+ }
+ /* push $i, the left most Pi stays in eax, which is used
+ * below, to call the vtable method
+ */
emit_pushl_r(jit_info->native_ptr, emit_EAX);
+ break;
+ case PARROT_ARG_KIC:
+ case PARROT_ARG_IC:
+ /* push value */
+ emitm_pushl_i(jit_info->native_ptr, p[i]);
+ break;
+ case PARROT_ARG_N:
+ /* push num on st(0) */
+ emit_fldl(jit_info->native_ptr,
+ &interpreter->ctx.num_reg.registers[p[i]]);
+ /* make room for double */
+ emitm_addb_i_r(jit_info->native_ptr, -8, emit_ESP);
+ /* pop st(0) onto stack */
+ emitm_fstpl(jit_info->native_ptr, emit_ESP, emit_None, 1, 0);
+ /* additional stack adjustment */
+ st += 4;
+ break;
+ case PARROT_ARG_NC:
+ emit_fldl(jit_info->native_ptr,
+ &interpreter->code->const_table->
+ constants[p[i]]->number);
+ emitm_addb_i_r(jit_info->native_ptr, -8, emit_ESP);
+ emitm_fstpl(jit_info->native_ptr, emit_ESP, emit_None, 1, 0);
+ st += 4;
+ break;
+ case PARROT_ARG_SC:
+ emitm_pushl_i(jit_info->native_ptr,
+ interpreter->code->const_table->
+ constants[p[i]]->string);
+ break;
+ case PARROT_ARG_KC:
+ emitm_pushl_i(jit_info->native_ptr,
+ &interpreter->code->const_table->
+ constants[p[i]]->key);
+ break;
+
+ default:
+ internal_exception(1,
+ "jit_vtable_n_op: unimp type %d, arg %d vtable %d",
+ op_info->types[i], i, nvtable);
+ break;
+ }
+ }
/* push interpreter */
emitm_pushl_i(jit_info->native_ptr, interpreter);
/* mov (eax), eax i.e. $1->vtable */
emitm_movl_m_r(jit_info->native_ptr, emit_EAX, emit_EAX, emit_None, 1, 0);
/* call *(offset)eax */
emitm_callm(jit_info->native_ptr, emit_EAX, emit_None, emit_None, offset);
- emitm_addb_i_r(jit_info->native_ptr, 8, emit_ESP);
+ emitm_addb_i_r(jit_info->native_ptr, st+sizeof(void*)*(n+1-ret), emit_ESP);
+}
+
+/* emit a call to a vtable func
+ * $1->vtable(interp, $1)
+ */
+static void
+Parrot_jit_vtable1_op(Parrot_jit_info_t *jit_info,
+ struct Parrot_Interp * interpreter)
+{
+ Parrot_jit_vtable_n_op(jit_info, interpreter, 1, 0);
+}
+
+/* emit a call to a vtable func
+ * $1 = $2->vtable(interp, $2)
+ */
+static void
+Parrot_jit_vtable1r_op(Parrot_jit_info_t *jit_info,
+ struct Parrot_Interp * interpreter)
+{
+ op_info_t *op_info = &interpreter->op_info_table[*jit_info->cur_op];
+ int p1 = *(jit_info->cur_op + 1);
+
+ Parrot_jit_vtable_n_op(jit_info, interpreter, 2, 1);
+ /* return result is in EAX or ST(0) */
+ switch (op_info->types[1]) {
+ case PARROT_ARG_I:
+ emit_movl_r_m(jit_info->native_ptr, emit_EAX,
+ &interpreter->ctx.int_reg.registers[p1]);
+ break;
+ case PARROT_ARG_S:
+ emit_movl_r_m(jit_info->native_ptr, emit_EAX,
+ &interpreter->ctx.string_reg.registers[p1]);
+ break;
+ case PARROT_ARG_P:
+ emit_movl_r_m(jit_info->native_ptr, emit_EAX,
+ &interpreter->ctx.pmc_reg.registers[p1]);
+ break;
+ case PARROT_ARG_N:
+ /* pop num from st(0) and mov to reg */
+ emit_fstpl(jit_info->native_ptr,
+ &interpreter->ctx.num_reg.registers[p1]);
+ break;
+ default:
+ internal_exception(1, "jit_vtable1r: ill LHS");
+ break;
+ }
+}
+
+/* emit a call to a vtable func
+ * $1->vtable(interp, $1, $2)
+ */
+static void
+Parrot_jit_vtable2_op(Parrot_jit_info_t *jit_info,
+ struct Parrot_Interp * interpreter)
+{
+ Parrot_jit_vtable_n_op(jit_info, interpreter, 2, 0);
+}
+
+/* emit a call to a vtable func
+ * $1->vtable(interp, $1, $2, $1)
+ * $2->vtable(interp, $2, $3, $1)
+ */
+static void
+Parrot_jit_vtable3_op(Parrot_jit_info_t *jit_info,
+ struct Parrot_Interp * interpreter)
+{
+ Parrot_jit_vtable_n_op(jit_info, interpreter, 3, 0);
}
/* if_p_ic, unless_p_ic */
@@ -1047,23 +1196,7 @@
Parrot_jit_vtable1_op(jit_info, interpreter);
/* test result */
emit_test_r_r(jit_info->native_ptr, emit_EAX, emit_EAX);
- /* remember PC */
- jmp_ptr = jit_info->native_ptr;
- /* emit jump past code, dummy offset */
- emitm_jxs(jit_info->native_ptr, unless ? emitm_jnz : emitm_jz, 0);
- /* get branch offset to eax */
- emitm_movl_i_r(jit_info->native_ptr,
- jit_info->cur_op + ic * sizeof(opcode_t), emit_EAX);
- /* TODO calc directly and jump
- * (cur_op - code_start) + ic * 4 indexed EBP */
- Parrot_emit_jump_to_eax(jit_info, interpreter);
- /* fixup above jump */
- sav_ptr = jit_info->native_ptr;
- jit_info->native_ptr = jmp_ptr;
- emitm_jxs(jit_info->native_ptr, unless ? emitm_jnz : emitm_jz,
- (long)(sav_ptr - jmp_ptr) - 2);
- /* restore PC */
- jit_info->native_ptr = sav_ptr;
+ emit_jcc(jit_info, unless ? emitm_jz : emitm_jnz, ic);
}
/* unless_p_ic */
@@ -1081,6 +1214,46 @@
{
Parrot_jit_vtable_if_unless_op(jit_info, interpreter, 0);
}
+
+/* new_p_ic */
+static void
+Parrot_jit_vtable_newp_ic_op(Parrot_jit_info_t *jit_info,
+ struct Parrot_Interp * interpreter)
+{
+ int p1, i2;
+ op_info_t *op_info = &interpreter->op_info_table[*jit_info->cur_op];
+ size_t offset = offsetof(struct _vtable, init);
+ int nvtable = op_jit[*jit_info->cur_op].extcall;
+
+ assert(nvtable == 0); /* vtable->init */
+ assert(op_info->types[1] == PARROT_ARG_P);
+ p1 = *(jit_info->cur_op + 1);
+ assert(p1 >= 0 && p1 < NUM_REGISTERS);
+ i2 = *(jit_info->cur_op + 2);
+ if (i2 <= 0 || i2 >= enum_class_max)
+ internal_exception(1, "Illegal PMC enum (%d) in new\n", i2);
+ /* push pmc enum and interpreter */
+ emitm_pushl_i(jit_info->native_ptr, i2);
+ emitm_pushl_i(jit_info->native_ptr, interpreter);
+ Parrot_jit_newfixup(jit_info);
+ jit_info->arena.fixups->type = JIT_X86CALL;
+ jit_info->arena.fixups->param.fptr = (void (*)(void))pmc_new_noinit;
+ emitm_calll(jit_info->native_ptr, 0xdeafc0de);
+ /* result = eax = PMC */
+ emit_movl_r_m(jit_info->native_ptr, emit_EAX,
+ &interpreter->ctx.pmc_reg.registers[p1]);
+ emit_pushl_r(jit_info->native_ptr, emit_EAX);
+ /* push interpreter */
+ emitm_pushl_i(jit_info->native_ptr, interpreter);
+ /* mov (eax), eax i.e. $1->vtable */
+ emitm_movl_m_r(jit_info->native_ptr, emit_EAX, emit_EAX, emit_None, 1, 0);
+ /* call *(offset)eax */
+ emitm_callm(jit_info->native_ptr, emit_EAX, emit_None, emit_None, offset);
+ /* adjust 4 args pushed */
+ emitm_addb_i_r(jit_info->native_ptr, 16, emit_ESP);
+}
+
+#endif
void
Parrot_jit_normal_op(Parrot_jit_info_t *jit_info,
1.1 parrot/t/op/jit.t
Index: jit.t
===================================================================
#! perl -w
# test WRT JIT register allocation
use Parrot::Test tests => 28;
output_is(<<'CODE', <<'OUTPUT', "add_i_i_i 1,2,3 mapped");
set I0,0
set I1,1
set I2,2
add I0,I1,I2
print I0
print I1
print I2
print "\n"
end
CODE
312
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "add_i_i_i 1,2 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
add I0,I1,I4
print I0
print I1
print I4
print "\n"
end
CODE
514
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "add_i_i_i 1,3 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
add I0,I4,I1
print I0
print I4
print I1
print "\n"
end
CODE
541
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "add_i_i_i 2,3 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
add I4,I0,I1
print I4
print I0
print I1
print "\n"
end
CODE
211
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "add_i_i_i 1 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
add I1,I5,I4
print I1
print I5
print I4
print "\n"
end
CODE
404
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "add_i_i_i 2 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
add I5,I1,I4
print I5
print I1
print I4
print "\n"
end
CODE
514
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "add_i_i_i 3 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
add I5,I4,I1
print I5
print I1
print I4
print "\n"
end
CODE
514
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "add_i_i_i 0 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
add I5,I6,I4
print I5
print I6
print I4
print "\n"
end
CODE
404
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "sub_i_i_i 1,2,3 mapped");
set I0,0
set I1,1
set I2,2
sub I0,I1,I2
print I0
print I1
print I2
print "\n"
end
CODE
-112
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "sub_i_i_i 1,2 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
sub I0,I1,I4
print I0
print I1
print I4
print "\n"
end
CODE
-314
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "sub_i_i_i 1,3 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
sub I0,I4,I1
print I0
print I4
print I1
print "\n"
end
CODE
341
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "sub_i_i_i 2,3 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
sub I4,I0,I1
print I4
print I0
print I1
print "\n"
end
CODE
011
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "sub_i_i_i 1 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
sub I1,I5,I4
print I1
print I5
print I4
print "\n"
end
CODE
-404
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "sub_i_i_i 2 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
sub I5,I1,I4
print I5
print I1
print I4
print "\n"
end
CODE
-314
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "sub_i_i_i 3 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
sub I5,I4,I1
print I5
print I1
print I4
print "\n"
end
CODE
314
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "sub_i_i_i 0 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
sub I5,I6,I4
print I5
print I6
print I4
print "\n"
end
CODE
-404
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i_i 1,2,3 mapped");
set I0,0
set I1,1
set I2,2
mul I0,I1,I2
print I0
print I1
print I2
print "\n"
end
CODE
212
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i_i 1,2 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
mul I0,I1,I4
print I0
print I1
print I4
print "\n"
end
CODE
414
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i_i 1,3 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
mul I0,I4,I1
print I0
print I4
print I1
print "\n"
end
CODE
441
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i_i 2,3 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
mul I4,I1,I3
print I4
print I1
print I3
print "\n"
end
CODE
313
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i_i 1 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
mul I1,I5,I4
print I1
print I5
print I4
print "\n"
end
CODE
004
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i_i 2 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
mul I5,I1,I4
print I5
print I1
print I4
print "\n"
end
CODE
414
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i_i 3 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
mul I5,I4,I1
print I5
print I1
print I4
print "\n"
end
CODE
414
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i_i 0 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
mul I5,I6,I4
print I5
print I6
print I4
print "\n"
end
CODE
004
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i 1,2 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
mul I2, I3
print I2
print I3
print "\n"
end
CODE
93
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i 1 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
mul I2, I4
print I2
print I4
print "\n"
end
CODE
124
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i 2 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
mul I4, I2
print I4
print I2
print "\n"
end
CODE
123
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "mul_i_i 0 mapped");
set I0,0
set I1,1
set I2,2
set I3,3
set I4,4
set I0,I1
set I2,I3
set I0,I1
set I2,I3
mul I4, I5
print I4
print I5
print "\n"
end
CODE
00
OUTPUT