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);
}
/*