/* Set the XT fields now that the heap has been compacted */ void factor_vm::fixup_object_xts() { begin_scan(); cell obj; while((obj = next_object()) != F) { switch(tagged<object>(obj).type()) { case WORD_TYPE: update_word_xt(obj); break; case QUOTATION_TYPE: { quotation *quot = untag<quotation>(obj); if(quot->code) set_quot_xt(quot,quot->code); break; } default: break; } } end_scan(); }
/* Set the XT fields now that the heap has been compacted */ void fixup_object_xts(void) { begin_scan(); CELL obj; while((obj = next_object()) != F) { if(type_of(obj) == WORD_TYPE) { F_WORD *word = untag_object(obj); update_word_xt(word); } else if(type_of(obj) == QUOTATION_TYPE) { F_QUOTATION *quot = untag_object(obj); if(quot->compiledp != F) set_quot_xt(quot,quot->code); } } /* End the heap scan */ gc_off = false; }
void forward_object_xts(void) { begin_scan(); CELL obj; while((obj = next_object()) != F) { if(type_of(obj) == WORD_TYPE) { F_WORD *word = untag_object(obj); word->code = forward_xt(word->code); if(word->profiling) word->profiling = forward_xt(word->profiling); } else if(type_of(obj) == QUOTATION_TYPE) { F_QUOTATION *quot = untag_object(obj); if(quot->compiledp != F) quot->code = forward_xt(quot->code); } else if(type_of(obj) == CALLSTACK_TYPE) { F_CALLSTACK *stack = untag_object(obj); iterate_callstack_object(stack,forward_frame_xt); } } /* End the heap scan */ gc_off = false; }
void strip_compiled_quotations(void) { begin_scan(); CELL obj; while((obj = next_object()) != F) { if(type_of(obj) == QUOTATION_TYPE) { F_QUOTATION *quot = untag_object(obj); quot->compiledp = F; } } gc_off = false; }
void factor_vm::forward_object_xts() { begin_scan(); cell obj; while(to_boolean(obj = next_object())) { switch(tagged<object>(obj).type()) { case WORD_TYPE: { word *w = untag<word>(obj); if(w->code) w->code = code->forward_code_block(w->code); if(w->profiling) w->profiling = code->forward_code_block(w->profiling); update_word_xt(obj); } break; case QUOTATION_TYPE: { quotation *quot = untag<quotation>(obj); if(quot->code) { quot->code = code->forward_code_block(quot->code); set_quot_xt(quot,quot->code); } } break; case CALLSTACK_TYPE: { callstack *stack = untag<callstack>(obj); callframe_forwarder forwarder(this); iterate_callstack_object(stack,forwarder); } break; default: break; } } end_scan(); }
void scan_partition_1(const std::uint8_t* partition, const unsigned* labels, const float* dists, binheap* bh) { // 0. Scan first keep pqcodes const std::uint32_t keep = *reinterpret_cast<const std::uint32_t*>(partition); partition += sizeof(keep); float qmax = begin_scan(partition, labels, dists, keep, bh); Counters::quant_bound = qmax; partition += keep * 8; // 1. Get small tables __m128i ft4[4][16]; __m128i min4[4]; float qmin = min4_small_table(qmax, dists, min4); ft4_small_table(qmax, dists, ft4, qmin); // 2. Fast scan (with lower bounds) fast_scan_1(partition, labels, dists, min4, ft4, qmin, qmax, bh, 0); }
void factor_vm::forward_object_xts() { begin_scan(); cell obj; while((obj = next_object()) != F) { switch(tagged<object>(obj).type()) { case WORD_TYPE: { word *w = untag<word>(obj); if(w->code) w->code = forward_xt(w->code); if(w->profiling) w->profiling = forward_xt(w->profiling); } break; case QUOTATION_TYPE: { quotation *quot = untag<quotation>(obj); if(quot->code) quot->code = forward_xt(quot->code); } break; case CALLSTACK_TYPE: { callstack *stack = untag<callstack>(obj); xt_forwarder forwarder(this); iterate_callstack_object(stack,forwarder); } break; default: break; } } end_scan(); }