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
  
  
  
  


Reply via email to