diff options
author | John van Groningen | 2003-05-06 14:27:01 +0000 |
---|---|---|
committer | John van Groningen | 2003-05-06 14:27:01 +0000 |
commit | fb40e282e5bb51da2441f442fa3b136c1bcaed97 (patch) | |
tree | 12c1fbf117326bd89a524cbe4eb49a1c3c96ce5a /macho/pcopy.a | |
parent | no message (diff) |
macho files
Diffstat (limited to 'macho/pcopy.a')
-rw-r--r-- | macho/pcopy.a | 985 |
1 files changed, 985 insertions, 0 deletions
diff --git a/macho/pcopy.a b/macho/pcopy.a new file mode 100644 index 0000000..bf079af --- /dev/null +++ b/macho/pcopy.a @@ -0,0 +1,985 @@ + + 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 cr6,d1,0 + bne record_node_without_arguments_part + .else + lhz d1,-2+2(d0) + cmpwi cr6,,d1,0 + .endif + baddi d5,2+1 + beq cr6,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 cr6,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 cr6,d2,256 + .if NODE_POINTER_OFFSET==0 + stw a6,-4(a2) + .endif + stw d0,0(a6) + bge cr6,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 cr5,copy_lp2 + blr + +copy_hnf_node2_1: + stw o0,4(a6) + baddi a6,8 + .if NODE_POINTER_OFFSET + stw a6,-4(a2) + .endif + bge cr5,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 cr5,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 cr5,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 cr5,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 cr5,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 cr5,copy_lp2 + blr + +copy_normal_hnf_0_2: + subi a0,d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET-NODE_POINTER_OFFSET + stw a0,-4(a2) + bge cr5,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 cr5,copy_lp2 + blr + +already_copied_2: + cmpwi 5,d5,0 +already_copied_2_: + subi d0,d0,1 + stw d0,-4(a2) + + bge cr5,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 cr5,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 cr5,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 cr5,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 cr5,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 cr5,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 cr5,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 + + lwz d2,-8(a0) + + 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_: + 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 + + lwz d2,-8(a0) + + 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_: + 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 cr5,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 cr5,copy_lp2 + blr + +copy_string_constant: + stw a1,-4(a2) + bge cr5,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-8 + 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 |