cvsuser     04/11/05 03:23:00

  Modified:    classes  sub.pmc
               include/parrot interpreter.h
               src      generic_register.c inter_run.c register.c sub.c
  Log:
  indirect register frame 17 - add frame-pointer reg access macros
  
  Revision  Changes    Path
  1.63      +4 -4      parrot/classes/sub.pmc
  
  Index: sub.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/sub.pmc,v
  retrieving revision 1.62
  retrieving revision 1.63
  diff -u -r1.62 -r1.63
  --- sub.pmc   2 Nov 2004 17:52:16 -0000       1.62
  +++ sub.pmc   5 Nov 2004 11:22:54 -0000       1.63
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: sub.pmc,v 1.62 2004/11/02 17:52:16 leo Exp $
  +$Id: sub.pmc,v 1.63 2004/11/05 11:22:54 leo Exp $
   
   =head1 NAME
   
  @@ -261,10 +261,10 @@
                */
               interpreter->ctx.current_sub = REG_PMC(0) = SELF;
               interpreter->ctx.current_cont = REG_PMC(1) =
  -                caller_regs->pmc_reg.registers[1];
  +                BP_REG_PMC(caller_regs, 1);
               interpreter->ctx.current_object = REG_PMC(2) =
  -                caller_regs->pmc_reg.registers[2];
  -            REG_STR(0) = caller_regs->string_reg.registers[0];
  +                BP_REG_PMC(caller_regs, 2);
  +            REG_STR(0) = BP_REG_STR(caller_regs, 0);
           }
           return sub->address;
       }
  
  
  
  1.162     +48 -10    parrot/include/parrot/interpreter.h
  
  Index: interpreter.h
  ===================================================================
  RCS file: /cvs/public/parrot/include/parrot/interpreter.h,v
  retrieving revision 1.161
  retrieving revision 1.162
  diff -u -r1.161 -r1.162
  --- interpreter.h     4 Nov 2004 12:52:25 -0000       1.161
  +++ interpreter.h     5 Nov 2004 11:22:58 -0000       1.162
  @@ -1,7 +1,7 @@
   /* interpreter.h
    *  Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
    *  CVS Info
  - *     $Id: interpreter.h,v 1.161 2004/11/04 12:52:25 leo Exp $
  + *     $Id: interpreter.h,v 1.162 2004/11/05 11:22:58 leo Exp $
    *  Overview:
    *     The interpreter api handles running the operations
    *  Data Structure and Algorithms:
  @@ -136,10 +136,19 @@
    * of a continuation by restoring the interpreter context.
    */
   struct parrot_regs_t {
  +#ifdef SLIDING_BP
  +    struct {
  +        INTVAL  int_reg;
  +        FLOATVAL num_reg;
  +        STRING * string_reg;
  +        PMC * pmc_reg;
  +    } registers[32];
  +#else
       struct IReg int_reg;
       struct NReg num_reg;
       struct SReg string_reg;
       struct PReg pmc_reg;
  +#endif /* SLIDING_BP */
   };
   
   typedef struct Parrot_Context {
  @@ -300,10 +309,31 @@
    * Macros to make accessing registers more convenient/readable.
    */
   
  -#define INTERP_REG_INT(i, x) i->ctx.bp->int_reg.registers[x]
  -#define INTERP_REG_NUM(i, x) i->ctx.bp->num_reg.registers[x]
  -#define INTERP_REG_STR(i, x) i->ctx.bp->string_reg.registers[x]
  -#define INTERP_REG_PMC(i, x) i->ctx.bp->pmc_reg.registers[x]
  +#ifdef SLIDING_BP
  +
  +#  define INTERP_REG_INT(i, x) i->ctx.bp->registers[x].int_reg
  +#  define INTERP_REG_NUM(i, x) i->ctx.bp->registers[x].num_reg
  +#  define INTERP_REG_STR(i, x) i->ctx.bp->registers[x].string_reg
  +#  define INTERP_REG_PMC(i, x) i->ctx.bp->registers[x].pmc_reg
  +
  +#  define BP_REG_INT(bp, x) bp->registers[x].int_reg
  +#  define BP_REG_NUM(bp, x) bp->registers[x].num_reg
  +#  define BP_REG_STR(bp, x) bp->registers[x].string_reg
  +#  define BP_REG_PMC(bp, x) bp->registers[x].pmc_reg
  +
  +#else
  +
  +#  define INTERP_REG_INT(i, x) i->ctx.bp->int_reg.registers[x]
  +#  define INTERP_REG_NUM(i, x) i->ctx.bp->num_reg.registers[x]
  +#  define INTERP_REG_STR(i, x) i->ctx.bp->string_reg.registers[x]
  +#  define INTERP_REG_PMC(i, x) i->ctx.bp->pmc_reg.registers[x]
  +
  +#  define BP_REG_INT(bp, x) bp->int_reg.registers[x]
  +#  define BP_REG_NUM(bp, x) bp->num_reg.registers[x]
  +#  define BP_REG_STR(bp, x) bp->string_reg.registers[x]
  +#  define BP_REG_PMC(bp, x) bp->pmc_reg.registers[x]
  +
  +#endif /* SLIDING_BP */
   
   #define REG_BASE struct parrot_regs_t
   
  @@ -318,14 +348,22 @@
   /*
    * and a set of macros to access a register by offset, mostly used
    * in JIT emit code
  - * The offsets are relative to REG_BASE, which is currently REG_INT(0)
  + * The offsets are relative to REG_BASE, which is REG_INT(0),
  + * i.e. that what interpreter->ctx.bp is pointing to.
    */
   
   
  -#define REG_OFFS_INT(x) offsetof(REG_BASE, int_reg.registers[x])
  -#define REG_OFFS_NUM(x) offsetof(REG_BASE, num_reg.registers[x])
  -#define REG_OFFS_STR(x) offsetof(REG_BASE, string_reg.registers[x])
  -#define REG_OFFS_PMC(x) offsetof(REG_BASE, pmc_reg.registers[x])
  +#ifdef SLIDING_BP
  +#  define REG_OFFS_INT(x) offsetof(REG_BASE, registers[x].int_reg)
  +#  define REG_OFFS_NUM(x) offsetof(REG_BASE, registers[x].num_reg)
  +#  define REG_OFFS_STR(x) offsetof(REG_BASE, registers[x].string_reg)
  +#  define REG_OFFS_PMC(x) offsetof(REG_BASE, registers[x].pmc_reg)
  +#else
  +#  define REG_OFFS_INT(x) offsetof(REG_BASE, int_reg.registers[x])
  +#  define REG_OFFS_NUM(x) offsetof(REG_BASE, num_reg.registers[x])
  +#  define REG_OFFS_STR(x) offsetof(REG_BASE, string_reg.registers[x])
  +#  define REG_OFFS_PMC(x) offsetof(REG_BASE, pmc_reg.registers[x])
  +#endif /* SLIDING_BP */
   
   #define PCONST(i) PF_CONST(interpreter->code, (i))
   #define PNCONST   PF_NCONST(interpreter->code)
  
  
  
  1.8       +5 -1      parrot/src/generic_register.c
  
  Index: generic_register.c
  ===================================================================
  RCS file: /cvs/public/parrot/src/generic_register.c,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- generic_register.c        1 Nov 2004 14:26:34 -0000       1.7
  +++ generic_register.c        5 Nov 2004 11:23:00 -0000       1.8
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: generic_register.c,v 1.7 2004/11/01 14:26:34 leo Exp $
  +$Id: generic_register.c,v 1.8 2004/11/05 11:23:00 leo Exp $
   
   =head1 NAME
   
  @@ -87,7 +87,11 @@
   {
       int i;
       for (i = 0; i < NUM_REGISTERS; i++) {
  +#ifdef SLIDING_BP
  +        interpreter->ctx.bp->registers[i].REG_TYPE = REG_NULL;
  +#else
           interpreter->ctx.bp->REG_TYPE.registers[i] = REG_NULL;
  +#endif
       }
   }
   
  
  
  
  1.18      +14 -14    parrot/src/inter_run.c
  
  Index: inter_run.c
  ===================================================================
  RCS file: /cvs/public/parrot/src/inter_run.c,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- inter_run.c       4 Nov 2004 08:03:36 -0000       1.17
  +++ inter_run.c       5 Nov 2004 11:23:00 -0000       1.18
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: inter_run.c,v 1.17 2004/11/04 08:03:36 leo Exp $
  +$Id: inter_run.c,v 1.18 2004/11/05 11:23:00 leo Exp $
   
   =head1 NAME
   
  @@ -312,23 +312,23 @@
        *     by the subroutine or both if possible, i.e. extract
        *     e.g. an INTVAL from a returned PMC?
        */
  -    if (bp->int_reg.registers[3] == 1) {
  +    if (BP_REG_INT(bp, 3) == 1) {
           /*
            * pythons functions from pie-thon always return a PMC
            */
           switch (sig_ret) {
               case 'S':
  -                return VTABLE_get_string(interpreter, bp->pmc_reg.registers[5]);
  +                return VTABLE_get_string(interpreter, BP_REG_PMC(bp,5));
               case 'P':
               case 0:
  -                return (void*) bp->pmc_reg.registers[5];
  +                return (void*) BP_REG_PMC(bp,5);
           }
       }
       switch (sig_ret) {
           case 0:
           case 'v': break;
  -        case 'S': retval = (void* ) bp->string_reg.registers[5]; break;
  -        case 'P': retval = (void* ) bp->pmc_reg.registers[5]; break;
  +        case 'S': retval = (void* ) BP_REG_STR(bp, 5); break;
  +        case 'P': retval = (void* ) BP_REG_PMC(bp,5); break;
           default:
               internal_exception(1,
                       "unhandle signature '%c' in set_retval", sig_ret);
  @@ -340,10 +340,10 @@
   set_retval_i(Parrot_Interp interpreter, int sig_ret, struct parrot_regs_t *bp)
   {
       if (sig_ret == 'I') {
  -        if (bp->int_reg.registers[3] == 1)
  -            return VTABLE_get_integer(interpreter, bp->pmc_reg.registers[5]);
  -        /* else if (bp->int_reg.registers[1] == 1) */
  -            return bp->int_reg.registers[5];
  +        if (BP_REG_INT(bp, 3) == 1)
  +            return VTABLE_get_integer(interpreter, BP_REG_PMC(bp,5));
  +        /* else if (BP_REG_INT(bp, 1) == 1) */
  +            return BP_REG_INT(bp, 5);
       }
       Parrot_warn(interpreter, PARROT_WARNINGS_ALL_FLAG, "argument mismatch");
       return 0;
  @@ -353,10 +353,10 @@
   set_retval_f(Parrot_Interp interpreter, int sig_ret, struct parrot_regs_t *bp)
   {
       if (sig_ret == 'N') {
  -        if (bp->int_reg.registers[3] == 1)
  -            return VTABLE_get_number(interpreter, bp->pmc_reg.registers[5]);
  -        /* else if (bp->int_reg.registers[4] == 1) */
  -            return bp->num_reg.registers[5];
  +        if (BP_REG_INT(bp, 3) == 1)
  +            return VTABLE_get_number(interpreter, BP_REG_PMC(bp,5));
  +        /* else if (BP_REG_INT(bp, 4) == 1) */
  +            return BP_REG_NUM(bp, 5);
       }
       Parrot_warn(interpreter, PARROT_WARNINGS_ALL_FLAG, "argument mismatch");
       return 0;
  
  
  
  1.54      +4 -3      parrot/src/register.c
  
  Index: register.c
  ===================================================================
  RCS file: /cvs/public/parrot/src/register.c,v
  retrieving revision 1.53
  retrieving revision 1.54
  diff -u -r1.53 -r1.54
  --- register.c        1 Nov 2004 14:26:34 -0000       1.53
  +++ register.c        5 Nov 2004 11:23:00 -0000       1.54
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: register.c,v 1.53 2004/11/01 14:26:34 leo Exp $
  +$Id: register.c,v 1.54 2004/11/05 11:23:00 leo Exp $
   
   =head1 NAME
   
  @@ -121,11 +121,12 @@
           struct parrot_regs_t *regs = (struct parrot_regs_t *)STACK_DATAP(chunk);
   
           pobject_lives(interpreter, (PObj*)chunk);
  +
           for (j = 0; j < NUM_REGISTERS; j++) {
  -            obj = (PObj*) regs->pmc_reg.registers[j];
  +            obj = (PObj*) BP_REG_PMC(regs, j);
               if (obj)
                   pobject_lives(interpreter, obj);
  -            obj = (PObj*) regs->string_reg.registers[j];
  +            obj = (PObj*) BP_REG_STR(regs, j);
               if (obj)
                   pobject_lives(interpreter, obj);
           }
  
  
  
  1.78      +15 -15    parrot/src/sub.c
  
  Index: sub.c
  ===================================================================
  RCS file: /cvs/public/parrot/src/sub.c,v
  retrieving revision 1.77
  retrieving revision 1.78
  diff -u -r1.77 -r1.78
  --- sub.c     4 Nov 2004 08:03:36 -0000       1.77
  +++ sub.c     5 Nov 2004 11:23:00 -0000       1.78
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: sub.c,v 1.77 2004/11/04 08:03:36 leo Exp $
  +$Id: sub.c,v 1.78 2004/11/05 11:23:00 leo Exp $
   
   =head1 NAME
   
  @@ -171,7 +171,7 @@
           if (!interpreter->ctx.current_sub) {
               copy_regs(interpreter, ctx->bp);
               ctx->current_sub = interpreter->ctx.current_sub = sub;
  -            interpreter->ctx.current_cont = ctx->bp->pmc_reg.registers[1];
  +            interpreter->ctx.current_cont = BP_REG_PMC(ctx->bp,1);
               REG_PMC(0) = sub;
               REG_PMC(1) = interpreter->ctx.current_cont;
               /*
  @@ -421,39 +421,39 @@
   */
   
   void
  -copy_regs(Interp *interpreter, struct parrot_regs_t *caller_regs)
  +copy_regs(Interp *interpreter, struct parrot_regs_t *bp)
   {
       int i, n, proto, overflow;
   
  -    proto = caller_regs->int_reg.registers[0];
  +    proto = BP_REG_INT(bp, 0);
       overflow = 0;
       if (proto) {
  -        n = caller_regs->int_reg.registers[1];
  +        n = BP_REG_INT(bp, 1);
           overflow = n == 11;
           for (i = 0; i < 5 + n; ++i)
  -            REG_INT(i) = caller_regs->int_reg.registers[i];
  -        n = caller_regs->int_reg.registers[2];
  +            REG_INT(i) = BP_REG_INT(bp, i);
  +        n = BP_REG_INT(bp, 2);
           overflow |= n == 11;
           for (i = 0; i < n; ++i)
  -            REG_STR(i + 5) = caller_regs->string_reg.registers[i + 5];
  -        n = caller_regs->int_reg.registers[3];
  +            REG_STR(i + 5) = BP_REG_STR(bp, i + 5);
  +        n = BP_REG_INT(bp, 3);
           overflow |= n == 11;
           for (i = 0; i < n; ++i)
  -            REG_PMC(i + 5) = caller_regs->pmc_reg.registers[i + 5];
  -        n = caller_regs->int_reg.registers[4];
  +            REG_PMC(i + 5) = BP_REG_PMC(bp,i + 5);
  +        n = BP_REG_INT(bp, 4);
           overflow |= n == 11;
           for (i = 0; i < n; ++i)
  -            REG_NUM(i + 5) = caller_regs->num_reg.registers[i + 5];
  +            REG_NUM(i + 5) = BP_REG_NUM(bp, i + 5);
       }
       else {
           REG_INT(0) = 0;
  -        REG_INT(3) = n = caller_regs->int_reg.registers[3];
  +        REG_INT(3) = n = BP_REG_INT(bp, 3);
           overflow = n == 11;
           for (i = 0; i < n; ++i)
  -            REG_PMC(i + 5) = caller_regs->pmc_reg.registers[i + 5];
  +            REG_PMC(i + 5) = BP_REG_PMC(bp,i + 5);
       }
       if (overflow)
  -        REG_PMC(3) = caller_regs->pmc_reg.registers[3];
  +        REG_PMC(3) = BP_REG_PMC(bp,3);
   }
   
   /*
  
  
  

Reply via email to