Here is the patch (again) to use the appropriate bitmask determined by
Configure for the different register chunks.

-- 
Jason
Index: Configure.pl
===================================================================
RCS file: /home/perlcvs/parrot/Configure.pl,v
retrieving revision 1.29
diff -u -r1.29 Configure.pl
--- Configure.pl        2001/10/17 11:45:23     1.29
+++ Configure.pl        2001/10/19 22:30:15
@@ -85,7 +85,11 @@
        perl =>                 $^X,
        debugging =>    $opt_debugging,
        rm_f =>         'rm -f',
-       stacklow => '(~0xfff)',
+       stacklow =>     '(~0xfff)',
+       intlow =>       '(~0xfff)',
+       numlow =>       '(~0xfff)',
+       strlow =>       '(~0xfff)',
+       pmclow =>       '(~0xfff)',
 );
 
 #copy the things from --define foo=bar
Index: config_h.in
===================================================================
RCS file: /home/perlcvs/parrot/config_h.in,v
retrieving revision 1.9
diff -u -r1.9 config_h.in
--- config_h.in 2001/10/12 17:59:01     1.9
+++ config_h.in 2001/10/19 22:30:15
@@ -26,8 +26,11 @@
 #define FRAMES_PER_INT_REG_CHUNK FRAMES_PER_CHUNK
 #define FRAMES_PER_STR_REG_CHUNK FRAMES_PER_CHUNK
 
-#define MASK_CHUNK_LOW_BITS (~0xfff)
 #define MASK_STACK_CHUNK_LOW_BITS ${stacklow}
+#define MASK_INT_CHUNK_LOW_BITS ${intlow}
+#define MASK_NUM_CHUNK_LOW_BITS ${numlow}
+#define MASK_STR_CHUNK_LOW_BITS ${strlow}
+#define MASK_PMC_CHUNK_LOW_BITS ${pmclow}
 
 
 ${headers}
Index: register.c
===================================================================
RCS file: /home/perlcvs/parrot/register.c,v
retrieving revision 1.11
diff -u -r1.11 register.c
--- register.c  2001/10/16 00:38:24     1.11
+++ register.c  2001/10/19 22:30:15
@@ -19,7 +19,7 @@
 Parrot_push_i(struct Parrot_Interp *interpreter) {
     struct IRegChunk *chunk_base;
     
-    chunk_base = CHUNK_BASE(interpreter->int_reg);
+    chunk_base = INT_CHUNK_BASE(interpreter->int_reg);
     /* Do we have any slots left in the current chunk? */
     if (chunk_base->free) {
         interpreter->int_reg = &chunk_base->IReg[chunk_base->used++];
@@ -46,7 +46,7 @@
 Parrot_clone_i(struct Parrot_Interp *interpreter) {
     struct IRegChunk *chunk_base;
     
-    chunk_base = CHUNK_BASE(interpreter->int_reg);
+    chunk_base = INT_CHUNK_BASE(interpreter->int_reg);
     /* Do we have any slots left in the current chunk? */
     if (chunk_base->free) {
         interpreter->int_reg = &chunk_base->IReg[chunk_base->used++];
@@ -77,7 +77,7 @@
 void
 Parrot_pop_i(struct Parrot_Interp *interpreter) {
     struct IRegChunk *chunk_base;
-    chunk_base = CHUNK_BASE(interpreter->int_reg);
+    chunk_base = INT_CHUNK_BASE(interpreter->int_reg);
     /* Is there more than one register frame in use? */
     if (chunk_base->used > 1) {
         chunk_base->used--;
@@ -118,7 +118,7 @@
 Parrot_push_s(struct Parrot_Interp *interpreter) {
     struct SRegChunk *chunk_base;
     
-    chunk_base = CHUNK_BASE(interpreter->string_reg);
+    chunk_base = STR_CHUNK_BASE(interpreter->string_reg);
     /* Do we have any slots left in the current chunk? */
     if (chunk_base->free) {
         interpreter->string_reg = &chunk_base->SReg[chunk_base->used++];
@@ -148,7 +148,7 @@
 Parrot_clone_s(struct Parrot_Interp *interpreter) {
     struct SRegChunk *chunk_base;
     
-    chunk_base = CHUNK_BASE(interpreter->string_reg);
+    chunk_base = STR_CHUNK_BASE(interpreter->string_reg);
     /* Do we have any slots left in the current chunk? */
     if (chunk_base->free) {
         interpreter->string_reg = &chunk_base->SReg[chunk_base->used++];
@@ -182,7 +182,7 @@
 void
 Parrot_pop_s(struct Parrot_Interp *interpreter) {
     struct SRegChunk *chunk_base;
-    chunk_base = CHUNK_BASE(interpreter->string_reg);
+    chunk_base = STR_CHUNK_BASE(interpreter->string_reg);
     /* Is there more than one register frame in use? */
     if (chunk_base->used > 1) {
         chunk_base->used--;
@@ -223,7 +223,7 @@
 Parrot_push_n(struct Parrot_Interp *interpreter) {
     struct NRegChunk *chunk_base;
     
-    chunk_base = CHUNK_BASE(interpreter->num_reg);
+    chunk_base = NUM_CHUNK_BASE(interpreter->num_reg);
     /* Do we have any slots left in the current chunk? */
     if (chunk_base->free) {
         interpreter->num_reg = &chunk_base->NReg[chunk_base->used++];
@@ -250,7 +250,7 @@
 Parrot_clone_n(struct Parrot_Interp *interpreter) {
     struct NRegChunk *chunk_base;
     
-    chunk_base = CHUNK_BASE(interpreter->num_reg);
+    chunk_base = NUM_CHUNK_BASE(interpreter->num_reg);
     /* Do we have any slots left in the current chunk? */
     if (chunk_base->free) {
         interpreter->num_reg = &chunk_base->NReg[chunk_base->used++];
@@ -281,7 +281,7 @@
 void
 Parrot_pop_n(struct Parrot_Interp *interpreter) {
     struct NRegChunk *chunk_base;
-    chunk_base = CHUNK_BASE(interpreter->num_reg);
+    chunk_base = NUM_CHUNK_BASE(interpreter->num_reg);
     /* Is there more than one register frame in use? */
     if (chunk_base->used > 1) {
         chunk_base->used--;
@@ -322,7 +322,7 @@
 Parrot_push_p(struct Parrot_Interp *interpreter) {
     struct PRegChunk *chunk_base;
     
-    chunk_base = CHUNK_BASE(interpreter->pmc_reg);
+    chunk_base = PMC_CHUNK_BASE(interpreter->pmc_reg);
     /* Do we have any slots left in the current chunk? */
     if (chunk_base->free) {
         interpreter->pmc_reg = &chunk_base->PReg[chunk_base->used++];
@@ -351,7 +351,7 @@
 Parrot_clone_p(struct Parrot_Interp *interpreter) {
     struct PRegChunk *chunk_base;
     
-    chunk_base = CHUNK_BASE(interpreter->pmc_reg);
+    chunk_base = PMC_CHUNK_BASE(interpreter->pmc_reg);
     /* Do we have any slots left in the current chunk? */
     if (chunk_base->free) {
         interpreter->pmc_reg = &chunk_base->PReg[chunk_base->used++];
@@ -384,7 +384,7 @@
 void
 Parrot_pop_p(struct Parrot_Interp *interpreter) {
     struct PRegChunk *chunk_base;
-    chunk_base = CHUNK_BASE(interpreter->pmc_reg);
+    chunk_base = PMC_CHUNK_BASE(interpreter->pmc_reg);
     /* Is there more than one register frame in use? */
     if (chunk_base->used > 1) {
         chunk_base->used--;
Index: include/parrot/register.h
===================================================================
RCS file: /home/perlcvs/parrot/include/parrot/register.h,v
retrieving revision 1.7
diff -u -r1.7 register.h
--- include/parrot/register.h   2001/10/16 00:38:25     1.7
+++ include/parrot/register.h   2001/10/19 22:30:16
@@ -63,9 +63,12 @@
     struct PReg PReg[FRAMES_PER_CHUNK];
 };
 
-/* This macro masks off the low bits of a register chunk address,
+/* These macros masks off the low bits of a register chunk address,
    since we're guaranteed to be aligned */
-#define CHUNK_BASE(x) (void *)(MASK_CHUNK_LOW_BITS & (ptrcast_t)x)
+#define INT_CHUNK_BASE(x) (void *)(MASK_INT_CHUNK_LOW_BITS & (ptrcast_t)x)
+#define NUM_CHUNK_BASE(x) (void *)(MASK_NUM_CHUNK_LOW_BITS & (ptrcast_t)x)
+#define STR_CHUNK_BASE(x) (void *)(MASK_STR_CHUNK_LOW_BITS & (ptrcast_t)x)
+#define PMC_CHUNK_BASE(x) (void *)(MASK_PMC_CHUNK_LOW_BITS & (ptrcast_t)x)
 
 void Parrot_clear_i(struct Parrot_Interp *);
 void Parrot_clear_s(struct Parrot_Interp *);

Reply via email to