// can be copied and pasted back in graph_to_string.c if wanted #define ML(x) x##_mark_en_nodes #define ENTRY_LABEL mark_en_nodes #define ENTRY_LABEL_NODEP mark_en_nodes_from_nodeP #define DETERMINE_ENTRY_NODES_PASS #define EXIT_LABEL mark_en_nodes_end #define FIXED_STACK #define IGNORE_MODULE_ID #define IGNORE_BUILD_BLOCK //#define SPECIAL // _set_undo_handler $undo_determine_entry_node_pass_end // the undo handler for colouring nodes is valid // collect EN-nodes ... q: jmp ENTRY_LABEL_NODEP #undef temp2 #include "gts_delete.c" EXIT_LABEL: #undef EXIT_LABEL // finished with one colour for now, see if there are still nodes left cmpl esp_backup,%esp je mark_en_nodes_finished popl nodeP movl (nodeP),descP #define new_current_colour %ecx decl descP movl SN_COLOUR(descP),new_current_colour andl $ ENSN_COLOUR_GET_COLOUR,new_current_colour movl new_current_colour,current_colour #undef new_current_colour jmp q // ... collect EN-nodes // list EN-nodes of a block ... collect_en_nodes_within_same_block: #define entry_node %eax movl %ecx,entry_node // current EN-node #define last %ecx movl $0, EN_NODE_LIST(entry_node) movl EN_COLOUR(entry_node),last andl $ ENSN_COLOUR_GET_COLOUR,last leal (heapP,last,4),last // call MAKE_ID_FCT(lb_index_of_entry) // last = ptr to ptr to EN_NODE_LIST(previous_entry_node) #define temp %ebx // movl (last),temp // movl temp,EN_CT_TEMP(entry_node) // backup CT entry #undef temp cmpl $0,(last) jne ga_maar_spelen // keep pointer to first EN-node in a linked list of EN-nodes #define temp %ebx #define temp2 %edx pushl temp2 movl en_list_base_address,temp2 movl counter,temp movl entry_node,(temp2,temp,4) incl counter popl temp2 #undef temp2 #undef temp // change colour table entry to hold address of tail #define temp %ebx lea EN_NODE_LIST(entry_node),temp movl temp,(last) #undef temp ret ga_maar_spelen: // modify previous entry node to point to the current one #define temp %ebx movl (last),temp // temp = ptr to EN_NODE_LIST(previous_entry_node) movl entry_node,(temp) #undef temp // #define temp %ebx leal EN_NODE_LIST(entry_node),temp movl temp,(last) ret #undef temp #undef last #undef entry_node // ... list EN-nodes of a block .align 4 .data mark_en_current_en_node: .long 0 mark_en_counter: .long 0 mark_en_block: .long 0 mark_en_tail: .long 0 .align 4 .text mark_en_nodes_finished: #ifdef DYNAMIC_STRINGS call MAKE_ID_NDS(lb_init) #endif #ifdef DEBUG2 int3 int3 #endif movl $ 0, counter movl block_n,%ecx // block_n = amount of blocks * 4 call alloc_from_extra_heap_fixed // allocate array of blocks movl %ecx,en_list_base_address // ptr to array base of a block i.e. non-empty set of EN-nodes // partitionate entry nodes in blocks ... #define size1 %ecx call MAKE_ID_FCT(lb_size) cmpl size1,free js GC_FIXED_STACK #define ptr %eax #define end %ebx leal (heapP,size1,4),end movl heapP,ptr clear_loop: cmpl ptr,end je clearing_done movl $0,(ptr) addl $4,ptr jmp clear_loop clearing_done: #undef ptr #undef end #undef size1 movl $ collect_en_nodes_within_same_block,%ecx call MAKE_ID_FEN(lb_map_array) // ... partitionate entry nodes in blocks // movl $ restore_ct_table,%ecx // call MAKE_ID_FEN(lb_map_array) _set_undo_handler $undo_copying movl heapP,graph_start // copy loop ... #define temp %ecx movl block_n,temp shrl $2,temp movl temp,mark_en_block #undef temp #define counter %ecx movl $0xffffffff,counter mark_en_blocks: incl counter cmpl mark_en_block,counter je mark_en_nodes_copied movl counter,mark_en_counter // body ... #define en_node counter shll $2,en_node addl en_list_base_address,en_node // ptr to ptr to EN-node movl (en_node),en_node // ptr to current en_node #define new_current_colour %eax movl -1(en_node),new_current_colour movl SN_COLOUR(en_node),new_current_colour andl $ ENSN_COLOUR_GET_COLOUR,new_current_colour movl new_current_colour,current_colour #undef new_current_colour // init2 ... movl heapP,old_heapP // backup start of block // ... init2 mark_en_copy2: #define temp %eax movl EN_NODE_LIST(en_node),temp // set tail movl temp,mark_en_tail #undef temp #define ML(x) x##__pcn22 #define ENTRY_LABEL copy_next_node_pcn22 #define ENTRY_LABEL_NODEP copy_next_node_in_nodeP #define EXIT_LABEL mark_en_exit #define COPY_BLOCK_PASS #define COPY_PASS #define OLD_COPY_PASS movl EN_NODEP(en_node),nodeP movl nodeP,mark_en_current_en_node // set current EN-node #define temp %ebx movl heapP,temp // set EN-node offset subl old_heap_pointer,temp movl temp,EN_BLOCK_OFFSET(en_node) // HIER movl nodeP,EN_NODE(en_node) // also done in gts_delete (next pass) #undef temp jmp ENTRY_LABEL_NODEP // node in eax // body2 ... #include "gts_copy.c" // copy nodes #undef COPY_BLOCK_PASS #undef COPY_PASS EXIT_LABEL: #undef EXIT_LABEL // ... body2 #define temp %eax movl mark_en_tail,en_node cmpl $0,en_node jne mark_en_copy2 #undef temp #undef en_node #define newHeapP descP movl heapP,newHeapP subl old_heapP,newHeapP #define block_size newHeapP shll $16,block_size movl current_colour,%ecx call MAKE_ID_FCT(lb_index_of_entry) movl (%ecx),%ecx andl $0x0000fffc,%ecx orl %ecx,block_size #define block_info block_size call MAKE_ID_FBI(lb_alloc_entry) movl block_info,(%ecx) #undef newHeapP #undef block_size #undef block_info //#error HIERO // ... body movl mark_en_counter,counter jmp mark_en_blocks #undef counter mark_en_nodes_copied: movl MAKE_ID_EN(lb_root),%ebx jmp copy_equally_coloured_nodes_finished #undef DETERMINE_ENTRY_NODES #undef EXIT_LABEL //#endif