X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fpurify.c;h=1c92c0a080b46b73011bafefb9f7a69e681c567b;hb=0e35b321b97477bcfedaa1a5aed1fa87d635d262;hp=480227d70f7ed5c554a9fe286ceb6e24b268e402;hpb=78fa16bf55be44cc16845be84d98023e83fb14bc;p=sbcl.git diff --git a/src/runtime/purify.c b/src/runtime/purify.c index 480227d..1c92c0a 100644 --- a/src/runtime/purify.c +++ b/src/runtime/purify.c @@ -205,12 +205,18 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr) } /* Is it plausible cons? */ if ((is_lisp_pointer(start_addr[0]) - || ((start_addr[0] & 3) == 0) /* fixnum */ + || ((start_addr[0] & FIXNUM_TAG_MASK) == 0) /* fixnum */ || (widetag_of(start_addr[0]) == CHARACTER_WIDETAG) +#if N_WORD_BITS == 64 + || (widetag_of(start_addr[0]) == SINGLE_FLOAT_WIDETAG) +#endif || (widetag_of(start_addr[0]) == UNBOUND_MARKER_WIDETAG)) && (is_lisp_pointer(start_addr[1]) - || ((start_addr[1] & 3) == 0) /* fixnum */ + || ((start_addr[1] & FIXNUM_TAG_MASK) == 0) /* fixnum */ || (widetag_of(start_addr[1]) == CHARACTER_WIDETAG) +#if N_WORD_BITS == 64 + || (widetag_of(start_addr[1]) == SINGLE_FLOAT_WIDETAG) +#endif || (widetag_of(start_addr[1]) == UNBOUND_MARKER_WIDETAG))) { break; } else { @@ -245,7 +251,7 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr) return 0; } /* Is it plausible? Not a cons. XXX should check the headers. */ - if (is_lisp_pointer(start_addr[0]) || ((start_addr[0] & 3) == 0)) { + if (is_lisp_pointer(start_addr[0]) || ((start_addr[0] & FIXNUM_TAG_MASK) == 0)) { if (pointer_filter_verbose) { fprintf(stderr,"*Wo2: %x %x %x\n", (unsigned long) pointer, (unsigned long) start_addr, *start_addr); @@ -255,6 +261,9 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr) switch (widetag_of(start_addr[0])) { case UNBOUND_MARKER_WIDETAG: case CHARACTER_WIDETAG: +#if N_WORD_BITS == 64 + case SINGLE_FLOAT_WIDETAG: +#endif if (pointer_filter_verbose) { fprintf(stderr,"*Wo3: %x %x %x\n", (unsigned long) pointer, (unsigned long) start_addr, *start_addr); @@ -304,7 +313,9 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr) case FDEFN_WIDETAG: case CODE_HEADER_WIDETAG: case BIGNUM_WIDETAG: +#if N_WORD_BITS != 64 case SINGLE_FLOAT_WIDETAG: +#endif case DOUBLE_FLOAT_WIDETAG: #ifdef LONG_FLOAT_WIDETAG case LONG_FLOAT_WIDETAG: @@ -1186,6 +1197,11 @@ pscav(lispobj *addr, long nwords, boolean constant) } count = 1; } +#if N_WORD_BITS == 64 + else if (widetag_of(thing) == SINGLE_FLOAT_WIDETAG) { + count = 1; + } +#endif else if (thing & FIXNUM_TAG_MASK) { /* It's an other immediate. Maybe the header for an unboxed */ /* object. */ @@ -1583,6 +1599,10 @@ purify(lispobj static_roots, lispobj read_only_roots) #endif #endif + /* Blast away instruction cache */ + os_flush_icache((os_vm_address_t)READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE); + os_flush_icache((os_vm_address_t)STATIC_SPACE_START, STATIC_SPACE_SIZE); + #ifdef PRINTNOISE printf(" done]\n"); fflush(stdout);