/* * divide_freeNode - make * |FREE| -> |empty(newsize)|FREE|. * * empty spaces will be used for malloc. * */ void divide_freeNode(FREE target, size_t newsize) { size_t oldsize = FSIZE(target); if(newsize >= oldsize) return; void* newtarget = (char*)target + newsize; delete_free(target); insert_free(target,newsize); insert_free(newtarget,oldsize-newsize); return; }
/* * merge_free - merging two nodes * delete two nodes and re-insert left. * */ void merge_free(FREE left, FREE right) { if(left == right) return; delete_free(left); delete_free(right); insert_free(left, FSIZE(left) + FSIZE(right)); return; }
/* * mm_free - Freeing a block inserts new free chunks to explicit list/tree * and tries merging free chunks. */ void mm_free(void *ptr) { MALLOC toFree = P_TO_M(ptr); insert_free(toFree,MSIZE(toFree)); merge_freeChunks(toFree); //mm_check(); return; }
/* * divide_malloc - * if size > newsize, make * |MALLOC(size)| -> |MALLOC(newsize)|FREE|. * * */ void divide_malloc(MALLOC target, size_t newsize) { size_t oldsize = MSIZE(target); if(newsize >= oldsize) return; void* newtarget = (char*)target + newsize; setAllocatedBlockSize(target,newsize); insert_free(newtarget, oldsize-newsize); return; }
void FpuStackAllocator::clear_fpu_stack(LIR_Opr preserve) { int result_stack_size = (preserve->is_fpu_register() && !preserve->is_xmm_register() ? 1 : 0); while (sim()->stack_size() > result_stack_size) { assert(!sim()->slot_is_empty(0), "not allowed"); if (result_stack_size == 0 || sim()->get_slot(0) != fpu_num(preserve)) { insert_free(0); } else { // move "preserve" to bottom of stack so that all other stack slots can be popped insert_exchange(sim()->stack_size() - 1); } } }
void FpuStackAllocator::insert_free_if_dead(LIR_Opr opr, LIR_Opr ignore) { if (fpu_num(opr) != fpu_num(ignore) && sim()->contains(fpu_num(opr))) { int res_slot = tos_offset(opr); insert_free(res_slot); } }