Changeset 15826


Ignore:
Timestamp:
May 26, 2013, 7:49:59 PM (6 years ago)
Author:
gb
Message:

Revert to r15810.

Location:
trunk/source/lisp-kernel
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/area.h

    r15815 r15826  
    7676  natural static_dnodes;        /* for hash consing, maybe other things. */
    7777  natural *static_used;         /* bitvector */
    78   natural *refidx;              /* compressed refbits */
    79   natural first_indexed_ref;    /* area's first bit in refidx */
    8078} area;
    8179
  • trunk/source/lisp-kernel/arm-exceptions.c

    r15822 r15826  
    16441644        return;
    16451645      }
    1646       ea = (LispObj*)(xpGPR(xp,arg_x) + unbox_fixnum(xpGPR(xp,temp2)));
     1646      ea = (LispObj*)(xpGPR(xp,arg_x) + xpGPR(xp,imm0));
    16471647      xpGPR(xp,arg_z) = t_value;
    16481648    } else if (program_counter >= &egc_set_hash_key) {
     
    16521652      root = xpGPR(xp,arg_x);
    16531653      val = xpGPR(xp,arg_z);
    1654       ea = (LispObj *) (root+unbox_fixnum(xpGPR(xp,temp2)));
     1654      ea = (LispObj *) (root+xpGPR(xp,arg_y)+misc_data_offset);
    16551655      need_memoize_root = true;
    16561656    } else if (program_counter >= &egc_gvset) {
     
    16781678          ((LispObj)ea < val)) {
    16791679        atomic_set_bit(refbits, bitnumber);
    1680         atomic_set_bit(global_refidx, bitnumber>>8);
    16811680        if (need_memoize_root) {
    16821681          bitnumber = area_dnode(root, lisp_global(REF_BASE));
    16831682          atomic_set_bit(refbits, bitnumber);
    1684           atomic_set_bit(global_refidx,bitnumber>>8);
    16851683        }
    16861684      }
  • trunk/source/lisp-kernel/arm-gc.c

    r15821 r15826  
    712712
    713713void
    714 check_refmap_consistency(LispObj *start, LispObj *end, bitvector refbits, bitvector refidx)
     714check_refmap_consistency(LispObj *start, LispObj *end, bitvector refbits)
    715715{
    716716  LispObj x1, *base = start, *prev = start;
     
    758758          Bug(NULL, "Missing memoization in doublenode at 0x" LISP "\n", start);
    759759          set_bit(refbits, ref_dnode);
    760           if (refidx) {
    761             set_bit(refidx,ref_dnode>>8);
    762           }
    763         } else {
    764           if (refidx) {
    765             if (!ref_bit(refidx, ref_dnode>>8)) {
    766               Bug(NULL, "Memoization for doublenode at 0x" LISP " not indexed\n", start);
    767               set_bit(refidx,ref_dnode>>8);
    768             }
    769           }
    770760        }
    771761      }
  • trunk/source/lisp-kernel/arm-spentry.s

    r15822 r15826  
    759759        __(mov imm1,imm1,lsr imm2)
    760760        __(mov imm0,imm0,lsr #bitmap_shift)
    761         __(ref_global(temp1,refbits))
    762         __(add temp1,temp1,imm0,lsl #word_shift)
    763         __(ldr imm2,[temp1])
     761        __(ref_global(temp0,refbits))
     762        __(add temp0,temp0,imm0,lsl #word_shift)
     763        __(ldr imm2,[temp0])
    764764        __(tst imm2,imm1)
    765765        __(bxne lr)
    766 0:      __(ldrex imm2,[temp1])
     7660:      __(ldrex imm2,[temp0])
    767767        __(orr imm2,imm2,imm1)
    768         __(strex imm0,imm2,[temp1])
     768        __(strex imm0,imm2,[temp0])
    769769        __(cmp imm0,#0)
    770         __(bne 0b)
    771         __(sub imm0,arg_y,temp0)
    772         __(mov imm0,imm0,lsr #dnode_shift+8)
    773         __(and imm2,imm0,#31)
    774         __(mov imm1,#0x80000000)
    775         __(mov imm1,imm1,lsr imm2)
    776         __(mov imm0,imm0,lsr #bitmap_shift)
    777         __(ref_global(temp1,ephemeral_refidx))
    778         __(add temp1,temp1,imm0,lsl #word_shift)
    779 1:      __(ldrex imm2,[temp1])
    780         __(orr imm2,imm2,imm1)
    781         __(strex imm0,imm2,[temp1])
    782         __(cmp imm0,#0)
    783         __(bne 1b)
     770        __(bne 0b)       
    784771        __(bx lr)
    785772
     
    803790        __(mov imm1,imm1,lsr imm2)
    804791        __(mov imm0,imm0,lsr #bitmap_shift)
    805         __(ref_global(temp1,refbits))
    806         __(add temp1,temp1,imm0,lsl #word_shift)
    807         __(ldr imm2,[temp1])
     792        __(ref_global(temp0,refbits))
     793        __(add temp0,temp0,imm0,lsl #word_shift)
     794        __(ldr imm2,[temp0])
    808795        __(tst imm2,imm1)
    809796        __(bxne lr)
    810 0:      __(ldrex imm2,[temp1])
     7970:      __(ldrex imm2,[temp0])
    811798        __(orr imm2,imm2,imm1)
    812         __(strex imm0,imm2,[temp1])
     799        __(strex imm0,imm2,[temp0])
    813800        __(cmp imm0,#0)
    814801        __(bne 0b)       
    815         __(sub imm0,arg_y,temp0)
    816         __(mov imm0,imm0,lsr #dnode_shift+8)
    817         __(and imm2,imm0,#31)
    818         __(mov imm1,#0x80000000)
    819         __(mov imm1,imm1,lsr imm2)
    820         __(mov imm0,imm0,lsr #bitmap_shift)
    821         __(ref_global(temp1,ephemeral_refidx))
    822         __(add temp1,temp1,imm0,lsl #word_shift)
    823 1:      __(ldrex imm2,[temp1])
    824         __(orr imm2,imm2,imm1)
    825         __(strex imm0,imm2,[temp1])
    826         __(cmp imm0,#0)
    827         __(bne 1b)
    828802        __(bx lr)
    829803       
     
    851825        __(mov imm1,imm1,lsr imm2)
    852826        __(mov imm0,imm0,lsr #bitmap_shift)
    853         __(ref_global(temp1,refbits))
    854         __(add temp1,temp1,imm0,lsl #word_shift)
    855         __(ldr imm2,[temp1])
     827        __(ref_global(temp0,refbits))
     828        __(add temp0,temp0,imm0,lsl #word_shift)
     829        __(ldr imm2,[temp0])
    856830        __(tst imm2,imm1)
    857831        __(bxne lr)     
    858 0:      __(ldrex imm2,[temp1])
     8320:      __(ldrex imm2,[temp0])
    859833        __(orr imm2,imm2,imm1)
    860         __(strex imm0,imm2,[temp1])
     834        __(strex imm0,imm2,[temp0])
    861835        __(cmp imm0,#0)
    862         __(bne 0b)
    863         __(add imm0,arg_y,#misc_data_offset)
    864         __(add imm0,imm0,arg_x)
    865         __(sub imm0,imm0,temp0)
    866         __(mov imm0,imm0,lsr #dnode_shift+8)
    867         __(and imm2,imm0,#31)
    868         __(mov imm1,#0x80000000)
    869         __(mov imm1,imm1,lsr imm2)
    870         __(mov imm0,imm0,lsr #bitmap_shift)
    871         __(ref_global(temp1,ephemeral_refidx))
    872         __(add temp1,temp1,imm0,lsl #word_shift)
    873 1:      __(ldrex imm2,[temp1])
    874         __(orr imm2,imm2,imm1)
    875         __(strex imm0,imm2,[temp1])
    876         __(cmp imm0,#0)
    877         __(bne 1b)   
     836        __(bne 0b)       
    878837        __(bx lr)
    879838
     
    902861        __(mov imm1,imm1,lsr imm2)
    903862        __(mov imm0,imm0,lsr #bitmap_shift)
    904         __(ref_global(temp1,refbits))
    905         __(add temp1,temp1,imm0,lsl #word_shift)
    906         __(ldr imm2,[temp1])
     863        __(ref_global(temp0,refbits))
     864        __(add temp0,temp0,imm0,lsl #word_shift)
     865        __(ldr imm2,[temp0])
    907866        __(tst imm2,imm1)
    908867        __(bxne lr)
    909 0:      __(ldrex imm2,[temp1])
     8680:      __(ldrex imm2,[temp0])
    910869        __(orr imm2,imm2,imm1)
    911         __(strex imm0,imm2,[temp1])
     870        __(strex imm0,imm2,[temp0])
    912871        __(cmp imm0,#0)
    913         __(bne 0b)
    914         __(add imm0,arg_y,#misc_data_offset)
    915         __(add imm0,imm0,arg_x)
    916         __(sub imm0,imm0,temp0)
    917         __(mov imm0,imm0,lsr #dnode_shift+8)
    918         __(and imm2,imm0,#31)
    919         __(mov imm1,#0x80000000)
    920         __(mov imm1,imm1,lsr imm2)
    921         __(mov imm0,imm0,lsr #bitmap_shift)
    922         __(ref_global(temp1,ephemeral_refidx))
    923         __(add temp1,temp1,imm0,lsl #word_shift)
    924 1:      __(ldrex imm2,[temp1])
    925         __(orr imm2,imm2,imm1)
    926         __(strex imm0,imm2,[temp1])
    927         __(cmp imm0,#0)
    928         __(bne 1b)   
    929        
     872        __(bne 0b)       
    930873/* Now need to ensure that the hash table itself is in the refmap; we
    931874   know that it's in bounds, etc. */
    932 
     875        __(ref_global(temp0,ref_base))
    933876        __(sub imm0,arg_x,temp0)
    934877        __(mov imm0,imm0,lsr #dnode_shift)
     
    937880        __(mov imm1,imm1,lsr imm2)
    938881        __(mov imm0,imm0,lsr #bitmap_shift)
    939         __(ref_global(temp1,refbits))
    940         __(add temp1,temp1,imm0,lsl #word_shift)
    941         __(ldr imm2,[temp1])
     882        __(ref_global(temp0,refbits))
     883        __(add temp0,temp0,imm0,lsl #word_shift)
     884        __(ldr imm2,[temp0])
    942885        __(tst imm2,imm1)
    943886        __(bxne lr)
    944 2:      __(ldrex imm2,[temp1])
     8871:      __(ldrex imm2,[temp0])
    945888        __(orr imm2,imm2,imm1)
    946         __(strex imm0,imm2,[temp1])
     889        __(strex imm0,imm2,[temp0])
    947890        __(cmp imm0,#0)
    948         __(bne 2b)       
    949         __(sub imm0,arg_x,temp0)
    950         __(mov imm0,imm0,lsr #dnode_shift+8)
    951         __(and imm2,imm0,#31)
    952         __(mov imm1,#0x80000000)
    953         __(mov imm1,imm1,lsr imm2)
    954         __(mov imm0,imm0,lsr #bitmap_shift)
    955         __(ref_global(temp1,ephemeral_refidx))
    956         __(add temp1,temp1,imm0,lsl #word_shift)
    957 3:      __(ldrex imm2,[temp1])
    958         __(orr imm2,imm2,imm1)
    959         __(strex imm0,imm2,[temp1])
    960         __(cmp imm0,#0)
    961         __(bne 3b)       
     891        __(bne 1b)       
    962892        __(bx lr)
    963893       
     
    985915_spentry(store_node_conditional)
    986916C(egc_store_node_conditional):
    987         __(vpop1(temp2))
     917        __(vpop1(temp0))
    988918         
    989 1:      __(unbox_fixnum(imm2,temp2))
     9191:      __(unbox_fixnum(imm2,temp0))
    990920        __(add imm2,imm2,arg_x)
    991921        __(ldrex temp1,[imm2])
    992922        __(cmp temp1,arg_y)
    993         __(bne 9f)
     923        __(bne 5f)
    994924        __(strex imm0,arg_z,[imm2])
    995925        .globl C(egc_store_node_conditional_test)
     
    998928        __(bne 1b)
    999929        __(cmp arg_z,arg_x)
    1000         __(blo 8f)
    1001 
    1002         __(ref_global(temp0,ref_base))
     930        __(blo 4f)
     931
     932        __(ref_global(imm0,ref_base))
    1003933        __(ref_global(imm1,oldspace_dnode_count))
    1004         __(sub imm0,imm2,temp0)
     934        __(sub imm0,imm2,imm0)
    1005935        __(mov imm0,imm0,lsr #dnode_shift)
    1006936        __(cmp imm0,imm1)
    1007         __(bhs 8f)
    1008         __(and imm2,imm0,#31)
    1009         __(mov imm1,#0x80000000)
    1010         __(mov imm1,imm1,lsr imm2)
    1011         __(ref_global(temp1,refbits))
     937        __(bhs 4f)
     938        __(and imm1,imm0,#31)
     939        __(mov arg_x,#0x80000000)
     940        __(mov imm1,arg_x,lsr imm1)
     941        __(ref_global(temp0,refbits))
    1012942        __(mov imm0,imm0,lsr #bitmap_shift)
    1013         __(add temp1,temp1,imm0,lsl #word_shift)
    1014         __(ldr imm2,[temp1])
     943        __(add temp0,temp0,imm0,lsl #word_shift)
     944        __(ldr imm2,[temp0])
    1015945        __(tst imm2,imm1)
    1016946        __(bxne lr)
    1017 2:      __(ldrex imm2,[temp1])
     9472:      __(ldrex imm2,[temp0])
    1018948        __(orr imm2,imm2,imm1)
    1019         __(strex imm0,imm2,[temp1])
     949        __(strex imm0,imm2,[temp0])
     950        .globl C(egc_set_hash_key_conditional_test)
     951C(egc_set_hash_key_conditional_test):
    1020952        __(cmp imm0,#0)
    1021953        __(bne 2b)
    1022         __(add imm0,arg_x,temp2,asr #fixnumshift)
    1023         __(sub imm0,imm0,temp0)
    1024         __(mov imm0,imm0,lsr #dnode_shift+8)
    1025         __(mov imm1,#0x80000000)
    1026         __(and imm2,imm0,#31)
    1027         __(mov imm1,imm1,lsr imm2)
    1028         __(mov imm0,imm0,lsr #bitmap_shift)
    1029         __(ref_global(temp1,ephemeral_refidx))
    1030         __(add temp1,temp1,imm0,lsl #word_shift)
    1031 3:      __(ldrex imm2,[temp1])
    1032         __(orr imm2,imm2,imm1)
    1033         __(strex imm0,imm2,[temp1])
    1034         __(cmp imm0,#0)
    1035         __(bne 3b)
    1036         __(b 8f)
     954        __(b 4f)
    1037955 
    1038956/* arg_z = new value, arg_y = expected old value, arg_x = hash-vector,
     
    1043961        .globl C(egc_set_hash_key_conditional)
    1044962C(egc_set_hash_key_conditional):
    1045         __(vpop1(temp2))
    1046         __(unbox_fixnum(imm1,temp2))
     963        __(vpop1(imm1))
     964        __(unbox_fixnum(imm1,imm1))
    10479650:      __(add imm2,arg_x,imm1)
    1048966        __(ldrex temp1,[imm2])
    1049967        __(cmp temp1,arg_y)
    1050         __(bne 9f)
     968        __(bne 5f)
    1051969        __(strex imm0,arg_z,[imm2])
    1052         .globl C(egc_set_hash_key_conditional_test)
    1053 C(egc_set_hash_key_conditional_test):
    1054970        __(cmp imm0,#0)
    1055971        __(bne 0b)
    1056972        __(cmp arg_z,arg_x)
    1057         __(blo 8f)
     973        __(blo 4f)
    1058974        __(ref_global(temp0,ref_base))
    1059975        __(sub imm0,imm2,temp0)
     
    1061977        __(ref_global(imm1,oldspace_dnode_count))
    1062978        __(cmp imm0,imm1)
    1063         __(bhs 8f)
     979        __(bhs 4f)
    1064980        __(and imm2,imm0,#31)
    1065981        __(mov imm1,#0x80000000)
    1066982        __(mov imm1,imm1,lsr imm2)
    1067983        __(mov imm0,imm0,lsr #bitmap_shift)
    1068         __(ref_global(temp1,refbits))
    1069         __(add temp1,temp1,imm0,lsl #word_shift)
    1070         __(ldr imm2,[temp1])
     984        __(ref_global(temp0,refbits))
     985        __(add temp0,temp0,imm0,lsl #word_shift)
     986        __(ldr imm2,[temp0])
    1071987        __(tst imm2,imm1)
    1072988        __(bxne lr)
    1073 1:      __(ldrex imm2,[temp1])
     9891:      __(ldrex imm2,[temp0])
    1074990        __(orr imm2,imm2,imm1)
    1075         __(strex imm0,imm2,[temp1])
     991        __(strex imm0,imm2,[temp0])
    1076992        __(cmp imm0,#0)
    1077         __(bne 1b)
    1078         __(add imm0,arg_x,temp2,asr #fixnumshift)
    1079         __(sub imm0,imm0,temp0)
    1080         __(mov imm0,imm0,lsr #dnode_shift+8)
    1081         __(and imm2,imm0,#31)
    1082         __(mov imm1,#0x80000000)
    1083         __(mov imm1,imm1,lsr imm2)
    1084         __(mov imm0,imm0,lsr #bitmap_shift)
    1085         __(ref_global(temp1,ephemeral_refidx))
    1086         __(add temp1,temp1,imm0,lsl #word_shift)
    1087 2:      __(ldrex imm2,[temp1])
    1088         __(orr imm2,imm2,imm1)
    1089         __(strex imm0,imm2,[temp1])
    1090         __(cmp imm0,#0)
    1091         __(bne 2b)   
     993        __(bne 1b)       
    1092994/* Now need to ensure that the hash table itself is in the refmap; we
    1093995   know that it's in bounds, etc. */
     996        __(ref_global(temp0,ref_base))
    1094997        __(sub imm0,arg_x,temp0)
    1095998        __(mov imm0,imm0,lsr #dnode_shift)
     
    10981001        __(mov imm1,imm1,lsr imm2)
    10991002        __(mov imm0,imm0,lsr #bitmap_shift)
    1100         __(ref_global(temp1,refbits))
    1101         __(add temp1,temp1,imm0,lsl #word_shift)
    1102         __(ldr imm2,[temp1])
     1003        __(ref_global(temp0,refbits))
     1004        __(add temp0,temp0,imm0,lsl #word_shift)
     1005        __(ldr imm2,[temp0])
    11031006        __(tst imm2,imm1)
    11041007        __(bxne lr)
    1105 3:      __(ldrex imm2,[temp1])
     10081:      __(ldrex imm2,[temp0])
    11061009        __(orr imm2,imm2,imm1)
    1107         __(strex imm0,imm2,[temp1])
     1010        __(strex imm0,imm2,[temp0])
    11081011        __(cmp imm0,#0)
    1109         __(bne 3b)
    1110         __(sub imm0,arg_x,temp0)
    1111         __(mov imm0,imm0,lsr #dnode_shift+8)
    1112         __(and imm2,imm0,#31)
    1113         __(mov imm1,#0x80000000)
    1114         __(mov imm1,imm1,lsr imm2)
    1115         __(mov imm0,imm0,lsr #bitmap_shift)
    1116         __(ref_global(temp1,ephemeral_refidx))
    1117         __(add temp1,temp1,imm0,lsl #word_shift)
    1118 4:      __(ldrex imm2,[temp1])
    1119         __(orr imm2,imm2,imm1)
    1120         __(strex imm0,imm2,[temp1])
    1121         __(cmp imm0,#0)
    1122         __(bne 4b)
    1123        
     1012        __(bne 1b)       
    11241013C(egc_write_barrier_end):
    1125 8:      __(mov arg_z,#nil_value)
     10144:      __(mov arg_z,#nil_value)
    11261015        __(add arg_z,arg_z,#t_offset)
    11271016        __(bx lr)
    1128 9:      __(_clrex(arg_z))
     10175:      __(_clrex(arg_z))
    11291018        __(mov arg_z,#nil_value)
    11301019        __(bx lr)
  • trunk/source/lisp-kernel/bits.c

    r15821 r15826  
    5454}
    5555
    56 /* Note that this zeros natural-sized words */
     56/* Note that this zeros longwords */
    5757void
    5858zero_bits(bitvector bits, natural nbits)
    5959{
    60   natural i, n = (((nbits+(nbits_in_word-1)))>>bitmap_shift);
    61  
    62   for(i=0; i < n; i++) {
    63     bits[i]= 0;
    64   }
     60  memset(bits, 0, ((sizeof(natural)*(((nbits+(nbits_in_word-1)))>>bitmap_shift))));
    6561}
    6662
  • trunk/source/lisp-kernel/constants.h

    r15815 r15826  
    179179#define gc_postgc_pending fixnum_bitmask(26)
    180180
    181 typedef struct {
    182   natural w0;
    183   natural w1;
    184 } dnode;
  • trunk/source/lisp-kernel/gc-common.c

    r15823 r15826  
    10901090}
    10911091
    1092 typedef struct {
    1093   bitvector refidx;
    1094   bitvector refbits;
    1095   bitvector idxp;
    1096   bitvector idxlimit;
    1097   bitvector rangelimit;
    1098   bitvector reflimit;
    1099   bitvector refp;
    1100   natural idx;
    1101   bitvector idxbase;
    1102 } bitidx_state;
    1103 
    1104 natural *
    1105 next_refbits(bitidx_state *s)
    1106 {
    1107   bitvector p, limit;
    1108   natural idxbit, idx;
    1109 
    1110   while (1) {
    1111     p = s->refp;
    1112     limit = s->rangelimit;
    1113     while (p < limit) {
    1114       if (*p) {
    1115         s->refp = p+1;
    1116         return p;
    1117       }
    1118       p++;
    1119     }
    1120     idx = s->idx;
    1121     while (idx == 0) {
    1122       if (s->idxp == s->idxlimit) {
    1123         return NULL;
    1124       }
    1125       idx = *(s->idxp);
    1126       if (idx) {
    1127         s->idx = idx;
    1128         s->idxbase = s->refbits + ((s->idxp - s->refidx) * (WORD_SIZE * (256 / WORD_SIZE)));
    1129       }
    1130       s->idxp++;
    1131     }
    1132     idxbit = count_leading_zeros(idx);
    1133     s->idx &= ~(BIT0_MASK>>idxbit);
    1134     p = s->idxbase + (idxbit * (256/WORD_SIZE));
    1135     s->refp = p;
    1136     s->rangelimit = p + (256/WORD_SIZE);
    1137     if (s->reflimit < s->rangelimit) {
    1138       s->rangelimit = s->reflimit;
    1139     }
    1140   }
    1141 }
    1142 
    1143 void
    1144 init_bitidx_state(bitidx_state *s, bitvector refidx, bitvector refbits, natural ndnodes)
    1145 {
    1146   s->refidx = refidx;
    1147   s->refbits = refbits;
    1148   s->idxp = refidx;
    1149   s->idxlimit = refidx + ((((ndnodes + 255) >> 8) + (WORD_SIZE-1)) >> bitmap_shift);
    1150   s->idx = 0;
    1151   s->reflimit = refbits + ((ndnodes + (WORD_SIZE-1)) >> bitmap_shift);
    1152   s->refp = s->rangelimit = s->idxbase = NULL;
    1153 }
    1154 
    1155 
    1156 void
    1157 forward_memoized_area(area *a, natural num_memo_dnodes, bitvector refbits, bitvector refidx)
    1158 {
    1159   LispObj *p = (LispObj *) a->low, *pbase = p, x1, x2, new;
     1092void
     1093forward_memoized_area(area *a, natural num_memo_dnodes, bitvector refbits)
     1094{
     1095  LispObj *p = (LispObj *) a->low, x1, x2, new;
    11601096#ifdef ARM
    11611097  LispObj *p0 = p;
    11621098#endif
    1163   natural bits, *bitsp, nextbit,  memo_dnode = 0, ref_dnode, hash_dnode_limit = 0;
     1099  natural bits, bitidx, *bitsp, nextbit, diff, memo_dnode = 0, hash_dnode_limit = 0;
    11641100  int tag_x1;
    11651101  hash_table_vector_header *hashp = NULL;
    11661102  Boolean header_p;
    1167   bitidx_state state;
    1168 
    11691103
    11701104
    11711105
    11721106  if (num_memo_dnodes) {
    1173     init_bitidx_state(&state, refidx, refbits, num_memo_dnodes);
    11741107    if (GCDebug) {
    1175       check_refmap_consistency(p, p+(num_memo_dnodes << 1), refbits, refidx);
     1108      check_refmap_consistency(p, p+(num_memo_dnodes << 1), refbits);
    11761109    }
    11771110
     
    11791112       when we move a key in a hash table vector that wants
    11801113       us to tell it about that. */
    1181    
    1182     bits = 0;
    1183     while (1) {
     1114
     1115    set_bitidx_vars(refbits, 0, bitsp, bits, bitidx);
     1116    while (memo_dnode < num_memo_dnodes) {
    11841117      if (bits == 0) {
    1185         bitsp = next_refbits(&state);
    1186         if (bitsp == NULL) {
    1187           return;
    1188         }
    1189         bits = *bitsp;
    1190         ref_dnode = (bitsp-refbits)<<bitmap_shift;
    1191       }
    1192       nextbit = count_leading_zeros(bits);
    1193       bits &= ~(BIT0_MASK>>nextbit);
    1194       memo_dnode = ref_dnode + nextbit;
    1195       p = pbase+(memo_dnode*2);
    1196       x1 = p[0];
    1197       x2 = p[1];
    1198       tag_x1 = fulltag_of(x1);
    1199       header_p = (nodeheader_tag_p(tag_x1));
    1200 
    1201       if (header_p &&
    1202           (header_subtag(x1) == subtag_hash_vector)) {
    1203         hashp = (hash_table_vector_header *) p;
    1204         if (hashp->flags & nhash_track_keys_mask) {
    1205           hash_dnode_limit = memo_dnode + ((header_element_count(x1)+2)>>1);
    1206         } else {
    1207           hashp = NULL;
    1208         }
    1209       }
    1210       if (! header_p) {
    1211         new = node_forwarding_address(x1);
    1212         if (new != x1) {
    1213           *p = new;
     1118        int remain = nbits_in_word - bitidx;
     1119        memo_dnode += remain;
     1120        p += (remain+remain);
     1121        if (memo_dnode < num_memo_dnodes) {
     1122          bits = *++bitsp;
     1123        }
     1124        bitidx = 0;
     1125      } else {
     1126        nextbit = count_leading_zeros(bits);
     1127        if ((diff = (nextbit - bitidx)) != 0) {
     1128          memo_dnode += diff;
     1129          bitidx = nextbit;
     1130          p += (diff+diff);
     1131        }
     1132        x1 = p[0];
     1133        x2 = p[1];
     1134        tag_x1 = fulltag_of(x1);
     1135        bits &= ~(BIT0_MASK >> bitidx);
     1136        header_p = (nodeheader_tag_p(tag_x1));
     1137
     1138        if (header_p &&
     1139            (header_subtag(x1) == subtag_hash_vector)) {
     1140          hashp = (hash_table_vector_header *) p;
     1141          if (hashp->flags & nhash_track_keys_mask) {
     1142            hash_dnode_limit = memo_dnode + ((header_element_count(x1)+2)>>1);
     1143          } else {
     1144            hashp = NULL;
     1145          }
     1146        }
     1147
     1148
     1149        if (! header_p) {
     1150          new = node_forwarding_address(x1);
     1151          if (new != x1) {
     1152            *p = new;
    12141153#ifdef ARM
    1215           /* This is heuristic: the two words before P might be immediate
    1216              data that just happens to look like a function header and
    1217              an unboxed reference to p[0].  That's extremely unlikely,
    1218              but close doesn't count ... Fix this. */
    1219           if (p != p0) {
    1220             if(header_subtag(p[-2]) == subtag_function) {
    1221               /* Just updated the code vector; fix the entrypoint */
    1222               if (p[-1] == (untag(x1)+fulltag_odd_fixnum)) {
    1223                 p[-1] = (untag(new)+fulltag_odd_fixnum);
     1154            if (p != p0) {
     1155              if(header_subtag(p[-2]) == subtag_function) {
     1156                /* Just updated the code vector; fix the entrypoint */
     1157                if (p[-1] == (untag(x1)+fulltag_odd_fixnum)) {
     1158                  p[-1] = (untag(new)+fulltag_odd_fixnum);
     1159                }
    12241160              }
    12251161            }
    1226           }
    12271162#endif
    1228         }
    1229       }
    1230       p++;
    1231      
    1232       new = node_forwarding_address(x2);
    1233       if (new != x2) {
    1234         *p = new;
    1235         if (memo_dnode < hash_dnode_limit) {
    1236           /* If this code is reached, 'hashp' is non-NULL and pointing
    1237              at the header of a hash_table_vector, and 'memo_dnode' identifies
    1238              a pair of words inside the hash_table_vector.  It may be
    1239              hard for program analysis tools to recognize that, but I
    1240              believe that warnings about 'hashp' being NULL here can
    1241              be safely ignored. */
    1242           hashp->flags |= nhash_key_moved_mask;
    1243           hash_dnode_limit = 0;
    1244           hashp = NULL;
    1245         }
     1163          }
     1164        }
     1165        p++;
     1166
     1167        new = node_forwarding_address(x2);
     1168        if (new != x2) {
     1169          *p = new;
     1170          if (memo_dnode < hash_dnode_limit) {
     1171            /* If this code is reached, 'hashp' is non-NULL and pointing
     1172               at the header of a hash_table_vector, and 'memo_dnode' identifies
     1173               a pair of words inside the hash_table_vector.  It may be
     1174               hard for program analysis tools to recognize that, but I
     1175               believe that warnings about 'hashp' being NULL here can
     1176               be safely ignored. */
     1177            hashp->flags |= nhash_key_moved_mask;
     1178            hash_dnode_limit = 0;
     1179            hashp = NULL;
     1180          }
     1181        }
     1182        p++;
     1183        memo_dnode++;
     1184        bitidx++;
     1185
    12461186      }
    12471187    }
     
    13561296}
    13571297
    1358 
    1359 void
    1360 mark_managed_static_refs(area *a, BytePtr low_dynamic_address, natural ndynamic_dnodes, bitvector refidx)
     1298void
     1299mark_managed_static_refs(area *a, BytePtr low_dynamic_address, natural ndynamic_dnodes)
    13611300{
    13621301  bitvector refbits = managed_static_refbits;
    1363   dnode *dnodes = (dnode *)a->low, *d;
    13641302  LispObj *p = (LispObj *) a->low, x1, x2;
    1365   natural inbits, outbits, bits, *bitsp, nextbit, memo_dnode = 0,
    1366     num_memo_dnodes = a->ndnodes, ref_dnode;
     1303  natural inbits, outbits, bits, bitidx, *bitsp, nextbit, diff, memo_dnode = 0,
     1304    num_memo_dnodes = a->ndnodes;
    13671305  Boolean keep_x1, keep_x2;
    1368   bitidx_state state;
    13691306
    13701307  if (num_memo_dnodes) {
    1371     init_bitidx_state(&state, refidx, refbits, num_memo_dnodes);
    1372 
    13731308    if (GCDebug) {
    1374       check_refmap_consistency(p, p+(num_memo_dnodes << 1), refbits, refidx);
     1309      check_refmap_consistency(p, p+(num_memo_dnodes << 1), refbits);
    13751310    }
    13761311
    13771312 
    1378 
    1379 
    1380     inbits = outbits = bits = 0;
    1381     while (1) {
     1313    set_bitidx_vars(refbits, 0, bitsp, bits, bitidx);
     1314    inbits = outbits = bits;
     1315    while (memo_dnode < num_memo_dnodes) {
    13821316      if (bits == 0) {
     1317        int remain = nbits_in_word - bitidx;
     1318        memo_dnode += remain;
     1319        p += (remain+remain);
    13831320        if (outbits != inbits) {
    13841321          *bitsp = outbits;
    13851322        }
    1386         bitsp = next_refbits(&state);
    1387         if (bitsp == NULL) {
    1388           break;
    1389         }
    1390         inbits = outbits = bits = *bitsp;
    1391         ref_dnode = (bitsp-refbits)<<bitmap_shift;
    1392       }
    1393       nextbit = count_leading_zeros(bits);
    1394       bits &= ~(BIT0_MASK>>nextbit);
    1395       memo_dnode = ref_dnode + nextbit;
    1396       d = dnodes+memo_dnode;
    1397       x1 = d->w0;
    1398       x2 = d->w1;
    1399       keep_x1 = mark_static_ref(x1, low_dynamic_address, ndynamic_dnodes);
    1400       keep_x2 = mark_static_ref(x2, low_dynamic_address, ndynamic_dnodes);
    1401       if ((keep_x1 == false) &&
    1402           (keep_x2 == false)) {
    1403         outbits &= ~(BIT0_MASK >> nextbit);
     1323        if (memo_dnode < num_memo_dnodes) {
     1324          bits = *++bitsp;
     1325        }
     1326        inbits = outbits = bits;
     1327        bitidx = 0;
     1328      } else {
     1329        nextbit = count_leading_zeros(bits);
     1330        if ((diff = (nextbit - bitidx)) != 0) {
     1331          memo_dnode += diff;
     1332          bitidx = nextbit;
     1333          p += (diff+diff);
     1334        }
     1335        x1 = *p++;
     1336        x2 = *p++;
     1337        bits &= ~(BIT0_MASK >> bitidx);
     1338        keep_x1 = mark_static_ref(x1, low_dynamic_address, ndynamic_dnodes);
     1339        keep_x2 = mark_static_ref(x2, low_dynamic_address, ndynamic_dnodes);
     1340        if ((keep_x1 == false) &&
     1341            (keep_x2 == false)) {
     1342          outbits &= ~(BIT0_MASK >> bitidx);
     1343        }
     1344        memo_dnode++;
     1345        bitidx++;
    14041346      }
    14051347    }
    14061348    if (GCDebug) {
    14071349      p = (LispObj *) a->low;
    1408       check_refmap_consistency(p, p+(num_memo_dnodes << 1), refbits, NULL);
    1409     }
    1410   }
    1411 }
    1412 
    1413 
    1414 void
    1415 mark_memoized_area(area *a, natural num_memo_dnodes, bitvector refidx)
     1350      check_refmap_consistency(p, p+(num_memo_dnodes << 1), refbits);
     1351    }
     1352  }
     1353}
     1354
     1355void
     1356mark_memoized_area(area *a, natural num_memo_dnodes)
    14161357{
    14171358  bitvector refbits = a->refbits;
    1418   dnode *dnodes = (dnode *)a->low, *d;
    1419   LispObj *p = (LispObj *) a->low,x1, x2;
    1420   natural inbits, outbits, bits, bitidx, *bitsp, nextbit, diff, memo_dnode = 0, ref_dnode = 0;
     1359  LispObj *p = (LispObj *) a->low, x1, x2;
     1360  natural inbits, outbits, bits, bitidx, *bitsp, nextbit, diff, memo_dnode = 0;
    14211361  Boolean keep_x1, keep_x2;
    14221362  natural hash_dnode_limit = 0;
    14231363  hash_table_vector_header *hashp = NULL;
    14241364  int mark_method = 3;
    1425   bitidx_state state;
    1426 
    1427 
    14281365
    14291366  if (num_memo_dnodes) {
    1430     init_bitidx_state(&state, refidx, refbits, num_memo_dnodes);   
    1431    
    14321367    if (GCDebug) {
    1433       check_refmap_consistency(p, p+(num_memo_dnodes << 1), refbits, refidx);
     1368      check_refmap_consistency(p, p+(num_memo_dnodes << 1), refbits);
    14341369    }
    14351370
     
    14391374       or readonly areas is definitely uninteresting, but other cases are
    14401375       more complicated (and some of these cases are hard to detect.)
     1376
    14411377       Some headers are "interesting", to the forwarder if not to us.
    14421378
     
    14611397      }
    14621398    }
    1463      
    1464      
    1465 
    1466     inbits = outbits = bits = 0;
    1467     while (1) {
     1399       
     1400    set_bitidx_vars(refbits, 0, bitsp, bits, bitidx);
     1401    inbits = outbits = bits;
     1402    while (memo_dnode < num_memo_dnodes) {
    14681403      if (bits == 0) {
     1404        int remain = nbits_in_word - bitidx;
     1405        memo_dnode += remain;
     1406        p += (remain+remain);
    14691407        if (outbits != inbits) {
    14701408          *bitsp = outbits;
    14711409        }
    1472         bitsp = next_refbits(&state);
    1473         if (bitsp == NULL) {
    1474           break;
    1475         }
    1476         inbits = outbits = bits = *bitsp;
    1477         ref_dnode = (bitsp-refbits)<<bitmap_shift;
    1478       }
    1479       nextbit = count_leading_zeros(bits);
    1480       bits &= ~(BIT0_MASK >> nextbit);
    1481       memo_dnode = ref_dnode + nextbit;
    1482       d = dnodes+memo_dnode;
    1483       x1 = d->w0;
    1484       x2 = d->w1;
    1485 
    1486 
    1487       if (hashp) {
    1488         Boolean force_x1 = false;
    1489         if ((memo_dnode >= hash_dnode_limit) && (mark_method == 3)) {
    1490           /* if vector_header_count is odd, x1 might be the last word of the header */
    1491           force_x1 = (hash_table_vector_header_count & 1) && (memo_dnode == hash_dnode_limit);
    1492           /* was marking header, switch to data */
    1493           hash_dnode_limit = area_dnode(((LispObj *)hashp)
    1494                                         + 1
    1495                                         + header_element_count(hashp->header),
    1496                                         a->low);
    1497           /* In traditional weak method, don't mark vector entries at all. */
    1498           /* Otherwise mark the non-weak elements only */
    1499           mark_method = ((lisp_global(WEAK_GC_METHOD) == 0) ? 0 :
    1500                          ((hashp->flags & nhash_weak_value_mask)
    1501                           ? (1 + (hash_table_vector_header_count & 1))
    1502                           : (2 - (hash_table_vector_header_count & 1))));
    1503         }
    1504        
    1505         if (memo_dnode < hash_dnode_limit) {
    1506           /* perhaps ignore one or both of the elements */
    1507           if (!force_x1 && !(mark_method & 1)) x1 = 0;
    1508           if (!(mark_method & 2)) x2 = 0;
    1509         } else {
    1510           hashp = NULL;
    1511         }
    1512       }
    1513 
    1514       if (header_subtag(x1) == subtag_hash_vector) {
    1515         if (hashp) Bug(NULL, "header inside hash vector?");
    1516         hash_table_vector_header *hp = (hash_table_vector_header *)d;
    1517         if (hp->flags & nhash_weak_mask) {
    1518           /* Work around the issue that seems to cause ticket:817,
    1519              which is that tenured hash vectors that are weak on value
    1520              aren't always maintained on GCweakvll.  If they aren't and
    1521              we process them weakly here, nothing will delete the unreferenced
    1522              elements. */
    1523           if (!(hp->flags & nhash_weak_value_mask)) {
    1524             /* If header_count is odd, this cuts off the last header field */
    1525             /* That case is handled specially above */
    1526             hash_dnode_limit = memo_dnode + ((hash_table_vector_header_count) >>1);
    1527             hashp = hp;
    1528             mark_method = 3;
    1529           }
    1530         }
    1531       }
    1532 
    1533       keep_x1 = mark_ephemeral_root(x1);
    1534       keep_x2 = mark_ephemeral_root(x2);
    1535       if ((keep_x1 == false) &&
    1536           (keep_x2 == false) &&
    1537           (hashp == NULL)) {
    1538         outbits &= ~(BIT0_MASK >> bitidx);
     1410        if (memo_dnode < num_memo_dnodes) {
     1411          bits = *++bitsp;
     1412        }
     1413        inbits = outbits = bits;
     1414        bitidx = 0;
     1415      } else {
     1416        nextbit = count_leading_zeros(bits);
     1417        if ((diff = (nextbit - bitidx)) != 0) {
     1418          memo_dnode += diff;
     1419          bitidx = nextbit;
     1420          p += (diff+diff);
     1421        }
     1422        x1 = *p++;
     1423        x2 = *p++;
     1424        bits &= ~(BIT0_MASK >> bitidx);
     1425
     1426
     1427        if (hashp) {
     1428          Boolean force_x1 = false;
     1429          if ((memo_dnode >= hash_dnode_limit) && (mark_method == 3)) {
     1430            /* if vector_header_count is odd, x1 might be the last word of the header */
     1431            force_x1 = (hash_table_vector_header_count & 1) && (memo_dnode == hash_dnode_limit);
     1432            /* was marking header, switch to data */
     1433            hash_dnode_limit = area_dnode(((LispObj *)hashp)
     1434                                          + 1
     1435                                          + header_element_count(hashp->header),
     1436                                          a->low);
     1437            /* In traditional weak method, don't mark vector entries at all. */
     1438            /* Otherwise mark the non-weak elements only */
     1439            mark_method = ((lisp_global(WEAK_GC_METHOD) == 0) ? 0 :
     1440                           ((hashp->flags & nhash_weak_value_mask)
     1441                            ? (1 + (hash_table_vector_header_count & 1))
     1442                            : (2 - (hash_table_vector_header_count & 1))));
     1443          }
     1444
     1445          if (memo_dnode < hash_dnode_limit) {
     1446            /* perhaps ignore one or both of the elements */
     1447            if (!force_x1 && !(mark_method & 1)) x1 = 0;
     1448            if (!(mark_method & 2)) x2 = 0;
     1449          } else {
     1450            hashp = NULL;
     1451          }
     1452        }
     1453
     1454        if (header_subtag(x1) == subtag_hash_vector) {
     1455          if (hashp) Bug(NULL, "header inside hash vector?");
     1456          hash_table_vector_header *hp = (hash_table_vector_header *)(p - 2);
     1457          if (hp->flags & nhash_weak_mask) {
     1458            /* Work around the issue that seems to cause ticket:817,
     1459               which is that tenured hash vectors that are weak on value
     1460               aren't always maintained on GCweakvll.  If they aren't and
     1461               we process them weakly here, nothing will delete the unreferenced
     1462               elements. */
     1463            if (!(hp->flags & nhash_weak_value_mask)) {
     1464              /* If header_count is odd, this cuts off the last header field */
     1465              /* That case is handled specially above */
     1466              hash_dnode_limit = memo_dnode + ((hash_table_vector_header_count) >>1);
     1467              hashp = hp;
     1468              mark_method = 3;
     1469            }
     1470          }
     1471        }
     1472
     1473        keep_x1 = mark_ephemeral_root(x1);
     1474        keep_x2 = mark_ephemeral_root(x2);
     1475        if ((keep_x1 == false) &&
     1476            (keep_x2 == false) &&
     1477            (hashp == NULL)) {
     1478          outbits &= ~(BIT0_MASK >> bitidx);
     1479        }
     1480        memo_dnode++;
     1481        bitidx++;
    15391482      }
    15401483    }
    15411484    if (GCDebug) {
    15421485      p = (LispObj *) a->low;
    1543       check_refmap_consistency(p, p+(num_memo_dnodes << 1), refbits, a->refidx);
     1486      check_refmap_consistency(p, p+(num_memo_dnodes << 1), refbits);
    15441487    }
    15451488  }
     
    17431686
    17441687    if (GCephemeral_low) {
    1745       mark_memoized_area(tenured_area, area_dnode(a->low,tenured_area->low), tenured_area->refidx);
    1746       mark_memoized_area(managed_static_area,managed_static_area->ndnodes, managed_static_area->refidx);
     1688      mark_memoized_area(tenured_area, area_dnode(a->low,tenured_area->low));
     1689      mark_memoized_area(managed_static_area,managed_static_area->ndnodes);
    17471690    } else {
    1748       mark_managed_static_refs(managed_static_area,low_markable_address,area_dnode(a->active,low_markable_address), managed_static_refidx);
     1691      mark_managed_static_refs(managed_static_area,low_markable_address,area_dnode(a->active,low_markable_address));
    17491692    }
    17501693    other_tcr = tcr;
     
    18791822
    18801823    if (GCephemeral_low) {
    1881       forward_memoized_area(tenured_area, area_dnode(a->low, tenured_area->low), tenured_area->refbits, tenured_area->refidx);
    1882       forward_memoized_area(managed_static_area,managed_static_area->ndnodes, managed_static_area->refbits, managed_static_area->refidx);
     1824      forward_memoized_area(tenured_area, area_dnode(a->low, tenured_area->low), tenured_area->refbits);
     1825      forward_memoized_area(managed_static_area,managed_static_area->ndnodes, managed_static_area->refbits);
    18831826    } else {
    1884       forward_memoized_area(managed_static_area,area_dnode(managed_static_area->active,managed_static_area->low),managed_static_refbits, managed_static_refidx);
     1827      forward_memoized_area(managed_static_area,area_dnode(managed_static_area->active,managed_static_area->low),managed_static_refbits);
    18851828    }
    18861829    a->active = (BytePtr) ptr_from_lispobj(compact_dynamic_heap());
  • trunk/source/lisp-kernel/gc.h

    r15823 r15826  
    6464extern LispObj GCarealow, GCareadynamiclow;
    6565extern natural GCndnodes_in_area, GCndynamic_dnodes_in_area;
    66 extern bitvector GCmarkbits, GCdynamic_markbits,managed_static_refbits,global_refidx,dynamic_refidx,managed_static_refidx;
     66extern bitvector GCmarkbits, GCdynamic_markbits,managed_static_refbits;
    6767LispObj *global_reloctab, *GCrelocptr;
    6868LispObj GCfirstunmarked;
     
    187187void update_locref(LispObj *);
    188188void forward_gcable_ptrs(void);
    189 void forward_memoized_area(area *, natural, bitvector, bitvector);
    190 
     189void forward_memoized_area(area *, natural, bitvector);
    191190void forward_tcr_tlb(TCR *);
    192191void reclaim_static_dnodes(void);
     
    215214LispObj dnode_forwarding_address(natural, int);
    216215LispObj locative_forwarding_address(LispObj);
    217 void check_refmap_consistency(LispObj *, LispObj *, bitvector, bitvector);
     216void check_refmap_consistency(LispObj *, LispObj *, bitvector);
    218217void check_all_areas(TCR *);
    219218void mark_tstack_area(area *);
     
    221220void mark_cstack_area(area *);
    222221void mark_simple_area_range(LispObj *, LispObj *);
    223 void mark_memoized_area(area *, natural, bitvector);
     222void mark_memoized_area(area *, natural);
    224223LispObj calculate_relocation(void);
    225224void forward_range(LispObj *, LispObj *);
     
    254253did_gc_notification_since_last_full_gc;
    255254
    256 
    257 
    258255#endif                          /* __GC_H__ */
  • trunk/source/lisp-kernel/image.c

    r15823 r15826  
    282282                   fd)) {
    283283        return;
    284       }
    285       /* Should change image format and store this in the image */
    286       {
    287         natural ndnodes = area_dnode(a->active, a->low), i;
    288         if (!CommitMemory(managed_static_refidx,(((ndnodes +255)>>8)+7)>>3)) {
    289           return;
    290         }
    291         for (i=0; i < ndnodes; i++) {
    292           if (ref_bit(managed_static_refbits,i)) {
    293             set_bit(managed_static_refidx,i>>8);
    294           }
    295         }
    296284      }
    297285      advance += refbits_size;
  • trunk/source/lisp-kernel/lisp_globals.h

    r15823 r15826  
    7878#define MANAGED_STATIC_REFBITS (-50) /* refs from managed_static to dynamic */
    7979#define MANAGED_STATIC_DNODES (-51) /* ndnodes in managed_static_area */
    80 #define EPHEMERAL_REFIDX      (-52) /* compressed refmap to ephmeral space */
    81 #define MANAGED_STATIC_REFIDX (-53) /* compressed refmap from managed static to dynamic */
    8280
    83 #define MIN_KERNEL_GLOBAL MANAGED_STATIC_REFIDX
     81
     82
     83#define MIN_KERNEL_GLOBAL MANAGED_STATIC_DNODES
    8484
    8585/* These are only non-zero when an image is being saved or loaded */
  • trunk/source/lisp-kernel/lisp_globals.s

    r15823 r15826  
    212212         _rnode(managed_static_refbits) /* refs from managed_static to dynamic */
    213213         _rnode(managed_static_dnodes) /* ndnodes in managed_static_area */
    214          _rnode(ephemeral_refidx) /* index of refbits */
    215          _rnode(managed_static_refidx) /* index of managed_static_refbits */
    216214        _ends
    217215
  • trunk/source/lisp-kernel/mach-o-image.c

    r15823 r15826  
    712712  void *lib;
    713713  LispObj image_nil = 0;
    714   natural i;
    715714
    716715  /* Because of the way that we've reserved memory, we can only
     
    844843    CommitMemory(global_mark_ref_bits,align_to_power_of_2(nrefbytes, 12));
    845844    CommitMemory(managed_static_refbits,align_to_power_of_2(nrefbytes, 12));
    846     CommitMemory(managed_static_refidx,(managed_static_area->ndnodes+255)>>3);
    847845    memcpy(managed_static_refbits,ms_end,nrefbytes);
    848846    memset(ms_end,0,nrefbytes);
    849     for (i = 0; i < managed_static_area->ndnodes; i++) {
    850       if (ref_bit(managed_static_refbits,i)) {
    851         set_bit(managed_static_refidx,i>>8);
    852       }
    853     }
     847   
    854848    return image_nil;
    855849  }
  • trunk/source/lisp-kernel/memory.c

    r15823 r15826  
    406406}
    407407
    408 void
    409 zero_refbits(bitvector refidx, bitvector refbits, natural ndnodes)
    410 {
    411   bitvector refbase = refbits, refword, limit = refbase + ((ndnodes + (WORD_SIZE-1)) >> node_shift), reflimit;
    412   natural i, n = (((ndnodes + 255) >> 8) + (WORD_SIZE-1)) >> bitmap_shift, bit, idx;
    413 
    414   for (i = 0; i < n; i++, refbase += WORD_SIZE * (256 / WORD_SIZE)) {
    415     idx = *refidx;
    416    
    417     if (idx != 0) {
    418       *refidx = 0;
    419       while (idx) {
    420         bit = count_leading_zeros(idx);
    421         idx &= ~(BIT0_MASK>>bit);
    422         refword = refbase + bit * (256/WORD_SIZE);
    423         reflimit = refword + (256/WORD_SIZE);
    424         if (limit < reflimit) {
    425           reflimit = limit;
    426         }
    427         while (refword < reflimit) {
    428           *refword++ = 0;
    429         }
    430       }
    431     }
    432     refidx++;
    433   }
    434 #if 0
    435   /* Check,slowly */
    436   for (i=0;i<ndnodes;i++) {
    437     if (ref_bit(refbits,i)) {
    438       Bug(NULL, "Bit 0x" LISP " set unexpectedly\n", i);
    439     }
    440   }
    441 #endif
    442 }
    443 
    444408
    445409 
     
    690654 
    691655  if (target == tenured_area) {
    692     zero_refbits(global_refidx,managed_static_area->refbits, managed_static_area->ndnodes);
    693656    zero_bits(refbits, new_tenured_dnodes);
    694     zero_bits(dynamic_refidx,(new_tenured_dnodes+255)>>8);
    695657    lisp_global(OLDEST_EPHEMERAL) = ptr_to_lispobj(curfree);
    696658  } else {
     
    925887}
    926888
    927 
    928    
    929 
    930  
    931889#ifdef DARWIN
    932890/*
  • trunk/source/lisp-kernel/memprotect.h

    r15823 r15826  
    129129
    130130
    131 void
    132 initialize_refidx_from_refbits(bitvector, bitvector, natural);
    133131 
    134132#endif /* __memprotect_h__ */
  • trunk/source/lisp-kernel/pmcl-kernel.c

    r15823 r15826  
    136136
    137137LispObj lisp_nil = (LispObj) 0;
    138 bitvector global_mark_ref_bits = NULL, dynamic_mark_ref_bits = NULL, relocatable_mark_ref_bits = NULL, global_refidx = NULL, dynamic_refidx = NULL,managed_static_refidx = NULL;
     138bitvector global_mark_ref_bits = NULL, dynamic_mark_ref_bits = NULL, relocatable_mark_ref_bits = NULL;
    139139
    140140
     
    290290    a->hardlimit = base+hardsize;
    291291    a->softlimit = base+hardsize+softsize;
     292    a->h = h;
    292293    a->softprot = soft_area;
    293294    a->hardprot = hard_area;
     
    525526{
    526527  Ptr h;
    527   natural base, refbits_size;
     528  natural base;
    528529  BytePtr
    529530    end,
     
    571572  end = lastbyte;
    572573  reserved_region_end = lastbyte;
    573   refbits_size = ((totalsize+63)>>6); /* word size! */
    574   end = (BytePtr) ((natural)((((natural)end) - refbits_size) & ~4095));
     574  end = (BytePtr) ((natural)((((natural)end) - ((totalsize+63)>>6)) & ~4095));
    575575
    576576  global_mark_ref_bits = (bitvector)end;
    577   end  = (BytePtr) ((natural)((((natural)end) - ((refbits_size+255) >> 8)) & ~4095));
    578   global_refidx = (bitvector)end;
    579   /* Don't really want to commit so much so soon */
    580   CommitMemory((BytePtr)global_refidx,(BytePtr)global_mark_ref_bits-(BytePtr)global_refidx);
    581    
    582577  end = (BytePtr) ((natural)((((natural)end) - ((totalsize+63) >> 6)) & ~4095));
    583578  global_reloctab = (LispObj *) end;
     
    597592      exit(1);
    598593    }
    599     managed_static_refidx = ReserveMemory(((((MANAGED_STATIC_SIZE>>dnode_shift)+255)>>8)+7)>>3);
    600     if (managed_static_refidx == NULL) {
    601 #ifdef WINDOWS
    602       wperror("allocate refidx for managed static area");
    603 #else
    604       perror("allocate refidx for managed static area");
    605 #endif
    606       exit(1);
    607     }     
    608594  }
    609595#endif
     
    657643    prefix_size = (prefix_dnodes+7)>>3,
    658644    markbits_size = (3*sizeof(LispObj))+((ndnodes+7)>>3),
    659     prefix_index_bits,
    660645    n;
    661646  low_markable_address = low;
    662647  high_markable_address = high;
    663648  dynamic_mark_ref_bits = (bitvector)(((BytePtr)global_mark_ref_bits)+prefix_size);
    664   if (prefix_dnodes & 255) {
    665     fprintf(dbgout, "warning: prefix_dnodes not a multiple of 256\n");
    666   }
    667   prefix_index_bits = prefix_dnodes>>8;
    668   if (prefix_index_bits & (WORD_SIZE-1)) {
    669     fprintf(dbgout, "warning: prefix_index_bits not a multiple of %d\n", WORD_SIZE);
    670   }
    671   dynamic_refidx = (bitvector)(((BytePtr)global_refidx)+(prefix_index_bits>>3));
    672649  relocatable_mark_ref_bits = dynamic_mark_ref_bits;
    673650  n = align_to_power_of_2(markbits_size,log2_page_size);
     
    745722  add_area_holding_area_lock(a);
    746723  CommitMemory(start, end-start);
     724  a->h = start;
    747725  a->softprot = NULL;
    748726  a->hardprot = NULL;
     
    17701748    tenured_area->younger = g2_area;
    17711749    tenured_area->refbits = dynamic_mark_ref_bits;
    1772     tenured_area->refidx = dynamic_refidx;
    17731750    managed_static_area->refbits = global_mark_ref_bits;
    1774     managed_static_area->refidx = global_refidx;
    17751751    a->markbits = dynamic_mark_ref_bits;
    17761752    tenured_area->static_dnodes = a->static_dnodes;
     
    17811757    lisp_global(STATIC_CONS_AREA) = ptr_to_lispobj(static_cons_area);
    17821758    lisp_global(REFBITS) = ptr_to_lispobj(global_mark_ref_bits);
    1783     lisp_global(EPHEMERAL_REFIDX) = ptr_to_lispobj(global_refidx);
    17841759    g2_area->threshold = default_g2_threshold;
    17851760    g1_area->threshold = default_g1_threshold;
     
    20882063  }
    20892064  lisp_global(MANAGED_STATIC_REFBITS) = (LispObj)managed_static_refbits;
    2090   lisp_global(MANAGED_STATIC_REFIDX) = (LispObj)managed_static_refidx;
    20912065  lisp_global(MANAGED_STATIC_DNODES) = (LispObj)managed_static_area->ndnodes;
    20922066  atexit(lazarus);
  • trunk/source/lisp-kernel/ppc-exceptions.c

    r15816 r15826  
    19991999          ((LispObj)ea < val)) {
    20002000        atomic_set_bit(refbits, bitnumber);
    2001         atomic_set_bit(global_refidx, bitnumber>>8);
    20022001        if (need_memoize_root) {
    20032002          bitnumber = area_dnode(root, lisp_global(REF_BASE));
    20042003          atomic_set_bit(refbits, bitnumber);
    2005           atomic_set_bit(global_refidx,bitnumber>>8);
    20062004        }
    20072005      }
  • trunk/source/lisp-kernel/ppc-gc.c

    r15821 r15826  
    832832
    833833void
    834 check_refmap_consistency(LispObj *start, LispObj *end, bitvector refbits, bitvector refidx)
     834check_refmap_consistency(LispObj *start, LispObj *end, bitvector refbits)
    835835{
    836836  LispObj x1, *base = start, *prev = start;
     
    875875        Bug(NULL, "Missing memoization in doublenode at 0x" LISP "\n", start);
    876876        set_bit(refbits, ref_dnode);
    877         if (refidx) {
    878           set_bit(refidx,ref_dnode>>8);
    879         }
    880       } else {
    881         if (refidx) {
    882           if (!ref_bit(refidx, ref_dnode>>8)) {
    883             Bug(NULL, "Memoization for doublenode at 0x" LISP " not indexed\n", start);
    884             set_bit(refidx,ref_dnode>>8);
    885           }
    886         }
    887877      }
    888878    }
  • trunk/source/lisp-kernel/ppc-spentry.s

    r15817 r15826  
    481481        __(sub imm0,arg_y,imm2)
    482482        __(load_highbit(imm3))
    483         __(srri(imm0,imm0,dnode_shift))
    484         __(srri(imm2,imm0,8))       
     483        __(srri(imm0,imm0,dnode_shift))       
    485484        __(ref_global(imm1,oldspace_dnode_count))
    486485        __(extract_bit_shift_count(imm4,imm0))
     
    488487        __(srr(imm3,imm3,imm4))
    489488        __(srri(imm0,imm0,bitmap_shift))       
    490         __(ref_global(temp0,refbits))
     489        __(ref_global(imm2,refbits))
    491490        __(bgelr)
    492491        __(slri(imm0,imm0,word_shift))
    493         __(ldrx(imm1,temp0,imm0))
     492        __(ldrx(imm1,imm2,imm0))
    494493        __(and. imm1,imm1,imm3)
    495494        __(bnelr)
    496 1:      __(lrarx(imm1,temp0,imm0))
     4951:      __(lrarx(imm1,imm2,imm0))
    497496        __(or imm1,imm1,imm3)
    498         __(strcx(imm1,temp0,imm0))
     497        __(strcx(imm1,imm2,imm0))
    499498        __(bne- 1b)
    500499        __(isync)
    501         __(extract_bit_shift_count(imm4,imm2))
    502         __(srri(imm2,imm2,bitmap_shift))
    503         __(load_highbit(imm3))
    504         __(ref_global(temp0,ephemeral_refidx))
    505         __(slri(imm2,imm2,word_shift))
    506         __(srr(imm3,imm3,imm4))
    507 2:      __(lrarx(imm1,temp0,imm2))
    508         __(or imm1,imm1,imm3)
    509         __(strcx(imm1,temp0,imm2))
    510         __(bne 2b)
    511         __(isync)       
    512500        __(blr)
    513501
     
    527515        __(extract_bit_shift_count(imm4,imm0))
    528516        __(cmplr(imm0,imm1))
    529         __(srri(imm2,imm0,8))
    530517        __(srr(imm3,imm3,imm4))
    531518        __(srri(imm0,imm0,bitmap_shift))       
    532         __(ref_global(temp0,refbits))
     519        __(ref_global(imm2,refbits))
    533520        __(bgelr)
    534521        __(slri(imm0,imm0,word_shift))
    535         __(ldrx(imm1,temp0,imm0))
     522        __(ldrx(imm1,imm2,imm0))
    536523        __(and. imm1,imm1,imm3)
    537524        __(bnelr)       
    538 1:      __(lrarx(imm1,temp0,imm0))
     5251:      __(lrarx(imm1,imm2,imm0))
    539526        __(or imm1,imm1,imm3)
    540         __(strcx(imm1,temp0,imm0))
     527        __(strcx(imm1,imm2,imm0))
    541528        __(bne- 1b)
    542529        __(isync)
    543         __(extract_bit_shift_count(imm4,imm2))
    544         __(srri(imm2,imm2,bitmap_shift))
    545         __(load_highbit(imm3))
    546         __(ref_global(temp0,ephemeral_refidx))
    547         __(slri(imm2,imm2,word_shift))
    548         __(srr(imm3,imm3,imm4))
    549 2:      __(lrarx(imm1,temp0,imm2))
    550         __(or imm1,imm1,imm3)
    551         __(strcx(imm1,temp0,imm2))
    552         __(bne 2b)
    553         __(isync)       
    554530        __(blr)
    555531
     
    572548        __(srri(imm0,imm0,dnode_shift))       
    573549        __(cmplr(imm0,imm1))
    574         __(srri(imm2,imm0,8))
    575550        __(extract_bit_shift_count(imm4,imm0))
    576551        __(srri(imm0,imm0,bitmap_shift))       
    577552        __(srr(imm3,imm3,imm4))
    578         __(ref_global(temp0,refbits))
     553        __(ref_global(imm2,refbits))
    579554        __(bgelr)
    580555        __(slri(imm0,imm0,word_shift))
    581         __(ldrx(imm1,temp0,imm0))
     556        __(ldrx(imm1,imm2,imm0))
    582557        __(and. imm1,imm1,imm3)
    583558        __(bnelr)       
    584 1:      __(lrarx(imm1,temp0,imm0))
     5591:      __(lrarx(imm1,imm2,imm0))
    585560        __(or imm1,imm1,imm3)
    586         __(strcx(imm1,temp0,imm0))
     561        __(strcx(imm1,imm2,imm0))
    587562        __(bne- 1b)
    588563        __(isync)
    589         __(extract_bit_shift_count(imm4,imm2))
    590         __(srri(imm2,imm2,bitmap_shift))
    591         __(load_highbit(imm3))
    592         __(ref_global(temp0,ephemeral_refidx))
    593         __(slri(imm2,imm2,word_shift))
    594         __(srr(imm3,imm3,imm4))
    595 2:      __(lrarx(imm1,temp0,imm2))
    596         __(or imm1,imm1,imm3)
    597         __(strcx(imm1,temp0,imm2))
    598         __(bne 2b)
    599         __(isync)       
    600564        __(blr)
    601565
     
    619583        __(srri(imm0,imm0,dnode_shift))       
    620584        __(cmplr(imm0,imm1))
    621         __(srri(imm2,imm0,8))
    622585        __(extract_bit_shift_count(imm4,imm0))
    623586        __(srri(imm0,imm0,bitmap_shift))       
    624587        __(srr(imm3,imm3,imm4))
    625         __(ref_global(temp0,refbits))
    626         __(ref_global(temp1,ephemeral_refidx))
     588        __(ref_global(imm2,refbits))
    627589        __(bgelr)
    628590        __(slri(imm0,imm0,word_shift))
    629         __(ldrx(imm1,temp0,imm0))
     591        __(ldrx(imm1,imm2,imm0))
    630592        __(and. imm1,imm1,imm3)
    631         __(bne 3f)       
    632 1:      __(lrarx(imm1,temp0,imm0))
     593        __(bne 2f)       
     5941:      __(lrarx(imm1,imm2,imm0))
    633595        __(or imm1,imm1,imm3)
    634         __(strcx(imm1,temp0,imm0))
     596        __(strcx(imm1,imm2,imm0))
    635597        __(bne- 1b)
    636598        __(isync)
    637         __(load_highbit(imm3))
    638         __(extract_bit_shift_count(imm4,imm2))
    639         __(srri(imm2,imm2,bitmap_shift))
    640         __(srr(imm3,imm3,imm4))
    641         __(slri(imm2,imm2,word_shift))
    642 2:      __(lrarx(imm1,temp1,imm2))
    643         __(or imm1,imm1,imm3)
    644         __(strcx(imm1,temp1,imm2))
    645         __(bne 2b)
    646         __(isync)       
    647 3:             
     5992:             
    648600        __(ref_global(imm1,ref_base))
    649601        __(sub imm0,arg_x,imm1)
    650602        __(srri(imm0,imm0,dnode_shift))
    651         __(srri(imm2,imm0,8))
    652603        __(load_highbit(imm3))
    653604        __(extract_bit_shift_count(imm4,imm0))
     
    655606        __(srr(imm3,imm3,imm4))
    656607        __(slri(imm0,imm0,word_shift))
    657         __(ldrx(imm1,temp0,imm0))
     608        __(ldrx(imm1,imm2,imm0))
    658609        __(and. imm1,imm1,imm3)
    659610        __(bnelr)
    660 4:      __(lrarx(imm1,temp0,imm0))
     6113:      __(lrarx(imm1,imm2,imm0))
    661612        __(or imm1,imm1,imm3)
    662         __(strcx(imm1,temp0,imm0))
    663         __(bne- 4b)
     613        __(strcx(imm1,imm2,imm0))
     614        __(bne- 3b)
    664615        __(isync)
    665         __(load_highbit(imm3))
    666         __(extract_bit_shift_count(imm4,imm2))
    667         __(srri(imm2,imm2,bitmap_shift))
    668         __(srr(imm3,imm3,imm4))
    669         __(slri(imm2,imm2,word_shift))
    670 5:      __(lrarx(imm1,temp1,imm2))
    671         __(or imm1,imm1,imm3)
    672         __(strcx(imm1,temp1,imm2))
    673         __(bne 5b)
    674         __(isync)       
    675616        __(blr)
    676617       
     
    7026431:      __(lrarx(temp1,arg_x,imm4))
    703644        __(cmpr(cr1,temp1,arg_y))
    704         __(bne cr1,9f)
     645        __(bne cr1,5f)
    705646        __(strcx(arg_z,arg_x,imm4))
    706647        .globl C(egc_store_node_conditional_test)
     
    715656        __(srri(imm0,imm0,dnode_shift))       
    716657        __(cmplr(imm0,imm1))
    717         __(srri(imm2,imm0,8))
    718         __(extract_bit_shift_count(imm4,imm0))
     658        __(extract_bit_shift_count(imm2,imm0))
    719659        __(srri(imm0,imm0,bitmap_shift))       
    720         __(srr(imm3,imm3,imm4))
    721         __(ref_global(temp0,refbits))
    722         __(bge 8f)
     660        __(srr(imm3,imm3,imm2))
     661        __(ref_global(imm2,refbits))
     662        __(bge 4f)
    723663        __(slri(imm0,imm0,word_shift))
    724 2:      __(lrarx(imm1,temp0,imm0))
     6642:      __(lrarx(imm1,imm2,imm0))
    725665        __(or imm1,imm1,imm3)
    726         __(strcx(imm1,temp0,imm0))
     666        __(strcx( imm1,imm2,imm0))
    727667        __(bne- 2b)
    728668        __(isync)
    729         __(load_highbit(imm3))
    730         __(extract_bit_shift_count(imm4,imm2))
    731         __(srri(imm2,imm2,bitmap_shift))
    732         __(ref_global(temp0,ephemeral_refidx))
    733         __(srr(imm3,imm3,imm4))
    734         __(slri(imm2,imm2,word_shift))
    735 3:      __(lrarx(imm1,temp0,imm2))
    736         __(or imm1,imm1,imm3)
    737         __(strcx(imm1,temp0,imm2))
    738         __(bne 3b)
    739         __(isync)       
    740         __(b 8f)
     669        __(b 4f)
    741670
    742671/* arg_z = new value, arg_y = expected old value, arg_x = hash-vector,
     
    7526811:      __(lrarx(temp1,arg_x,imm4))
    753682        __(cmpr(cr1,temp1,arg_y))
    754         __(bne cr1,9f)
     683        __(bne cr1,5f)
    755684        __(strcx(arg_z,arg_x,imm4))
    756685        .globl C(egc_set_hash_key_conditional_test)
     
    765694        __(srri(imm0,imm0,dnode_shift))
    766695        __(cmplr(imm0,imm1))
    767         __(srri(imm2,imm0,8))
    768         __(extract_bit_shift_count(imm4,imm0))
    769         __(srri(imm0,imm0,bitmap_shift))       
    770         __(srr(imm3,imm3,imm4))
    771         __(ref_global(temp0,refbits))
    772         __(ref_global(temp1,ephemeral_refidx))
    773         __(bge 8f)
     696        __(extract_bit_shift_count(imm2,imm0))
     697        __(srri(imm0,imm0,bitmap_shift))
     698        __(srr(imm3,imm3,imm2))
     699        __(ref_global(imm2,refbits))
     700        __(bge 4f)
    774701        __(slri(imm0,imm0,word_shift))
    775 2:      __(lrarx(imm1,temp0,imm0))
     7022:      __(lrarx(imm1,imm2,imm0))
    776703        __(or imm1,imm1,imm3)
    777         __(strcx(imm1,temp0,imm0))
     704        __(strcx(imm1,imm2,imm0))
    778705        __(bne- 2b)
    779706        __(isync)
    780         __(load_highbit(imm3))
    781         __(extract_bit_shift_count(imm4,imm2))
    782         __(srri(imm2,imm2,bitmap_shift))
    783         __(srr(imm3,imm3,imm4))
    784         __(slri(imm2,imm2,word_shift))
    785 3:      __(lrarx(imm1,temp1,imm2))
    786         __(or imm1,imm1,imm3)
    787         __(strcx(imm1,temp1,imm2))
    788         __(bne 3b)
    789         __(isync)       
    790        
    791707        /* Memoize hash table header */         
    792708        __(ref_global(imm1,ref_base))
     
    794710        __(srri(imm0,imm0,dnode_shift))
    795711        __(load_highbit(imm3))
    796         __(srri(imm2,imm0,8))
    797712        __(extract_bit_shift_count(imm4,imm0))
    798713        __(srri(imm0,imm0,bitmap_shift))
    799714        __(srr(imm3,imm3,imm4))
    800715        __(slri(imm0,imm0,word_shift))
    801         __(ldrx(imm1,temp0,imm0))
     716        __(ldrx(imm1,imm2,imm0))
    802717        __(and. imm1,imm1,imm3)
    803         __(bne 8f)
    804 4:      __(lrarx(imm1,temp0,imm0))
     718        __(bne 4f)
     7193:      __(lrarx(imm1,imm2,imm0))
    805720        __(or imm1,imm1,imm3)
    806         __(strcx(imm1,temp0,imm0))
    807         __(bne- 4b)
    808         __(isync)
    809         __(load_highbit(imm3))
    810         __(extract_bit_shift_count(imm4,imm2))
    811         __(srri(imm2,imm2,bitmap_shift))
    812         __(srr(imm3,imm3,imm4))
    813         __(slri(imm2,imm2,word_shift))
    814 5:      __(lrarx(imm1,temp1,imm2))
    815         __(or imm1,imm1,imm3)
    816         __(strcx(imm1,temp1,imm2))
    817         __(bne 5b)
     721        __(strcx(imm1,imm2,imm0))
     722        __(bne- 3b)
    818723        __(isync)
    819724C(egc_write_barrier_end):
    820 8:      __(li arg_z,t_value)
    821         __(blr)
    822 9:      __(li imm0,RESERVATION_DISCHARGE)
     7254:      __(li arg_z,t_value)
     726        __(blr)
     7275:      __(li imm0,RESERVATION_DISCHARGE)
    823728        __(strcx(rzero,0,imm0))
    824729        __(li arg_z,nil_value)
  • trunk/source/lisp-kernel/x86-exceptions.c

    r15823 r15826  
    27602760        if ((bitnumber < lisp_global(OLDSPACE_DNODE_COUNT))) {
    27612761          atomic_set_bit(refbits, bitnumber);
    2762           atomic_set_bit(global_refidx,bitnumber>>8);
    27632762          if (need_memoize_root) {
    27642763            atomic_set_bit(refbits, rootbitnumber);
    2765             atomic_set_bit(global_refidx,rootbitnumber>>8);
    27662764          }
    27672765        }
    27682766        if (bitnumber < lisp_global(MANAGED_STATIC_DNODES)) {
    27692767          atomic_set_bit(managed_static_refbits,bitnumber);
    2770           atomic_set_bit(managed_static_refidx,bitnumber>>8);
    27712768          if (need_memoize_root) {
    27722769            atomic_set_bit(managed_static_refbits, rootbitnumber);
    2773             atomic_set_bit(managed_static_refidx,rootbitnumber>>8);
    27742770          }
    27752771        }
  • trunk/source/lisp-kernel/x86-gc.c

    r15823 r15826  
    12161216
    12171217void
    1218 check_refmap_consistency(LispObj *start, LispObj *end, bitvector refbits, bitvector refidx)
     1218check_refmap_consistency(LispObj *start, LispObj *end, bitvector refbits)
    12191219{
    12201220  LispObj x1, *base = start, *prev = start;
     
    12731273          Bug(NULL, "Missing memoization in doublenode at 0x" LISP "\n", start);
    12741274          set_bit(refbits, ref_dnode);
    1275           if (refidx) {
    1276             set_bit(refidx, ref_dnode>>8);
    1277           }
    1278         } else {
    1279           if (refidx) {
    1280             if (!ref_bit(refidx, ref_dnode>>8)) {
    1281               Bug(NULL, "Memoization for doublenode at 0x" LISP " not indexed\n", start);
    1282               set_bit(refidx,ref_dnode>>8);
    1283             }
    1284           }
    12851275        }
    12861276      }
     
    26882678    *base = start, *prev = start;
    26892679  int tag;
    2690   bitvector refbits = managed_static_refbits, refidx = managed_static_refidx;
     2680  bitvector refbits = managed_static_refbits;
    26912681  natural ref_dnode, node_dnode;
    26922682  Boolean intergen_ref;
     
    27322722        ref_dnode = area_dnode(start, base);
    27332723        set_bit(refbits, ref_dnode);
    2734         set_bit(refidx, ref_dnode>>8);
    27352724      }
    27362725      start += 2;
     
    28392828        CommitMemory(managed_static_area->refbits, refbytes); /* zeros them */
    28402829        CommitMemory(managed_static_refbits,refbytes); /* zeroes them, too */
    2841         CommitMemory(managed_static_refidx,((managed_dnodes+255)>>8)>>3);
    28422830        update_managed_refs(managed_static_area, low_markable_address, area_dnode(a->active,low_markable_address));
    28432831      }
  • trunk/source/lisp-kernel/x86-spentry32.s

    r15823 r15826  
    17321732        __(cmpl lisp_global(oldspace_dnode_count),%imm0)
    17331733        __(jae 2f)
    1734         __(movd %imm0,%mm0)
    17351734        __(ref_global(refbits,%temp0))
    17361735        __(xorb $31,%imm0_b)
    17371736        __(lock)
    17381737        __(btsl %imm0,(%temp0))
    1739         __(shrl $8,%imm0)
    17401738        __(xorb $31,%imm0_b)
    1741         __(ref_global(ephemeral_refidx,%temp0))
    1742         __(lock)
    1743         __(btsl %imm0,(%temp0))
    1744         __(movd %mm0,%imm0)
    174517392:      __(cmpl lisp_global(managed_static_dnodes),%imm0)
    17461740        __(jae 0b)
    17471741        __(ref_global(managed_static_refbits,%temp0))
    1748         __(xorb $31,%imm0_b)
    1749         __(lock)
    1750         __(btsl %imm0,(%temp0))
    1751         __(ref_global(managed_static_refidx,%temp0))
    1752         __(shrl $8,%imm0)
    17531742        __(xorb $31,%imm0_b)
    17541743        __(lock)
     
    17701759        __(cmpl lisp_global(oldspace_dnode_count),%imm0)
    17711760        __(jae 2f)
    1772         __(movd %imm0,%mm0)
    17731761        __(ref_global(refbits,%temp0))
    17741762        __(xorb $31,%imm0_b)
    17751763        __(lock)
    17761764        __(btsl %imm0,(%temp0))
    1777         __(shrl $8,%imm0)
    1778         __(xorb $31,%imm0_b)
    1779         __(ref_global(ephemeral_refidx,%temp0))
    1780         __(lock)
    1781         __(btsl %imm0,(%temp0))
    1782         __(movd %mm0,%imm0)
     1765        __(xorb $31,%imm0_b)       
    178317662:      __(cmpl lisp_global(managed_static_dnodes),%imm0)
    17841767        __(jae 0b)
     
    17871770        __(lock)
    17881771        __(btsl %imm0,(%temp0))       
    1789         __(ref_global(managed_static_refidx,%temp0))
    1790         __(shrl $8,%imm0)
    1791         __(xorb $31,%imm0_b)
    1792         __(lock)
    1793         __(btsl %imm0,(%temp0))       
    17941772        __(ret)
    17951773_endsubp(rplacd)
     
    18101788        __(cmpl lisp_global(oldspace_dnode_count),%imm0)
    18111789        __(jae 2f)
    1812         __(movd %imm0,%mm0)
    18131790        __(ref_global(refbits,%temp1))
    18141791        __(xorb $31,%imm0_b)
    18151792        __(lock)
    18161793        __(btsl %imm0,(%temp1))
    1817         __(shrl $8,%imm0)
    18181794        __(xorb $31,%imm0_b)
    1819         __(ref_global(ephemeral_refidx,%temp1))
    1820         __(lock)
    1821         __(btsl %imm0,(%temp1))
    1822         __(movd %mm0,%imm0)
    182317952:      __(cmpl lisp_global(managed_static_dnodes),%imm0)
    18241796        __(jae 0b)
     
    18271799        __(lock)
    18281800        __(btsl %imm0,(%temp1))
    1829         __(ref_global(managed_static_refidx,%temp1))
    1830         __(shrl $8,%imm0)
    1831         __(xorb $31,%imm0_b)
    1832         __(lock)
    1833         __(btsl %imm0,(%temp1))       
    18341801        __(ret)
    18351802_endsubp(gvset)
     
    18561823        __(lock)
    18571824        __(btsl %imm0,(%temp1))
    1858         __(shrl $8,%imm0)
    1859         __(xorb $31,%imm0_b)
    1860         __(ref_global(ephemeral_refidx,%temp1))
    1861         __(lock)
    1862         __(btsl %imm0,(%temp1))
    18631825        /* Now memoize the address of the hash vector */
    1864         __(ref_global(refbits,%temp1))
    18651826        __(movl %temp0,%imm0)
    18661827        __(subl lisp_global(ref_base),%imm0)
     
    18691830        __(lock)
    18701831        __(btsl %imm0,(%temp1))
    1871         __(shrl $8,%imm0)
    1872         __(xorb $31,%imm0_b)
    1873         __(ref_global(ephemeral_refidx,%temp1))
    1874         __(lock)
    1875         __(btsl %imm0,(%temp1))
    18761832        __(lea misc_data_offset(%temp0,%arg_y),%imm0)
    18771833        __(subl lisp_global(ref_base),%imm0)
     
    18831839        __(lock)
    18841840        __(btsl %imm0,(%temp1))
    1885         __(ref_global(managed_static_refidx,%temp1))
    1886         __(shrl $8,%imm0)
    1887         __(xorb $31,%imm0_b)
    1888         __(lock)
    1889         __(btsl %imm0,(%temp1))
    18901841        /* Now memoize the address of the hash vector */
    1891         __(ref_global(managed_static_refbits,%temp1))
    18921842        __(movl %temp0,%imm0)
    18931843        __(subl lisp_global(ref_base),%imm0)
     
    18961846        __(lock)
    18971847        __(btsl %imm0,(%temp1))               
    1898         __(ref_global(managed_static_refidx,%temp1))
    1899         __(shrl $8,%imm0)
    1900         __(xorb $31,%imm0_b)
    1901         __(lock)
    1902         __(btsl %imm0,(%temp1))
    19031848        __(ret)
    19041849_endsubp(set_hash_key)
     
    19301875        __(cmpl lisp_global(oldspace_dnode_count),%imm0)
    19311876        __(jae 2f)
    1932         __(movd %imm0,%mm0)
    19331877        __(ref_global(refbits,%arg_y))
    19341878        __(xorb $31,%imm0_b)
    19351879        __(lock)
    19361880        __(btsl %imm0,(%arg_y))
    1937         __(shrl $8,%imm0)
    19381881        __(xorb $31,%imm0_b)
    1939         __(ref_global(ephemeral_refidx,%arg_y))
    1940         __(lock)
    1941         __(btsl %imm0,(%arg_y))
    1942         __(movd %mm0,%imm0)
    194318822:      __(cmpl lisp_global(managed_static_dnodes),%imm0)
    19441883        __(jae 8f)
    19451884        __(ref_global(managed_static_refbits,%arg_y))
    1946         __(xorb $31,%imm0_b)
    1947         __(lock)
    1948         __(btsl %imm0,(%arg_y))
    1949         __(ref_global(managed_static_refidx,%arg_y))
    1950         __(shrl $8,%imm0)
    19511885        __(xorb $31,%imm0_b)
    19521886        __(lock)
     
    19831917        __(lock)
    19841918        __(btsl %imm0,(%arg_y))
    1985         __(shrl $8,%imm0)
    1986         __(xorb $31,%imm0_b)
    1987         __(ref_global(ephemeral_refidx,%arg_y))
    1988         __(lock)
    1989         __(btsl %imm0,(%arg_y))
    19901919        /* Now memoize the address of the hash vector */
    1991         __(ref_global(refbits,%arg_y))
    19921920        __(movl %temp1,%imm0)
    19931921        __(subl lisp_global(ref_base),%imm0)
     
    19961924        __(lock)
    19971925        __(btsl %imm0,(%arg_y))
    1998         __(ref_global(ephemeral_refidx,%arg_y))
    1999         __(shrl $8,%imm0)
    2000         __(xorb $31,%imm0_b)
    2001         __(lock)
    2002         __(btsl %imm0,(%arg_y))
    20031926        __(leal misc_data_offset(%temp1,%temp0),%imm0)
    20041927        __(subl lisp_global(ref_base),%imm0)
     
    20101933        __(lock)
    20111934        __(btsl %imm0,(%arg_y))
    2012         __(ref_global(managed_static_refidx,%arg_y))
    2013         __(shrl $8,%imm0)
    2014         __(xorb $31,%imm0_b)
    2015         __(lock)
    2016         __(btsl %imm0,(%arg_y))
    2017         __(ref_global(managed_static_refbits,%arg_y))
    20181935        /* Now memoize the address of the hash vector */
    20191936        __(movl %temp1,%imm0)
     
    20231940        __(lock)
    20241941        __(btsl %imm0,(%arg_y))
    2025         __(ref_global(managed_static_refidx,%arg_y))
    2026         __(shrl $8,%imm0)
    2027         __(xorb $31,%imm0_b)
    2028         __(lock)
    2029         __(btsl %imm0,(%arg_y))
    20301942        .globl C(egc_write_barrier_end)
    20311943C(egc_write_barrier_end):
  • trunk/source/lisp-kernel/x86-spentry64.s

    r15823 r15826  
    17751775        __(jae 2f)
    17761776        __(ref_global(refbits,%temp0))
    1777         __(xorq $63,%imm0)
    1778         __(lock)
    1779         __(btsq %imm0,(%temp0))
    1780         __(ref_global(ephemeral_refidx,%temp0))
    1781         __(shrq $8,%imm0)
    1782         __(xorq $63,%imm0)
     1777        __(xorb $63,%imm0_b)
    17831778        __(lock)
    17841779        __(btsq %imm0,(%temp0))
     
    17861781        __(jae 0b)
    17871782        __(ref_global(managed_static_refbits,%temp0))
    1788         __(xor $63,%imm1)
     1783        __(xorb $63,%imm1_b)
    17891784        __(lock)
    1790         __(btsq %imm1,(%temp0))
    1791         __(shrq $8,%imm1)
    1792         __(ref_global(managed_static_refidx,%temp0))
    1793         __(xorb $63,(%temp0))
    17941785        __(btsq %imm1,(%temp0))
    17951786        __(ret)
     
    18111802        __(jae 2f)
    18121803        __(ref_global(refbits,%temp0))
    1813         __(xorq $63,%imm0)
     1804        __(xorb $63,%imm0_b)
    18141805        __(lock)
    18151806        __(btsq %imm0,(%temp0))
    1816         __(ref_global(ephemeral_refidx,%temp0))
    1817         __(shrq $8,%imm0)
    1818         __(xorq $63,%imm0)
    1819         __(lock)
    1820         __(btsq %imm0,(%temp0))
     1807        __(ret)
    182118082:      __(cmpq lisp_global(managed_static_dnodes),%imm1)
    18221809        __(jae 0b)
    18231810        __(ref_global(managed_static_refbits,%temp0))
    1824         __(xor $63,%imm1)
    1825         __(lock)
    1826         __(btsq %imm1,(%temp0))
    1827         __(shrq $8,%imm1)
    1828         __(ref_global(managed_static_refidx,%temp0))
    1829         __(xorb $63,(%temp0))
     1811        __(xorb $63,%imm1_b)
    18301812        __(lock)
    18311813        __(btsq %imm1,(%temp0))
     
    18511833        __(jae 2f)
    18521834        __(ref_global(refbits,%temp0))
    1853         __(xorq $63,%imm0)
    1854         __(lock)
    1855         __(btsq %imm0,(%temp0))
    1856         __(ref_global(ephemeral_refidx,%temp0))
    1857         __(shrq $8,%imm0)
    1858         __(xorq $63,%imm0)
     1835        __(xorb $63,%imm0_b)
    18591836        __(lock)
    18601837        __(btsq %imm0,(%temp0))
     
    18621839        __(jae 0b)
    18631840        __(ref_global(managed_static_refbits,%temp0))
    1864         __(xor $63,%imm1)
     1841        __(xorb $63,%imm1_b)
    18651842        __(lock)
    18661843        __(btsq %imm1,(%temp0))       
    1867         __(shrq $8,%imm1)
    1868         __(ref_global(managed_static_refidx,%temp0))
    1869         __(xor $63,%imm1)
    1870         __(lock)
    1871         __(btsq %imm1,(%temp0))
    18721844        __(ret)               
    18731845_endsubp(gvset)
     
    18931865        __(jae 2f)
    18941866        __(ref_global(refbits,%temp0))
    1895         __(xorq $63,%imm0)
    1896         __(lock)
    1897         __(btsq %imm0,(%temp0))
    1898         __(ref_global(ephemeral_refidx,%temp0))
    1899         __(shrq $8,%imm0)
    1900         __(xorq $63,%imm0)
     1867        __(xorb $63,%imm0_b)
    19011868        __(lock)
    19021869        __(btsq %imm0,(%temp0))
    19031870        /* Now memoize the address of the hash vector   */
    1904         __(ref_global(refbits,%temp0))
    19051871        __(movq %arg_x,%imm0)
    19061872        __(subq lisp_global(ref_base),%imm0)
    19071873        __(shrq $dnode_shift,%imm0)
    1908         __(xorq $63,%imm0)
    1909         __(lock)
    1910         __(btsq %imm0,(%temp0))
    1911         __(ref_global(ephemeral_refidx,%temp0))
    1912         __(shrq $8,%imm0)
    1913         __(xorq $63,%imm0)
     1874        __(xorb $63,%imm0_b)
    19141875        __(lock)
    19151876        __(btsq %imm0,(%temp0))
     
    19171878        __(jae 0b)
    19181879        __(ref_global(managed_static_refbits,%temp0))
    1919         __(xor $63,%imm1)
     1880        __(xorb $63,%imm1_b)
    19201881        __(lock)
    19211882        __(btsq %imm1,(%temp0))
     
    19241885        __(subq lisp_global(ref_base),%imm0)
    19251886        __(shrq $dnode_shift,%imm0)
    1926         __(xorq $63,%imm0)
     1887        __(xorb $63,%imm0_b)
    19271888        __(lock)
    19281889        __(btsq %imm0,(%temp0))
    1929         __(ref_global(managed_static_refidx,%temp0))
    1930         __(shrq $8,%imm0)
    1931         __(xorq $63,%imm0)
    1932         __(lock)
    1933         __(btsq %imm0,(%temp0))
    1934         __(shrq $8,%imm1)
    1935         __(xor $63,%imm1)
    1936         __(lock)
    1937         __(btsq %imm1,(%temp0))
    19381890        __(ret)
    19391891_endsubp(set_hash_key)
     
    19641916        __(ref_global(refbits,%temp1))
    19651917        __(jae 2f)
    1966         __(xorq $63,%imm0)
    1967         __(lock)
    1968         __(btsq %imm0,(%temp1))
    1969         __(shrq $8,%imm0)
    1970         __(ref_global(ephemeral_refidx,%temp1))
    1971         __(xorq $63,%imm0)
     1918        __(xorb $63,%imm0_b)
    19721919        __(lock)
    19731920        __(btsq %imm0,(%temp1))
     
    19751922        __(jae 8f)
    19761923        __(ref_global(managed_static_refbits,%temp1))
    1977         __(xor $63,%imm1)
     1924        __(xorb $63,%imm1_b)
    19781925        __(lock)
    1979         __(btsq %imm1,(%temp1))   
    1980         __(ref_global(managed_static_refidx,%temp1))
    1981         __(shrq $8,%imm1)
    1982         __(xor $63,%imm1)
    1983         __(lock)
    1984         __(btsq %imm1,(%temp1))   
     1926        __(btsq %imm1,(%temp1))       
    19851927        .globl C(egc_store_node_conditional_success_end)
    19861928C(egc_store_node_conditional_success_end):
     
    20101952        __(ref_global(refbits,%temp1))
    20111953        __(jae 2f)
    2012         __(xorq $63,%imm0)
    2013         __(lock)
    2014         __(btsq %imm0,(%temp1))
    2015         __(shrq $8,%imm0)
    2016         __(xorq $63,%imm0)
    2017         __(ref_global(ephemeral_refidx,%temp1))
     1954        __(xorb $63,%imm0_b)
    20181955        __(lock)
    20191956        __(btsq %imm0,(%temp1))
     
    20211958        __(movq %arg_x,%imm0)
    20221959        __(subq lisp_global(ref_base),%imm0)
    2023         __(ref_global(refbits,%temp1))
    20241960        __(shrq $dnode_shift,%imm0)
    2025         __(xorq $63,%imm0)
    2026         __(lock)
    2027         __(btsq %imm0,(%temp1))
    2028         __(shrq $8,%imm0)
    2029         __(xorq $63,%imm0)
    2030         __(ref_global(ephemeral_refidx,%temp1))
     1961        __(xorb $63,%imm0_b)
    20311962        __(lock)
    20321963        __(btsq %imm0,(%temp1))
     
    20341965        __(jae 8f)
    20351966        __(ref_global(managed_static_refbits,%temp1))
    2036         __(xor $63,%imm1)
     1967        __(xorb $63,%imm1_b)
    20371968        __(lock)
    20381969        __(btsq %imm1,(%temp1))
     
    20411972        __(subq lisp_global(ref_base),%imm0)
    20421973        __(shrq $dnode_shift,%imm0)
    2043         __(xorq $63,%imm0)
    2044         __(lock)
    2045         __(btsq %imm0,(%temp1))
    2046         __(ref_global(managed_static_refidx,%temp1))
    2047         __(shrq $8,%imm1)
    2048         __(xor $63,%imm1)
    2049         __(lock)
    2050         __(btsq %imm1,(%temp1))
    2051         __(shrq $8,%imm0)
    2052         __(xorq $63,%imm0)
     1974        __(xorb $63,%imm0_b)
    20531975        __(lock)
    20541976        __(btsq %imm0,(%temp1))
Note: See TracChangeset for help on using the changeset viewer.