diff options
Diffstat (limited to 'pcompact.a')
-rw-r--r-- | pcompact.a | 789 |
1 files changed, 17 insertions, 772 deletions
@@ -1,7 +1,6 @@ ; mark used nodes and pointers in argument parts and link backward pointers - lea o0,heap_size_33 lwz d7,0(o0) @@ -9,20 +8,24 @@ slwi d7,d7,5 lwz d0,0(o0) - stwu a4,-4(sp) li g3,128 + subi d4,sp,8000 + + stwu a4,-4(sp) + cmpwi 0,d0,0 beq end_mark_cafs mark_cafs_lp: lwz d1,0(d0) lwz o5,-4(d0) - addi a2,d0,4 + + addi a3,d0,4 slwi d0,d1,2 - add a4,a2,d0 + add a4,a3,d0 - bl mark_stack_nodes + bl rmark_stack_nodes addic. d0,o5,0 bne mark_cafs_lp @@ -31,10 +34,11 @@ end_mark_cafs: lea o0,stack_p lwz a4,0(sp) - lwz a2,0(o0) + + lwz a3,0(o0) addi sp,sp,4 - bl mark_stack_nodes + bl rmark_stack_nodes if MEASURE_GC stwu o4,-4(sp) @@ -47,770 +51,8 @@ end_mark_cafs: b compact_heap -mark_stack_nodes3: - stw a0,-4(a2) - b mark_stack_nodes - -mark_stack_nodes2: - lwz g1,0(a0) - addi d0,a2,1-4 - stw g1,-4(a2) - stw d0,0(a0) - -mark_stack_nodes: - cmpw 0,a4,a2 - beq end_mark_nodes - - lwz a0,0(a2) - addi a2,a2,4 - - sub d0,a0,d6 - if SHARE_CHAR_INT - cmplw 0,d0,d7 - bge- mark_stack_nodes - endif - - srwi o0,d0,5 - lbzx o1,o4,o0 - rlwinm o2,d0,32-2,29,31 - rlwnm. r0,o1,o2,24,24 - bne- mark_stack_nodes2 - - li d3,0 - li d5,1 - -mark_arguments: - lwz d0,0-NODE_POINTER_OFFSET(a0) - srw o3,g3,o2 - - or o1,o1,o3 - - andi. r0,d0,2 - lha d2,-2(d0) - - stbx o1,o4,o0 - - cmpwi 6,d2,0 - beq mark_lazy_node - - beq 6,mark_hnf_0 - - cmplwi 0,d2,256 - addi a0,a0,4 - bge mark_record - - subic. d2,d2,2 - beq mark_hnf_2 - blt mark_hnf_1 - -mark_hnf_3: - lwz a1,4-NODE_POINTER_OFFSET(a0) -mark_hnf_3_: - sub d0,a1,d6 - srwi o0,d0,5 - lbzx o1,o4,o0 - rlwinm o2,d0,32-2,29,31 - srw o3,g3,o2 - and. r0,o1,o3 - bne shared_argument_part - - or o1,o1,o3 - stbx o1,o4,o0 - -no_shared_argument_part: - lwz o0,0-NODE_POINTER_OFFSET(a0) - or d3,d3,d5 - ori o0,o0,2 - stw o0,0-NODE_POINTER_OFFSET(a0) - stwu d3,4-NODE_POINTER_OFFSET(a0) - - lwz o0,0-NODE_POINTER_OFFSET(a1) - slwi d2,d2,2 - ori o0,o0,1 - stw o0,0-NODE_POINTER_OFFSET(a1) - - lwzux d2,a1,d2 - li d5,0 - stw a0,0-NODE_POINTER_OFFSET(a1) - mr d3,a1 - mr a0,d2 - b mark_node - -shared_argument_part: - cmplw 0,a1,a0 - bgt mark_hnf_1 - - lwz o0,0-NODE_POINTER_OFFSET(a1) - addi d0,a0,4+2+1 - stw d0,0-NODE_POINTER_OFFSET(a1) - stw o0,4-NODE_POINTER_OFFSET(a0) - b mark_hnf_1 - -mark_lazy_node_1: -; remove if no selectors: - bne mark_selector_node_1 -mark_hnf_1: - lwz d2,0-NODE_POINTER_OFFSET(a0) - or d3,d3,d5 - stw d3,0-NODE_POINTER_OFFSET(a0) - mr d3,a0 - li d5,2 - mr a0,d2 - b mark_node - -mark_selector_node_1: - baddicc d2,3 - lwz a1,0-NODE_POINTER_OFFSET(a0) - beq mark_indirection_node - - addic. d2,d2,1 - sub o2,a1,d6 - ble mark_record_selector_node_1 - - srwi d2,o2,5 - lbzx g1,o4,d2 - rlwinm g2,o2,32-2,29,31 - rlwnm. r0,g1,g2,24,24 - bne mark_hnf_1 - - lwz d2,0-NODE_POINTER_OFFSET(a1) - andi. r0,d2,2 - beq mark_hnf_1 - - lha g1,-2(d2) - cmplwi 0,g1,2 - ble small_tuple_or_record - -large_tuple_or_record: - lwz d1,8-NODE_POINTER_OFFSET(a1) - - sub o2,d1,d6 - srwi d2,o2,5 - lbzx g1,o4,d2 - rlwinm g2,o2,32-2,29,31 - rlwnm. r0,g1,g2,24,24 - bne mark_hnf_1 - -small_tuple_or_record: - if LINUX - lwz g1,-8(d0) - mflr r0 - else - lha g1,-6(d0) - mflr r0 - lwzx g1,rtoc,g1 - endif - andc o1,o1,o3 - - lwz g1,4(g1) - subi d2,a0,4 - - mtlr g1 - stbx o1,o4,o0 - mr a0,a1 - stwu r0,-4(sp) - blrl - mtlr r0 - - lea g1,__indirection - stw a0,4-NODE_POINTER_OFFSET(d2) - stw g1,0-NODE_POINTER_OFFSET(d2) - b mark_node - -mark_record_selector_node_1: - srwi d2,o2,5 - lbzx g1,o4,d2 - rlwinm g2,o2,32-2,29,31 - beq mark_strict_record_selector_node_1 - - rlwnm. r0,g1,g2,24,24 - bne mark_hnf_1 - - lwz d2,0-NODE_POINTER_OFFSET(a1) - andi. r0,d2,2 - beq mark_hnf_1 - - lha g1,-2(d2) - cmplwi 0,g1,258 - ble small_tuple_or_record - b large_tuple_or_record - -mark_strict_record_selector_node_1: - rlwnm. r0,g1,g2,24,24 - bne mark_hnf_1 - - lwz d2,0-NODE_POINTER_OFFSET(a1) - andi. r0,d2,2 - beq mark_hnf_1 - - lha g1,-2(d2) - cmplwi 0,g1,258 - ble select_from_small_record - - lwz d1,8-NODE_POINTER_OFFSET(a1) - sub o2,d1,d6 - - srwi d2,o2,5 - lbzx g1,o4,d2 - rlwinm g2,o2,32-2,29,31 - rlwnm. r0,g1,g2,24,24 - bne mark_hnf_1 - -select_from_small_record: - if LINUX - lwz g1,-8(d0) - mflr r0 - else - lha g1,-6(d0) - mflr r0 - lwzx g1,rtoc,g1 - endif - subi a0,a0,4 - lwz g1,4(g1) - - mtlr g1 - stwu r0,-4(sp) - blrl - mtlr r0 - - b mark_next_node - -mark_indirection_node: - andc o1,o1,o3 - stbx o1,o4,o0 - - mr a0,a1 - b mark_node - -mark_hnf_2: - lwz o0,0-NODE_POINTER_OFFSET(a0) - or d3,d3,d5 - ori o0,o0,2 - stw o0,0-NODE_POINTER_OFFSET(a0) - lwzu d2,4-NODE_POINTER_OFFSET(a0) - stw d3,0-NODE_POINTER_OFFSET(a0) - mr d3,a0 - li d5,0 - mr a0,d2 - -mark_node: - sub d0,a0,d6 - if SHARE_CHAR_INT - cmplw 0,d0,d7 - bge- mark_next_node_after_static - endif - srwi o0,d0,5 - lbzx o1,o4,o0 - rlwinm o2,d0,32-2,29,31 - rlwnm. r0,o1,o2,24,24 - beq+ mark_arguments - -mark_next_node: - cmpwi 0,d5,0 - bne mark_parent - - lwzu d2,-4-NODE_POINTER_OFFSET(d3) - lwz o0,4-NODE_POINTER_OFFSET(d3) - andi. d5,d2,3 - - cmpwi 0,d5,3 - beq argument_part_cycle1 - - stw o0,0-NODE_POINTER_OFFSET(d3) - -c_argument_part_cycle1: - cmplw 0,a0,d3 - bgt no_reverse_1 - - lwz o0,0-NODE_POINTER_OFFSET(a0) - addi d0,d3,4+1 - stw o0,4-NODE_POINTER_OFFSET(d3) - stw d0,0-NODE_POINTER_OFFSET(a0) - clrrwi a0,d2,2 - b mark_node - -no_reverse_1: - stw a0,4-NODE_POINTER_OFFSET(d3) - clrrwi a0,d2,2 - b mark_node - -mark_lazy_node: - beq 6,mark_next_node - - bsubicc d2,1 - baddi a0,4 - ble mark_lazy_node_1 - - cmplwi 0,d2,255 - bge mark_closure_with_unboxed_arguments - -mark_closure_with_unboxed_arguments_: - lwz o0,0-NODE_POINTER_OFFSET(a0) - slwi d2,d2,2 - ori o0,o0,2 - stw o0,0(a0) - - lwzux d2,a0,d2 - or d3,d3,d5 - stw d3,0-NODE_POINTER_OFFSET(a0) - mr d3,a0 - li d5,0 - mr a0,d2 - b mark_node - -mark_closure_with_unboxed_arguments: -; baddi d2,1 - srwi d0,d2,8 - bandic d2,255 -; bsub d2,d0 - bsubc d2,d0 -; bsubicc d2,1 - bgt mark_closure_with_unboxed_arguments_ - beq mark_hnf_1 - bsubi a0,4 - b mark_next_node - -mark_hnf_0: - if SHARE_CHAR_INT - cmpw d0,int_reg - bne no_int_3 - - lwz d2,4-NODE_POINTER_OFFSET(a0) - cmplwi 0,d2,33 - bge mark_next_node - - andc o1,o1,o3 - stbx o1,o4,o0 - - lea a0,small_integers - slwi d2,d2,3 - add a0,a0,d2 - b mark_next_node_after_static - -no_int_3: - cmplw d0,char_reg - bne no_char_3 - - andc o1,o1,o3 - stbx o1,o4,o0 - - lbz d2,7-NODE_POINTER_OFFSET(a0) - lea a0,static_characters - slwi d2,d2,3 - add a0,a0,d2 - b mark_next_node_after_static - -no_char_3: - blt no_normal_hnf_0 - - subi a0,d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET - - andc o1,o1,o3 - stbx o1,o4,o0 - b mark_next_node_after_static - -no_normal_hnf_0: - endif - - lea o0,__ARRAY__2 - cmplw 0,d0,o0 - bne+ mark_next_node - b mark_array - -mark_record: - subic. d2,d2,258 - beq mark_record_2 - blt mark_record_1 - -mark_record_3: - lhz d2,-2+2(d0) - lwz a1,4-NODE_POINTER_OFFSET(a0) - subic. d2,d2,1 - blt mark_record_3_bb - - beq mark_record_3_ab - - subic. d2,d2,1 - beq mark_record_3_aab - - b mark_hnf_3_ - -mark_record_3_bb: - subi a0,a0,4 - - sub d0,a1,d6 - setmbit o4,d0,d1,o0,o1,o2,2 - - cmplw a1,a0 - bgt mark_next_node - - srwi. o0,o0,1 - - lwz o2,0-NODE_POINTER_OFFSET(a1) - addi d0,a0,8+2+1 - stw o2,8-NODE_POINTER_OFFSET(a0) - stw d0,0-NODE_POINTER_OFFSET(a1) - - bne+ not_next_byte_1 - - addi d1,d1,1 - lbzx o1,o4,d1 - li o0,128 -not_next_byte_1: - and. r0,o1,o0 - beq+ not_yet_linked_bb - - sub d0,a0,d6 - addi d0,d0,8 - setmbit o4,d0,d1,o0,o1,o2,2 - b mark_next_node - -not_yet_linked_bb: - or o1,o1,o0 - stbx o1,o4,d1 - b mark_next_node - -mark_record_3_ab: - sub d0,a1,d6 - setmbit o4,d0,d1,o0,o1,o2,2 - - cmplw 0,a1,a0 - bgt mark_hnf_1 - - srwi. o0,o0,1 - - lwz o2,0-NODE_POINTER_OFFSET(a1) - addi d0,a0,4+2+1 - stw o2,4-NODE_POINTER_OFFSET(a0) - stw d0,0-NODE_POINTER_OFFSET(a1) - - bne+ not_next_byte_2 - - addi d1,d1,1 - lbzx o1,o4,d1 - li o0,128 -not_next_byte_2: - and. r0,o1,o0 - beq+ not_yet_linked_ab - - sub d0,a0,d6 - addi d0,d0,4 - setmbit o4,d0,d1,o0,o1,o2,2 - b mark_hnf_1 - -not_yet_linked_ab: - or o1,o1,o0 - stbx o1,o4,d1 - b mark_hnf_1 - -mark_record_3_aab: - sub d0,a1,d6 - - tstmbit o4,d0,d1,o0,o1,o2,2 - bne shared_argument_part - - srw o0,g3,o2 - or o1,o1,o0 - stbx o1,o4,d1 - - lwz o0,0-NODE_POINTER_OFFSET(a0) - or d3,d3,d5 - ori o0,o0,2 - stw o0,0-NODE_POINTER_OFFSET(a0) - stwu d3,4-NODE_POINTER_OFFSET(a0) - - lwz d2,0-NODE_POINTER_OFFSET(a1) - li d5,1 - stw a0,0-NODE_POINTER_OFFSET(a1) - mr d3,a1 - mr a0,d2 - b mark_node - -mark_record_2: - lhz g1,-2+2(d0) - cmplwi g1,1 - bgt mark_hnf_2 - beq mark_hnf_1 - - subi a0,a0,4 - b mark_next_node - -mark_record_1: - lhz g1,-2+2(d0) - tst g1 - bne mark_hnf_1 - - subi a0,a0,4 - b mark_next_node - -mark_array: - lwz d1,8-NODE_POINTER_OFFSET(a0) - tst d1 - beq mark_lazy_array - - lhz d0,-2(d1) - tst d0 - beq mark_b_record_array - - lhz d1,-2+2(d1) - tst d1 - beq mark_b_record_array - - subi d0,d0,256 - cmpw 0,d0,d1 - beq mark_a_record_array - -mark_ab_record_array: - mr o2,d2 - mr o3,d3 - stw d5,-4(sp) - - lwz d2,4-NODE_POINTER_OFFSET(a0) - addi a0,a0,8 - stw a0,-8(sp) - - slwi d2,d2,2 - mullw a1,d2,d0 - - sub d0,d0,d1 - addi a0,a0,4 - add a1,a1,a0 - - mflr r0 - stw r0,-12(sp) - bl reorder - lwz r0,-12(sp) - - lwz a0,-8(sp) - mtlr r0 - - lwz d0,-4(a0) - mullw d0,d0,d1 - - lwz d5,-4(sp) - mr d3,o3 - mr d2,o2 - b mark_lr_array - -mark_b_record_array: - sub d0,a0,d6 - addi d0,d0,4 - setmbit o4,d0,d1,o0,o1,o2,2 - b mark_next_node - -mark_a_record_array: - lwz d0,4-NODE_POINTER_OFFSET(a0) - addi a0,a0,8 - mullw d0,d0,d1 - b mark_lr_array - -mark_lazy_array: - lwz d0,4-NODE_POINTER_OFFSET(a0) - addi a0,a0,8 -mark_lr_array: - sub d1,a0,d6 - srwi d1,d1,2 - add d1,d1,d0 - setmbit o4,d1,d2,o0,o1,o2,0 - - cmplwi 0,d0,1 - ble mark_array_length_0_1 - - mr a1,a0 - slwi d0,d0,2 - add a0,a0,d0 - - lwz d2,0-NODE_POINTER_OFFSET(a0) - lwz o0,0-NODE_POINTER_OFFSET(a1) - stw d2,0-NODE_POINTER_OFFSET(a1) - stw o0,0-NODE_POINTER_OFFSET(a0) - - lwzu d2,-4-NODE_POINTER_OFFSET(a0) - lwzu o0,-4-NODE_POINTER_OFFSET(a1) - addi d2,d2,2 - stw o0,0-NODE_POINTER_OFFSET(a0) - stw d2,0-NODE_POINTER_OFFSET(a1) - - lwzu d2,-4-NODE_POINTER_OFFSET(a0) - or d3,d3,d5 - stw d3,0-NODE_POINTER_OFFSET(a0) - mr d3,a0 - li d5,0 - mr a0,d2 - b mark_node - -mark_array_length_0_1: - subi a0,a0,8 - blt mark_next_node - - lwz d1,12-NODE_POINTER_OFFSET(a0) - lwz o0,8-NODE_POINTER_OFFSET(a0) - lwz o1,4-NODE_POINTER_OFFSET(a0) - stw o0,12-NODE_POINTER_OFFSET(a0) - stw o1,8-NODE_POINTER_OFFSET(a0) - stwu d1,4-NODE_POINTER_OFFSET(a0) - b mark_hnf_1 - - -mark_parent: - tst d3 - beq mark_stack_nodes2 - - subic. d5,d5,1 - beq argument_part_parent - - cmplw a0,d3 - lwz d2,0-NODE_POINTER_OFFSET(d3) - bgt no_reverse_2 - - mr a1,a0 - addi d0,d3,1 - lwz a0,0-NODE_POINTER_OFFSET(a1) - stw d0,0-NODE_POINTER_OFFSET(a1) - -no_reverse_2: - stw a0,0-NODE_POINTER_OFFSET(d3) - subi a0,d3,4 - andi. d5,d2,3 - clrrwi d3,d2,2 - b mark_next_node - -argument_part_parent: - mr a1,d3 - mr d3,a0 - - lwz d2,0-NODE_POINTER_OFFSET(a1) - - mr a0,a1 - -skip_upward_pointers: - andi. d0,d2,3 - cmpwi 0,d0,3 - bne no_upward_pointer - - clrrwi a1,d2,2 - lwz d2,0-NODE_POINTER_OFFSET(a1) - b skip_upward_pointers - -no_upward_pointer: - cmplw 0,d3,a0 - bgt no_reverse_3 - - mr a6,d3 - lwz d3,0-NODE_POINTER_OFFSET(d3) - addi d0,a0,1 - stw d0,0-NODE_POINTER_OFFSET(a6) - -no_reverse_3: - stw d3,0-NODE_POINTER_OFFSET(a1) - - clrrwi d3,d2,2 - - lwzu d2,-4-NODE_POINTER_OFFSET(d3) - - cmplw 6,a0,d3 - - lwz o0,4-NODE_POINTER_OFFSET(d3) - andi. d5,d2,3 - stw o0,0-NODE_POINTER_OFFSET(d3) - - bgt 6,no_reverse_4 - - lwz o0,0-NODE_POINTER_OFFSET(a0) - stw o0,4-NODE_POINTER_OFFSET(d3) - addi d0,d3,4+2+1 - stw d0,0-NODE_POINTER_OFFSET(a0) - clrrwi a0,d2,2 - b mark_node - -no_reverse_4: - stw a0,4-NODE_POINTER_OFFSET(d3) - clrrwi a0,d2,2 - b mark_node - -argument_part_cycle1: - mr d1,a1 - -skip_pointer_list1: - clrrwi a1,d2,2 - lwz d2,0-NODE_POINTER_OFFSET(a1) - andi. d5,d2,3 - cmpwi 0,d5,3 - beq skip_pointer_list1 - - stw o0,0-NODE_POINTER_OFFSET(a1) - mr a1,d1 - b c_argument_part_cycle1 - - if SHARE_CHAR_INT -mark_next_node_after_static: - cmpwi 0,d5,0 - bne mark_parent_after_static - - lwzu d2,-4-NODE_POINTER_OFFSET(d3) - lwz o0,4-NODE_POINTER_OFFSET(d3) - andi. d5,d2,3 - - cmpwi 0,d5,3 - beq argument_part_cycle2 - - stw o0,0-NODE_POINTER_OFFSET(d3) - -c_argument_part_cycle2: - stw a0,4-NODE_POINTER_OFFSET(d3) - clrrwi a0,d2,2 - b mark_node - -mark_parent_after_static: - cmpwi 0,d3,0 - beq mark_stack_nodes3 - - subic. d5,d5,1 - beq argument_part_parent_after_static - - lwz d2,0-NODE_POINTER_OFFSET(d3) - stw a0,0-NODE_POINTER_OFFSET(d3) - subi a0,d3,4 - andi. d5,d2,3 - clrrwi d3,d2,2 - b mark_next_node - -argument_part_parent_after_static: - mr a1,d3 - mr d3,a0 - - lwz d2,0-NODE_POINTER_OFFSET(a1) - - mr a0,a1 - -skip_upward_pointers_2: - andi. d0,d2,3 - cmpwi 0,d0,3 - bne no_reverse_3 - - clrrwi a1,d2,2 - lwz d2,0-NODE_POINTER_OFFSET(a1) - b skip_upward_pointers_2 - -argument_part_cycle2: - mr d1,a1 - -skip_pointer_list2: - clrrwi a1,d2,2 - lwz d2,0-NODE_POINTER_OFFSET(a1) - andi. d5,d2,3 - cmpwi 0,d5,3 - beq skip_pointer_list2 - - stw o0,0-NODE_POINTER_OFFSET(a1) - mr a1,d1 - b c_argument_part_cycle2 - endif - -end_mark_nodes: - addi a2,a2,4 - blr - + include 'pcompact_rmark.a' + include 'pcompact_rmarkr.a' ; compact the heap @@ -897,7 +139,10 @@ finalizer_list_empty: stwu a4,-4(sp) addi a4,a2,4 - bl mark_stack_nodes + + mr a3,a2 + bl rmark_stack_nodes + lwz a4,0(sp) addi sp,sp,4 |