NODE_POINTER_OFFSET set 0 lea o0,heap_p2 lea o1,stack_p lwz a6,0(o0) lwz a2,0(o1) if COPIED_VECTOR lea o0,heap_size_129 lwz d7,0(o0) lea o0,heap_p1 slwi d7,d7,6 lwz a3,0(o0) else lea o0,heap_size lwz d7,0(o0) srwi d7,d7,1 endif add o4,a6,d7 if WRITE_HEAP lea o0,heap2_begin_and_end stw o4,4(o0) endif lea o0,caf_list if USE_DCBZ li g3,32 li o3,-32 endif lwz d0,0(o0) cmpwi 0,d0,0 beq end_copy_cafs copy_cafs_lp: lwz o5,-4(d0) lwz d5,0(d0) addi a2,d0,4 subi d5,d5,1 bl copy_lp2 addic. d0,o5,0 bne copy_cafs_lp end_copy_cafs: lea o0,stack_p lwz a2,0(o0) sub d5,a4,a2 subic. d5,d5,4 srwi d5,d5,2 bgel copy_lp2 lea o0,heap_p2 lwz a2,0(o0) ; ; Copy all referenced nodes to the other semi space ; lea g2,copy_lp1 copy_lp1: cmplw 0,a2,a6 bge end_copy1 lwz d0,0(a2) mtlr g2 baddi a2,4 andi. o0,d0,2 lha d5,-2(d0) beq not_in_hnf_1 in_hnf_1: cmpwi 0,d5,0 beq copy_array_21 cmpwi 0,d5,2 ble b_copy_lp2 cmplwi 0,d5,256 bge copy_record_1 lwz o0,4(a2) mr d6,d5 andi. r0,o0,1 bne node_without_arguments_part li d5,0 bl copy_lp2 mtlr g2 baddi a2,4 subi d5,d6,2 b copy_lp2 node_without_arguments_part: clrrwi o0,o0,1 stw o0,4(a2) li d5,0 bl copy_lp2 baddi a2,4 b copy_lp1 copy_record_1: subic. d5,d5,258 bgt copy_record_arguments_3 lhz d5,-2+2(d0) blt copy_record_arguments_1 subic. d5,d5,1 bgt copy_lp2 beq- copy_node_arity1 baddi a2,8 b copy_lp1 copy_record_arguments_1: cmpwi d5,0 li d5,0 bne copy_lp2 baddi a2,4 b copy_lp1 copy_record_arguments_3: if COPIED_VECTOR lwz o1,4(a2) andi. r0,o1,1 lhz d1,-2+2(d0) cmpwi 6,d1,0 bne record_node_without_arguments_part else lhz d1,-2+2(d0) cmpwi 6,,d1,0 endif baddi d5,2+1 beq 6,copy_record_arguments_3b subic. d6,d1,1 beq copy_record_arguments_3abb slwi d5,d5,2 add d4,a2,d5 li d5,0 bl copy_lp2 baddi a2,4 subi d5,d6,1 bl copy_lp2 mr a2,d4 b copy_lp1 copy_record_arguments_3abb: subi d5,d5,1 slwi d6,d5,2 li d5,0 bl copy_lp2 add a2,a2,d6 b copy_lp1 copy_record_arguments_3b: slwi d5,d5,2 add a2,a2,d5 b copy_lp1 if COPIED_VECTOR record_node_without_arguments_part: clrrwi o1,o1,1 stw o1,4(a2) baddi a2,8 beq 6,copy_lp1 subi a2,a2,8 li d5,0 bl copy_lp2 baddi a2,4 b copy_lp1 endif not_in_hnf_1: cmpwi 0,d5,257 bge copy_unboxed_closure_arguments subic. d5,d5,1 bgt copy_lp2 copy_node_arity1: li d5,0 bl copy_lp2 baddi a2,4 b copy_lp1 copy_unboxed_closure_arguments: srwi d4,d5,8 rlwinm d5,d5,0,24,31 beq copy_unboxed_closure_arguments1 bsubc d5,d4 bsubi d5,1 bnel+ copy_lp2 slwi d4,d4,2 badd a2,d4 b copy_lp1 copy_unboxed_closure_arguments1: baddi a2,8 b copy_lp1 copy_array_21: lwz d1,4(a2) cmpwi 0,d1,0 lwz d5,0(a2) baddi a2,8 beq copy_array_21_a lhz d0,-2(d1) subi d0,d0,256 lhz d1,-2+2(d1) cmpwi 0,d1,0 beq copy_array_21_b cmpw 0,d0,d1 beq copy_array_21_r_a copy_array_21_ab: subic. d5,d5,1 blt copy_lp1 sub d0,d0,d1 slwi d0,d0,2 subi d1,d1,1 mr d6,d5 stw d1,-4(sp) stwu d0,-8(sp) copy_array_21_lp_ab: lwz d5,4(sp) bl copy_lp2 lwz o1,0(sp) subic. d6,d6,1 add a2,a2,o1 bge copy_array_21_lp_ab baddi sp,8 b copy_lp1 copy_array_21_b: mullw d2,d5,d0 slwi d2,d2,2 add a2,a2,d2 b copy_lp1 copy_array_21_r_a: mullw d2,d5,d0 mr d5,d2 copy_array_21_a: subic. d5,d5,1 bge copy_lp2 b copy_lp1 ; ; Copy root nodes to the other semi-space ; b_copy_lp2: bsubi d5,1 copy_lp2: lwz a1,0(a2) baddi a2,4 lwz d0,0-NODE_POINTER_OFFSET(a1) bsubi d5,1 continue_after_selector_2: andi. r0,d0,2 beq not_in_hnf_2 in_hnf_2: lhz d2,-2(d0) cmpwi 5,d5,0 cmpwi 0,d2,0 beq copy_arity_0_node2 cmplwi 6,d2,256 if NODE_POINTER_OFFSET==0 stw a6,-4(a2) endif stw d0,0(a6) bge 6,copy_record_2 subic. d2,d2,2 lwz o0,4-NODE_POINTER_OFFSET(a1) addi a0,a6,1+NODE_POINTER_OFFSET stw a0,0-NODE_POINTER_OFFSET(a1) blt copy_hnf_node2_1 bgt copy_hnf_node2_3 lwz o1,8-NODE_POINTER_OFFSET(a1) stw o0,4(a6) if NODE_POINTER_OFFSET==0 stw o1,8(a6) stw a6,-4(a2) baddi a6,12 else stwu o1,8(a6) stw a6,-4(a2) baddi a6,4 endif bge 5,copy_lp2 blr copy_hnf_node2_1: stw o0,4(a6) baddi a6,8 if NODE_POINTER_OFFSET stw a6,-4(a2) endif bge 5,copy_lp2 blr copy_hnf_node2_3: lwz a0,8-NODE_POINTER_OFFSET(a1) baddi a6,12 stw o0,4-12(a6) if NODE_POINTER_OFFSET addi a1,a6,NODE_POINTER_OFFSET endif lwz d1,0-NODE_POINTER_OFFSET(a0) andi. r0,d1,1 bne arguments_already_copied_2 if NODE_POINTER_OFFSET==0 stw a6,-4(a6) ori a1,a6,1 stw d1,0(a6) else stwu a1,-4(a6) ori a1,a1,1 stw a6,-4(a2) stwu d1,4(a6) endif stw a1,0-NODE_POINTER_OFFSET(a0) cp_hnf_arg_lp2: if NODE_POINTER_OFFSET lwz o0,4-NODE_POINTER_OFFSET(a0) baddi a0,4 else lwzu o0,4(a0) endif subic. d2,d2,1 stwu o0,4(a6) bgt cp_hnf_arg_lp2 baddi a6,4 bge 5,copy_lp2 blr arguments_already_copied_2: stw d1,-4(a6) if NODE_POINTER_OFFSET addi a1,a6,-4 stw a1,-4(a2) endif bge 5,copy_lp2 blr copy_arity_0_node2: cmplw d0,int_reg blt copy_real_file_or_string_2 cmplw d0,char_reg bgt copy_normal_hnf_0_2 copy_int_bool_or_char_2: if SHARE_CHAR_INT bne no_char_2 lbz d2,7-NODE_POINTER_OFFSET(a1) if NODE_POINTER_OFFSET lea a0,static_characters8 else lea a0,static_characters endif slwi d2,d2,3 add a0,a0,d2 stw a0,-4(a2) bge 5,copy_lp2 blr no_char_2: cmpw int_reg,d0 lwz o0,4-NODE_POINTER_OFFSET(a1) bne no_small_int_or_char_2 cmplwi 0,o0,33 slwi d2,o0,3 bge no_small_int_or_char_2 if NODE_POINTER_OFFSET lea a0,small_integers8 else lea a0,small_integers endif add a0,a0,d2 stw a0,-4(a2) bge 5,copy_lp2 blr no_small_int_or_char_2: else no_small_int_or_char_2: lwz o0,4-NODE_POINTER_OFFSET(a1) endif if NODE_POINTER_OFFSET ori d2,o4,1 stw o4,-4(a2) stw d2,0-NODE_POINTER_OFFSET(a1) endif stwu d0,-8(o4) stw o0,4(o4) if NODE_POINTER_OFFSET==0 ori d2,o4,1 stw o4,-4(a2) stw d2,0-NODE_POINTER_OFFSET(a1) endif bge 5,copy_lp2 blr copy_normal_hnf_0_2: subi a0,d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET-NODE_POINTER_OFFSET stw a0,-4(a2) bge 5,copy_lp2 blr copy_real_file_or_string_2: lea o0,__STRING__2 cmplw 0,d0,o0 ble copy_string_or_array_2 copy_real_or_file_2: if NODE_POINTER_OFFSET==0 stwu d0,-12(o4) lwz o0,4-NODE_POINTER_OFFSET(a1) addi d2,o4,1 stw d2,0-NODE_POINTER_OFFSET(a1) lwz o1,8-NODE_POINTER_OFFSET(a1) stw o0,4(o4) stw o1,8(o4) stw o4,-4(a2) else lwz o1,8-NODE_POINTER_OFFSET(a1) lwz o0,4-NODE_POINTER_OFFSET(a1) stwu o1,-4(o4) stw o4,-4(a2) addi d2,o4,1 stw d2,0-NODE_POINTER_OFFSET(a1) stw o0,-4(o4) stwu d0,-8(o4) endif bge 5,copy_lp2 blr already_copied_2: cmpwi 5,d5,0 already_copied_2_: subi d0,d0,1 stw d0,-4(a2) bge 5,copy_lp2 blr ; to do: copy strict basic records to end of heap copy_record_2: subic. d2,d2,258 lwz o0,4-NODE_POINTER_OFFSET(a1) addi a0,a6,1+NODE_POINTER_OFFSET stw a0,0-NODE_POINTER_OFFSET(a1) blt copy_record_node2_1 bgt copy_record_node2_3 lwz o1,8-NODE_POINTER_OFFSET(a1) stw o0,4(a6) if NODE_POINTER_OFFSET==0 stw o1,8(a6) baddi a6,12 else stwu o1,8(a6) stw a6,-4(a2) baddi a6,4 endif bge 5,copy_lp2 blr copy_record_node2_1: stw o0,4-NODE_POINTER_OFFSET(a6) baddi a6,8 if NODE_POINTER_OFFSET stw a6,-4(a2) endif bge 5,copy_lp2 blr copy_record_node2_3: lwz a0,8-NODE_POINTER_OFFSET(a1) stw o0,4(a6) if COPIED_VECTOR lea a1,heap_copied_vector sub d0,a0,a3 lwz a1,0(a1) tstmbit a1,d0,d1,o0,o1,o2,3 bne record_arguments_already_copied_2 li o0,128 srw o0,o0,o2 or o1,o1,o0 stbx o1,a1,d1 endif if NODE_POINTER_OFFSET==0 addi a1,a6,12 stw a1,8(a6) else addi a1,a6,12+NODE_POINTER_OFFSET stwu a1,8(a6) stw a6,-4(a2) endif lwz o1,0-NODE_POINTER_OFFSET(a0) addi a1,a1,1 stw a1,0-NODE_POINTER_OFFSET(a0) if NODE_POINTER_OFFSET==0 stwu o1,12(a6) else stwu o1,4(a6) endif subi d2,d2,1 cp_record_arg_lp2: if NODE_POINTER_OFFSET lwz o1,4-NODE_POINTER_OFFSET(a0) baddi a0,4 else lwzu o1,4(a0) endif subic. d2,d2,1 stwu o1,4(a6) bge cp_record_arg_lp2 addi a6,a6,4 bge 5,copy_lp2 blr if COPIED_VECTOR record_arguments_already_copied_2: lwz o0,0-NODE_POINTER_OFFSET(a0) if NODE_POINTER_OFFSET==0 addi a6,a6,12 stw o0,-4(a6) else stwu o0,8(a6) stw a6,-4(a2) addi a6,a6,4 endif bge 5,copy_lp2 blr endif not_in_hnf_2: andi. r0,d0,1 bne- already_copied_2 lwz d2,-4-NODE_POINTER_OFFSET(d0) cmpwi 5,d5,0 extsb. d2,d2 beq copy_arity_0_node2_ copy_node2_1_: subic. d2,d2,2 blt copy_arity_1_node2 copy_node2_3: if NODE_POINTER_OFFSET==0 stw a6,-4(a2) endif stw d0,0(a6) addi a0,a6,1+NODE_POINTER_OFFSET stw a0,0-NODE_POINTER_OFFSET(a1) lwzu o0,4-NODE_POINTER_OFFSET(a1) if NODE_POINTER_OFFSET addi o1,a6,8 stw o1,-4(a2) endif stwu o0,4(a6) cp_arg_lp2: lwzu o0,4(a1) subic. d2,d2,1 stwu o0,4(a6) bge cp_arg_lp2 addi a6,a6,4 bge 5,copy_lp2 blr copy_arity_1_node2: cmpwi 0,d2,-1-2 ble copy_selector_2 copy_arity_1_node2_: if NODE_POINTER_OFFSET==0 stw a6,-4(a2) endif lwz o0,4-NODE_POINTER_OFFSET(a1) addi a0,a6,1+NODE_POINTER_OFFSET stw a0,0-NODE_POINTER_OFFSET(a1) if NODE_POINTER_OFFSET addi o1,a6,8 stw o1,-4(a2) endif stw d0,0(a6) stw o0,4(a6) addi a6,a6,12 bge 5,copy_lp2 blr copy_indirection_2: mr d1,a1 lwz a1,4-NODE_POINTER_OFFSET(a1) lwz d0,0-NODE_POINTER_OFFSET(a1) andi. r0,d0,2 bne in_hnf_2 andi. r0,d0,1 bne already_copied_2_ lwz d2,-4(d0) extsb. d2,d2 beq copy_arity_0_node2_ cmpwi 0,d2,-2 bne copy_node2_1_ skip_indirections_2: lwz a1,4-NODE_POINTER_OFFSET(a1) lwz d0,0-NODE_POINTER_OFFSET(a1) andi. r0,d0,3 bne update_indirection_list_2 lwz o0,-4(d0) mr a0,d0 cmpwi 0,o0,-2 beq skip_indirections_2 update_indirection_list_2: addi a0,d1,4 lwz d1,0-NODE_POINTER_OFFSET(a0) stw a1,0-NODE_POINTER_OFFSET(a0) cmpw 0,a1,d1 bne update_indirection_list_2 lwz d0,0-NODE_POINTER_OFFSET(a1) b continue_after_selector_2 copy_selector_2: cmpwi 0,d2,-2-2 beq copy_indirection_2 mr a0,d0 ; if no selectors ; b copy_arity_1_node2_ blt copy_record_selector_2 if LINUX lwz d2,-8(a0) else lha d2,-6(a0) endif lwz a0,4-NODE_POINTER_OFFSET(a1) lwz d1,0-NODE_POINTER_OFFSET(a0) andi. r0,d1,2 beq copy_arity_1_node2_ lha g1,-2(d1) cmplwi 0,g1,2 ble copy_selector_2_ lwz g1,8-NODE_POINTER_OFFSET(a0) lwz g1,0-NODE_POINTER_OFFSET(g1) andi. r0,g1,1 bne copy_arity_1_node2_ copy_selector_2_: if LINUX else lwzx d2,rtoc,d2 endif lwz g1,4(d2) mtctr g1 mr d2,a1 mflr r0 stwu r0,-4(sp) bctrl mtlr r0 lea g1,__indirection stw a0,4-NODE_POINTER_OFFSET(d2) stw g1,0-NODE_POINTER_OFFSET(d2) mr a1,a0 lwz d0,0-NODE_POINTER_OFFSET(a1) b continue_after_selector_2 copy_record_selector_2: cmpwi 0,d2,-2-3 if LINUX lwz d2,-8(a0) else lha d2,-6(a0) endif beq copy_strict_record_selector_2 lwz a0,4-NODE_POINTER_OFFSET(a1) lwz d1,0-NODE_POINTER_OFFSET(a0) andi. r0,d1,2 beq copy_arity_1_node2_ lha g1,-2(d1) cmplwi 0,g1,258 ble copy_selector_2_ if COPIED_VECTOR lea g1,heap_copied_vector lwz g0,8-NODE_POINTER_OFFSET(a0) lwz g1,0(g1) sub g0,g0,a3 tstmbit g1,g0,d1,o0,o1,o2,3 bne copy_arity_1_node2_ endif b copy_selector_2_ copy_strict_record_selector_2: lwz a0,4-NODE_POINTER_OFFSET(a1) lwz d1,0-NODE_POINTER_OFFSET(a0) andi. r0,d1,2 beq copy_arity_1_node2_ lha g1,-2(d1) cmplwi 0,g1,258 ble copy_strict_record_selector_2_ if COPIED_VECTOR lea g1,heap_copied_vector lwz g0,8-NODE_POINTER_OFFSET(a0) lwz g1,0(g1) sub g0,g0,a3 tstmbit g1,g0,d1,o0,o1,o2,3 bne copy_arity_1_node2_ endif copy_strict_record_selector_2_: if LINUX else lwzx d2,rtoc,d2 endif mr d0,a1 lwz g1,4(d2) mr a1,a0 mtctr g1 mr a0,d0 mflr r0 stwu r0,-4(sp) bctrl mtlr r0 lwz d0,0-NODE_POINTER_OFFSET(a0) mr a1,a0 b in_hnf_2 copy_arity_0_node2_: if NODE_POINTER_OFFSET==0 stwu d0,-12(o4) stw o4,-4(a2) ori d2,o4,1 else addi o1,o4,-4 stwu d0,-12(o4) ori d2,o1,1 stw o1,-4(a2) endif stw d2,0-NODE_POINTER_OFFSET(a1) bge 5,copy_lp2 blr copy_string_or_array_2: bne copy_array_2 sub d1,a1,a3 cmplw 0,d1,d7 bge copy_string_constant lwz d2,4-NODE_POINTER_OFFSET(a1) mr a0,a1 lwz o0,0-NODE_POINTER_OFFSET(a0) addi d2,d2,3 srwi d2,d2,2 slwi d1,d2,2 subi a1,o4,8-NODE_POINTER_OFFSET sub a1,a1,d1 stw a1,-4(a2) ori d0,a1,1 subi o4,a1,NODE_POINTER_OFFSET if NODE_POINTER_OFFSET stwu d0,0-NODE_POINTER_OFFSET(a0) stwu o0,0-NODE_POINTER_OFFSET(a1) else stw d0,0-NODE_POINTER_OFFSET(a0) stw o0,0(a1) endif cp_s_arg_lp2: lwzu o0,4(a0) subic. d2,d2,1 stwu o0,4(a1) bge cp_s_arg_lp2 bge 5,copy_lp2 blr copy_string_constant: stw a1,-4(a2) bge 5,copy_lp2 blr copy_array_2: mr a0,a1 lwz d0,8-NODE_POINTER_OFFSET(a0) lwz d2,4-NODE_POINTER_OFFSET(a0) cmpwi 0,d0,0 beq copy_array_a2 lhz d1,-2(d0) cmpwi 0,d1,0 beq copy_strict_basic_array_2 subi d0,d1,256 mullw d2,d2,d0 copy_array_a2: addi a1,a6,-NODE_POINTER_OFFSET slwi d1,d2,2 add a6,a6,d1 addi a6,a6,12 stw a1,-4(a2) addi d0,a1,1 lwz o0,0-NODE_POINTER_OFFSET(a0) if NODE_POINTER_OFFSET stwu d0,0-NODE_POINTER_OFFSET(a0) addi d2,d2,1 stwu o0,0-NODE_POINTER_OFFSET(a1) else stw d0,0-NODE_POINTER_OFFSET(a0) addi d2,d2,1 stw o0,0(a1) endif b cp_s_arg_lp2 copy_strict_basic_array_2: cmplw d0,int_reg beq copy_int_array_2 cmpw bool_reg,d0 beq copy_bool_array_2 add d2,d2,d2 copy_int_array_2: slwi d1,d2,2 subi a1,o4,12-NODE_POINTER_OFFSET sub a1,a1,d1 lwz o0,0-NODE_POINTER_OFFSET(a0) stw a1,-4(a2) addi d0,a1,1 subi o4,a1,NODE_POINTER_OFFSET if NODE_POINTER_OFFSET stwu d0,0-NODE_POINTER_OFFSET(a0) addi d2,d2,1 stw o0,0-NODE_POINTER_OFFSET(a1) else stw d0,0-NODE_POINTER_OFFSET(a0) addi d2,d2,1 stw o0,0(a1) endif b cp_s_arg_lp2 copy_bool_array_2: addi d2,d2,3 srwi d2,d2,2 b copy_int_array_2 end_copy1: if FINALIZERS lea a0,finalizer_list lea a1,free_finalizer_list lwz a2,0(a0) determine_free_finalizers_after_copy: lwz d0,0(a2) andi. o0,d0,1 beq finalizer_not_used_after_copy lwz a2,4(a2) subi d0,d0,1 stw d0,0(a0) addi a0,d0,4 b determine_free_finalizers_after_copy finalizer_not_used_after_copy: lea o0,__Nil_m8 cmplw a2,o0 beq end_finalizers_after_copy stw a2,0(a1) addi a1,a2,4 lwz a2,4(a2) b determine_free_finalizers_after_copy end_finalizers_after_copy: stw a2,0(a0) stw a2,0(a1) endif