diff options
-rw-r--r-- | macho/Makefile | 57 | ||||
-rw-r--r-- | macho/pcompact.a | 1749 | ||||
-rw-r--r-- | macho/pcopy.a | 985 | ||||
-rw-r--r-- | macho/pfileIO3.a | 1390 | ||||
-rw-r--r-- | macho/pmacros.a | 45 | ||||
-rw-r--r-- | macho/pmark.a | 2107 | ||||
-rw-r--r-- | macho/pprofile.a | 1488 | ||||
-rw-r--r-- | macho/pstartup.a | 6116 | ||||
-rw-r--r-- | macho/ptrace.a | 739 |
9 files changed, 14676 insertions, 0 deletions
diff --git a/macho/Makefile b/macho/Makefile new file mode 100644 index 0000000..675920b --- /dev/null +++ b/macho/Makefile @@ -0,0 +1,57 @@ + +all: _startup.o _startupProfile.o _startupTrace.o _startup2.o _startup3.o _library.o + + +_startup.o: pstartup_.a + as pstartup_.a -o _startup.o + +pstartup_.a: pstartup.a pmark.a pcompact.a pcopy.a pmacros.a + cpp -DPROFILE=0 pstartup.a > pstartup_.a + +pstartup_p.a: pstartup.a pmark.a pcompact.a pcopy.a pmacros.a + cpp -DPROFILE=1 pstartup.a > pstartup_p.a + + +_startupProfile.o: _startupProfile_.a + as _startupProfile_.a -o _startupProfile.o + +_startupProfile_.a: pstartup_p.a pprofile_.a + cat pstartup_p.a pprofile_.a > _startupProfile_.a + +pprofile.o: pprofile_.a + as pprofile_.a -o pprofile.o + +pprofile_.a: pprofile.a + cpp pprofile.a > pprofile_.a + + +_startupTrace.o: _startupTrace_.a + as _startupTrace_.a -o _startupTrace.o + +_startupTrace_.a: pstartup_p.a ptrace_.a + cat pstartup_p.a ptrace_.a > _startupTrace_.a + +ptrace.o: ptrace_.a + as ptrace_.a -o ptrace.o + +ptrace_.a: ptrace.a + cpp ptrace.a > ptrace_.a + + +_startup2.o: pfileIO3_.a + as pfileIO3_.a -o _startup2.o + +pfileIO3_.a: pfileIO3.a + cpp pfileIO3.a > pfileIO3_.a + + +_startup3.o: ../mfileIO3.c + cc -I /Developer/Headers/FlatCarbon/ -I .. -c -fpascal-strings -O -DMACHO ../mfileIO3.c -o _startup3.o + + +_library.o: ../mcon.c ../mcon.h + cc -I /Developer/Headers/FlatCarbon/ -I .. -c -fpascal-strings -O -DMACHO ../mcon.c -o _library.o + + +cleanup: + rm -f pstartup_.a pstartup_p.a _startupTrace_.a _startupProfile_.a pprofile_.a ptrace_.a pfileIO3_.a diff --git a/macho/pcompact.a b/macho/pcompact.a new file mode 100644 index 0000000..0e9c39e --- /dev/null +++ b/macho/pcompact.a @@ -0,0 +1,1749 @@ + +; mark used nodes and pointers in argument parts and link backward pointers + + + lea o0,heap_size_33 + lwz d7,0(o0) + + lea o0,caf_list + slwi d7,d7,5 + lwz d0,0(o0) + + stwu a4,-4(sp) + li g3,128 + + cmpwi 0,d0,0 + beq end_mark_cafs + +mark_cafs_lp: + lwz d1,0(d0) + lwz o5,-4(d0) + addi a2,d0,4 + slwi d0,d1,2 + add a4,a2,d0 + + bl mark_stack_nodes + + addic. d0,o5,0 + bne mark_cafs_lp + +end_mark_cafs: + + lea o0,stack_p + lwz a4,0(sp) + lwz a2,0(o0) + addi sp,sp,4 + + bl mark_stack_nodes + + 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 cr6,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: + lwz g1,-8(d0) + mflr r0 + 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: + lwz g1,-8(d0) + mflr r0 + 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 cr6,mark_next_node + + bsubicc d2,1 + baddi a0,4 + ble mark_lazy_node_1 + + .if UNBOXED_CLOSURES + cmplwi 0,d2,255 + bge mark_closure_with_unboxed_arguments +mark_closure_with_unboxed_arguments_: + .endif + 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 + + .if UNBOXED_CLOSURES +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 + .endif + +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 cr6,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 + + +; compact the heap + +compact_heap: + + .if FINALIZERS + lea a0,finalizer_list + lea a1,free_finalizer_list + + lwz a2,0(a0) +determine_free_finalizers_after_compact1: + lea o0,__Nil-8 + cmplw o0,a2 + beq end_finalizers_after_compact1 + + sub d1,a2,d6 + rlwinm o0,d1,32-5,5,29 + lwzx o1,o4,o0 + rlwinm d1,d1,32-2,27,31 + rlwnm. r0,o1,d1,0,0 + beq finalizer_not_used_after_compact1 + + lwz d0,0(a2) + mr a3,a2 + b finalizer_find_descriptor + +finalizer_find_descriptor_lp: + clrrwi d0,d0,2 + mr a3,d0 + lwz d0,0(d0) +finalizer_find_descriptor: + andi. r0,d0,1 + bne finalizer_find_descriptor_lp + + lea o0,e____system__kFinalizerGCTemp+2 + stw o0,0(a3) + + cmplw a2,a0 + bgt finalizer_no_reverse + + lwz d0,0(a2) + addi a3,a0,1 + stw a3,0(a2) + stw d0,0(a0) + +finalizer_no_reverse: + addi a0,a2,4 + lwz a2,4(a2) + b determine_free_finalizers_after_compact1 + +finalizer_not_used_after_compact1: + lea o0,e____system__kFinalizerGCTemp+2 + stw o0,0(a2) + + stw a2,0(a1) + addi a1,a2,4 + + lwz a2,4(a2) + stw a2,0(a0) + b determine_free_finalizers_after_compact1 + +end_finalizers_after_compact1: + stw a2,0(a1) + + lea o1,finalizer_list + lwz a0,0(o1) + lea o0,__Nil-8 + cmplw o0,a0 + beq finalizer_list_empty + andi. r0,a0,3 + bne finalizer_list_already_reversed + lwz d0,0(a0) + addi o0,o1,1 + stw o0,0(a0) + stw d0,0(o1) +finalizer_list_already_reversed: +finalizer_list_empty: + + lea a2,free_finalizer_list + lea o0,__Nil-8 + lwz o1,0(a2) + cmplw o0,o1 + beq free_finalizer_list_empty + + stwu a4,-4(sp) + addi a4,a2,4 + bl mark_stack_nodes + lwz a4,0(sp) + addi sp,sp,4 + +free_finalizer_list_empty: + .endif + + + lea o0,heap_size_33 + lwz d5,0(o0) + slwi d2,d5,5 + + .if SHARE_CHAR_INT + add d2,d2,d6 + .endif + + addi d5,d5,3 + srwi. d5,d5,2 + + mr a2,o4 + mr a6,d6 + li d4,0 + + beq end_compact_heap + + mtctr d5 +skip_zeros_2: + lwz d4,0(a2) + baddi a2,4 + cmpwi 0,d4,0 + bne end_skip_zeros +find_non_zero_long_2: + bdnz skip_zeros_2 + + b end_compact_heap + +end_skip_zeros: + sub d7,a2,o4 + subi d7,d7,4 + slwi d7,d7,5 + add d7,d7,d6 + +skip_zero_bits: + cntlzw d1,d4 + cmpwi 0,d1,32 + beq- find_non_zero_long_2 + + addi d1,d1,1 + slw d4,d4,d1 + slwi d1,d1,2 + add d7,d7,d1 + + lwz d0,-4(d7) + mr a0,d7 + + andi. r0,d0,2 + clrrwi d0,d0,2 + beq+ begin_update_list_2 + + lwz d3,-8(d0) + mr a1,d0 + andi. r0,d3,1 + beq end_list_2 +find_descriptor_2: + clrrwi a1,d3,2 + lwz d3,0(a1) + andi. r0,d3,1 + bne find_descriptor_2 +end_list_2: + lhz d1,-2(d3) + + cmplwi 0,d1,256 + blt no_record_arguments + + lhz d3,-2+2(d3) + subic. d3,d3,2 + bge copy_record_arguments_aa + + subi d1,d1,256+3 + +copy_record_arguments_all_b: + mr g2,d1 + +update_up_list_1r: + mr a1,d0 + sub d0,d0,d6 + + tstmbit o4,d0,d1,o0,o1,o2,2 + beq copy_argument_part_1r + + lwz d0,0(a1) + stw a6,0(a1) + subi d0,d0,3 + b update_up_list_1r + +copy_argument_part_1r: + lwz d0,0(a1) + stw a6,0(a1) + stw d0,0(a6) + addi a6,a6,4 + + mr d1,g2 + +copy_b_record_argument_part_arguments: + lwz o0,0(a0) + + subic. d1,d1,1 + + addi a0,a0,4 + stw o0,0(a6) + addi a6,a6,4 + bge copy_b_record_argument_part_arguments + + sub o0,a2,o4 + slwi o0,o0,5 + add o0,o0,d6 + + cmpw 0,o0,d7 + addi d7,d7,4 + slwi d4,d4,1 + bne skip_zero_bits + + bdz end_compact_heap + + lwz d4,0(a2) + lis o1,0x8000 + andc d4,d4,o1 + b skip_zeros_2+4 + +copy_record_arguments_aa: + subi d1,d1,256+2 + sub d1,d1,d3 + mr g2,d1 + +update_up_list_2r: + mr a1,d0 + lwz d0,0(a1) + andi. d1,d0,3 + subic. d1,d1,3 + stw a6,0(a1) + bne copy_argument_part_2r + + subi d0,d0,3 + b update_up_list_2r + +copy_argument_part_2r: + cmplw 0,d0,a0 + blt copy_record_argument_2 + .if SHARE_CHAR_INT + cmplw 0,d0,d2 + bge copy_record_argument_2 + .endif + mr a1,d0 + lwz d0,0(a1) + addi d1,a6,1 + stw d1,0(a1) +copy_record_argument_2: + stw d0,0(a6) + addi a6,a6,4 + + subic. d3,d3,1 + blt no_pointers_in_record +copy_record_pointers: + lwz a1,0(a0) + addi a0,a0,4 + cmplw 0,a1,a0 + blt copy_record_pointers_2 + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + bge copy_record_pointers_2 + .endif + lwz d1,0(a1) + addi d0,a6,1 + stw d0,0(a1) + mr a1,d1 +copy_record_pointers_2: + stw a1,0(a6) + subic. d3,d3,1 + addi a6,a6,4 + bge copy_record_pointers + +no_pointers_in_record: + cmpwi 0,g2,0 + subi d1,g2,1 + beq no_non_pointers_in_record + +copy_non_pointers_in_record: + lwz o0,0(a0) + addi a0,a0,4 + stw o0,0(a6) +# subi. d2,d2,1 + subic. d1,d1,1 + addi a6,a6,4 + bge copy_non_pointers_in_record + +no_non_pointers_in_record: + b skip_zero_bits + +no_record_arguments: + subi d1,d1,3 +update_up_list_2: + mr a1,d0 + lwz d0,0(a1) + andi. d3,d0,3 + cmpwi 0,d3,3 + bne copy_argument_part_2 + + stw a6,0(a1) + clrrwi d0,d0,2 + b update_up_list_2 + +copy_argument_part_2: + stw a6,0(a1) + + cmplw 0,d0,a0 + addi a6,a6,4 + blt copy_arguments_1 + + .if SHARE_CHAR_INT + cmplw 0,d0,d2 + bge copy_arguments_1 + .endif + mr a1,d0 + lwz d0,0(a1) + addi d3,a6,1-4 + stw d3,0(a1) +copy_arguments_1: + stw d0,-4(a6) + +copy_argument_part_arguments: + lwz a1,0(a0) + addi a0,a0,4 + cmplw 0,a1,a0 + blt copy_arguments_2 + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + bge copy_arguments_2 + .endif + ori d0,a6,1 + lwz d3,0(a1) + stw d0,0(a1) + mr a1,d3 + +copy_arguments_2: + stw a1,0(a6) + subic. d1,d1,1 + addi a6,a6,4 + bge copy_argument_part_arguments + + b skip_zero_bits + +update_list_2: + stw a6,0(a1) +begin_update_list_2: + mr a1,d0 + lwz d0,0(a1) +update_list__2: + andi. r0,d0,1 + beq end_update_list_2 + andi. r0,d0,2 + clrrwi d0,d0,2 + beq update_list_2 + mr a1,d0 + lwz d0,0(a1) + b update_list__2 + +end_update_list_2: + stw a6,0(a1) + + andi. r0,d0,2 + stw d0,0(a6) + beq move_lazy_node + + lhz d1,-2(d0) + baddi a6,4 + cmpwi 0,d1,0 + beq move_hnf_0 + + cmplwi 0,d1,256 + bge move_record + + subic. d1,d1,2 + blt move_hnf_1 + beq move_hnf_2 + +move_hnf_3: + lwz a1,0(a0) + addi a0,a0,4 +move_hnf_3_: + cmplw 0,a1,a0 + blt copy_hnf_3_1 + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + bge copy_hnf_3_1 + .endif + ori d0,a6,1 + lwz d1,0(a1) + stw d0,0(a1) + mr a1,d1 +copy_hnf_3_1: + stw a1,0(a6) + + lwz a1,0(a0) + addi a0,a0,4 + cmplw 0,a1,a0 + blt copy_hnf_3_2 + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + bge copy_hnf_3_2 + .endif + addi d0,a6,4+2+1 + lwz d1,0(a1) + stw d0,0(a1) + mr a1,d1 +copy_hnf_3_2: + stw a1,4(a6) + addi a6,a6,8 + b skip_zero_bits + +move_hnf_2: + lwz a1,0(a0) + addi a0,a0,4 + cmplw 0,a1,a0 + blt copy_hnf_2_1 + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + bge copy_hnf_2_1 + .endif + ori d0,a6,1 + lwz d1,0(a1) + stw d0,0(a1) + mr a1,d1 +copy_hnf_2_1: + stw a1,0(a6) + + lwz a1,0(a0) + addi a0,a0,4 + cmplw 0,a1,a0 + blt copy_hnf_2_2 + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + bge copy_hnf_2_2 + .endif + addi d0,a6,4+1 + lwz d1,0(a1) + stw d0,0(a1) + mr a1,d1 +copy_hnf_2_2: + stw a1,4(a6) + addi a6,a6,8 + b skip_zero_bits + +move_hnf_1: + lwz a1,0(a0) + addi a0,a0,4 + cmplw 0,a1,a0 + blt move_hnf_1_ + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + bge move_hnf_1_ + .endif + ori d0,a6,1 + lwz d1,0(a1) + stw d0,0(a1) + mr a1,d1 +move_hnf_1_: + stw a1,0(a6) + addi a6,a6,4 + b skip_zero_bits + +move_real_or_file: + lwz o0,0(a0) + lwz o1,4(a0) + stw o0,0(a6) + stw o1,4(a6) + addi a6,a6,8 + b skip_zero_bits + +move_int_bool_or_char: + lwz o0,0(a0) + addi a6,a6,4 + stw o0,-4(a6) +copy_normal_hnf_0: + b skip_zero_bits + +move_hnf_0: + cmplw 0,d0,int_reg + blt move_real_file_string_or_array + + cmplw 0,d0,char_reg + ble move_int_bool_or_char + +; b,a copy_normal_hnf_0 + b skip_zero_bits + +move_real_file_string_or_array: + lea o0,__STRING__+2 + cmplw 0,d0,o0 + bgt move_real_or_file + + bne move_array + + lwz d0,0(a0) + addi d0,d0,3 + srwi d0,d0,2 + +cp_s_arg_lp3: + lwz o0,0(a0) + subic. d0,d0,1 + stw o0,0(a6) + blt end_cp_s_lp3 + +cp_s_lp3: + lwzu o0,4(a0) + subic. d0,d0,1 + stwu o0,4(a6) + bge cp_s_lp3 + +end_cp_s_lp3: + addi a6,a6,4 + b skip_zero_bits + +move_record: + bsubicc d1,258 + blt move_record_1 + beq move_record_2 + +move_record_3: + lhz d1,-2+2(d0) + + lwz a1,0(a0) + + bsubicc d1,1 + + baddi a0,4 + + bgt move_hnf_3_ + + blt move_record_3_1b + +move_record_3_1a: + cmplw 0,a1,a0 + blt move_record_3_1b + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + bge move_record_3_1b + .endif + addi d0,a6,1 + lwz d1,0(a1) + stw d0,0(a1) + mr a1,d1 +move_record_3_1b: + stw a1,0(a6) + addi a6,a6,4 + + lwz a1,0(a0) + addi a0,a0,4 + cmplw 0,a1,a0 + blt move_record_3_2 + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + bge move_record_3_2 + .endif + sub d0,a1,d6 + addi d0,d0,4 + + tstmbit o4,d0,d1,o0,o1,o2,2 + beq not_linked_record_argument_part_3_b + + sub d0,a6,d6 + setmbit o4,d0,d1,o0,o1,o2,2 + b linked_record_argument_part_3_b + +not_linked_record_argument_part_3_b: + srw o0,g3,o2 + or o1,o1,o0 + stbx o1,o4,d1 + + sub d0,a6,d6 + clrmbit o4,d0,d1,o0,o1,o2,2 + +linked_record_argument_part_3_b: + lwz d1,0(a1) + addi d0,a6,2+1 + stw d0,0(a1) + mr a1,d1 +move_record_3_2: + stw a1,0(a6) + addi a6,a6,4 + + sub o0,a2,o4 + slwi o0,o0,5 + add o0,o0,d6 + + addi d7,d7,4 + cmpw 0,d7,o0 + + addi d7,d7,4 + slwi d4,d4,2 + blt skip_zero_bits + bgt bits_in_next_long + + lis o1,0x80000000>>16 + b one_bit_in_next_long + +bits_in_next_long: + lis o1,0xc0000000>>16 +one_bit_in_next_long: + bdz end_compact_heap + + lwz d4,0(a2) + andc d4,d4,o1 + b skip_zeros_2+4 + +move_record_2: + lhz g1,-2+2(d0) + cmplwi 0,g1,1 + bgt move_hnf_2 + blt move_real_or_file + +move_record_2_ab: + lwz a1,0(a0) + lwzu o0,4(a0) + cmplw 0,a1,a0 + blt move_record_2_1 + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + addi d0,a6,1 + bge move_record_2_1 + .endif + lwz d1,0(a1) + stw d0,0(a1) + mr a1,d1 +move_record_2_1: + stw a1,0(a6) + stw o0,4(a6) + addi a6,a6,8 + b skip_zero_bits + +move_record_1: + lhz g1,-2+2(d0) + cmpwi 0,g1,0 + bne move_hnf_1 + + b move_int_bool_or_char + +skip_zeros_2_a: + lwz d4,0(a2) + bdz- out_of_memory_4 + cmpwi 0,d4,0 + addi a2,a2,4 + beq skip_zeros_2_a + +end_skip_zeros_a: + sub d7,a2,o4 + subi d7,d7,4 + slwi d7,d7,5 + add d7,d7,d6 + +move_array: +skip_zero_bits_a: + cntlzw d1,d4 + cmpwi 0,d1,32 + beq skip_zeros_2_a + + slw d4,d4,d1 + slwi d4,d4,1 + + slwi d1,d1,2 + add d7,d7,d1 + + cmpw 0,d7,a0 + mr d1,d7 + addi d7,d7,4 + bne move_a_array + +move_b_array: + lwz a1,0(a0) + lwzu d1,4(a0) + stw a1,0(a6) + lhz d0,-2(d1) + + addi a6,a6,4 + + cmpwi 0,d0,0 + beq move_strict_basic_array + + subi d1,d0,256 + mullw d0,a1,d1 + b cp_s_arg_lp3 + +move_strict_basic_array: + cmpw 0,d1,int_reg + mr d0,a1 + beq cp_s_arg_lp3 + + cmpw 0,d1,bool_reg + beq move_bool_array + + add d0,d0,d0 + b cp_s_arg_lp3 + +move_bool_array: + addi d0,d0,3 + srwi d0,d0,2 + b cp_s_arg_lp3 + +move_a_array: + mr a1,d1 + sub d1,d1,a0 + srwi d1,d1,2 + subic. d1,d1,1 + blt skip_zero_bits + .if 0 + cmpwi d1,1 + ble move_a_array_size_0_1 + .endif + +; first swap second last element of array and second last element of header + lwz o0,0(a0) + lwz d0,-4(a1) + stw o0,-4(a1) + stw d0,0(a6) + +; then swap last element of array and last element of header +; this also works for length 0 and 1 ! + + lwz d0,0(a1) + lwz o0,4(a0) + stw o0,0(a1) + addi a0,a0,8 + .if 0 + c_move_array_size_1: + .endif + + cmpwi 0,d0,0 + stw d0,4(a6) + addi a6,a6,8 + beq st_move_array_lp + + lhz d3,-2+2(d0) + lhz d0,-2(d0) + subi d0,d0,256 + cmpw 0,d0,d3 + beq st_move_array_lp + +move_array_ab: + mr o2,d4 + mr o3,d5 + + mr g2,d2 + stw a0,-4(sp) + + lwz d2,-8(a6) + mr d1,d3 + + mr d3,d0 + slwi d2,d2,2 + mullw a1,d2,d3 + + sub d0,d0,d1 + add a1,a1,a0 + + mflr r0 + stw r0,-8(sp) + + bl reorder + + lwz r0,-8(sp) + lwz d3,-8(a6) + mtlr r0 + + lwz a0,-4(sp) + mr d2,g2 + subi d1,d1,1 + subi d0,d0,1 + b st_move_array_lp_ab + +move_array_ab_lp1: + mr d4,d1 +move_array_ab_a_elements: + lwz d5,0(a0) + addi a0,a0,4 + cmplw 0,d5,a0 + blt move_array_element_ab + .if SHARE_CHAR_INT + cmplw 0,d5,d2 + bge move_array_element_ab + .endif + mr a1,d5 + lwz d5,0(a1) + addi o0,a6,1 + stw o0,0(a1) +move_array_element_ab: + subic. d4,d4,1 + stw d5,0(a6) + addi a6,a6,4 + bge move_array_ab_a_elements + + mr d4,d0 +move_array_ab_b_elements: + lwz o0,0(a0) + subic. d4,d4,1 + addi a0,a0,4 + stw o0,0(a6) + addi a6,a6,4 + bge move_array_ab_b_elements +st_move_array_lp_ab: + subic. d3,d3,1 + bge move_array_ab_lp1 + + mr d5,o3 + mr d4,o2 + b skip_zero_bits + +st_move_array_lp: + subic. d1,d1,1 + subi a6,a6,4 + bge+ move_lazy_node_arguments + addi a6,a6,4 + b skip_zero_bits + .if 0 + move_a_array_size_0_1: + lwz o0,0(a0) + lwz d0,4(a0) + blt move_array_size_0 + + stw d0,0(a6) + lwz d0,8(a0) + stwu o0,8(a0) + b c_move_array_size_1 + + move_array_size_0: + stw o0,0(a6) + stw d0,4(a6) + addi a6,a6,8 + b skip_zero_bits + .endif + +move_lazy_node: + lha d1,-2(d0) + mr a1,d0 + cmpwi 0,d1,0 + beq move_lazy_node_0 + + bsubicc d1,1 + ble move_lazy_node_1 + + .if UNBOXED_CLOSURES + cmplwi 0,d1,256 + bge move_closure_with_unboxed_arguments + .endif + +move_lazy_node_arguments: + lwz a1,0(a0) + baddi a0,4 + cmplw 0,a1,a0 + blt move_lazy_node_arguments_ + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + bge move_lazy_node_arguments_ + .endif + lwz o0,0(a1) + + bsubicc d1,1 + + stwu o0,4(a6) + addi d0,a6,1 + stw d0,0(a1) + bge move_lazy_node_arguments + + baddi a6,4 + b skip_zero_bits + +move_lazy_node_arguments_: + bsubicc d1,1 + stwu a1,4(a6) + bge move_lazy_node_arguments + + baddi a6,4 + b skip_zero_bits + +move_lazy_node_1: + lwz a1,0(a0) + baddi a0,4 + cmplw 0,a1,a0 + blt move_lazy_node_1_ + .if SHARE_CHAR_INT + cmplw 0,a1,d2 + bge move_lazy_node_1_ + .endif + addi d0,a6,4+1 + lwz d1,0(a1) + stw d0,0(a1) + mr a1,d1 +move_lazy_node_1_: + stw a1,4(a6) +move_lazy_node_0: + baddi a6,12 + b skip_zero_bits + + .if UNBOXED_CLOSURES +move_closure_with_unboxed_arguments: + baddi d1,1 + srwi d0,d1,8 + beq move_closure_with_unboxed_arguments_1 + bandic d1,255 + bsubc d1,d0 + beq copy_non_pointers_of_closure + +move_pointers_in_closure: + lwz a1,0(a0) + baddi a0,4 + cmplw 6,a1,a0 + + bsubicc d1,1 + + blt cr6,move_pointers_in_closure_ + .if SHARE_CHAR_INT + cmplw 6,a1,d2 + bge cr6,move_pointers_in_closure_ + .endif + lwz o0,0(a1) + addi o1,a6,4+1 + stw o1,0(a1) + mr a1,o0 + +move_pointers_in_closure_: + stwu a1,4(a6) + bne move_pointers_in_closure + +copy_non_pointers_of_closure: + bsubicc d0,1 + + lwz d1,0(a0) + baddi a0,4 + stwu d1,4(a6) + + bne copy_non_pointers_of_closure + + baddi a6,4 + b skip_zero_bits + +move_closure_with_unboxed_arguments_1: + lwz d0,0(a0) + baddi a6,12 + stw d0,4-12(a6) + b skip_zero_bits + .endif + +end_compact_heap: + + .if FINALIZERS + lea a0,finalizer_list + lwz a0,0(a0) + +restore_finalizer_descriptors: + lea o0,__Nil-8 + cmplw o0,a0 + beq end_restore_finalizer_descriptors + + lea o0,e____system__kFinalizer+2 + stw o0,0(a0) + lwz a0,4(a0) + b restore_finalizer_descriptors + +end_restore_finalizer_descriptors: + .endif 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 diff --git a/macho/pfileIO3.a b/macho/pfileIO3.a new file mode 100644 index 0000000..6c532ee --- /dev/null +++ b/macho/pfileIO3.a @@ -0,0 +1,1390 @@ +# comment File: cgpfileIO3.s +# comment Copyright: University of Nijmegen +# comment Written by: John van Groningen +# comment Machine: Power Macintosh + +MACOSX = 1 + +#define sp r1 + +#define d0 r24 +#define d1 r25 +#define d2 r26 +#define d3 r27 +#define d4 r28 +#define d5 r29 +#define d6 r30 +#define d7 r31 + +#define a0 r23 +#define a1 r22 +#define a2 r21 +#define a3 r20 +#define a4 r19 +#define a5 r18 +#define a6 r17 + +#define o0 r3 +#define o1 r4 +#define o2 r5 +#define o3 r6 +#define o4 r7 +#define o5 r8 + +#define g2 r9 +#define g3 r10 + +#define g0 r11 +#define g1 r12 + +#define int_reg r16 +#define char_reg r15 +#define real_reg r14 +#define bool_reg r13 + +#include "pmacros.a" + + .data + .align 3 +tmp_real: .double 0.0 +freadstring_error: + .ascii "Error in freadsubstring parameters." + .byte 13,0 + .byte 0,0,0 +fwritestring_error: + .ascii "Error in fwritesubstring parameters." + .byte 13,0 + .byte 0,0 + + .text + + .globl stdioF + .globl stderrF + .globl openF + .globl closeF + .globl reopenF + .globl readFC + .globl readFI + .globl readFR + .globl readFS + .globl readFString + .globl readLineF + .globl writeFC + .globl writeFI + .globl writeFR + .globl writeFS + .globl writeFString + .globl endF + .globl errorF + .globl positionF + .globl seekF + .globl shareF + + .globl openSF + .globl readSFC + .globl readSFI + .globl readSFR + .globl readSFS + .globl readLineSF + .globl endSF + .globl positionSF + .globl seekSF + + .globl collect_0 + .globl collect_1 + .globl __STRING__ + + .text + .globl _open_stdio +stdioF: mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _open_stdio + lwz r0,60(sp) + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d1,r3 + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _open_stderr +stderrF: mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _open_stderr + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d1,r3 + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _open_file +openF: mr o1,d0 + addi o0,a0,4 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _open_file + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + addic. d1,o0,0 + li d0,-1 + blt openF_1 + li d2,-1 + lwz r0,0(sp) + addi sp,sp,4 + blr + +openF_1: + li d2,0 + lwz r0,0(sp) + neg d1,d1 + addi sp,sp,4 + blr + + .text + .globl _close_file +closeF: mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _close_file + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d0,o0 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _re_open_file +reopenF: + mr o0,d2 + mr o1,d0 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _re_open_file + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d1,d2 + mr d2,o0 + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _file_read_char +readFC: + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_char + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d2,o0 + cmpwi 0,o0,-1 + li d0,-1 + beq readFC_eof + + li d3,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +readFC_eof: + li d2,0 + li d3,0 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _file_read_int +readFI: + subi sp,sp,4 + mr o1,sp + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_int + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + lwz d2,0(sp) + li d0,-1 + mr d3,o0 + lwz r0,4(sp) + addi sp,sp,8 + blr + + .text + .globl _file_read_real +readFR: + lea o1,tmp_real + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_real + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + lea o1,tmp_real + mr d2,o0 + lfd f14,0(o1) + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + + + + + .text + .globl _file_read_characters + .globl print_error +readFString: + lwz d4,4(a0) + cmplw 0,d3,d4 + bge readFString_error + + sub o0,d4,d3 + cmplw 0,d2,o0 + bgt readFString_error + + addi o2,a0,8 + stwu d2,-4(sp) + add o2,o2,d3 + mr o1,sp + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_characters + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d2,o0 + li d0,-1 + + lwz r0,4(sp) + addi sp,sp,8 + blr + +readFString_error: + lea o0,freadstring_error + b print_error + + .text + .if 0 + .globl _file_read_string + .else + .globl _file_read_characters + .endif +readFS: + addi d5,d0,8+3 + srwi d5,d5,2 + sub. d7,d7,d5 + blt readFS_gc +readFS_r_gc: + add d7,d7,d5 + mr d4,d2 + + lea o0,__STRING__+2 + addi d3,a6,4 + stwu o0,4(a6) + .if 0 + addi o2,a6,4 + mr o1,d0 + .else + addi o2,a6,8 + stw d0,4(a6) + addi o1,a6,4 + .endif + mr o0,d2 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + .if 0 + bl _file_read_string + .else + bl _file_read_characters + .endif + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + +readFS_end: + addi d0,o0,3 + clrrwi d0,d0,2 + addi a6,a6,4 + add a6,a6,d0 + srwi d0,d0,2 + baddi d0,2 + bsub d7,d0 + + mr a0,d3 + mr d1,d4 + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +readFS_gc: + mflr r0 + bl collect_0 + b readFS_r_gc + + .text + .globl _file_read_line +readLineF: + li d5,32+2 + cmpw 0,d7,d5 + blt readLineF_gc + +readLineF_r_gc: + mr d4,d1 + + lea o0,__STRING__+2 + addi d3,a6,4 + stwu o0,4(a6) + + addi o2,a6,8 + subi o1,d7,2 + slwi o1,o1,2 + mr o0,d4 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_line + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + addic. d0,o0,0 + stw d0,4(a6) + bge readFS_end + + subi d0,d7,2 + slwi d0,d0,2 + stwu d0,4(a6) + +readLineF_lp: + add a6,a6,d0 + + lwz d5,4(d3) + mr a0,d3 + srwi d5,d5,2 + addi d5,d5,2+32 + neg d7,d5 + + mflr r0 + bl collect_1 + + mr a1,a0 + add d7,d7,d5 + lwzu d0,4(a1) + addi d1,d0,3 + srwi d1,d1,2 + subi d7,d7,2 + sub d7,d7,d1 + + lea o0,__STRING__+2 + subic. d1,d1,1 + + addi d3,a6,4 + stw o0,4(a6) + stwu d0,8(a6) + blt end_copy_string1 + +copy_st_lp1: + lwzu g1,4(a1) + subic. d1,d1,1 + stwu g1,4(a6) + bge copy_st_lp1 +end_copy_string1: + + addi o2,a6,4 + slwi o1,d7,2 + mr o0,d4 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_line + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + addic. d0,o0,0 + lwz g1,4(d3) + blt readLineF_again + + mr a0,d3 + add g1,g1,d0 + stw g1,4(d3) + + addi d1,d0,3 + srwi d1,d1,2 + sub d7,d7,d1 + slwi d1,d1,2 + add a6,a6,d1 + + mr d1,d4 + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +readLineF_gc: + sub d7,d7,d5 + mflr r0 + bl collect_0 + add d7,d7,d5 + b readLineF_r_gc + +readLineF_again: + slwi d0,d7,2 + add g1,g1,d0 + stw g1,4(d3) + b readLineF_lp + + .text + .globl _file_write_char +writeFC: + mr o1,d1 + mr o0,d2 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_write_char + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _file_write_int +writeFI: + mr o1,d1 + mr o0,d2 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_write_int + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _file_write_real +writeFR: + mr o2,d1 + fmr f1,f14 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_write_real + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .if 0 + .globl _file_write_string + .else + .globl _file_write_characters + .endif +writeFS: + .if 0 + mr o1,d1 + addi o0,a0,4 + .else + lwz o1,4(a0) + mr o2,d1 + addi o0,a0,8 + .endif + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + .if 0 + bl _file_write_string + .else + bl _file_write_characters + .endif + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .if 1 + .text + .globl _file_write_characters + .globl print_error +writeFString: + lwz d4,4(a0) + cmplw 0,d3,d4 + bge writeFString_error + + sub o0,d4,d3 + cmplw 0,d2,o0 + bgt writeFString_error + + mr o2,d1 + addi o0,a0,8 + mr o1,d2 + add o0,o0,d3 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_write_characters + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +writeFString_error: + lea o0,fwritestring_error + b print_error + .endif + + .text + .globl _file_end +endF: + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_end + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + li d0,-1 + mr d2,o0 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _file_error +errorF: + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_error + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d2,o0 + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _file_position +positionF: + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_position + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d2,o0 + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _file_seek +seekF: + mr o2,d0 + mr o1,d1 + mr o0,d3 + mr d1,d3 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_seek + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d2,o0 + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _file_share +shareF: + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_share + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _open_s_file +openSF: + mr o1,d0 + addi o0,a0,4 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _open_s_file + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + addic. d1,o0,0 + li d0,0 + blt openSF_1 + li d2,-1 + lwz r0,0(sp) + addi sp,sp,4 + blr + +openSF_1: + li d2,0 + lwz r0,0(sp) + neg d1,d1 + addi sp,sp,4 + blr + + .text + .globl _file_read_s_char +readSFC: + stwu d0,-4(sp) + mr o1,sp + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_s_char + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d2,o0 + cmpwi 0,o0,-1 + lwz d0,0(sp) + beq readSFC_eof + + li d3,-1 + lwz r0,4(sp) + addi sp,sp,8 + blr + +readSFC_eof: + li d2,0 + li d3,0 + lwz r0,4(sp) + addi sp,sp,8 + blr + + .text + .globl _file_read_s_int +readSFI: + stwu d0,-4(sp) + mr o2,sp + subi sp,sp,4 + mr o1,sp + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_s_int + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + lwz d2,0(sp) + lwz d0,4(sp) + mr d3,o0 + + lwz r0,8(sp) + addi sp,sp,12 + blr + + .text + .globl _file_read_s_real +readSFR: + stwu d0,-4(sp) + mr o2,sp + lea o1,tmp_real + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_s_real + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + lea g1,tmp_real + lwz d0,0(sp) + lfd f14,0(g1) + mr d2,o0 + lwz r0,4(sp) + addi sp,sp,8 + blr + + .text + .globl _file_read_s_string +readSFS: + addi d5,d0,8+3 + srwi d5,d5,2 + sub. d7,d7,d5 + blt readSFS_gc +readSFS_r_gc: + add d7,d7,d5 + mr d4,d2 + + lea o0,__STRING__+2 + addi d3,a6,4 + stwu o0,4(a6) + + stwu d1,-4(sp) + mr o3,sp + addi o2,a6,4 + mr o1,d0 + mr o0,d2 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_s_string + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + +readSFS_end: + addi d0,d0,3 + clrrwi d0,d0,2 + addi a6,a6,4 + add a6,a6,d0 + srwi d0,d0,2 + baddi d0,2 + bsub d7,d0 + + mr a0,d3 + mr d1,d4 + lwz d0,0(sp) + lwz r0,4(sp) + addi sp,sp,8 + blr + +readSFS_gc: + mflr r0 + bl collect_0 + b readSFS_r_gc + + .text + .globl _file_read_s_line +readLineSF: + li d5,32+2 + cmpw 0,d7,d5 + blt readLineSF_gc + +readLineSF_r_gc: + stwu d0,-4(sp) + mr d4,d1 + + lea o0,__STRING__+2 + addi d3,a6,4 + stwu o0,4(a6) + + mr o3,sp + addi o2,a6,8 + subi o1,d7,2 + slwi o1,o1,2 + mr o0,d4 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_s_line + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + addic. d0,o0,0 + stw d0,4(a6) + bge readSFS_end + + subi d0,d7,2 + slwi d0,d0,2 + stwu d0,4(a6) + +readLineSF_lp: + add a6,a6,d0 + + lwz d5,4(d3) + mr a0,d3 + srwi d5,d5,2 + addi d5,d5,2+32 + neg d7,d5 + + mflr r0 + bl collect_1 + + mr a1,a0 + add d7,d7,d5 + lwzu d0,4(a1) + addi d1,d0,3 + srwi d1,d1,2 + subi d7,d7,2 + sub d7,d7,d1 + + lea o0,__STRING__+2 + subic. d1,d1,1 + + addi d3,a6,4 + stw o0,4(a6) + stwu d0,8(a6) + blt end_copy_string2 + +copy_st_lp2: + lwzu g1,4(a1) + subic. d1,d1,1 + stwu g1,4(a6) + bge copy_st_lp2 +end_copy_string2: + + mr o3,sp + addi o2,a6,4 + slwi o1,d7,2 + mr o0,d4 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_read_s_line + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + addic. d0,o0,0 + lwz g1,4(d3) + blt readLineSF_again + + mr a0,d3 + add g1,g1,d0 + stw g1,4(d3) + + addi d1,d0,3 + srwi d1,d1,2 + sub d7,d7,d1 + slwi d1,d1,2 + add a6,a6,d1 + + lwz d0,0(sp) + mr d1,d4 + lwz r0,4(sp) + addi sp,sp,8 + blr + +readLineSF_gc: + sub d7,d7,d5 + mflr r0 + bl collect_0 + add d7,d7,d5 + b readLineSF_r_gc + +readLineSF_again: + slwi d0,d7,2 + add g1,g1,d0 + stw g1,4(d3) + b readLineSF_lp + + .text + .globl _file_s_end +endSF: + mr o1,d0 + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_s_end + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d0,o0 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _file_s_position +positionSF: + mr o1,d0 + mr o0,d1 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_s_position + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + mr d0,o0 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text + .globl _file_s_seek +seekSF: + stwu d2,-4(sp) + mr o3,sp + + mr o2,d0 + mr o1,d1 + mr o0,d3 + mr d1,d3 + + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + stw r0,60(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl _file_s_seek + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + mtlr r0 + + lwz d0,0(sp) + mr d2,o0 + + lwz r0,4(sp) + addi sp,sp,8 + blr diff --git a/macho/pmacros.a b/macho/pmacros.a new file mode 100644 index 0000000..f6cec6a --- /dev/null +++ b/macho/pmacros.a @@ -0,0 +1,45 @@ + +.macro lea &r,&a + lis $0,ha16($1) + addi $0,$0,lo16($1) +.endmacro + +.macro tst + cmpwi 0,$0,0 +.endmacro + +.macro badd + add $0,$0,$1 +.endmacro + +.macro baddi + addi $0,$0,$1 +.endmacro + +.macro baddicc + addic. $0,$0,$1 +.endmacro + +.macro bandic + andi. $0,$0,$1 +.endmacro + +.macro bsub + sub $0,$0,$1 +.endmacro + +.macro bsubc + sub. $0,$0,$1 +.endmacro + +.macro bsubi + subi $0,$0,$1 +.endmacro + +.macro bsubicc + subic. $0,$0,$1 +.endmacro + +.macro bor + or $0,$0,$1 +.endmacro diff --git a/macho/pmark.a b/macho/pmark.a new file mode 100644 index 0000000..5cb0823 --- /dev/null +++ b/macho/pmark.a @@ -0,0 +1,2107 @@ + +COUNT_GARBAGE_COLLECTIONS = 0 +MARK_USING_REVERSAL = 0 +REMOVE_INDIRECTION_LISTS = 0 + + .if 0 + subi sp,sp,256 + stmw r3,68(sp) + mflr r3 + stw r3,64(sp) + bl .Debugger + nop + lwz r3,64(sp) + mtlr r3 + lmw r3,68(sp) + baddi sp,256 + .endif + + lea d7,heap_size_33 + lea o0,lazy_array_list + lwz d7,0(d7) + li d4,0 + stw d4,0(o0) + + lis g3,32768 + + subi a3,sp,2000 + + lea d0,caf_list + slwi d7,d7,5 + lwz d0,0(d0) + + stwu a4,-4(sp) + + tst d0 + beq _end_mark_cafs + +_mark_cafs_lp: + lwz d1,0(d0) + lwz o5,-4(d0) + addi a2,d0,4 + slwi d0,d1,2 + add a4,a2,d0 + + bl _mark_stack_nodes + + addic. d0,o5,0 + bne _mark_cafs_lp + +_end_mark_cafs: + lea a2,stack_p + lwz a4,0(sp) + lwz a2,0(a2) + baddi sp,4 + + bl _mark_stack_nodes + + lea a0,lazy_array_list + lwz a0,0(a0) + + tst a0 + beq end_restore_arrays + +restore_arrays: + lwz d3,0(a0) ; size + lwz d1,4(a0) ; second last element + cmplwi 0,d3,1 + + lea o0,__ARRAY__+2 + lwz d2,8(a0) ; last element + stw o0,0(a0) + beq restore_array_size_1 + + slwi a1,d3,2 + add a1,a0,a1 + + lwz d0,8(a1) ; descriptor + + tst d0 + beq restore_lazy_array + + lhz o0,-2+2(d0) + divwu d3,d3,o0 + +restore_lazy_array: + stw d3,4(a0) + lwz a3,4(a1) ; next + stw d0,8(a0) + + stw d1,4(a1) + stw d2,8(a1) + + tst d0 + beq no_reorder_array + + lhz o1,-2(d0) + subi o1,o1,256 + cmpw 0,o1,o0 + beq no_reorder_array + + mr d0,o1 + mr d1,o0 + slwi d3,d3,2 + mullw d3,d3,d0 + baddi a0,12 + add a1,a0,d3 + sub d0,d0,d1 + + mr g1,d4 + + bl reorder + + mr d4,g1 + +no_reorder_array: + addic. a0,a3,0 + bne restore_arrays + + b end_restore_arrays + +restore_array_size_1: + stw d3,4(a0) + lwz a3,12(a0) ; descriptor + + stw d1,12(a0) + stw a3,8(a0) + + addic. a0,d2,0 + bne restore_arrays + +end_restore_arrays: + + .if FINALIZERS + lea a0,finalizer_list + lea a1,free_finalizer_list + + lwz a2,0(a0) +determine_free_finalizers_after_mark: + lea o0,__Nil-8 + cmplw o0,a2 + beq end_finalizers_after_mark + + sub d1,a2,d6 + rlwinm o0,d1,32-5,5,29 + lwzx o1,o4,o0 + rlwinm d1,d1,32-2,27,31 + rlwnm. r0,o1,d1,0,0 + beq finalizer_not_used_after_mark + + addi a0,a2,4 + lwz a2,4(a2) + b determine_free_finalizers_after_mark + +finalizer_not_used_after_mark: + stw a2,0(a1) + addi a1,a2,4 + + lwz a2,4(a2) + stw a2,0(a0) + b determine_free_finalizers_after_mark + +end_finalizers_after_mark: + stw a2,0(a1) + .endif + + stwu o4,-4(sp) + + bl .add_garbage_collect_time + + lwz o4,0(sp) + baddi sp,4 + + .if ADJUST_HEAP_SIZE + lea o0,bit_vector_size + lea d2,alloc_size + lwz d0,0(o0) + .else + lea o0,heap_size_33 + lea d2,alloc_size + lwz d0,0(o0) + slwi d0,d0,3 + .endif + lwz d2,0(d2) + slwi d4,d4,2 + slwi d2,d2,2 + add d2,d2,d4 + + .if ADJUST_HEAP_SIZE + lea d1,_heap_size_multiple + slwi o1,d0,2 + lwz o2,0(d1) + + mullw d1,d2,o2 + mulhwu o2,d2,o2 + srwi d1,d1,8 + rlwimi d1,o2,32-8,0,7 + srwi. o2,o2,8 + beq+ not_largest_heap + + lea d1,heap_size_33 + lwz d1,0(d1) + slwi d1,d1,5 + +not_largest_heap: + cmpw d1,o1 + ble no_larger_heap + + lea o1,heap_size_33 + lwz o1,0(o1) + slwi o1,o1,5 + cmpw d1,o1 + ble not_larger_then_heap + mr d1,o1 +not_larger_then_heap: + srwi d0,d1,2 + stw d0,0(o0) +no_larger_heap: + .endif + + andi. r0,d0,31 + + srwi d5,d0,5 + + beq no_extra_word + + rlwinm d1,d0,32-3,3,29 + li g0,0 + stwx g0,o4,d1 + +no_extra_word: + + lea o0,last_heap_free + slwi d0,d0,2 + sub d0,d0,d4 + stw d0,0(o0) + + .if COUNT_GARBAGE_COLLECTIONS + lea o1,n_garbage_collections + lwz o2,0(o1) + addi o2,o2,1 + .endif + lea o0,_flags + lwz o0,0(o0) + andi. r0,o0,2 + .if COUNT_GARBAGE_COLLECTIONS + stw o2,0(o1) + .endif + beq+ _no_heap_use_message2 + + stwu o4,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + + lea o0,marked_gc_string_1 + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + + mr o0,d4 + .if STDERR_TO_FILE + bl _er_print_int + .else + bl _ew_print_int + .endif + lea o0,heap_use_after_gc_string_2 + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + .if MACOSX + lwz sp,0(sp) + lwzu o4,0(sp) + .else + lwzu o4,64(sp) + .endif + baddi sp,4 + +_no_heap_use_message2: + .if FINALIZERS + bl call_finalizers + lea o4,heap_vector + lwz o4,0(o4) + .endif + lea d2,alloc_size + + mtctr d5 + + lwz d2,0(d2) + mr a0,o4 + + lea o0,free_after_mark + li g0,0 + stw g0,0(o0) + +_scan_bits: + lwz o0,0(a0) + baddi a0,4 + cmpwi o0,0 + beq _zero_bits + stw g0,-4(a0) + bdnz _scan_bits + + b _end_scan + +_zero_bits: + mr a1,a0 + bdnz _skip_zero_bits_lp+4 + b _end_bits + +_skip_zero_bits_lp: + bne _end_zero_bits + lwz d1,0(a0) + baddi a0,4 + tst d1 + bdnz _skip_zero_bits_lp + + beq _end_bits + stw g0,-4(a0) + sub d1,a0,a1 + b _end_bits2 + +_end_zero_bits: + lea o0,free_after_mark + + sub d1,a0,a1 + slwi d1,d1,3 + + cmplw 0,d1,d2 + + lwz o1,0(o0) + stw g0,-4(a0) + + add o1,o1,d1 + stw o1,0(o0) + blt _scan_bits + +_found_free_memory: + mfctr d0 + lea o0,bit_counter + lea o1,bit_vector_p + stw d0,0(o0) + stw a0,0(o1) + + sub d7,d1,d2 + + subi d0,a1,4 + sub d0,d0,o4 + slwi d0,d0,5 + add a6,d0,d6 + + slwi d1,d1,2 + lea o0,heap_end_after_gc + add d0,a6,d1 + stw d0,0(o0) + + lwz d0,0(sp) + lwz d1,4(sp) + lwz d2,8(sp) + lwz d3,12(sp) + lwz d4,16(sp) + lwz d5,20(sp) + lwz d6,24(sp) + + lwz r0,28(sp) + mtlr r0 + + subi a6,a6,4 + baddi sp,32 + blr + +_end_bits: + sub d1,a0,a1 + baddi d1,4 +_end_bits2: + lea o0,free_after_mark + + slwi d1,d1,3 + + lwz o1,0(o0) + cmplw 0,d1,d2 + + add o1,o1,d1 + stw o1,0(o0) + bge _found_free_memory + +_end_scan: + lea o0,bit_counter + mfctr d0 + stw d0,0(o0) + b compact_gc + + + .text + .globl _mark_stack_nodes + +; a0,a1,a2,a3,a4 +; d0,d1,d2,d3,d4,d5,d6,d7 +; o0,o1,o2,o3,o4,o5 +; g0,g1,g2 +; g3 = 0x80000000 + +; a5 not used, __cycle__in__spine +; a6 not used, hp + + +_mark_stack_nodes: + cmpw a4,a2 + beqlr + + lwz a0,0(a2) + addi a2,a2,4 + + sub d1,a0,d6 + .if SHARE_CHAR_INT + cmplw d1,d7 + bge- _mark_stack_nodes + .endif + + rlwinm o0,d1,32-5,5,29 + lwzx o1,o4,o0 + rlwinm d1,d1,32-2,27,31 + rlwnm. r0,o1,d1,0,0 + bne- _mark_stack_nodes + + .if MARK_USING_REVERSAL + addi o0,a2,-4 + stwu o0,-4(sp) + li d3,0 + li d5,1 + b __mark__node + +_mark_next_node: + b _mark_stack_nodes + + .else + li g0,0 + stwu g0,-4(sp) + +_mark_arguments: + lwz d0,0-NODE_POINTER_OFFSET(a0) + + srw o3,g3,d1 + + andi. r0,d0,2 + lha d2,-2(d0) + beq _mark_lazy_node + +_no_mark_lazy_node: + tst d2 + beq _mark_hnf_0 + + cmplwi 0,d2,256 + baddi a0,4 + bge _mark_record + + subic. d2,d2,2 + beq _mark_hnf_2 + blt _mark_hnf_1 + +_mark_hnf_3: + cmplwi 0,o3,4 + + lwz a1,4-NODE_POINTER_OFFSET(a0) + bor o1,o3 + stwx o1,o4,o0 + + bge+ fits_in_word_1 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits_in_word_1: + sub d0,a1,d6 + + rlwinm o0,d0,32-5,5,29 + lwzx o1,o4,o0 + rlwinm d0,d0,32-2,27,31 + srw o3,g3,d0 + + and. r0,o1,o3 + baddi d4,3 + bne _shared_argument_part + +_no_shared_argument_part: + slwi o2,d2,2 + add a1,a1,o2 + + addi d2,d2,1 + + add o2,d0,d2 + cmplwi 0,o2,32 + + add d4,d4,d2 + + bor o1,o3 + stwx o1,o4,o0 + ble+ fits_in_word_2 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits_in_word_2: + .if NODE_POINTER_OFFSET + lwzu o0,0-NODE_POINTER_OFFSET(a1) + .else + lwz o0,0-NODE_POINTER_OFFSET(a1) + .endif + subi d2,d2,2 + stwu o0,-4(sp) + +_push_hnf_args: + cmplw 6,sp,a3 + +_push_hnf_args_lp: + lwzu o0,-4(a1) + subic. d2,d2,1 + stwu o0,-4(sp) + bge _push_hnf_args_lp + + bge cr6,_mark_node2 + + b __mark_using_reversal + +_mark_hnf_1: + cmplwi 0,o3,2 + bor o1,o3 + stwx o1,o4,o0 + bge+ fits_in_word_4 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits_in_word_4: + baddi d4,2 + +_shared_argument_part: + lwz a0,0-NODE_POINTER_OFFSET(a0) + b _mark_node + +_mark_lazy_node_1: + cmplwi 6,o3,4 + + bor o1,o3 + baddi a0,4 + stwx o1,o4,o0 + + bge+ cr6,fits_in_word_3 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits_in_word_3: +; tst d2 + baddi d4,3 + beq _mark_node2 + +_mark_selector_node_1: + baddicc d2,2 + lwz a1,0-NODE_POINTER_OFFSET(a0) + beq _mark_indirection_node + + sub d1,a1,d6 + + baddicc d2,1 + + rlwinm o0,d1,32-5,5,29 + lwzx o1,o4,o0 + rlwinm d1,d1,32-2,27,31 + + ble _mark_record_selector_node_1 + + rlwnm. r0,o1,d1,0,0 + bne _mark_node3 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq _mark_node3 + + lhz g1,-2(d2) + cmplwi 0,g1,2 + ble _small_tuple_or_record + +_large_tuple_or_record: + lwz d1,8(a1) + + sub d1,d1,d6 + rlwinm o0,d1,32-5,5,29 + lwzx g1,o4,o0 + rlwinm d1,d1,32-2,27,31 + rlwnm. r0,g1,d1,0,0 + bne _mark_node3 + +_small_tuple_or_record: + lwz g1,-8(d0) + subi d2,a0,4 + mr a0,a1 + lwz g1,4(g1) + + mtctr g1 + 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) + .if REMOVE_INDIRECTION_LISTS + addi g2,d2,4 + b __mark_node + .else + b _mark_node + .endif + +_mark_record_selector_node_1: + beq _mark_strict_record_selector_node_1 + + rlwnm. r0,o1,d1,0,0 + bne _mark_node3 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq _mark_node3 + + lhz 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,o1,d1,0,0 + bne _mark_node3 + +_no_mark_strict_record_selector_node_1: + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq _mark_node3 + + lhz g1,-2(d2) + cmplwi 0,g1,258 + ble _select_from_small_record + + lwz d1,8-NODE_POINTER_OFFSET(a1) + + sub d1,d1,d6 + rlwinm o0,d1,32-5,5,29 + lwzx g1,o4,o0 + rlwinm d1,d1,32-2,27,31 + rlwnm. r0,g1,d1,0,0 + bne _mark_node3 + +_select_from_small_record: + lwz g1,-8(d0) + subi a0,a0,4 + lwz g1,4(g1) + + mtctr g1 + mflr r0 + stwu r0,-4(sp) + bctrl + mtlr r0 + + b _mark_next_node + +_mark_indirection_node: + + + + .if REMOVE_INDIRECTION_LISTS + mr g2,a0 +__mark_indirection_node: + mr a0,a1 +__mark_node: + sub d1,a0,d6 + .if SHARE_CHAR_INT + cmplw d1,d7 + bge- __mark_next_node + .endif + rlwinm o0,d1,32-5,5,29 + lwzx o1,o4,o0 + rlwinm d1,d1,32-2,27,31 + rlwnm. r0,o1,d1,0,0 + beq __mark_arguments + +__mark_next_node: + + lwz g1,0-NODE_POINTER_OFFSET(g2) + cmpw g1,a0 + beq __end_indirection_list1 +__update_indirection_list1: + stw a0,0-NODE_POINTER_OFFSET(g2) + addi g2,g1,4 + lwz g1,4-NODE_POINTER_OFFSET(g1) + cmplw g1,a0 + bne __update_indirection_list1 +__end_indirection_list1: + + b _mark_next_node + +__mark_arguments: + lwz d0,0-NODE_POINTER_OFFSET(a0) + + srw o3,g3,d1 + + andi. r0,d0,2 + lha d2,-2(d0) + beq __mark_lazy_node + + lwz g1,0-NODE_POINTER_OFFSET(g2) + cmpw g1,a0 + beq __end_indirection_list2 +__update_indirection_list2: + stw a0,0-NODE_POINTER_OFFSET(g2) + addi g2,g1,4 + lwz g1,4-NODE_POINTER_OFFSET(g1) + cmplw g1,a0 + bne __update_indirection_list2 +__end_indirection_list2: + + b _no_mark_lazy_node + +__mark_lazy_node: + tst d2 + blt __mark_lazy_node_lt0 + + lwz g1,0-NODE_POINTER_OFFSET(g2) + cmpw g1,a0 + beq __end_indirection_list3 +__update_indirection_list3: + stw a0,0-NODE_POINTER_OFFSET(g2) + addi g2,g1,4 + lwz g1,4(g1) + cmplw g1,a0 + bne __update_indirection_list3 +__end_indirection_list3: + + b _mark_lazy_node + +__mark_lazy_node_lt0: + baddicc d2,2 + lwz a1,4-NODE_POINTER_OFFSET(a0) + beq __mark_indirection_node + + sub d1,a1,d6 + + baddicc d2,1 + + rlwinm g0,d1,32-5,5,29 + lwzx g1,o4,g0 + rlwinm d1,d1,32-2,27,31 + + ble __mark_record_selector_node_1 + + rlwnm. r0,g1,d1,0,0 + bne __mark_node3 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq __mark_node3 + + lhz g1,-2(d2) + cmplwi 0,g1,2 + ble __small_tuple_or_record + +__large_tuple_or_record: + lwz d1,8-NODE_POINTER_OFFSET(a1) + + sub d1,d1,d6 + rlwinm g0,d1,32-5,5,29 + lwzx g1,o4,g0 + rlwinm d1,d1,32-2,27,31 + rlwnm. r0,g1,d1,0,0 + bne __mark_node3 + +__small_tuple_or_record: + .if LINUX + lwz g1,-8(d0) + .else + lha g1,-6(d0) + .endif + mr d2,a0 + .if LINUX + .else + lwzx g1,rtoc,g1 + .endif + mr a0,a1 + lwz g1,4(g1) + + mtctr g1 + 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) + b __mark_node + +__mark_record_selector_node_1: + beq __mark_strict_record_selector_node_1 + + rlwnm. r0,g1,d1,0,0 + bne __mark_node3 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq __mark_node3 + + lhz g1,-2(d2) + cmplwi 0,g1,258 + ble __small_tuple_or_record + b __large_tuple_or_record + +__mark_node3: + cmplwi 6,o3,4 + + bor o1,o3 + stwx o1,o4,o0 + + bge+ cr6,_fits_in_word_3 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +_fits_in_word_3: + baddi d4,3 + + lwz g1,0-NODE_POINTER_OFFSET(g2) + cmpw g1,a0 + beq __end_indirection_list4 +__update_indirection_list4: + stw a0,0-NODE_POINTER_OFFSET(g2) + addi g2,g1,4 + lwz g1,4-NODE_POINTER_OFFSET(g1) + cmplw g1,a0 + bne __update_indirection_list4 +__end_indirection_list4: + + mr a0,a1 + b _mark_node + +__mark_strict_record_selector_node_1: + rlwnm. r0,g1,d1,0,0 + bne __mark_node3 + + cmplwi 6,o3,4 + + bor o1,o3 + stwx o1,o4,o0 + + bge+ cr6,_fits_in_word_3_ + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +_fits_in_word_3_: + baddi d4,3 + + lwz g1,0-NODE_POINTER_OFFSET(g2) + cmpw g1,a0 + beq __end_indirection_list5 +__update_indirection_list5: + stw a0,0-NODE_POINTER_OFFSET(g2) + addi g2,g1,4 + lwz g1,4-NODE_POINTER_OFFSET(g1) + cmplw g1,a0 + bne __update_indirection_list5 +__end_indirection_list5: + + baddi a0,4 + b _no_mark_strict_record_selector_node_1 + .endif + + + + + + + +_mark_node3: + mr a0,a1 + b _mark_node + +_mark_hnf_2: + cmplwi 0,o3,4 + bor o1,o3 + stwx o1,o4,o0 + bge+ fits_in_word_6 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits_in_word_6: + baddi d4,3 + +_mark_record_2_c: + lwz o0,4-NODE_POINTER_OFFSET(a0) + cmplw 0,sp,a3 + + stwu o0,-4(sp) + blt __mark_using_reversal + +_mark_node2: + lwz a0,0-NODE_POINTER_OFFSET(a0) + +_mark_node: + sub d1,a0,d6 + .if SHARE_CHAR_INT + cmplw d1,d7 + bge- _mark_next_node + .endif + + rlwinm o0,d1,32-5,5,29 + lwzx o1,o4,o0 + rlwinm d1,d1,32-2,27,31 + rlwnm. r0,o1,d1,0,0 + beq _mark_arguments + +_mark_next_node: + lwz a0,0(sp) + baddi sp,4 + tst a0 + bne _mark_node + + b _mark_stack_nodes + +_mark_lazy_node: + tst d2 + beq _mark_real_or_file + + cmpwi 0,d2,1 + ble _mark_lazy_node_1 + + cmplwi 0,d2,256 + bge _mark_closure_with_unboxed_arguments + baddi d2,1 + + add o2,d1,d2 + cmpwi 0,o2,32 + + add d4,d4,d2 + bor o1,o3 + stwx o1,o4,o0 + + ble+ fits_in_word_7 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits_in_word_7: + slwi g2,d2,2 + add a0,a0,g2 + + cmplw 6,sp,a3 + + subi d2,d2,3 +_push_lazy_args: + lwzu o0,-4(a0) + subic. d2,d2,1 + stwu o0,-4(sp) + bge _push_lazy_args + + bsubi a0,4 + + bge cr6,_mark_node2 + + b __mark_using_reversal + +_mark_closure_with_unboxed_arguments: + srwi g2,d2,8 + bandic d2,255 + + bsubicc d2,1 + beq _mark_real_or_file + + baddi d2,2 + + add o2,d1,d2 + cmpwi 0,o2,32 + + badd d4,d2 + bor o1,o3 + stwx o1,o4,o0 + + ble+ fits_in_word_7_ + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits_in_word_7_: + bsub d2,g2 + slwi g2,d2,2 + + bsubicc d2,2 + blt- _mark_next_node + + badd a0,g2 + + cmplw 6,sp,a3 + bne _push_lazy_args + +_mark_closure_with_one_boxed_argument: + lwz a0,-4(a0) + b _mark_node + +_mark_hnf_0: + cmplw 0,d0,int_reg + blt _mark_real_file_or_string + + cmplw d0,char_reg + bgt _mark_normal_hnf_0 + +_mark_bool_or_small_string: + cmplwi 0,o3,2 + bor o1,o3 + + stwx o1,o4,o0 + baddi d4,2 + + bge+ _mark_next_node + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + b _mark_next_node + +_mark_normal_hnf_0: + bor o1,o3 + baddi d4,1 + stwx o1,o4,o0 + b _mark_next_node + +_mark_real_file_or_string: + lea g1,__STRING__+2 + cmplw 0,d0,g1 + ble _mark_string_or_array + +_mark_real_or_file: + cmplwi 0,o3,4 + bor o1,o3 + + stwx o1,o4,o0 + baddi d4,3 + + bge+ _mark_next_node + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + b _mark_next_node + +_mark_record: + subic. d2,d2,258 + beq _mark_record_2 + blt _mark_record_1 + +_mark_record_3: + cmplwi 0,o3,4 + + lhz d1,-2+2(d0) + + bor o1,o3 + stwx o1,o4,o0 + baddi d4,3 + + bge+ fits_in_word_13 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 +fits_in_word_13: + + lwz a1,4-NODE_POINTER_OFFSET(a0) + + subic. d1,d1,1 + + sub d0,a1,d6 + rlwinm o0,d0,32-5,5,29 + lwzx o1,o4,o0 + rlwinm d0,d0,32-2,27,31 + srw o3,g3,d0 + + blt _mark_record_3_bb + + and. r0,o3,o1 + bne _mark_node2 + + addi d2,d2,1 + + add o2,d0,d2 + cmplwi 0,o2,32 + + add d4,d4,d2 + + bor o1,o3 + stwx o1,o4,o0 + ble+ _push_record_arguments + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +_push_record_arguments: + subic. d2,d1,1 + + slwi d1,d1,2 + add a1,a1,d1 + .if NODE_POINTER_OFFSET + bsubi a1,NODE_POINTER_OFFSET + .endif + bge _push_hnf_args + + b _mark_node2 + +_mark_record_3_bb: + and. r0,o3,o1 + bne _mark_next_node + + addi d2,d2,1 + + add o2,d0,d2 + cmplwi 0,o2,32 + + add d4,d4,d2 + + bor o1,o3 + stwx o1,o4,o0 + ble _mark_next_node + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + b _mark_next_node + +_mark_record_2: + cmplwi 0,o3,4 + + lhz g1,-2+2(d0) + bor o1,o3 + + cmplwi 6,g1,1 + + stwx o1,o4,o0 + bge+ fits_in_word_12 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits_in_word_12: + baddi d4,3 + + bgt cr6,_mark_record_2_c + beq cr6,_mark_node2 + b _mark_next_node + +_mark_record_1: + lhz g1,-2+2(d0) + tst g1 + bne _mark_hnf_1 + + b _mark_bool_or_small_string + +_mark_string_or_array: + beq _mark_string_ + +_mark_array: + lwz d1,8-NODE_POINTER_OFFSET(a0) + tst d1 + beq __mark_array_using_reversal + + lhz d0,-2(d1) + tst d0 + beq _mark_strict_basic_array + + lhz d1,-2+2(d1) + beq _mark_b_record_array + +__mark_array_using_reversal: + li d3,0 + stwu d3,-4(sp) + li d5,1 + b __mark__node + +_mark_strict_basic_array: + lwz d0,4-NODE_POINTER_OFFSET(a0) + cmplw 0,d1,int_reg + beq _mark_strict_int_array + cmplw 0,d1,bool_reg + beq _mark_strict_bool_array +_mark_strict_real_array: + badd d0,d0 +_mark_strict_int_array: + addi d0,d0,3 + b _mark_basic_array_ +_mark_strict_bool_array: + addi d0,d0,12+3 + srwi d0,d0,2 + b _mark_basic_array_ + +_mark_b_record_array: + lwz d1,4-NODE_POINTER_OFFSET(a0) + subi d0,d0,256 + mullw d0,d0,d1 + addi d0,d0,3 + b _mark_basic_array_ + +_mark_string_: + lwz d0,4-NODE_POINTER_OFFSET(a0) + addi d0,d0,8+3 + srwi d0,d0,2 + +_mark_basic_array_: + bor o1,o3 + stwx o1,o4,o0 + + add d4,d4,d0 + + slwi d0,d0,2 + badd d0,a0 + subi d0,d0,4 + + sub d0,d0,d6 + rlwinm d0,d0,32-5,5,29 + + cmplw 0,o0,d0 + bge _mark_next_node + + baddi o0,4 + cmplw 0,o0,d0 + bge _last_string_bits + +_mark_string_lp: + stwx g3,o4,o0 + baddi o0,4 + cmplw 0,o0,d0 + blt _mark_string_lp + +_last_string_bits: + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + b _mark_next_node + .endif + + + +__end__mark__using__reversal: + lwz a1,0(sp) + baddi sp,4 + tst a1 + beq _mark_next_node + stw a0,0(a1) + b _mark_next_node + +__end__mark__using__reversal__after__static: + lwz a1,0(sp) + baddi sp,4 + stw a0,0(a1) + b _mark_next_node + +__mark_using_reversal: + stwu a0,-4(sp) + li d3,0 + lwz a0,0(a0) + li d5,1 + b __mark__node + +__mark__arguments: + lwz d0,0-NODE_POINTER_OFFSET(a0) + srw o3,g3,d1 + + andi. r0,d0,2 + lha d2,-2(d0) + + beq __mark__lazy__node + + tst d2 + beq __mark__hnf__0 + + cmplwi 0,d2,256 + baddi a0,4 + bge __mark__record + + subic. d2,d2,2 + beq __mark__hnf__2 + blt __mark__hnf__1 + +__mark__hnf__3: + cmplwi 0,o3,4 + + lwz a1,4-NODE_POINTER_OFFSET(a0) + bor o1,o3 + stwx o1,o4,o0 + + bge+ fits__in__word__1 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits__in__word__1: + sub d0,a1,d6 + + rlwinm o0,d0,32-5,5,29 + lwzx o1,o4,o0 + rlwinm d0,d0,32-2,27,31 + srw o3,g3,d0 + + and. r0,o1,o3 + baddi d4,3 + bne __shared__argument__part + +__no__shared__argument__part: + or d3,d3,d5 + stwu d3,4-NODE_POINTER_OFFSET(a0) + + lwz g1,0-NODE_POINTER_OFFSET(a1) + slwi d1,d2,2 + + addi d2,d2,1 + add o2,d0,d2 + cmplwi o2,32 + + ori g1,g1,1 + stw g1,0(a1) + + add d4,d4,d2 + + bor o1,o3 + stwx o1,o4,o0 + + ble+ fits__in__word__2 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits__in__word__2: + lwzux d2,a1,d1 + li d5,0 + stw a0,0-NODE_POINTER_OFFSET(a1) + mr d3,a1 + mr a0,d2 + b __mark__node + +__mark__lazy__node__1: + bne __mark__selector__node__1 + +__mark__selector__1: + cmplwi 0,o3,4 + bor o1,o3 + stwx o1,o4,o0 + baddi d4,3 + bge+ __shared__argument__part + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + b __shared__argument__part + +__mark__hnf__1: + cmplwi 0,o3,2 + + bor o1,o3 + stwx o1,o4,o0 + baddi d4,2 + + bge+ __shared__argument__part + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +__shared__argument__part: + lwz d2,0-NODE_POINTER_OFFSET(a0) + bor 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,2 + lwz a1,0-NODE_POINTER_OFFSET(a0) + beq __mark__indirection__node + + sub o2,a1,d6 + + addic. d2,d2,1 + + rlwinm d2,o2,32-5,5,29 + lwzx g1,o4,d2 + rlwinm o2,o2,32-2,27,31 + + ble __mark__record__selector__node__1 + + rlwnm. r0,g1,o2,0,0 + bne- __mark__selector__1 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq- __mark__selector__1 + + lha g1,-2(d2) + cmplwi 0,g1,2 + ble __small__tuple__or__record + +__large__tuple__or__record: + lwz o2,8-NODE_POINTER_OFFSET(a1) + sub o2,o2,d6 + + rlwinm d2,o2,32-5,5,29 + lwzx g1,o4,d2 + rlwinm o2,o2,32-2,27,31 + srw g2,g3,o2 + + and. r0,g2,g1 + bne- __mark__selector__1 + +__small__tuple__or__record: + lwz g1,-8(d0) + subi d2,a0,4 + mr a0,a1 + lwz g1,4(g1) + + mtctr g1 + 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) + b __mark__node + +__mark__record__selector__node__1: + beq __mark__strict__record__selector__node__1 + + rlwnm. r0,g1,o2,0,0 + bne- __mark__selector__1 + + lwz d2,0(a1) + andi. r0,d2,2 + beq- __mark__selector__1 + + lhz 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,o2,0,0 + bne- __mark__selector__1 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + andi. r0,d2,2 + beq- __mark__selector__1 + + lhz g1,-2(d2) + cmplwi 0,g1,258 + ble __select__from__small__record + + lwz o2,8-NODE_POINTER_OFFSET(a1) + sub o2,o2,d6 + + rlwinm d2,o2,32-5,5,29 + lwzx g1,o4,d2 + rlwinm o2,o2,32-2,27,31 + rlwnm. r0,g1,o2,0,0 + bne- __mark__selector__1 + +__select__from__small__record: + lwz g1,-8(d0) + subi a0,a0,4 + lwz g1,4(g1) + + mtctr g1 + mflr r0 + stwu r0,-4(sp) + bctrl + mtlr r0 + + b __mark__node + +__mark__indirection__node: + mr a0,a1 + b __mark__node + +__mark__hnf__2: + cmplwi 0,o3,4 + + bor o1,o3 + stwx o1,o4,o0 + baddi d4,3 + + bge+ fits__in__word__6 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 +fits__in__word__6: + +__mark__record__2__c: + 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 d1,a0,d6 + .if SHARE_CHAR_INT + cmplw d1,d7 + bge- __mark__next__node__after__static + .endif + + rlwinm o0,d1,32-5,5,29 + lwzx o1,o4,o0 + rlwinm d1,d1,32-2,27,31 + rlwnm. r0,o1,d1,0,0 + beq __mark__arguments + +__mark__next__node: + tst d5 + bne __mark__parent + +__mark__next__node2: + lwzu d2,-4-NODE_POINTER_OFFSET(d3) + lwz o0,4-NODE_POINTER_OFFSET(d3) + andi. d5,d2,3 + + stw o0,0-NODE_POINTER_OFFSET(d3) + + stw a0,4-NODE_POINTER_OFFSET(d3) + clrrwi a0,d2,2 + b __mark__node + +__mark__lazy__node: + tst d2 + beq __mark__real__or__file + + cmpwi 0,d2,1 + baddi a0,4 + ble __mark__lazy__node__1 + + cmplwi 0,d2,256 + bge __mark_closure_with_unboxed_arguments + baddi d2,1 + + add o2,d1,d2 + cmplwi 0,o2,32 + + add d4,d4,d2 + + bor o1,o3 + stwx o1,o4,o0 + ble+ fits__in__word__7 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits__in__word__7: + subi d2,d2,2 + +__mark_closure_with_unboxed_arguments__2: + lwz o0,0-NODE_POINTER_OFFSET(a0) + slwi d2,d2,2 + ori o0,o0,2 + stw o0,0-NODE_POINTER_OFFSET(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: + srwi d0,d2,8 + bandic d2,255 + + bsubicc d2,1 + beq __mark_closure_1_with_unboxed_argument + + baddi d2,2 + add o2,d1,d2 + cmplwi 0,o2,32 + + badd d4,d2 + + bor o1,o3 + stwx o1,o4,o0 + ble+ fits__in__word__7_ + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits__in__word__7_: + bsub d2,d0 + bsubicc d2,2 + bgt __mark_closure_with_unboxed_arguments__2 + beq __shared__argument__part + bsubi a0,4 + b __mark__next__node + +__mark_closure_1_with_unboxed_argument: + bsubi a0,4 + b __mark__real__or__file + +__mark__hnf__0: + cmplw d0,int_reg + bne __no__int__3 + + lwz d2,4-NODE_POINTER_OFFSET(a0) + cmplwi 0,d2,33 + slwi d2,d2,3 + blt ____small____int + +__mark__bool__or__small__string: + cmplwi 0,o3,2 + + bor o1,o3 + stwx o1,o4,o0 + baddi d4,2 + + bge+ __mark__next__node + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + b __mark__next__node + +____small____int: + lea a0,small_integers + add a0,a0,d2 + b __mark__next__node__after__static + +__no__int__3: + blt __mark__real__file__or__string + + cmplw 0,d0,char_reg + bne __no__char__3 + + 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 __mark__bool__or__small__string + + subi a0,d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET + b __mark__next__node__after__static + +__mark__real__file__or__string: + lea g1,__STRING__+2 + cmplw 0,d0,g1 + ble __mark__string__or__array + +__mark__real__or__file: + cmplwi 0,o3,4 + bor o1,o3 + stwx o1,o4,o0 + baddi d4,3 + bge+ __mark__next__node + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + b __mark__next__node + +__mark__record: + subic. d2,d2,258 + beq __mark__record__2 + blt __mark__record__1 + +__mark__record__3: + cmplwi 0,o3,4 + + bor o1,o3 + stwx o1,o4,o0 + baddi d4,3 + + lwz a1,4-NODE_POINTER_OFFSET(a0) + + bge+ fits__in__word__13 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 +fits__in__word__13: + + lhz d1,-2+2(d0) + + sub d0,a1,d6 + rlwinm o0,d0,32-5,5,29 + lwzx o1,o4,o0 + rlwinm d0,d0,32-2,27,31 + srw o3,g3,d0 + + and. r0,o3,o1 + bne __shared__record__argument__part + + addi d2,d2,1 + + add o2,d0,d2 + cmplwi 6,o2,32 + + add d4,d4,d2 + + subic. d1,d1,1 + + bor o1,o3 + stwx o1,o4,o0 + ble+ cr6,fits__in__word__14 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits__in__word__14: + blt __mark__record__3__bb + beq __shared__argument__part + + subic. d1,d1,1 + or d3,d3,d5 + stwu d3,4-NODE_POINTER_OFFSET(a0) + + beq __mark__record__3__aab + + lwz g1,0-NODE_POINTER_OFFSET(a1) + slwi d1,d1,2 + ori g1,g1,1 + stw g1,0-NODE_POINTER_OFFSET(a1) + + lwzux d2,a1,d1 + li d5,0 + stw a0,0-NODE_POINTER_OFFSET(a1) + mr d3,a1 + mr a0,d2 + b __mark__node + +__mark__record__3__bb: + subi a0,a0,4 + b __mark__next__node + +__mark__record__3__aab: + lwz d2,0-NODE_POINTER_OFFSET(a1) + stw a0,0-NODE_POINTER_OFFSET(a1) + mr d3,a1 + li d5,1 + mr a0,d2 + b __mark__node + +__shared__record__argument__part: + tst d1 + bne __shared__argument__part + subi a0,a0,4 + b __mark__next__node + +__mark__record__2: + cmplwi 0,o3,4 + + lhz g1,-2+2(d0) + bor o1,o3 + + cmplwi 6,g1,1 + baddi d4,3 + + stwx o1,o4,o0 + bge+ fits__in__word_12 + + baddi o0,4 + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + +fits__in__word_12: + bgt cr6,__mark__record__2__c + beq cr6,__shared__argument__part + 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__bool__or__small__string + +__mark__string__or__array: + beq __mark__string__ + +__mark__array: + lwz d1,8-NODE_POINTER_OFFSET(a0) + tst d1 + beq __mark__lazy__array + + lhz d0,-2(d1) + tst d0 + beq __mark__strict__basic__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 g0,d3 + mr g1,d4 + mr g2,d5 + + lwz d2,4-NODE_POINTER_OFFSET(a0) + baddi a0,8 + stw a0,-4(sp) + + slwi d2,d2,2 + mullw a1,d2,d0 + + sub d0,d0,d1 + baddi a0,4 + add a1,a0,a1 + + mflr r0 + stw o0,-8(sp) + stw o1,-12(sp) + stw r0,-16(sp) + + bl reorder + + lwz o0,-8(sp) + lwz o1,-12(sp) + lwz r0,-16(sp) + + lwz a0,-4(sp) + mtlr r0 + + mr d5,g2 + mr d4,g1 + mr d3,g0 + mr d2,o2 + + lwz g1,-4(a0) + mr a1,d0 + mullw d0,d1,g1 + mullw d1,a1,g1 + badd d4,d1 + badd d1,d0 + +; to do add n b elements to d4 + + slwi d1,d1,2 + add d1,a0,d1 + sub d1,d1,d6 + + slwi a1,d0,2 + add a1,a0,a1 + b __mark__r__array + +__mark__a__record__array: + lwz g1,4-NODE_POINTER_OFFSET(a0) + baddi a0,8 + mullw d0,d0,g1 + b __mark__lr__array + +__mark__lazy__array: + lwz d0,4-NODE_POINTER_OFFSET(a0) + baddi a0,8 + +__mark__lr__array: + slwi a1,d0,2 + add a1,a0,a1 + + sub d1,a1,d6 +__mark__r__array: + rlwinm d1,d1,32-5,5,29 + + cmplw 0,o0,d1 + + bor o1,o3 + stwx o1,o4,o0 + + bge __skip__mark__lazy__array__bits + +__mark__lazy__array__bits: + baddi o0,4 + lwzx o1,o4,o0 + cmplw 0,o0,d1 + bor o1,g3 + stwx o1,o4,o0 + blt __mark__lazy__array__bits + +__skip__mark__lazy__array__bits: + cmplwi d0,1 + + baddi d4,3 + add d4,d4,d0 + lea o2,lazy_array_list + + ble __mark__array__length__0__1 + + lwz d2,0-NODE_POINTER_OFFSET(a1) + lwz o0,0-NODE_POINTER_OFFSET(a0) + stw d2,0-NODE_POINTER_OFFSET(a0) + stw o0,0-NODE_POINTER_OFFSET(a1) + + lwzu d2,-4-NODE_POINTER_OFFSET(a1) + lwz o1,0(o2) + addi d2,d2,2 + stw o1,0-NODE_POINTER_OFFSET(a1) + stw d2,-4-NODE_POINTER_OFFSET(a0) + stwu d0,-8-NODE_POINTER_OFFSET(a0) + stw a0,0(o2) + + lwzu d2,-4-NODE_POINTER_OFFSET(a1) + or d3,d3,d5 + stw d3,0-NODE_POINTER_OFFSET(a1) + mr d3,a1 + 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) ; element + lwz o0,8-NODE_POINTER_OFFSET(a0) ; element descriptor + lwz o3,0(o2) + stw o0,12-NODE_POINTER_OFFSET(a0) + stw o3,8-NODE_POINTER_OFFSET(a0) + stw d0,0-NODE_POINTER_OFFSET(a0) + + stw a0,0(o2) + stwu d1,4-NODE_POINTER_OFFSET(a0) + + 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__b__record__array: + lwz d1,4-NODE_POINTER_OFFSET(a0) + subi d0,d0,256 + mullw d0,d0,d1 + addi d0,d0,3 + b __mark__basic__array + +__mark__strict__basic__array: + lwz d0,4-NODE_POINTER_OFFSET(a0) + cmplw 0,d1,int_reg + beq __mark__strict__int__array + cmplw 0,d1,bool_reg + beq __mark__strict__bool__array +__mark__strict__real__array: + badd d0,d0 +__mark__strict__int__array: + addi d0,d0,3 + b __mark__basic__array +__mark__strict__bool__array: + addi d0,d0,12+3 + srwi d0,d0,2 + b __mark__basic__array + +__mark__string__: + lwz d0,4-NODE_POINTER_OFFSET(a0) + addi d0,d0,8+3 + srwi d0,d0,2 + +__mark__basic__array: + bor o1,o3 + stwx o1,o4,o0 + + add d4,d4,d0 + + slwi d0,d0,2 + badd d0,a0 + subi d0,d0,4 + + sub d0,d0,d6 + rlwinm d0,d0,32-5,5,29 + + cmplw 0,o0,d0 + bge __mark__next__node + + baddi o0,4 + cmplw 0,o0,d0 + bge __last__string__bits + +__mark__string__lp: + stwx g3,o4,o0 + baddi o0,4 + cmplw 0,o0,d0 + blt __mark__string__lp + +__last__string__bits: + lwzx o1,o4,o0 + bor o1,g3 + stwx o1,o4,o0 + b __mark__next__node + +__mark__parent: + tst d3 + beq __end__mark__using__reversal + + subic. d5,d5,1 + lwz d2,0-NODE_POINTER_OFFSET(d3) + stw a0,0-NODE_POINTER_OFFSET(d3) + beq __argument__part__parent + + subi a0,d3,4 + andi. d5,d2,3 + clrrwi d3,d2,2 + b __mark__next__node + +__argument__part__parent: + mr a1,d3 + + clrrwi d3,d2,2 + + lwzu a0,-4-NODE_POINTER_OFFSET(d3) + lwz o0,4-NODE_POINTER_OFFSET(d3) + li d5,2 + stw o0,0-NODE_POINTER_OFFSET(d3) + stw a1,4-NODE_POINTER_OFFSET(d3) + b __mark__node + +__mark__next__node__after__static: + tst d5 + beq __mark__next__node2 + + tst d3 + beq __end__mark__using__reversal__after__static + + subic. d5,d5,1 + lwz d2,0-NODE_POINTER_OFFSET(d3) + stw a0,0-NODE_POINTER_OFFSET(d3) + beq __argument__part__parent + + subi a0,d3,4 + andi. d5,d2,3 + clrrwi d3,d2,2 + b __mark__next__node + + .text diff --git a/macho/pprofile.a b/macho/pprofile.a new file mode 100644 index 0000000..84d2022 --- /dev/null +++ b/macho/pprofile.a @@ -0,0 +1,1488 @@ + +.macro lea_ &r,&a + lis $0,ha16($1) + addi $0,$0,lo16($1) +.endmacro + +MACOSX = 1 +POWER601 = 0 +ALLOCATION_PROFILE = 1 +USE_TEMPORARY_MEMORY = 1 +CHECK_STACK_OVERFLOWS = 0 +MODULE_NAMES = 1 + + .if POWER601 + .macro time_hi + dialect Power + mfrtcu $0 + dialect PowerPC + .endmacro + + .macro time_lo + dialect Power + mfrtcl $0 + dialect PowerPC + .endmacro + .else + .macro time_hi + mftbu $0 + .endmacro + + .macro time_lo + mftb $0 + .endmacro + .endif + +#define sp r1 + +#define d0 r24 +#define d1 r25 +#define d2 r26 +#define d3 r27 +#define d4 r28 +#define d5 r29 +#define d6 r30 +#define d7 r31 + +#define a0 r23 +#define a1 r22 +#define a2 r21 +#define a3 r20 +#define a4 r19 +#define a5 r18 +#define a6 r17 + +#define o0 r3 +#define o1 r4 +#define o2 r5 +#define o3 r6 +#define o4 r7 +#define o5 r8 + +#define g2 r9 +#define g3 r10 + +#define g0 r11 +#define g1 r12 + +#define int_reg r16 +#define char_reg r15 +#define real_reg r14 +#define bool_reg r13 + + .if POWER601 +lo1e9 = 1000000000 % 65536 +hi1e9 = (1000000000 / 65536)+1 + .endif + + .globl init_profiler + .globl profile_r + .globl profile_l + .globl profile_l2 + .globl profile_n + .globl profile_n2 + .globl profile_s + .globl profile_s2 + .globl profile_t + .globl profile_ti + .globl write_profile_information + .globl write_profile_stack + + .if USE_TEMPORARY_MEMORY + .globl _TempNewHandle + .globl _TempHLock + .globl _TempHUnlock + .globl _TempDisposeHandle + .else + .globl _NewPtr + .endif + .globl _Gestalt + .globl __STRING__ + .globl openF + .globl closeF + .globl writeFC + .globl writeFI + .globl print_error + .globl _new_file_creator + .globl _stack_size + .globl _er_print_string + .globl _er_print_char + .globl _create_profile_file_name + .if CHECK_STACK_OVERFLOWS + .globl _Debugger + .endif + +#define FunctionProfile_next 0 +#define FunctionProfile_time_hi 4 +#define FunctionProfile_time_lo 8 +#define FunctionProfile_n_profiler_calls 12 +#define FunctionProfile_n_strict_calls 16 +#define FunctionProfile_n_lazy_calls 20 +#define FunctionProfile_n_curried_calls 24 +#define FunctionProfile_n_words_allocated 28 +#define FunctionProfile_name 32 + +#define FunctionProfile 36 + +#define Globals_n_free_records_in_block 0 + # comment 0 n free records in block +#define Globals_last_allocated_block 4 + # comment 4 latest allocated block +#define Globals_profile_records 8 + # comment 8 profile record list +#define Globals_time_hi 12 + # comment 12 clock +#define Globals_time_lo 16 +#define Globals_stack_pointer 20 + # comment 20 stack pointer +#define Globals_last_tail_call 24 + # comment 24 last tail calling function +#define Globals_n_words_free 28 + .if USE_TEMPORARY_MEMORY +#define Globals_temp_handle_list 32 +#define Globals_profile_stack_handle 36 + .if CHECK_STACK_OVERFLOWS +Globals_end_profile_stack = 40 +Globals = 44 + .else +Globals = 40 + .endif + .else + .if CHECK_STACK_OVERFLOWS +Globals_end_profile_stack = 32 +Globals = 36 + .else +Globals = 32 + .endif + .endif + + .text +profile_ti: +read_clock_0: + time_hi r9 + time_lo r10 + time_hi r4 + cmpw 0,r4,r9 + bne- read_clock_0 + + lea_ r5,profile_globals + b profile_t_ + +profile_t: +read_clock_1: + time_hi r9 + time_lo r10 + time_hi r4 + cmpw 0,r4,r9 + bne- read_clock_1 + + mflr r12 + lea_ r5,profile_globals + mtctr r12 + mtlr r0 +profile_t_: + lwz r6,Globals_stack_pointer(r5) + + lwz r7,Globals_time_hi(r5) + lwz r8,Globals_time_lo(r5) + + lwzu r4,-4(r6) + stw r6,Globals_stack_pointer(r5) + stw r4,Globals_last_tail_call(r5) + + .if POWER601 + sub. r10,r10,r8 + sub r9,r9,r7 + bge+ @no_borrow + addis r10,r10,hi1e9 + addi r10,r10,lo1e9 + subi r9,r9,1 +@no_borrow: + .else + subc r10,r10,r8 + subfe r9,r7,r9 + .endif + lwz r8,FunctionProfile_time_lo(r4) + lwz r7,FunctionProfile_time_hi(r4) + + .if POWER601 + add r8,r8,r10 + add r7,r7,r9 + + subis r9,r8,hi1e9 + cmpwi 0,r9,lo1e9 + + lwz r6,FunctionProfile_n_profiler_calls(r4) + + blt+ @no_carry + + subi r8,r9,lo1e9 + addi r7,r7,1 + +@no_carry: + .else + addc r8,r8,r10 + lwz r6,FunctionProfile_n_profiler_calls(r4) + adde r7,r7,r9 + .endif + addi r6,r6,1 + stw r7,FunctionProfile_time_hi(r4) + stw r8,FunctionProfile_time_lo(r4) + stw r6,FunctionProfile_n_profiler_calls(r4) + + .if ALLOCATION_PROFILE + lwz r11,Globals_n_words_free(r5) + stw d7,Globals_n_words_free(r5) + lwz r12,FunctionProfile_n_words_allocated(r4) + sub r11,r11,d7 + add r12,r12,r11 + stw r12,FunctionProfile_n_words_allocated(r4) + .endif + +store_clock_0: + time_hi r9 + stw r9,Globals_time_hi(r5) + time_lo r10 + time_hi r4 + stw r10,Globals_time_lo(r5) + cmpw 0,r4,r9 + +; beqctr+ + bcctr 13,2 + + b store_clock_0 + +profile_r: +read_clock_2: + time_hi r9 + time_lo r10 + time_hi r4 + cmpw 0,r4,r9 + bne- read_clock_2 + + lea_ r5,profile_globals + + lwz r6,Globals_stack_pointer(r5) + + lwz r7,Globals_time_hi(r5) + lwz r8,Globals_time_lo(r5) + + lwzu r4,-4(r6) + li r3,0 + stw r6,Globals_stack_pointer(r5) + stw r3,Globals_last_tail_call(r5) + + .if POWER601 + sub. r10,r10,r8 + sub r9,r9,r7 + bge+ @no_borrow + addis r10,r10,hi1e9 + addi r10,r10,lo1e9 + subi r9,r9,1 +@no_borrow: + .else + subc r10,r10,r8 + subfe r9,r7,r9 + .endif + + lwz r8,FunctionProfile_time_lo(r4) + lwz r7,FunctionProfile_time_hi(r4) + + .if POWER601 + add r8,r8,r10 + add r7,r7,r9 + + subis r9,r8,hi1e9 + cmpwi 0,r9,lo1e9 + + lwz r6,FunctionProfile_n_profiler_calls(r4) + + blt+ @no_carry + + subi r8,r9,lo1e9 + addi r7,r7,1 + +@no_carry: + .else + addc r8,r8,r10 + lwz r6,FunctionProfile_n_profiler_calls(r4) + adde r7,r7,r9 + .endif + + addi r6,r6,1 + stw r7,FunctionProfile_time_hi(r4) + stw r8,FunctionProfile_time_lo(r4) + stw r6,FunctionProfile_n_profiler_calls(r4) + + .if ALLOCATION_PROFILE + lwz r11,Globals_n_words_free(r5) + stw d7,Globals_n_words_free(r5) + lwz r12,FunctionProfile_n_words_allocated(r4) + sub r11,r11,d7 + add r12,r12,r11 + stw r12,FunctionProfile_n_words_allocated(r4) + .endif + +store_clock_1: + time_hi r9 + stw r9,Globals_time_hi(r5) + time_lo r10 + time_hi r4 + stw r10,Globals_time_lo(r5) + cmpw 0,r4,r9 + beqlr+ + + b store_clock_1 + +profile_l: +read_clock_3: + time_hi r9 + time_lo r10 + time_hi r4 + cmpw 0,r4,r9 + bne- read_clock_3 + + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r3,Globals_last_tail_call(r5) + lwz r6,Globals_stack_pointer(r5) + cmpwi 0,r3,0 + + lwz r7,Globals_time_hi(r5) + lwz r8,Globals_time_lo(r5) + + bne use_tail_calling_function_0 + + lwz r3,-4(r6) +c_use_tail_calling_function_0: + + stw r4,0(r6) + addi r6,r6,4 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + lwz r6,FunctionProfile_n_curried_calls(r4) + mtlr r0 + addi r6,r6,1 + stw r6,FunctionProfile_n_curried_calls(r4) + b profile_n_ + +use_tail_calling_function_0: + li r12,0 + stw r12,Globals_last_tail_call(r5) + b c_use_tail_calling_function_0 + +profile_l2: +read_clock_4: + time_hi r9 + time_lo r10 + time_hi r4 + cmpw 0,r4,r9 + bne- read_clock_4 + + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r3,Globals_last_tail_call(r5) + lwz r6,Globals_stack_pointer(r5) + cmpwi 0,r3,0 + + lwz r7,Globals_time_hi(r5) + lwz r8,Globals_time_lo(r5) + + bne use_tail_calling_function_1 + + lwz r3,-4(r6) +c_use_tail_calling_function_1: + + stw r4,0(r6) + stw r4,4(r6) + addi r6,r6,8 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + + lwz r6,FunctionProfile_n_curried_calls(r4) + mtlr r0 + addi r6,r6,1 + stw r6,FunctionProfile_n_curried_calls(r4) + b profile_n_ + +use_tail_calling_function_1: + li r12,0 + stw r12,Globals_last_tail_call(r5) + b c_use_tail_calling_function_1 + +profile_n: +read_clock_5: + time_hi r9 + time_lo r10 + time_hi r4 + cmpw 0,r4,r9 + bne- read_clock_5 + + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r3,Globals_last_tail_call(r5) + lwz r6,Globals_stack_pointer(r5) + cmpwi 0,r3,0 + + lwz r7,Globals_time_hi(r5) + lwz r8,Globals_time_lo(r5) + + bne use_tail_calling_function_2 + + lwz r3,-4(r6) +c_use_tail_calling_function_2: + + stw r4,0(r6) + addi r6,r6,4 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + + lwz r6,FunctionProfile_n_lazy_calls(r4) + mtlr r0 + addi r6,r6,1 + stw r6,FunctionProfile_n_lazy_calls(r4) + b profile_n_ + +use_tail_calling_function_2: + li r12,0 + stw r12,Globals_last_tail_call(r5) + b c_use_tail_calling_function_2 + +profile_n2: +read_clock_6: + time_hi r9 + time_lo r10 + time_hi r4 + cmpw 0,r4,r9 + bne- read_clock_6 + + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r3,Globals_last_tail_call(r5) + lwz r6,Globals_stack_pointer(r5) + cmpwi 0,r3,0 + + lwz r7,Globals_time_hi(r5) + lwz r8,Globals_time_lo(r5) + + bne use_tail_calling_function_3 + + lwz r3,-4(r6) +c_use_tail_calling_function_3: + + stw r4,0(r6) + stw r4,4(r6) + addi r6,r6,8 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + + lwz r6,FunctionProfile_n_lazy_calls(r4) + mtlr r0 + addi r6,r6,1 + stw r6,FunctionProfile_n_lazy_calls(r4) + b profile_n_ + +use_tail_calling_function_3: + li r12,0 + stw r12,Globals_last_tail_call(r5) + b c_use_tail_calling_function_3 + +profile_s2: +read_clock_7: + time_hi r9 + time_lo r10 + time_hi r4 + cmpw 0,r4,r9 + bne- read_clock_7 + + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r3,Globals_last_tail_call(r5) + lwz r6,Globals_stack_pointer(r5) + cmpwi 0,r3,0 + + lwz r7,Globals_time_hi(r5) + lwz r8,Globals_time_lo(r5) + + bne use_tail_calling_function_4 + + lwz r3,-4(r6) +c_use_tail_calling_function_4: + + stw r4,0(r6) + stw r4,4(r6) + addi r6,r6,8 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + b profile_s_ + +use_tail_calling_function_4: + li r12,0 + stw r12,Globals_last_tail_call(r5) + b c_use_tail_calling_function_4 + +profile_s: +read_clock_8: + time_hi r9 + time_lo r10 + time_hi r4 + cmpw 0,r4,r9 + bne- read_clock_8 + + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r3,Globals_last_tail_call(r5) + lwz r6,Globals_stack_pointer(r5) + cmpwi 0,r3,0 + + lwz r7,Globals_time_hi(r5) + lwz r8,Globals_time_lo(r5) + + bne use_tail_calling_function_5 + + lwz r3,-4(r6) +c_use_tail_calling_function_5: + + stw r4,0(r6) + addi r6,r6,4 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + +profile_s_: + lwz r6,FunctionProfile_n_strict_calls(r4) + mtlr r0 + addi r6,r6,1 + stw r6,FunctionProfile_n_strict_calls(r4) + +profile_n_: + .if POWER601 + sub. r10,r10,r8 + sub r9,r9,r7 + bge+ @no_borrow + addis r10,r10,hi1e9 + addi r10,r10,lo1e9 + subi r9,r9,1 +@no_borrow: + .else + subc r10,r10,r8 + subfe r9,r7,r9 + .endif + + lwz r8,FunctionProfile_time_lo(r3) + lwz r7,FunctionProfile_time_hi(r3) + + .if POWER601 + add r8,r8,r10 + add r7,r7,r9 + + subis r9,r8,hi1e9 + cmpwi 0,r9,lo1e9 + + lwz r6,FunctionProfile_n_profiler_calls(r4) + + blt+ @no_carry + + subi r8,r9,lo1e9 + addi r7,r7,1 + +@no_carry: + .else + addc r8,r8,r10 + lwz r6,FunctionProfile_n_profiler_calls(r4) + adde r7,r7,r9 + .endif + addi r6,r6,1 + stw r7,FunctionProfile_time_hi(r3) + stw r8,FunctionProfile_time_lo(r3) + stw r6,FunctionProfile_n_profiler_calls(r4) + + .if ALLOCATION_PROFILE + lwz r11,Globals_n_words_free(r5) + stw d7,Globals_n_words_free(r5) + lwz r12,FunctionProfile_n_words_allocated(r3) + sub r11,r11,d7 + add r12,r12,r11 + stw r12,FunctionProfile_n_words_allocated(r3) + .endif + +store_clock_2: + time_hi r9 + stw r9,Globals_time_hi(r5) + time_lo r10 + time_hi r4 + stw r10,Globals_time_lo(r5) + cmpw 0,r4,r9 + +; beqctr+ + bcctr 13,2 + + b store_clock_2 + +use_tail_calling_function_5: + li r12,0 + stw r12,Globals_last_tail_call(r5) + b c_use_tail_calling_function_5 + +allocate_function_profile_record: + lwz r6,Globals_n_free_records_in_block(r5) + lwz r4,Globals_last_allocated_block(r5) + cmpwi 0,r6,0 + bne+ no_alloc + + stw r0,-4(sp) + stw r3,-8(sp) + stw r9,-12(sp) + stw r10,-16(sp) + mfctr r11 + stw r11,-20(sp) + mflr r12 + stw r12,-24(sp) + + .if USE_TEMPORARY_MEMORY + li r3,(128*FunctionProfile)+4 + .else + li r3,128*FunctionProfile + .endif + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+32+28)(sp) + .else + stwu sp,-(64+32)(sp) + .endif + .if USE_TEMPORARY_MEMORY + bl allocate_temp_memory_handle + .else + bl _NewPtr + nop + .endif + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64+32 + .endif + and. r4,r3,r3 + + lwz r12,-24(sp) + lwz r11,-20(sp) + mtlr r12 + lwz r10,-16(sp) + mtctr r11 + lwz r9,-12(sp) + lwz r3,-8(sp) + lwz r0,-4(sp) + + lea_ r5,profile_globals + + beq profiler_memory_error + + .if USE_TEMPORARY_MEMORY + lwz r6,Globals_temp_handle_list(r5) + stw r4,Globals_temp_handle_list(r5) + lwz r4,0(r4) + stw r6,0(r4) + addi r4,r4,4 + .endif + li r6,128 + stw r4,Globals_last_allocated_block(r5) + +no_alloc: + subi r6,r6,1 + stw r6,Globals_n_free_records_in_block(r5) + addi r7,r4,FunctionProfile + stw r7,Globals_last_allocated_block(r5) + + lwz r6,Globals_profile_records(r5) + li r8,0 + stw r8,FunctionProfile_time_hi(r4) + stw r8,FunctionProfile_time_lo(r4) + stw r8,FunctionProfile_n_profiler_calls(r4) + stw r8,FunctionProfile_n_strict_calls(r4) + stw r8,FunctionProfile_n_lazy_calls(r4) + stw r8,FunctionProfile_n_curried_calls(r4) + stw r8,FunctionProfile_n_words_allocated(r4) + stw r6,FunctionProfile_next(r4) + stw r4,Globals_profile_records(r5) + stw r3,FunctionProfile_name(r4) + + stw r4,0(r3) + blr + +write_profile_information: + lea_ o0,profile_file_name + + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl _create_profile_file_name + nop + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,4 + .else + lwz r0,64(sp) + addi sp,sp,68 + .endif + mtlr r0 + + lea_ d3,_new_file_creator + li d5,'T*256+'I + lwz d4,0(d3) + addis d5,d5,'P*256+'R + stw d5,0(d3) + + li d0,1 + lea_ a0,profile_file_name + + mflr r0 + stwu r0,-4(sp) + bl openF + mtlr r0 + + stw d4,0(d3) + + cmpwi 0,d2,0 + beq cannot_open + + mflr r0 + li d3,0 + stw r0,-4(sp) + stwu d3,-8(sp) + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + stw d3,64(sp) + li r3,'u*256+'t + addi r4,sp,64 + addis r3,r3,'c*256+'p + bl L_Gestalt$stub + nop + + lwz d2,64(sp) + stwu r0,-4(sp) + bl writeFI_space + mtlr r0 + + stw d3,64(sp) + li r3,'l*256+'k + addi r4,sp,64 + addis r3,r3,'p*256+'c + bl L_Gestalt$stub + nop + + lwz d2,64(sp) + stwu r0,-4(sp) + bl writeFI_space + mtlr r0 + + stw d3,64(sp) + li r3,'l*256+'k + addi r4,sp,64 + addis r3,r3,'b*256+'c + bl L_Gestalt$stub + nop + + lwz d2,64(sp) + stwu r0,-4(sp) + bl writeFI + mtlr r0 + + li d2,13 + stwu r0,-4(sp) + bl writeFC + mtlr r0 + + .if MACOSX + lwz sp,0(sp) + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + mtlr r0 + + lea_ d2,profile_globals + lwz d2,Globals_profile_records(d2) + +write_profile_lp: + cmpwi 0,d2,0 + beq end_list + + lwz d3,FunctionProfile_name(d2) + stwu d2,-4(sp) + + .if MODULE_NAMES + stwu d3,-4(sp) + + lwz d3,-4(d3) + lwz d2,0(d3) + addi d3,d3,3 + +write_module_name_lp: + subic. d2,d2,1 + blt end_module_name + + stw d2,-4(sp) + lbzu d2,1(d3) + + mflr r0 + + stw d3,-8(sp) + + stwu r0,-12(sp) + bl writeFC + mtlr r0 + + lwz d2,4(sp) + lwz d3,0(sp) + addi sp,sp,8 + b write_module_name_lp + +end_module_name: + li d2,' + + mflr r0 + stwu r0,-4(sp) + bl writeFC + mtlr r0 + + lwz d3,0(sp) + addi sp,sp,4 + .endif + + addi d3,d3,3 + +write_function_name_lp: + lbzu d2,1(d3) + cmpwi 0,d2,0 + beq end_function_name + + stw d3,-4(sp) + + mflr r0 + stwu r0,-8(sp) + bl writeFC + mtlr r0 + + lwz d3,0(sp) + addi sp,sp,4 + b write_function_name_lp + +end_function_name: + li d2,' + + mflr r0 + stwu r0,-4(sp) + bl writeFC + + lwz d2,0(sp) + lwz d2,FunctionProfile_n_strict_calls(d2) + stwu r0,-4(sp) + bl writeFI_space + + lwz d2,0(sp) + lwz d2,FunctionProfile_n_lazy_calls(d2) + stwu r0,-4(sp) + bl writeFI_space + + lwz d2,0(sp) + lwz d2,FunctionProfile_n_curried_calls(d2) + stwu r0,-4(sp) + bl writeFI_space + + lwz d2,0(sp) + lwz d2,FunctionProfile_n_profiler_calls(d2) + stwu r0,-4(sp) + bl writeFI_space + + lwz d2,0(sp) + lwz d2,FunctionProfile_n_words_allocated(d2) + stwu r0,-4(sp) + bl writeFI_space + + lwz d2,0(sp) + lwz d2,FunctionProfile_time_hi(d2) + stwu r0,-4(sp) + bl writeFI_space + + lwz d2,0(sp) + lwz d2,FunctionProfile_time_lo(d2) + stwu r0,-4(sp) + bl writeFI + + li d2,13 + stwu r0,-4(sp) + bl writeFC + mtlr r0 + + lwz d2,0(sp) + addi sp,sp,4 + lwz d2,FunctionProfile_next(d2) + b write_profile_lp + +writeFI_space: + mflr r0 + stwu r0,-4(sp) + bl writeFI + mtlr r0 + + li d2,' + b writeFC + +end_list: + mflr r0 + stwu r0,-4(sp) + bl closeF + mtlr r0 + +cannot_open: + + .if USE_TEMPORARY_MEMORY + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(96+28)(sp) + .else + stwu sp,-96(sp) + .endif + stw r0,96-4(sp) + lea_ r5,profile_globals + lwz r3,Globals_profile_stack_handle(r5) + bl free_temp_memory_handle + + lea_ r5,profile_globals + + stw r31,96-8(sp) + + lwz r31,Globals_temp_handle_list(r5) + b free_temp_handles + +free_temp_handles_lp: + mr r3,r31 + lwz r31,0(r31) + lwz r31,0(r31) + bl free_temp_memory_handle + +free_temp_handles: + cmpwi 0,r31,0 + bne free_temp_handles_lp + + lwz r31,96-8(sp) + + lwz r0,96-4(sp) + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,96 + .endif + mtlr r0 + .endif + lwz r0,0(sp) + addi sp,sp,4 + blr + +write_profile_stack: + mflr r0 + lea_ d0,profile_globals + stwu r0,-4(sp) + lwz d0,Globals_stack_pointer(d0) + + cmpwi 0,d0,0 + beq stack_not_initialised + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + lea_ o0,stack_trace_string + bl _er_print_string + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + + .if 1 + li d2,12 + .else + li d2,24 + .endif +write_functions_on_stack: + lwzu d1,-4(d0) + cmpwi 0,d1,0 + beq end_profile_stack + + lwz o0,FunctionProfile_name(d1) + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + addi o0,o0,4 + bl _er_print_string + li o0,13 + bl _er_print_char + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + + subic. d2,d2,1 + .if 0 + b write_functions_on_stack + .else + bne write_functions_on_stack + .endif + +end_profile_stack: +stack_not_initialised: + lwz r0,0(sp) + mtlr r0 + lwz r0,4(sp) + addi sp,sp,8 + blr + +init_profiler: + .if 0 + mflr r0 + stw r0,-4(sp) + stwu sp,-64(sp) + + bl .Debugger + nop + + lwz r0,64-4(sp) + addi sp,sp,64 + mtlr r0 + .endif + + mflr r0 + stwu r0,-4(sp) + + .if MACOSX + subi sp,sp,8 + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-72(sp) + .endif + li r3,0 + addi r4,sp,64 + stw r3,64(sp) + li r3,'u*256+'t + addis r3,r3,'c*256+'p + bl L_Gestalt$stub + nop + lwz r3,64(sp) + .if MACOSX + lwz sp,0(sp) + addi sp,sp,8 + .else + addi sp,sp,72 + .endif + + cmpwi 0,r3,257 + .if POWER601 + bne init_profiler_error1 + .else + beq init_profiler_error1 + .endif + + .if 1 + lea_ r3,_stack_size + lwz r3,0(r3) + .else + li r3, (512*1024) % 65536 + addis r3,r3,(512*1024) / 65536 + .endif + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + .if USE_TEMPORARY_MEMORY + bl allocate_temp_memory_handle + .else + bl _NewPtr + nop + .endif + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + lea_ r5,profile_globals + + and. r9,r3,r3 + beq init_profiler_error + + .if USE_TEMPORARY_MEMORY + stw r9,Globals_profile_stack_handle(r5) + lwz r9,0(r9) + li r0,0 + stw r0,Globals_temp_handle_list(r5) + .endif + .if CHECK_STACK_OVERFLOWS + .if 1 + lea_ r3,_stack_size + lwz r3,0(r3) + .else + li r3, (512*1024) % 65536 + addis r3,r3,(512*1024) / 65536 + .endif + add r3,r3,r9 + stw r3,Globals_end_profile_stack(r5) + .endif + lea_ r3,start_string + bl allocate_function_profile_record + + lwz r0,0(sp) + addi sp,sp,4 + mtlr r0 + + li r0,0 + stw r4,4(r9) + stw r0,0(r9) + addi r9,r9,8 + stw r9,Globals_stack_pointer(r5) + stw r0,Globals_last_tail_call(r5) + stw d7,Globals_n_words_free(r5) + + lwz r0,0(sp) + addi sp,sp,4 + +store_clock_3: + time_hi r9 + stw r9,Globals_time_hi(r5) + time_lo r10 + time_hi r4 + stw r10,Globals_time_lo(r5) + cmpw 0,r4,r9 + beqlr+ + + b store_clock_3 + + .if USE_TEMPORARY_MEMORY +allocate_temp_memory_handle: + mflr r0 + stw r31,-4(sp) + stw r0,8(sp) + stwu sp,-96(sp) + + addi r4,sp,56 + bl L_TempNewHandle$stub + nop + + mr. r31,r3 + beq return_r31 + + addi r4,sp,56 + bl L_TempHLock$stub + nop + + lha r0,56(sp) + cmpwi r0,0 + beq+ return_r31 + + mr r3,r31 + addi r4,sp,56 + bl L_TempDisposeHandle$stub + nop + + li r31,0 +return_r31: + lwz r0,104(sp) + mr r3,r31 + mtlr r0 + addi sp,sp,96 + lwz r31,-4(sp) + blr + +free_temp_memory_handle: + mflr r0 + stw r3,-4(sp) + stw r0,8(sp) + stwu sp,-96(sp) + + addi r4,sp,56 + bl L_TempHUnlock$stub + nop + + lwz r3,96-4(sp) + addi r4,sp,56 + bl L_TempDisposeHandle$stub + nop + + lwz r0,104(sp) + addi sp,sp,96 + mtlr r0 + blr + .endif + +init_profiler_error1: + lea_ o0,wrong_processor + lea_ r5,profile_globals + li r4,0 + stw r4,Globals_stack_pointer(r5) + b print_error +init_profiler_error: + lea_ o0,not_enough_memory_for_profile_stack + lea_ r5,profile_globals + li r4,0 + stw r4,Globals_stack_pointer(r5) + b print_error +profiler_memory_error: + lea_ o0,not_enough_memory_for_profiler + b print_error + .if CHECK_STACK_OVERFLOWS +profile_stack_overflow: + mflr r0 + stw r0,-4(sp) + stwu sp,-64(sp) + + bl .Debugger + nop + + lwz r0,64-4(sp) + addi sp,sp,64 + mtlr r0 + b profile_stack_overflow + .endif + + .data + .align 2 + .comm profile_globals,Globals + +profile_file_name: + .long __STRING__+2 + .long 0 + .long 0,0,0,0,0,0,0,0 + .align 2 + .if MODULE_NAMES +m_system_: + .long 6 + .ascii "System" + .byte 0,0 + .long m_system_ + .endif +start_string: + .long 0 + .ascii "start" + .byte 0 + .align 2 +not_enough_memory_for_profile_stack: + .ascii "not enough memory for profile stack" + .byte 13 + .byte 0 +not_enough_memory_for_profiler: + .ascii "not enough memory for profiler" + .byte 13 + .byte 0 +wrong_processor: + .if POWER601 + .ascii "Not a PowerPC601 processor (don't use profiling option for 601)" + .else + .ascii "This is a PowerPC601 processor (use profiling option for 601)" + .endif + .byte 13 + .byte 0 +stack_trace_string: + .ascii "Stack trace:" + .byte 13 + .byte 0 + .align 2 + + +.picsymbol_stub +L_Gestalt$stub: + .indirect_symbol _Gestalt + mflr r0 + bcl 20,31,L20$pb +L20$pb: + mflr r11 + addis r11,r11,ha16(L20$lz-L20$pb) + mtlr r0 + lwz r12,lo16(L20$lz-L20$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L20$lz-L20$pb ) + bctr +.lazy_symbol_pointer +L20$lz: + .indirect_symbol _Gestalt + .long dyld_stub_binding_helper + + +.picsymbol_stub +L_TempDisposeHandle$stub: + .indirect_symbol _TempDisposeHandle + mflr r0 + bcl 20,31,L21$pb +L21$pb: + mflr r11 + addis r11,r11,ha16(L21$lz-L21$pb) + mtlr r0 + lwz r12,lo16(L21$lz-L21$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L21$lz-L21$pb ) + bctr +.lazy_symbol_pointer +L21$lz: + .indirect_symbol _TempDisposeHandle + .long dyld_stub_binding_helper + + +.picsymbol_stub +L_TempHLock$stub: + .indirect_symbol _TempHLock + mflr r0 + bcl 20,31,L22$pb +L22$pb: + mflr r11 + addis r11,r11,ha16(L22$lz-L22$pb) + mtlr r0 + lwz r12,lo16(L22$lz-L22$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L22$lz-L22$pb ) + bctr +.lazy_symbol_pointer +L22$lz: + .indirect_symbol _TempHLock + .long dyld_stub_binding_helper + + + +.picsymbol_stub +L_TempHUnlock$stub: + .indirect_symbol _TempHUnlock + mflr r0 + bcl 20,31,L23$pb +L23$pb: + mflr r11 + addis r11,r11,ha16(L23$lz-L23$pb) + mtlr r0 + lwz r12,lo16(L23$lz-L23$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L23$lz-L23$pb ) + bctr +.lazy_symbol_pointer +L23$lz: + .indirect_symbol _TempHUnlock + .long dyld_stub_binding_helper + + + +.picsymbol_stub +L_TempNewHandle$stub: + .indirect_symbol _TempNewHandle + mflr r0 + bcl 20,31,L24$pb +L24$pb: + mflr r11 + addis r11,r11,ha16(L24$lz-L24$pb) + mtlr r0 + lwz r12,lo16(L24$lz-L24$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L24$lz-L24$pb ) + bctr +.lazy_symbol_pointer +L24$lz: + .indirect_symbol _TempNewHandle + .long dyld_stub_binding_helper + diff --git a/macho/pstartup.a b/macho/pstartup.a new file mode 100644 index 0000000..8b44279 --- /dev/null +++ b/macho/pstartup.a @@ -0,0 +1,6116 @@ +# comment +# comment File: pstartup.a +# comment Author: John van Groningen +# comment Machine: power macintosh + +LINUX = 0 +# comment PROFILE = 0 + +#define sp r1 + +#define d0 r24 +#define d1 r25 +#define d2 r26 +#define d3 r27 +#define d4 r28 +#define d5 r29 +#define d6 r30 +#define d7 r31 + +#define a0 r23 +#define a1 r22 +#define a2 r21 +#define a3 r20 +#define a4 r19 +#define a5 r18 +#define a6 r17 + +#define o0 r3 +#define o1 r4 +#define o2 r5 +#define o3 r6 +#define o4 r7 +#define o5 r8 + +#define g2 r9 +#define g3 r10 + +#define g0 r11 +#define g1 r12 + +#define int_reg r16 +#define char_reg r15 +#define real_reg r14 +#define bool_reg r13 + + .macro setmbit + rlwinm $2,$1,32-$6-3,3+$6,31 + lbzx $4,$0,$2 + rlwinm $5,$1,(32-$6) & 31,29,31 + srw $3,g3,$5 + or $4,$4,$3 + stbx $4,$0,$2 + .endmacro + +# comment &vector 0,&bit_n 1,&byte_offset 2,&bit 3,&byte 4,&scratch 5,&shift 6 +# comment rlwinm &byte_offset,&bit_n,32-&shift-3,3+&shift,31 +# comment lbzx &byte,&vector,&byte_offset +# comment rlwinm &scratch,&bit_n,(32-&shift) & 31,29,31 +# comment srw &bit,g3,&scratch +# comment or &byte,&byte,&bit +# comment stbx &byte,&vector,&byte_offset + + .macro tstmbit + rlwinm $2,$1,32-$6-3,3+$6,31 + lbzx $4,$0,$2 + rlwinm $5,$1,32-$6,29,31 + rlwnm. $3,$4,$5,24,24 + .endmacro + +# comment &vector 0,&bit_n 1,&byte_offset 2,&bit 3,&byte 4,&bit_n_in_byte 5,&shift 6 +# comment rlwinm &byte_offset,&bit_n,32-&shift-3,3+&shift,31 +# comment lbzx &byte,&vector,&byte_offset +# comment rlwinm &bit_n_in_byte,&bit_n,32-&shift,29,31 +# comment rlwnm. &bit,&byte,&bit_n_in_byte,24,24 +# comment .endmacro + + .macro clrmbit + rlwinm $2,$1,32-$6-3,3+$6,31 + lbzx $4,$0,$2 + rlwinm $5,$1,32-$6,29,31 + srw $3,g3,$5 + andc $4,$4,$3 + stbx $4,$0,$2 + .endmacro + +# comment &vector 0,&bit_n 1,&byte_offset 2,&bit 3,&byte 4,&scratch 5,&shift 6 +# comment rlwinm &byte_offset,&bit_n,32-&shift-3,3+&shift,31 +# comment lbzx &byte,&vector,&byte_offset +# comment rlwinm &scratch,&bit_n,32-&shift,29,31 +# comment srw &bit,g3,&scratch +# comment andc &byte,&byte,&bit +# comment stbx &byte,&vector,&byte_offset +# comment .endmacro + +#include "pmacros.a" + +MACOSX = 1 + +NODE_POINTER_OFFSET = 0 + +SHARE_CHAR_INT = 1 +COPIED_VECTOR = 1 +RECORDS = 1 +MY_ITOS = 1 +FINALIZERS = 1 + +USE_DCBZ = 0 +COMPACT_GC_ONLY = 0 + +ADJUST_HEAP_SIZE = 1 +MARK_GC = 1 +MARK_AND_COPY_GC = 1 + + .if LINUX +STDERR_TO_FILE = 0 +WRITE_HEAP = 0 + .else +WRITE_HEAP = 0 +STDERR_TO_FILE = 1 + .endif +# comment PROFILE = 0 +UNBOXED_CLOSURES = 1 + +MODULE_NAMES_IN_TIME_PROFILER = 1 + +EXCEPTIONS = 0 + +MINIMUM_HEAP_SIZE = 8000 + + .if 1 +DESCRIPTOR_ARITY_OFFSET = (-2) +ZERO_ARITY_DESCRIPTOR_OFFSET = (-8) + .else +DESCRIPTOR_ARITY_OFFSET = (-8) +ZERO_ARITY_DESCRIPTOR_OFFSET = (-12) + .endif + + .globl r_to_i_buffer + .comm r_to_i_buffer,8 + .comm heap_mbp,4 + .comm heap_p,4 + .comm heap_p1,4 + .comm heap_p2,4 + .comm heap_size_33,4 + .if COPIED_VECTOR + .comm heap_size_129,4 + .comm heap_copied_vector,4 + .comm heap_copied_vector_size,4 + .comm heap_end_after_copy_gc,4 + .endif + .comm extra_heap,4 + .comm extra_heap_size,4 + .comm stack_p,4 + .if MACOSX + .comm end_a_stack,4 + .comm end_b_stack,4 + .endif + .comm halt_sp,4 +# comment number of long words requested from the garbage collector + .comm alloc_size,4 + .comm basic_only,4 + .comm last_time,4 + .comm execute_time,4 + .comm garbage_collect_time,4 + .comm IO_time,4 + + .globl saved_heap_p + .comm saved_heap_p,8 + + .globl saved_a_stack_p + .comm saved_a_stack_p,4 + + .comm sprintf_buffer,32 + .comm sprintf_time_buffer,20 + + .globl small_integers + .comm small_integers,33*8 + .globl static_characters + .comm static_characters,256*8 + + .if EXCEPTIONS + .comm exception_info,12 + .endif + + .comm caf_list,4 + .globl caf_listp + .comm caf_listp,4 + + .data + +heap_p3: .long 0 +heap_vector:.long 0 +heap_end_after_gc: .long 0 + + .if MARK_GC +bit_counter: + .long 0 +bit_vector_p: + .long 0 +zero_bits_before_mark: + .long 1 +free_after_mark: + .long 1000 +last_heap_free: + .long 0 +lazy_array_list: + .long 0 + .if ADJUST_HEAP_SIZE +bit_vector_size: + .long 0 ; in bits + .endif + .endif + + .align 2 +zero_length_string: + .long __STRING__+2 + .long 0 +true_string: + .long __STRING__+2 + .long 4 +true_c_string: + .ascii "True" + .byte 0,0,0,0 +false_string: + .long __STRING__+2 + .long 5 +false_c_string: + .ascii "False" + .byte 0,0,0 +file_c_string: + .ascii "File" + .byte 0,0,0,0 + +# comment -1: compact or mark, no extra heap +# comment 0: copy, no extra heap +# comment 1: compact, extra heap +# comment 2: copy, extra heap +garbage_collect_flag: + .byte 0 + .byte 0,0,0 + +out_of_memory_string_1: + .ascii "Not enough memory to allocate heap and stack" + .byte 13,0 +printf_int_string: + .ascii "%d" + .byte 0 +printf_real_string: + .ascii "%g" + .byte 0 +printf_string_string: + .ascii "%s" + .byte 0 +printf_char_string: + .ascii "%c" + .byte 0 +garbage_collect_string_1: + .ascii "A stack: " + .byte 0 +garbage_collect_string_2: + .ascii " bytes. BC stack: " + .byte 0 +garbage_collect_string_3: + .ascii " bytes." + .byte 13,0 +heap_use_after_gc_string_1: + .ascii "Heap use after garbage collection: " + .byte 0 +heap_use_after_gc_string_2: + .ascii " Bytes." + .byte 13,0 +stack_overflow_string: + .ascii "Stack overflow." + .byte 13,0 +out_of_memory_string_4: + .ascii "Heap full." + .byte 13,0 +time_string_1: + .ascii "Execution: " + .byte 0 +time_string_2: + .ascii " Garbage collection: " + .byte 0 +time_string_3: + .ascii " IO: " + .byte 0 +time_string_4: + .ascii " Total: " + .byte 0 +high_index_string: + .ascii "Index too high in UPDATE string." + .byte 13,0 +low_index_string: + .ascii "Index negative in UPDATE string." + .byte 13,0 +IO_error_string: + .ascii "IO error: " + .byte 0 +new_line_string: + .byte 13,0 + +sprintf_time_string: + .ascii "%d.%02d" + .byte 0 + + .if MARK_GC +marked_gc_string_1: + .ascii "Marked: " + .byte 0 + .endif + .if PROFILE + .align 2 + .if MODULE_NAMES_IN_TIME_PROFILER +m_system: + .long 6 + .ascii "System" + .byte 0,0 + .long m_system + .endif +garbage_collector_name: + .long 0 + .ascii "garbage_collector" + .byte 0 + .align 2 + .endif + .if WRITE_HEAP + .comm heap2_begin_and_end,8 + .endif + + .align 3 +entier_constants_and_buffers: + .double 0.0 + .double 0.0 + .long 0x43300000 + .long 0x00000000 + .long 0x43300000 + .long 0x80000000 + + .if FINALIZERS + .globl __Nil + .globl e____system__kFinalizer + .globl e____system__kFinalizerGCTemp + .globl finalizer_list + .comm finalizer_list,4 + .globl free_finalizer_list + .comm free_finalizer_list,4 + .endif + + .align 1 + + .text + .globl _abc_main + .globl print_ + .globl print_char + .globl print_int + .globl print_real + .globl print_sc + .globl print_symbol + .globl print_symbol_sc + .globl print__string__ + .globl print__chars__sc + .globl printD + + .globl eprint__ + .globl eprint__string__ + .globl eprintD + + .globl push_t_r_args + .globl push_a_r_args + .globl halt + + .globl catAC + .globl sliceAC + .globl updateAC + .globl eqAC + .globl cmpAC + + .globl string_to_string_node + + .globl create_array + .globl create_arrayB + .globl create_arrayC + .globl create_arrayI + .globl create_arrayR + .globl create_R_array + + .globl _create_arrayB + .globl _create_arrayC + .globl _create_arrayI + .globl _create_arrayR + .globl _create_r_array + + .globl BtoAC + .globl DtoAC + .globl ItoAC + .globl RtoAC + .globl eqD + + .globl collect_0,collect_1,collect_2,collect_3 + .globl collect_00,collect_01,collect_02,collect_03 + + .globl eval_01,eval_11,eval_02,eval_12,eval_22 + + .globl e__system__sAP + .globl yet_args_needed,yet_args_needed_0,yet_args_needed_1 + .globl yet_args_needed_2,yet_args_needed_3,yet_args_needed_4 + + .globl _c3,_c4,_c5,_c6,_c7,_c8,_c9,_c10,_c11,_c12 + .globl _c13,_c14,_c15,_c16,_c17,_c18,_c19,_c20,_c21,_c22 + .globl _c23,_c24,_c25,_c26,_c27,_c28,_c29,_c30,_c31,_c32 + + .globl __indirection,__eaind,eval_fill + .globl eval_upd_0,eval_upd_1,eval_upd_2,eval_upd_3,eval_upd_4 + .globl eval_upd_5,eval_upd_6,eval_upd_7,eval_upd_8,eval_upd_9 + .globl eval_upd_10,eval_upd_11,eval_upd_12,eval_upd_13,eval_upd_14 + .globl eval_upd_15,eval_upd_16,eval_upd_17,eval_upd_18,eval_upd_19 + .globl eval_upd_20,eval_upd_21,eval_upd_22,eval_upd_23,eval_upd_24 + .globl eval_upd_25,eval_upd_26,eval_upd_27,eval_upd_28,eval_upd_29 + .globl eval_upd_30,eval_upd_31,eval_upd_32 + + .globl repl_args_b + .globl push_arg_b + .globl del_args + .if 0 + .globl o__S_P2 + .globl ea__S_P2 + .endif + .globl _add_IO_time + .globl _add_execute_time + + .globl _IO_error + .globl print_error + .globl stack_overflow + + .globl out_of_memory_4 + + .globl acos_real + .globl asin_real + .globl atan_real + .globl cos_real + .globl sin_real + .globl tan_real + .globl ln_real + .globl log10_real + .globl exp_real + .globl sqrt_real + .globl pow_real + .globl entier_real + .if EXCEPTIONS + .globl e__Exceptions__scatch__exception + .globl e__Exceptions__sraise__exception + .endif + .if LINUX + .globl __start + .else + .globl _start + .endif + .globl __driver + + +# comment from system.abc: + .globl INT + .globl CHAR + .globl BOOL + .globl REAL + .globl FILE + .globl __STRING__ + .globl __ARRAY__ + .globl __cycle__in__spine + .globl __print__graph + .globl __eval__to__nf + + .if STDERR_TO_FILE + .globl _close_stderr_file + .endif + +# comment from cgcon.c: + .globl _w_print_char + .globl _w_print_text + .globl _w_print_int + .globl _w_print_real + .globl _w_print_string + + .if STDERR_TO_FILE + .globl _er_print_char + .globl _er_print_string + .globl _er_print_int + .globl _er_print_text + .else + .globl _ew_print_char + .globl _ew_print_string + .globl _ew_print_int + .endif + .if 0 + + .globl _wait_for_key_press + .else + .globl _execution_aborted + .endif + .globl _stack_size + .globl _heap_size + .globl _flags + .if ADJUST_HEAP_SIZE + .globl _heap_size_multiple + .globl _initial_heap_size + .endif + +# comment from standard c library: + .globl _sprintf + .if LINUX + .globl malloc + .globl free + .else + .globl _NewPtr + .globl _DisposePtr + .globl _TickCount + .globl _Debugger + .endif + .globl _acos + .globl _asin + .globl _atan + .globl _cos + .globl _sin + .globl _tan + .globl _log + .globl _log10 + .globl _exp + .globl _sqrt + .globl _pow + + .if PROFILE + .globl init_profiler + .globl profile_s,profile_n,profile_r,profile_ti + .globl write_profile_information,write_profile_stack + .endif + +_abc_main: + mflr r0 + stwu r0,-4(sp) + stmw r13,-76(sp) + subi sp,sp,76 + + lea o0,_flags + lwz d0,0(o0) + lea o0,basic_only + andi. d0,d0,1 + stw d0,0(o0) + + lea o0,_heap_size + lwz d0,0(o0) + subi o0,d0,3 + li o1,33 + divwu o0,o0,o1 + lea o1,heap_size_33 + stw o0,0(o1) + + .if COPIED_VECTOR + lea o0,_heap_size + li o1,129 + lwz d0,0(o0) + subi o0,d0,7 + divwu o0,o0,o1 + lea o1,heap_size_129 + stw o0,0(o1) + addi o0,o0,3 + lea o1,heap_copied_vector_size + clrrwi o0,o0,2 + stw o0,0(o1) + + lea o1,heap_end_after_copy_gc + li g0,0 + stw g0,0(o1) + .endif + + lea o1,_heap_size + lwz o0,0(o1) + addi o0,o0,7 + clrrwi o0,o0,3 + stw o0,0(o1) + addi o0,o0,3+4 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + + .if LINUX + bl malloc + .else + bl L_NewPtr$stub + .endif + nop + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + cmpwi 0,o0,0 + beq no_memory_1 + + lea o1,heap_mbp + stw o0,0(o1) + + addi o0,o0,3 + clrrwi a6,o0,2 + + lea o0,heap_p + lea o1,heap_p1 + stw a6,0(o0) + stw a6,0(o1) + + .if MACOSX + lea o0,_stack_size + lwz o0,0(o0) + + stwu sp,-64(sp) + bl L_NewPtr$stub + addi sp,sp,64 + + cmpwi 0,o0,0 + beq no_memory_1 + + mr a4,o0 + lea o0,stack_p + stw a4,0(o0) + + lea o0,_stack_size + addi d0,sp,128 + lwz d1,0(o0) + + lea o0,end_a_stack + sub d0,d0,d1 + add d1,a4,d1 + stw d1,0(o0) + + lea o0,end_b_stack + stw d0,0(o0) + .else + lea o0,_stack_size + addi d0,sp,-128 + lwz o0,0(o0) + sub a4,d0,o0 + + lea o0,stack_p + stw a4,0(o0) + .endif + + lea a0,small_integers + li d0,0 + lea d1,INT+2 +make_small_integers_lp: + stw d1,0(a0) + stw d0,4(a0) + addi d0,d0,1 + cmpwi 0,d0,33 + addi a0,a0,8 + bne make_small_integers_lp + + lea a0,static_characters + li d0,0 + lea d1,CHAR+2 +make_static_characters_lp: + stw d1,0(a0) + stw d0,4(a0) + addi d0,d0,1 + cmpwi 0,d0,256 + addi a0,a0,8 + bne make_static_characters_lp + + lea o0,caf_listp + lea a0,caf_list+4 + stw a0,0(o0) + li g0,0 + stw g0,-4(a0) + + .if FINALIZERS + lea o0,finalizer_list + lea o1,free_finalizer_list + lea a0,__Nil-8 + stw a0,0(o0) + stw a0,0(o1) + .endif + + .if COPIED_VECTOR + lea o0,heap_size_129 + lwz d1,0(o0) + slwi d7,d1,6-2 + slwi d1,d1,6 + lea o0,heap_copied_vector + add d0,a6,d1 + lea o1,heap_copied_vector_size + stw d0,0(o0) + lwz o1,0(o1) + lea o0,heap_p2 + add d0,d0,o1 + stw d0,0(o0) + .else + lea o0,_heap_size + lwz d1,0(o0) + lea o0,heap_p2 + srwi d1,d1,1 + add d0,a6,d1 + srwi d7,d1,2 + stw d0,0(o0) + .endif + + lea o0,garbage_collect_flag + li g0,0 + stb g0,0(o0) + + .if MARK_AND_COPY_GC + lea o0,_flags + lwz o0,0(o0) + andi. r0,o0,64 + beq no_mark1 + .endif + + .if MARK_GC | COMPACT_GC_ONLY + lea o0,heap_size_33 + lea o1,heap_vector + lwz d0,0(o0) + stw a6,0(o1) + slwi d7,d0,3 + add a6,a6,d0 + addi a6,a6,3 + lea o0,heap_p3 + clrrwi a6,a6,2 + stw a6,0(o0) + lea o0,garbage_collect_flag + li d0,-1 + stb d0,0(o0) + .endif + + .if MARK_AND_COPY_GC +no_mark1: + .endif + + .if ADJUST_HEAP_SIZE + lea d0,_initial_heap_size + lea o0,_flags + lwz d0,0(d0) + .if MARK_AND_COPY_GC + lwz o0,0(o0) + li d1,MINIMUM_HEAP_SIZE/2 + andi. r0,o0,64 + bne no_mark9 + add d1,d1,d1 +no_mark9: + .else + .if MARK_GC | COMPACT_GC_ONLY + li d1,MINIMUM_HEAP_SIZE + .else + li d1,MINIMUM_HEAP_SIZE/2 + .endif + .endif + cmpw d0,d1 + ble too_large_or_too_small + srwi d0,d0,2 + cmpw d0,d7 + bge too_large_or_too_small + mr d7,d0 +too_large_or_too_small: + .endif + + .if MARK_AND_COPY_GC + lea o0,_flags + lwz o0,0(o0) + andi. r0,o0,64 + beq no_mark2 + .endif + + .if MARK_GC & ADJUST_HEAP_SIZE + lea o0,bit_vector_size + stw d7,0(o0) + .endif + + .if MARK_AND_COPY_GC +no_mark2: + .endif + + lea o0,heap_end_after_gc + slwi d0,d7,2 + add d0,a6,d0 + stw d0,0(o0) + + lea o0,halt_sp + stw sp,0(o0) + + .if EXCEPTIONS + lea o0,exception_info + li o1,0 + stw o1,0(o0) + .endif + bl _init_timer + + + lea a5,__cycle__in__spine + lea int_reg,INT+2 + lea char_reg,CHAR+2 + lea real_reg,REAL+2 + lea bool_reg,BOOL+2 + + .if USE_DCBZ + subi d7,d7,15 + li g2,32 + .endif + + li r0,-1 + .if PROFILE + stwu r0,-4(sp) + bl init_profiler + .endif + stwu r0,-4(sp) + + .if 0 + stwu sp,-64(sp) + bl .Debugger + nop + addi sp,sp,64 + .endif + + subi a6,a6,4 + + .if LINUX + bl __start + .else + bl _start + .endif + nop + +exit: + bl _add_execute_time + + lea o0,_flags + lwz d0,0(o0) + andi. g0,d0,8 + beq no_print_execution_time + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + + lea o0,time_string_1 + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + nop + + lea a0,execute_time + lwz d0,0(a0) + bl _print_time + + lea o0,time_string_2 + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + + lea a0,garbage_collect_time + lwz d0,0(a0) + bl _print_time + + lea o0,time_string_3 + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + + lea a0,IO_time + lwz d0,0(a0) + bl _print_time + + lea o0,time_string_4 + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + + lea a0,execute_time + lwz d0,0(a0) + lea a0,garbage_collect_time + lwz d2,0(a0) + add d0,d0,d2 + lea a0,IO_time + lwz d2,0(a0) + add d0,d0,d2 + + bl _print_time + + li o0,13 + .if STDERR_TO_FILE + bl _er_print_char + .else + bl _ew_print_char + .endif + nop + + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif +no_print_execution_time: + +exit_3: +exit_2: + lea o0,heap_mbp + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + lwz o0,0(o0) + .if LINUX + bl free + .else + bl L_DisposePtr$stub + .endif + nop + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + +exit_1: + .if STDERR_TO_FILE + lea o0,_flags + lwz d0,0(o0) + andi. g0,d0,128 + beq no_close_stderr_file + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl _close_stderr_file + nop + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + +no_close_stderr_file: + .endif + .if PROFILE + mflr r0 + stwu r0,-4(sp) + bl write_profile_information + .endif + + lwz r0,76(sp) + mtlr r0 + lmw r13,0(sp) + addi sp,sp,80 + blr + +__driver: + lea o1,_flags + lwz o0,0(o1) + andi. r0,o0,16 + bne _eval__to__nf + b __print__graph +_eval__to__nf: + b __eval__to__nf + +_print_time: + mflr r0 + stwu r0,-4(sp) + + .if LINUX + li o1,100 + .else + li o1,60 + .endif + divwu o2,d0,o1 + + .if LINUX + mulli o3,o2,100 + sub o3,d0,o3 + .else + mulli o3,o2,60 + sub o3,d0,o3 + mulli o3,o3,5 + li o1,3 + divwu o3,o3,o1 + .endif + lea o1,sprintf_time_string + lea o0,sprintf_time_buffer + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_sprintf$stub + + lea o0,sprintf_time_buffer + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + nop + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + lwz r0,0(sp) + addi sp,sp,4 + mtlr r0 + + blr + +no_memory_1: + lea o0,out_of_memory_string_1 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + nop + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + b exit_1 + +print_sc: + lea o0,basic_only + lwz o1,0(o0) + cmpwi 0,o1,0 + bne end_print +print_: + mr o0,d0 + +print_string_o0_and_return: + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl _w_print_string + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,8 + .else + lwz r0,64(sp) + addi sp,sp,72 + .endif + mtlr r0 + lwz r0,-4(sp) + blr + +end_print: + lwz r0,0(sp) + addi sp,sp,4 + blr + +printD: andi. r0,d0,2 + bne printD_ + + mr a2,d0 + b print_string_a2 + +print_symbol: + li d1,0 + b print_symbol_2 + +print_symbol_sc: + lea o0,basic_only + lwz d1,0(o0) +print_symbol_2: + lwz d0,0(a0) + + cmpw 0,int_reg,d0 + beq print_int_node + + cmpw 0,char_reg,d0 + beq print_char_node + + cmpw 0,bool_reg,d0 + beq print_bool + + cmpw 0,real_reg,d0 + beq print_real_node + + cmpwi 0,d1,0 + bne end_print_symbol + +printD_: lha d1,-2(d0) + addi a2,d0,-2 + + cmplwi 0,d1,256 + bge print_record + + slwi d1,d1,3 + sub a2,a2,d1 + + .if 1 + lhz d1,DESCRIPTOR_ARITY_OFFSET(a2) + addi a2,a2,4 + slwi d1,d1,3 + add a2,a2,d1 + b print_string_a2 + .endif + +print_record: + lwz a2,-4(a2) + b print_string_a2 + +end_print_symbol: + lwz r0,0(sp) + addi sp,sp,4 + blr + +print_int_node: + lwz o0,4(a0) +print_int2: + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl _w_print_int + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,8 + .else + lwz r0,64(sp) + addi sp,sp,72 + .endif + mtlr r0 + lwz r0,-4(sp) + blr + +print_int: + mr o0,d0 + b print_int2 + +print_char: + lea o0,basic_only + lwz d1,0(o0) + cmpwi 0,d1,0 + bne print_char_node_bo + + b print_char_node_sc + +print_char_node: + cmpwi 0,d1,0 + lwz d0,4(a0) + bne print_char_node_sc +print_char_node_bo: + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + li o0,0x27 + bl _w_print_char + + mr o0,d0 + bl _w_print_char + + li o0,0x27 + bl _w_print_char + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,8 + .else + lwz r0,64(sp) + addi sp,sp,72 + .endif + mtlr r0 + lwz r0,-4(sp) + blr + +print_char_node_sc: + mr o0,d0 + + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl _w_print_char + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,8 + .else + lwz r0,64(sp) + addi sp,sp,72 + .endif + mtlr r0 + lwz r0,-4(sp) + blr + +print_bool: + lbz o0,7(a0) + cmpwi 0,o0,0 + beq print_false + +print_true: + lea o0,true_c_string + b print_string_o0_and_return + +print_false: + lea o0,false_c_string + b print_string_o0_and_return + +print_real: + fmr f1,f14 + b print_real_ +print_real_node: + lfd f1,4(a0) +print_real_: + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl _w_print_real + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,8 + .else + lwz r0,64(sp) + addi sp,sp,72 + .endif + mtlr r0 + lwz r0,-4(sp) + blr + +print_string_a2: + lwz o1,0(a2) + addi o0,a2,4 + + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl _w_print_text + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,8 + .else + lwz r0,64(sp) + addi sp,sp,72 + .endif + mtlr r0 + lwz r0,-4(sp) + blr + +print__chars__sc: + lea o0,basic_only + lwz d1,0(o0) + cmpwi 0,d1,0 + bne no_print_chars + +print__string__: + lwz o1,4(a0) + addi o0,a0,8 + + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl _w_print_text + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,8 + .else + lwz r0,64(sp) + addi sp,sp,72 + .endif + mtlr r0 + lwz r0,-4(sp) + blr + +no_print_chars: + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +eprint__: + mr o0,d0 + + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,8 + .else + lwz r0,64(sp) + addi sp,sp,72 + .endif + mtlr r0 + lwz r0,-4(sp) + blr + + .text +eprint__string__: + lwz o1,4(a0) + addi o0,a0,8 + + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + .if STDERR_TO_FILE + bl _er_print_text + .else + bl _ew_print_text + .endif + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,8 + .else + lwz r0,64(sp) + addi sp,sp,72 + .endif + mtlr r0 + lwz r0,-4(sp) + blr + + .text +eprintD: andi. r0,d0,2 + bne eprintD_ + + mr a2,d0 + b eprint_string_a2 + +eprintD_: lha d1,-2(d0) + addi a2,d0,-2 + + cmplwi 0,d1,256 + bge eprint_record + + slwi d1,d1,3 + sub a2,a2,d1 + + lhz d1,DESCRIPTOR_ARITY_OFFSET(a2) + addi a2,a2,4 + slwi d1,d1,3 + add a2,a2,d1 + b eprint_string_a2 + +eprint_record: + lwz a2,-4(a2) + +eprint_string_a2: + lwz o1,0(a2) + addi o0,a2,4 + + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + .if STDERR_TO_FILE + bl _er_print_text + .else + bl _ew_print_text + .endif + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,8 + .else + lwz r0,64(sp) + addi sp,sp,72 + .endif + mtlr r0 + lwz r0,-4(sp) + blr + + .text + +DtoAC: lha d1,-2(d0) + addi a0,d0,-2 + + cmplwi 0,d1,256 + bge DtoAC_record + + slwi d1,d1,3 + bsub a0,d1 + .if 1 + lhz d1,DESCRIPTOR_ARITY_OFFSET(a0) + baddi a0,4 + slwi d1,d1,3 + badd a0,d1 + .endif +DtoAC_a0: + lwz d2,0(a0) + mr a2,a0 + + addi d3,d2,3 + bsubi d7,2 + + srwi d3,d3,2 + sub. d7,d7,d3 + blt DtoAC_gc +DtoAC_r_gc: + lea o1,__STRING__+2 + + subic. d3,d3,1 + + addi a0,a6,4 + stw o1,4(a6) + stwu d2,8(a6) + blt DtoAC_copy + +DtoAC_copy_lp: + lwzu o0,4(a2) + subic. d3,d3,1 + stwu o0,4(a6) + bge DtoAC_copy_lp +DtoAC_copy: + + lwz r0,0(sp) + baddi sp,4 + blr + +DtoAC_gc: mflr r0 + mr d0,a0 + bl collect_0 + mr a2,d0 + b DtoAC_r_gc + +DtoAC_record: + lwz a0,-4(a0) + b DtoAC_a0 + + .text +push_a_r_args: + lwz a1,8(a0) + subi a1,a1,2 + lhz d3,0(a1) + subi d3,d3,256 + lhz d1,2(a1) + addi a1,a1,4 + sub d2,d3,d1 + slwi d0,d0,2 + + mullw d4,d0,d3 + addi a0,a0,12 + add a0,a0,d4 + + lwz r0,0(sp) + addi sp,sp,4 + + slwi o0,d1,2 + add a0,a0,o0 + mr a3,a0 + b push_a_elements + +push_a_elements_lp: + lwzu o0,-4(a3) + addi a4,a4,4 + stw o0,-4(a4) +push_a_elements: + subic. d1,d1,1 + bge push_a_elements_lp + + slwi o0,d2,2 + add a0,a0,o0 + b push_b_elements + +push_b_elements_lp: + lwzu o0,-4(a0) + stwu o0,-4(sp) +push_b_elements: + subic. d2,d2,1 + bge push_b_elements_lp + + mr d0,a1 + blr + +push_t_r_args: + lwz a1,0(a0) + addi a0,a0,4 + subi a1,a1,2 + lhz d3,0(a1) + lhz d1,2(a1) + subi d3,d3,256 + addi d0,a1,4 + sub d2,d3,d1 + + slwi d4,d3,2 + cmplwi 0,d3,2 + add a1,a0,d4 + ble small_record + + lwz a1,4(a0) + subi a1,a1,4 + add a1,a1,d4 +small_record: + lwz r0,0(sp) + addi sp,sp,4 + b push_r_b_elements + +push_r_b_elements_lp: + subic. d3,d3,1 + bne not_first_arg_b + + lwz o0,0(a0) + stwu o0,-4(sp) + b push_r_b_elements +not_first_arg_b: + lwzu o0,-4(a1) + stwu o0,-4(sp) +push_r_b_elements: + subic. d2,d2,1 + bge push_r_b_elements_lp + + b push_r_a_elements + +push_r_a_elements_lp: + subic. d3,d3,1 + addi a4,a4,4 + bne not_first_arg_a + + lwz o0,0(a0) + stw o0,-4(a4) + b push_r_a_elements + +not_first_arg_a: + lwzu o0,-4(a1) + stw o0,-4(a4) +push_r_a_elements: + subic. d1,d1,1 + bge push_r_a_elements_lp + + blr + + .text +BtoAC: + andi. d0,d0,255 + beq BtoAC_false +BtoAC_true: + lea a0,true_string + lwz r0,0(sp) + addi sp,sp,4 + blr +BtoAC_false: + lea a0,false_string + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +RtoAC: + .if LINUX + fmr f1,f14 + .else + stfd f14,-8(sp) + .endif + lea o1,printf_real_string + lea o0,sprintf_buffer + .if LINUX + creqv 6,6,6 + .else + lwz o2,-8(sp) + lwz o3,-4(sp) + .endif + mflr r0 + .if MACOSX + stwu r0,-4(sp) + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stw r0,-4(sp) + stwu sp,-64(sp) + .endif + bl L_sprintf$stub + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + addi sp,sp,4 + .else + lwz r0,60(sp) + addi sp,sp,64 + .endif + mtlr r0 + + b return_sprintf_buffer_string + + .text +ItoAC: + .if MY_ITOS + lea a0,sprintf_buffer + cmpwi 0,d0,0 + bge no_minus + + li o0,45 + stb o0,0(a0) + addi a0,a0,1 + li g0,0 + sub d0,g0,d0 +no_minus: + addi a2,a0,12 + beq zero_digit + +calculate_digits: + cmplwi 0,d0,10 + blt last_digit + + li o1,10 + divwu o0,d0,o1 + + mullw a1,o0,o1 + sub a1,d0,a1 + addi a1,a1,48 + + stb a1,0(a2) + addi a2,a2,1 + + mr d0,o0 + b calculate_digits + +last_digit: + cmpwi 0,d0,0 + beq no_zero +zero_digit: + addi d0,d0,48 + stb d0,0(a2) + addi a2,a2,1 +no_zero: + addi a1,a0,12 + +reverse_digits: + lbzu d1,-1(a2) + cmpw 0,a2,a1 + stb d1,0(a0) + addi a0,a0,1 + bne reverse_digits + + li g0,0 + lea d0,sprintf_buffer + + stb g0,0(a0) + sub d0,a0,d0 + b sprintf_buffer_to_string + + .else + mr o2,d0 + lea o1,printf_int_string + lea o0,sprintf_buffer + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_sprintf$stub + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + .endif + +return_sprintf_buffer_string: + lea o0,sprintf_buffer + li d0,-1 + subi o0,o0,1 + +count_chars_in_c_string: + lbzu d1,1(o0) + addi d0,d0,1 + cmpwi d1,0 + bne count_chars_in_c_string + + .if MY_ITOS +sprintf_buffer_to_string: + .endif + addi d1,d0,3 + srwi d1,d1,2 + subi d7,d7,2 + sub. d7,d7,d1 + bge+ D_to_S_no_gc + + mflr r0 + bl collect_0 + +D_to_S_no_gc: + lea a0,sprintf_buffer + lea o0,__STRING__+2 + addi d2,a6,4 + stw o0,4(a6) + stwu d0,8(a6) + b D_to_S_cp_str_2 + +D_to_S_cp_str_1: + lwz o0,0(a0) + addi a0,a0,4 + stwu o0,4(a6) +D_to_S_cp_str_2: + subic. d1,d1,1 + bge D_to_S_cp_str_1 + + mr a0,d2 + lwz r0,0(sp) + addi sp,sp,4 + .if USE_DCBZ + li g2,32 + .endif + blr + + .text +eqD: lwz d0,0(a0) + lwz o0,0(a1) + cmpw 0,d0,o0 + bne eqD_false + + cmpw 0,d0,int_reg + beq eqD_INT + + cmpw 0,d0,char_reg + beq eqD_CHAR + + cmpw 0,d0,bool_reg + beq eqD_BOOL + + cmpw 0,d0,real_reg + beq eqD_REAL + + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +eqD_CHAR: +eqD_INT: lwz d1,4(a0) + lwz o0,4(a1) + li d0,0 + cmpw 0,d1,o0 + + mfcr d0 + srwi d0,d0,31-2 + andi. d0,d0,1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +eqD_BOOL: lbz d1,7(a0) + lbz o0,7(a1) + li d0,0 + cmpw 0,d1,o0 + + mfcr d0 + srwi d0,d0,31-2 + andi. d0,d0,1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +eqD_REAL: lfd f0,4(a0) + lfd f1,4(a1) + + fcmpo 0,f0,f1 + + mfcr d0 + srwi d0,d0,31-2 + andi. d0,d0,1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +eqD_false: + li d0,0 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +# comment +# comment the timer +# comment + +_init_timer: + mflr r0 + stwu r0,-4(sp) + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + .if LINUX + addi o0,sp,8 + bl times + lwz o0,8(sp) + .else + bl L_TickCount$stub + .endif + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + lwz r0,0(sp) + addi sp,sp,4 + mtlr r0 + + lea o1,last_time + stw o0,0(o1) + + lea o1,execute_time + li o0,0 + stw o0,0(o1) + + lea o1,garbage_collect_time + stw o0,0(o1) + + lea o1,IO_time + stw o0,0(o1) + + blr + +_get_time_diff: + mflr r0 + stwu r0,-4(sp) + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + .if LINUX + addi o0,sp,8 + bl times + lwz o0,8(sp) + .else + bl L_TickCount$stub + .endif + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + lea o2,last_time + + lwz r0,0(sp) + addi sp,sp,4 + mtlr r0 + + lwz o1,0(o2) + stw o0,0(o2) + sub o0,o0,o1 + + blr + +_add_execute_time: + mflr r0 + stwu r0,-4(sp) + + bl _get_time_diff + + lea o2,execute_time + + lwz r0,0(sp) + addi sp,sp,4 + mtlr r0 + + lwz o1,0(o2) + add o1,o1,o0 + stw o1,0(o2) + + blr + +.add_garbage_collect_time: + mflr r0 + stwu r0,-4(sp) + + bl _get_time_diff + + lea o2,garbage_collect_time + + lwz r0,0(sp) + addi sp,sp,4 + mtlr r0 + + lwz o1,0(o2) + add o1,o1,o0 + stw o1,0(o2) + + blr + +_add_IO_time: + mflr r0 + stwu r0,-4(sp) + + bl _get_time_diff + + lea o2,IO_time + + lwz r0,0(sp) + addi sp,sp,4 + mtlr r0 + + lwz o1,0(o2) + add o1,o1,o0 + stw o1,0(o2) + + blr + +# comment +# comment the garbage collector +# comment + + .text +collect_3: + stwu r0,-4(sp) + .if PROFILE + lea r3,garbage_collector_name + mflr r0 + bl profile_s + .endif + stw a0,0(a4) + stw a1,4(a4) + stw a2,8(a4) + addi a4,a4,12 + + mflr r0 + bl collect_ + + lwz a2,-4(a4) + lwz a1,-8(a4) + lwzu a0,-12(a4) + + lwz r0,0(sp) + mtctr r0 + lwz r0,4(sp) + mtlr r0 + addi sp,sp,8 + .if PROFILE + b profile_ti + .else + bctr + .endif + + .text +collect_2: + stwu r0,-4(sp) + .if PROFILE + lea r3,garbage_collector_name + mflr r0 + bl profile_s + .endif + stw a0,0(a4) + stw a1,4(a4) + addi a4,a4,8 + + mflr r0 + bl collect_ + + lwz a1,-4(a4) + lwzu a0,-8(a4) + + lwz r0,0(sp) + mtctr r0 + lwz r0,4(sp) + mtlr r0 + addi sp,sp,8 + .if PROFILE + b profile_ti + .else + bctr + .endif + + .text +collect_1: + stwu r0,-4(sp) + .if PROFILE + lea r3,garbage_collector_name + mflr r0 + bl profile_s + .endif + stw a0,0(a4) + addi a4,a4,4 + + mflr r0 + bl collect_ + + lwzu a0,-4(a4) + + lwz r0,0(sp) + mtctr r0 + lwz r0,4(sp) + mtlr r0 + addi sp,sp,8 + .if PROFILE + b profile_ti + .else + bctr + .endif + + .text +collect_0: + stwu r0,-4(sp) + .if PROFILE + lea r3,garbage_collector_name + mflr r0 + bl profile_s + .endif + mflr r0 + bl collect_ + + lwz r0,0(sp) + mtctr r0 + lwz r0,4(sp) + mtlr r0 + addi sp,sp,8 + .if PROFILE + b profile_ti + .else + bctr + .endif + + .text +collect_03: + stwu r0,-4(sp) + .if PROFILE + lea r3,garbage_collector_name + mflr r0 + bl profile_s + .endif + stw a0,0(a4) + stw a1,4(a4) + stw a2,8(a4) + addi a4,a4,12 + + mflr r0 + bl collect_ + + lwz a2,-4(a4) + lwz a1,-8(a4) + lwzu a0,-12(a4) + + lwz r0,0(sp) + mtctr r0 + lwz r0,4(sp) + addi sp,sp,8 + .if PROFILE + b profile_ti + .else + bctr + .endif + + .text +collect_02: + stwu r0,-4(sp) + .if PROFILE + lea r3,garbage_collector_name + mflr r0 + bl profile_s + .endif + stw a0,0(a4) + stw a1,4(a4) + addi a4,a4,8 + + mflr r0 + bl collect_ + + lwz a1,-4(a4) + lwzu a0,-8(a4) + + lwz r0,0(sp) + mtctr r0 + lwz r0,4(sp) + addi sp,sp,8 + .if PROFILE + b profile_ti + .else + bctr + .endif + + .text +collect_01: + stwu r0,-4(sp) + .if PROFILE + lea r3,garbage_collector_name + mflr r0 + bl profile_s + .endif + stw a0,0(a4) + addi a4,a4,4 + + mflr r0 + bl collect_ + + lwzu a0,-4(a4) + + lwz r0,0(sp) + mtctr r0 + lwz r0,4(sp) + addi sp,sp,8 + .if PROFILE + b profile_ti + .else + bctr + .endif + + .text +collect_00: + stwu r0,-4(sp) + .if PROFILE + lea r3,garbage_collector_name + mflr r0 + bl profile_s + .endif + mflr r0 + bl collect_ + + lwz r0,0(sp) + mtctr r0 + lwz r0,4(sp) + addi sp,sp,8 + .if PROFILE + b profile_ti + .else + bctr + .endif + + + .text +collect_: + stwu r0,-4(sp) + + addi a6,a6,4 + .if USE_DCBZ + addi d7,d7,15 + .endif + + .if MARK_AND_COPY_GC + lea o0,_flags + lwz o0,0(o0) + andi. r0,o0,64 + beq no_mark3 + .endif + + .if MARK_GC + lea g1,bit_counter + lwz o2,0(g1) + li g0,0 + + tst o2 + beq no_scan + + mtctr o2 + + lea o4,heap_end_after_gc + lea a0,bit_vector_p + lwz o4,0(o4) + lwz a0,0(a0) + sub o4,o4,a6 + srwi o4,o4,2 + sub o4,o4,d7 + +scan_bits: + lwz o0,0(a0) + addi a0,a0,4 + cmpwi o0,0 + beq zero_bits + stw g0,-4(a0) + bdnz scan_bits + + b end_scan + +zero_bits: + mr a1,a0 + bdnz skip_zero_bits_lp+4 + b end_bits + +skip_zero_bits_lp: + bne end_zero_bits + lwz o3,0(a0) + addi a0,a0,4 + tst o3 + bdnz skip_zero_bits_lp + + beq end_bits + stw g0,-4(a0) + sub o3,a0,a1 + b end_bits2 + +end_zero_bits: + lea g1,free_after_mark + + sub o3,a0,a1 + slwi o3,o3,3 + + cmplw 0,o3,o4 + + lwz o1,0(g1) + stw g0,-4(a0) + + add o1,o1,o3 + stw o1,0(g1) + blt scan_bits + +found_free_memory: + mfctr o2 + lea o1,bit_counter + lea g1,bit_vector_p + stw o2,0(o1) + stw a0,0(g1) + + lea o1,heap_vector + sub d7,o3,o4 + + lwz o1,0(o1) + subi o2,a1,4 + lea g1,heap_p3 + sub o2,o2,o1 + lwz o1,0(g1) + slwi o2,o2,5 + + add a6,o2,o1 + + slwi o3,o3,2 + lea g1,heap_end_after_gc + add o2,a6,o3 + stw o2,0(g1) + + .if USE_DCBZ + subi d7,d7,15 + li g2,32 + .endif + subi a6,a6,4 + blr + +end_bits: + sub o3,a0,a1 + addi o3,o3,4 +end_bits2: + lea g1,free_after_mark + + slwi o3,o3,3 + + lwz o1,0(g1) + cmplw 0,o3,o4 + add o1,o1,o3 + stw o1,0(g1) + bge found_free_memory + +end_scan: + mfctr o2 + lea g1,bit_counter + stw o2,0(g1) +no_scan: + .endif + + .if MARK_AND_COPY_GC +no_mark3: + .endif + mflr r0 + stwu r0,-4(sp) + + subi sp,sp,28 + stw d0,0(sp) + stw d1,4(sp) + stw d2,8(sp) + stw d3,12(sp) + stw d4,16(sp) + + lea g1,garbage_collect_flag + + stw d5,20(sp) + + lbz o0,0(g1) + + stw d6,24(sp) + + extsb o0,o0 + cmpwi 0,o0,0 + ble collect + + subi o0,o0,2 + stb o0,0(g1) + + lea o0,heap_end_after_gc + lwz d0,0(o0) + sub d0,d0,a6 + srwi d0,d0,2 + lea o0,extra_heap_size + sub d0,d0,d7 + lwz d1,0(o0) + cmplw 0,d0,d1 + bgt collect + + lea o0,extra_heap_size + lwz d1,0(o0) + + lea o0,extra_heap + + sub d7,d1,d0 + + lwz a6,0(o0) + slwi d1,d1,2 + lea o0,heap_end_after_gc + add d1,d1,a6 + stw d1,0(o0) + + lwz d0,0(sp) + lwz d1,4(sp) + lwz d2,8(sp) + lwz d3,12(sp) + lwz d4,16(sp) + lwz d5,20(sp) + lwz d6,24(sp) + + lwz r0,28(sp) + mtlr r0 + + .if USE_DCBZ + subi d7,d7,15 + li g2,32 + .endif + subi a6,a6,4 + + addi sp,sp,32 + blr + +collect: + bl _add_execute_time + + lea o1,_flags + lwz o0,0(o1) + andi. r0,o0,4 + beq no_print_stack_sizes + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + lea o0,garbage_collect_string_1 + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + nop + + lea o0,stack_p + lwz a0,0(o0) + sub o0,a4,a0 + .if MACOSX + lea o1,halt_sp + lwz d0,0(o1) + .else + lea o1,_stack_size + lwz o2,0(o1) + add d0,a0,o2 + .endif + sub d0,d0,sp + .if STDERR_TO_FILE + bl _er_print_int + .else + bl _ew_print_int + .endif + nop + + lea o0,garbage_collect_string_2 + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + nop + + mr o0,d0 + .if STDERR_TO_FILE + bl _er_print_int + .else + bl _ew_print_int + .endif + nop + + lea o0,garbage_collect_string_3 + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + nop + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif +no_print_stack_sizes: + cmplw 0,a4,sp + bgt stack_overflow + + .if MARK_AND_COPY_GC + lea o0,_flags + lwz o0,0(o0) + andi. r0,o0,64 + bne compacting_collector + .else + .if MARK_GC + b compacting_collector + .endif + .endif + + .if MARK_AND_COPY_GC | !MARK_GC + lea o0,garbage_collect_flag + lbz o1,0(o0) + extsb. o1,o1 + bne compacting_collector + + .if COPIED_VECTOR + lea o1,heap_end_after_copy_gc + li g0,0 + lwz a1,0(o1) + lea a2,heap_copied_vector + tst a1 + + lea o0,heap_copied_vector_size + lwz a2,0(a2) + lwz d1,0(o0) + + beq zero_all + + lea o0,heap_p1 + stw g0,0(o1) + lwz a0,0(o0) + sub d0,a6,a0 + addi d0,d0,63*4 + srwi d0,d0,8 + bl zero_bit_vector + + sub d2,a1,a0 + lea a2,heap_copied_vector + clrrwi d2,d2,8 + lwz a2,0(a2) + srwi d2,d2,6 + add a2,a2,d2 + + sub d0,d1,d2 + srwi d0,d0,2 + bl zero_bit_vector + + b end_zero_bit_vector + +zero_all: + srwi d0,d1,2 + bl zero_bit_vector + +end_zero_bit_vector: + .endif + +# comment calculate alloc_size + lea o0,heap_end_after_gc + lwz d0,0(o0) + lea o1,alloc_size + sub d0,d0,a6 + srwi d0,d0,2 + sub d0,d0,d7 + stw d0,0(o1) + +#include "pcopy.a" + + .if WRITE_HEAP + lea o0,heap2_begin_and_end + stw o4,0(o0) + .endif + + lea o0,heap_end_after_gc + stw o4,0(o0) + + sub d7,o4,a6 + srwi d7,d7,2 + + bl .add_garbage_collect_time + + lea o0,alloc_size + lwz o1,0(o0) + sub. d7,d7,o1 + blt switch_to_mark_scan +# comment bneg out_of_memory_4 + + slwi d0,d7,2 + add d0,d0,d7 + slwi d0,d0,5 + lea o0,_heap_size + lwz d2,0(o0) + slwi d1,d2,2 + add d1,d1,d2 + slwi d1,d1,1 + add d1,d1,d2 + cmplw 0,d0,d1 + bge no_mark_scan +# comment b no_mark_scan + +switch_to_mark_scan: + lea o0,heap_size_33 + lwz d0,0(o0) + slwi d0,d0,5 + lea o0,heap_p + lwz d1,0(o0) + + lea o0,heap_p1 + lwz d2,0(o0) + lea o0,heap_p2 + lwz o1,0(o0) + cmplw 0,d2,o1 + blt vector_at_begin + +vector_at_end: + lea o0,heap_p3 + stw d1,0(o0) + add d1,d1,d0 + lea o0,heap_vector + stw d1,0(o0) + + lea o0,heap_p1 + lwz d0,0(o0) + lea o0,extra_heap + stw d0,0(o0) + sub d1,d1,d0 + srwi d1,d1,2 + lea o0,extra_heap_size + stw d1,0(o0) + b switch_to_mark_scan_2 + +vector_at_begin: + lea o0,heap_vector + stw d1,0(o0) + lea o1,_heap_size + lwz o0,0(o1) + add d1,d1,o0 + sub d1,d1,d0 + lea o0,heap_p3 + stw d1,0(o0) + + lea o0,extra_heap + stw d1,0(o0) + lea o0,heap_p2 + lwz d2,0(o0) + sub d2,d2,d1 + srwi d2,d2,2 + lea o0,extra_heap_size + stw d2,0(o0) + +switch_to_mark_scan_2: + lea o0,_heap_size + lwz d0,0(o0) + srwi d0,d0,3 + sub d0,d0,d7 + slwi d0,d0,2 + + lea o0,garbage_collect_flag + li o1,1 + stb o1,0(o0) + + cmpwi 0,d7,0 + bge end_garbage_collect + + li o1,-1 + stb o1,0(o0) + + lea o0,extra_heap_size + lea o1,alloc_size + lwz d1,0(o0) + lwz d7,0(o1) + sub. d7,d1,d7 + blt out_of_memory_4 + + lea o0,extra_heap + lea o1,heap_end_after_gc + .if WRITE_HEAP + mr d2,a6 + .endif + lwz a6,0(o0) + slwi d1,d1,2 + add d1,d1,a6 + stw d1,0(o1) + .if WRITE_HEAP + li d3,1 + b end_garbage_collect_ + .else + b end_garbage_collect + .endif + +no_mark_scan: +# comment exchange the semi_spaces + + lea o0,heap_p1 + lea o1,heap_p2 + lwz d0,0(o0) + lwz d1,0(o1) + stw d0,0(o1) + stw d1,0(o0) + + .if COPIED_VECTOR + lea o0,heap_size_129 + lwz d1,0(o0) + slwi d1,d1,6-2 + .else + lea o0,_heap_size + lwz d1,0(o0) + srwi d1,d1,3 + .endif + sub d0,d1,d7 + + .if ADJUST_HEAP_SIZE + lea o0,_heap_size_multiple + lwz o0,0(o0) + + mullw d2,d0,o0 + mulhwu o0,d0,o0 + + rlwinm d2,d2,32-9,9,31-2 +# comment srwi d2,d2,9 + + rlwimi d2,o0,32-9,0,8 + srwi. o0,o0,9 + bne no_small_heap1 + + cmplwi d2,MINIMUM_HEAP_SIZE/2 + bge not_too_small1 + li d2,MINIMUM_HEAP_SIZE/2 +not_too_small1: + + sub. d2,d1,d2 + blt no_small_heap1 + + sub d7,d7,d2 + lea o0,heap_end_after_gc + slwi d2,d2,2 + lwz d1,0(o0) + sub d2,d1,d2 + lea o1,heap_end_after_copy_gc + stw d2,0(o0) + stw d1,0(o1) + +no_small_heap1: + .endif + + slwi d0,d0,2 + .endif + +end_garbage_collect: + .if WRITE_HEAP + mr d2,a6 + li d3,0 +end_garbage_collect_: + .endif + lea o0,_flags + lwz o1,0(o0) + andi. r0,o1,2 + beq+ no_heap_use_message + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + lea o0,heap_use_after_gc_string_1 + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + + mr o0,d0 + .if STDERR_TO_FILE + bl _er_print_int + .else + bl _ew_print_int + .endif + + lea o0,heap_use_after_gc_string_2 + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif +no_heap_use_message: + .if FINALIZERS + bl call_finalizers + .endif + + .if WRITE_HEAP + .globl first_function + .globl _write_heap + .globl min_write_heap_size + + lea o0,_flags + lea o1,min_write_heap_size + + lwz o0,0(o0) + lwz o1,0(o1) + + andi. r0,o0,32 + beq no_write_heap + + cmplw 0,d0,o1 + blt no_write_heap + + subi sp,sp,64 + + lea r3,garbage_collect_flag + cmpwi d3,0 + + lea r7,heap2_begin_and_end + lbz r3,0(r3) + lwz r5,0(r7) + bne copy_to_compact_with_alloc_in_extra_heap + + extsb. r3,r3 + lwz r6,4(r7) + + lea r4,heap_p1 + beq gc0 + lea r4,heap_p2 + bgt gc1 + lea r4,heap_p3 + li r5,0 + li r6,0 +gc0: +gc1: + lwz r4,0(r4) + mr r10,sp + stw r4,0(r10) + stw d2,4(r10) + stw r5,8(r10) + stw r6,12(r10) + + lea r6,stack_p + lea r8,first_function + lwz r6,0(r6) + + li r9,0 + + lwz r8,0(r8) + + stw r6,16(r10) + stw a4,20(r10) + stw r8,24(r10) + stw r9,28(r10) + + lea r4,small_integers + lea r5,static_characters + stw r4,32(r10) + stw r5,36(r10) + + stw r16,40(r10) + stw r15,44(r10) + stw r14,48(r10) + stw r13,52(r10) + lea d0,__STRING__+2 + lea d1,__ARRAY__+2 + stw d0,56(r10) + stw d1,60(r10) + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + + mr r3,r10 + bl _write_heap + nop + + .if MACOSX + lwz sp,0(sp) + addi sp,sp,64 + .else + addi sp,sp,128 + .endif +no_write_heap: + + .endif + + lwz d0,0(sp) + lwz d1,4(sp) + lwz d2,8(sp) + lwz d3,12(sp) + lwz d4,16(sp) + lwz d5,20(sp) + lwz d6,24(sp) + + lwz r0,28(sp) + mtlr r0 + + .if USE_DCBZ + subi d7,d7,15 + li g2,32 + .endif + subi a6,a6,4 + + addi sp,sp,32 + blr + + .if FINALIZERS +call_finalizers: + lea d0,free_finalizer_list + lwz d0,0(d0) + +call_finalizers_lp: + lea o0,__Nil-8 + cmplw d0,o0 + beq end_call_finalizers + + lwz d1,8(d0) + lwz d0,4(d0) + mflr d2 + + lwz r12,0(d1) + lwz r3,4(d1) + + mtctr r12 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + + bctrl + + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + + mtlr d2 + b call_finalizers_lp +end_call_finalizers: + lea d0,free_finalizer_list + stw o0,0(d0) + blr + .endif + + .if WRITE_HEAP +copy_to_compact_with_alloc_in_extra_heap: + lwz r6,4(r7) + lea r4,heap_p2 + b gc1 + .endif + +out_of_memory_4: + bl .add_garbage_collect_time + + lea o0,out_of_memory_string_4 + b print_error + + .text +# comment d0 = n words +# comment a2 = address +# comment g0 = 0 +zero_bit_vector: + andi. r0,d0,1 + srwi d0,d0,1 + beq zero_bits1_1 + + stw g0,0(a2) + addi a2,a2,4 +zero_bits1_1: + andi. r0,d0,1 + srwi d0,d0,1 + beq zero_bits1_5 + + subi a2,a2,8 + b zero_bits1_2 + +zero_bits1_4: + stw g0,0(a2) + stw g0,4(a2) +zero_bits1_2: + stw g0,8(a2) + stw g0,12(a2) + addi a2,a2,16 +zero_bits1_5: + subic. d0,d0,1 + bge zero_bits1_4 + + blr + + .text +reorder: + mr d2,d0 + mr d3,d1 + slwi d4,d0,2 + slwi d5,d1,2 + add a0,a0,d5 + sub a1,a1,d4 + b st_reorder_lp + +reorder_lp: + lwzu o0,-4(a1) + subic. d2,d2,1 + + lwz o1,0(a0) + stw o0,0(a0) + addi a0,a0,4 + + bne+ next_b_in_element + mr d2,d0 + add a0,a0,d5 +next_b_in_element: + + subic. d3,d3,1 + stw o1,0(a1) + + bne+ next_a_in_element + mr d3,d1 + sub a1,a1,d4 +next_a_in_element: + +st_reorder_lp: + cmplw 1,a1,a0 + bgt cr1,reorder_lp + + blr + +# comment +# comment the sliding compacting garbage collector +# comment + + .text +compacting_collector: + +# comment zero all mark bits + + lea o0,heap_p3 + lea o1,heap_vector + lwz d6,0(o0) + lea o0,heap_end_after_gc + lwz o4,0(o1) + lwz d5,0(o0) + sub d5,d5,a6 + srwi d5,d5,2 + + lea o0,alloc_size + sub d5,d5,d7 + stw d5,0(o0) + + .if MARK_GC + .if MARK_AND_COPY_GC + lea o0,_flags + lwz o0,0(o0) + andi. r0,o0,64 + beq no_mark4 + .endif + + lea o0,zero_bits_before_mark + li g0,0 + lwz o1,0(o0) + cmpwi 0,o1,0 + beq no_zero_bits + + stw g0,0(o0) + + .if MARK_AND_COPY_GC +no_mark4: + .endif + .endif + + lea o0,heap_size_33 + mr a2,o4 + lwz d0,0(o0) + addi d0,d0,3 + srwi d0,d0,2 + + li o0,0 + + andi. r0,d0,1 + srwi d0,d0,1 + beq zero_bits_1 + + stw o0,0(a2) + addi a2,a2,4 +zero_bits_1: + + andi. r0,d0,1 + srwi d0,d0,1 + beq zero_bits_5 + + subi a2,a2,8 + b zero_bits_2 + +zero_bits_4: + stw o0,0(a2) + stw o0,4(a2) +zero_bits_2: + stw o0,8(a2) + stw o0,12(a2) + addi a2,a2,16 +zero_bits_5: + subic. d0,d0,1 + bge zero_bits_4 + + .if MARK_GC + .if MARK_AND_COPY_GC + lea o0,_flags + lwz o0,0(o0) + andi. r0,o0,64 + beq no_mark5 + .endif + +no_zero_bits: + lea o0,last_heap_free + lea o1,free_after_mark + lwz d0,0(o0) + lwz d1,0(o1) + slwi d1,d1,2 + + slwi d2,d1,3 + add d2,d2,d1 + srwi d2,d2,2 + + cmplw d0,d2 + bgt compact_gc + + .if ADJUST_HEAP_SIZE + lea o0,bit_vector_size + lwz d1,0(o0) + lea o0,_heap_size_multiple + slwi d1,d1,2 + lwz o0,0(o0) + sub o2,d1,d0 + + mullw o1,o2,o0 + mulhwu o2,o2,o0 + + rlwinm o1,o1,32-7,7,31-2 +# comment srwi o1,o1,7 + + rlwimi o1,o2,32-7,0,6 + srwi. o2,o2,7 + bne no_smaller_heap + + cmplw o1,d1 + bge no_smaller_heap + + cmplwi d1,MINIMUM_HEAP_SIZE + ble no_smaller_heap + + b compact_gc + +no_smaller_heap: + .endif + +#include "pmark.a" + +compact_gc: + lea o0,zero_bits_before_mark + li d0,1 + stw d0,0(o0) + lea o0,last_heap_free + li g0,0 + stw g0,0(o0) + lea o0,free_after_mark + li o1,1000 + stw o1,0(o0) + .endif + + .if MARK_AND_COPY_GC +no_mark5: + .endif + +#include "pcompact.a" + + lea o0,heap_size_33 + lwz d7,0(o0) + lea o0,heap_end_after_gc + slwi d7,d7,5 + add d7,d7,d6 + stw d7,0(o0) + + lea o0,alloc_size + sub d7,d7,a6 + lwz d1,0(o0) + srwi d7,d7,2 + sub. d7,d7,d1 + blt out_of_memory_4 + + slwi d0,d7,2 + lea o0,_heap_size + add d0,d0,d7 + lwz o1,0(o0) + slwi d0,d0,3 + cmplw 0,d0,o1 + blt out_of_memory_4 + + .if MARK_GC | COMPACT_GC_ONLY + .if MARK_GC & ADJUST_HEAP_SIZE + .if MARK_AND_COPY_GC + lea o0,_flags + lwz o0,0(o0) + andi. r0,o0,64 + beq no_mark6 + .endif + + sub d0,a6,d6 + lea o0,_heap_size_multiple + slwi d1,d1,2 + lwz o0,0(o0) + add o2,d0,d1 + + lea d1,heap_size_33 + lwz d1,0(d1) + slwi d1,d1,5 + + mullw d0,o2,o0 + mulhwu o0,o2,o0 + + rlwinm d0,d0,32-8,8,31-2 +# comment srwi d0,d0,8 + rlwimi d0,o0,32-8,0,7 +# comment clrrwi d0,d0,2 + + srwi. o0,o0,8 + bne no_small_heap2 + + cmplwi d0,MINIMUM_HEAP_SIZE + bge not_too_small2 + li d0,MINIMUM_HEAP_SIZE +not_too_small2: + + sub. d2,d1,d0 + blt no_small_heap2 + + lea o1,heap_end_after_gc + srwi o0,d2,2 + lwz d1,0(o1) + sub d7,d7,o0 + sub d1,d1,d2 + stw d1,0(o1) + + mr d1,d0 + +no_small_heap2: + lea o0,bit_vector_size + srwi d1,d1,2 + stw d1,0(o0) + + .if MARK_AND_COPY_GC +no_mark6: + .endif + .endif + b no_copy_garbage_collection + .else + lea o0,_heap_size + slwi d0,d0,2 + lwz d1,0(o0) + lwz o1,0(o0) + slwi d1,d1,5 + sub d1,d1,o1 + cmpw 0,d0,d1 + + ble no_copy_garbage_collection +# comment b no_copy_garbage_collection + + lea o0,heap_p + lwz d0,0(o0) + lea o0,heap_p1 + stw d0,0(o0) + .if COPIED_VECTOR + lea o0,heap_size_129 + lwz d1,0(o0) + slwi d1,d1,6 + add d0,d0,d1 + lea o0,heap_copied_vector + lea o1,heap_end_after_gc + stw d0,0(o0) + lea o0,heap_copied_vector_size + stw d0,0(o1) + lwz d1,0(o0) + lea o0,heap_p2 + add d1,d1,d0 + stw d1,0(o0) + .else + lea o0,_heap_size + lwz d1,0(o0) + srwi d1,d1,1 + add d0,d0,d1 + lea o0,heap_p2 + stw d0,0(o0) + lea o0,heap_end_after_gc + stw d0,0(o0) + .endif + sub d0,d0,a6 + srwi d0,d0,2 + mr d7,d0 + lea o0,alloc_size + lwz o1,0(o0) + sub d7,d7,o1 + + lea o0,heap_p3 + lwz d0,0(o0) + lea o0,heap_vector + lwz o1,0(o0) + cmpw 0,d0,o1 + ble vector_at_end_2 + + lea o0,heap_vector + lwz d1,0(o0) + lea o0,extra_heap + stw d1,0(o0) + sub d0,d0,d1 + srwi d0,d0,2 + lea o0,extra_heap_size + stw d0,0(o0) + + lea o0,garbage_collect_flag + li o1,2 + stb o1,0(o0) + + b no_copy_garbage_collection + +vector_at_end_2: + lea o0,garbage_collect_flag + li o1,0 + stb o1,0(o0) + .endif + +no_copy_garbage_collection: + bl .add_garbage_collect_time + + lea o0,alloc_size + sub d0,a6,d6 + lwz d1,0(o0) + slwi d1,d1,2 + + add d0,d0,d1 + b end_garbage_collect + +stack_overflow: + bl _add_execute_time + + lea o0,stack_overflow_string + b print_error + +_IO_error: + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(128+28)(sp) + .else + stwu sp,-128(sp) + .endif + stw o0,124(sp) + + lea o0,IO_error_string + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + + lwz o0,124(sp) + + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + + lea o0,new_line_string + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,128 + .endif + b halt + +print_error: + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + .if STDERR_TO_FILE + bl _er_print_string + .else + bl _ew_print_string + .endif + .if MACOSX + lwz sp,0(sp) + .else + baddi sp,64 + .endif +halt: + + .if PROFILE + mflr r0 + stwu r0,-4(sp) + bl write_profile_stack + mtlr r0 + .endif + + .if EXCEPTIONS + lea o0,exception_info + lwz o0,0(o0) + cmpwi 0,o0,0 + bne e__Exceptions__sraise__exception + .endif + + lea o0,halt_sp + lwz sp,0(o0) + .if 0 + lea o0,_flags + lwz d0,0(o0) + andi. r0,d0,8 + bne exit + + andi. r0,d0,16 + beq exit + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl _wait_for_key_press + .if MACOSX + lwz sp,0(sp) + .else + baddi sp,64 + .endif + .else + lea o0,_execution_aborted + li d0,1 + stw d0,0(o0) + .endif + b exit + + .if EXCEPTIONS +e__Exceptions__scatch__exception: + lea o0,exception_info + mflr d0 + stw a4,0(o0) + stw sp,4(o0) + stw d0,8(o0) + + li d0,0 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +e__Exceptions__sraise__exception: + lea o0,exception_info + li d0,-1 + + lwz o1,8(o0) + lwz sp,4(o0) + mtlr o1 + lwz a4,0(o0) + + li o1,0 + stw o1,0(o0) + + lwz r0,0(sp) + addi sp,sp,4 + blr + .endif + + .text +eval_01: + stw a1,0(a4) + addi a4,a4,4 + bctr + + .text +eval_11: + stw a0,0(a4) + mr a0,a1 + addi a4,a4,4 + bctr + + .text +eval_02: + stw a2,0(a4) + addi a4,a4,8 + stw a1,4-8(a4) + bctr + + .text +eval_12: + stw a0,4(a4) + mr a0,a1 + stw a2,0(a4) + addi a4,a4,8 + bctr + + .text +eval_22: + stw a0,4(a4) + mr a0,a2 + stw a1,0(a4) + addi a4,a4,8 + bctr + +__eaind: +eval_fill: + stw a0,0(a4) + mr a0,a1 + lwz a1,0-NODE_POINTER_OFFSET(a1) + addi a4,a4,4 + + mtctr a1 + mflr r0 + stwu r0,-4(sp) + bctrl + mtlr r0 + + mr a1,a0 + lwzu a0,-4(a4) + + lwz g0,0-NODE_POINTER_OFFSET(a1) + lwz g1,4-NODE_POINTER_OFFSET(a1) + stw g0,0-NODE_POINTER_OFFSET(a0) + lwz g0,8-NODE_POINTER_OFFSET(a1) + stw g1,4-NODE_POINTER_OFFSET(a0) + stw g0,8-NODE_POINTER_OFFSET(a0) + + lwz r0,0(sp) + addi sp,sp,4 + blr + + b eval_fill + nop + nop + .if LINUX | MACOSX + nop + nop + .endif + .long 0 + .long -2 +__indirection: + lwz a1,4(a0) + lwz d0,0(a1) + andi. r0,d0,2 + .if MARK_GC + beq eval_fill2 + .else + beq _cycle__in__spine + .endif + stw d0,0(a0) + lwz g0,4(a1) + lwz g1,8(a1) + stw g0,4(a0) + stw g1,8(a0) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +_cycle__in__spine: + b __cycle__in__spine + + .if MARK_GC + .text +eval_fill2: + .if MARK_AND_COPY_GC + lea o0,_flags + stw a5,0-NODE_POINTER_OFFSET(a0) + lwz o0,0(o0) + stw a0,0(a4) + andi. r0,o0,64 + beq _cycle__in__spine + .else + stw a5,0-NODE_POINTER_OFFSET(a0) + stw a0,0(a4) + .endif + addi a4,a4,4 + mr a0,a1 + + mtctr d0 + mflr r0 + stwu r0,-4(sp) + bctrl + mtlr r0 + + lwzu a1,-4(a4) + lwz o0,0-NODE_POINTER_OFFSET(a0) + lwz o1,4-NODE_POINTER_OFFSET(a0) + stw o0,0-NODE_POINTER_OFFSET(a1) + lwz o0,8-NODE_POINTER_OFFSET(a0) + stw o1,4-NODE_POINTER_OFFSET(a1) + stw o0,8-NODE_POINTER_OFFSET(a1) + mr a0,a1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + .endif + + .text + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_0: + lea a3,__indirection + mtctr a2 + stw a0,4-NODE_POINTER_OFFSET(a1) + stw a3,0-NODE_POINTER_OFFSET(a1) + bctr + + .text + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_1: + lea a3,__indirection + mtctr a2 + lwz d0,4-NODE_POINTER_OFFSET(a1) + stw a3,0-NODE_POINTER_OFFSET(a1) + stw a0,4-NODE_POINTER_OFFSET(a1) + mr a1,d0 + bctr + + .text + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_2: + mtctr a2 + lea a2,__indirection + stw a2,0-NODE_POINTER_OFFSET(a1) + lwz a2,4-NODE_POINTER_OFFSET(a1) + stw a0,4-NODE_POINTER_OFFSET(a1) + lwz a1,8-NODE_POINTER_OFFSET(a1) + bctr + + .text + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_3: + mtctr a2 + lea a2,__indirection + stw a0,0(a4) + stw a2,0-NODE_POINTER_OFFSET(a1) + lwz a2,4-NODE_POINTER_OFFSET(a1) + stw a0,4-NODE_POINTER_OFFSET(a1) + addi a4,a4,4 + lwz a0,12-NODE_POINTER_OFFSET(a1) + lwz a1,8-NODE_POINTER_OFFSET(a1) + bctr + + .text + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_4: + mtctr a2 + lea a2,__indirection + stw a0,0(a4) + stw a2,0-NODE_POINTER_OFFSET(a1) + lwz a2,4-NODE_POINTER_OFFSET(a1) + stw a0,4-NODE_POINTER_OFFSET(a1) + lwz g1,16-NODE_POINTER_OFFSET(a1) + lwz a0,12-NODE_POINTER_OFFSET(a1) + stw g1,4(a4) + addi a4,a4,8 + lwz a1,8-NODE_POINTER_OFFSET(a1) + bctr + + .text + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_5: + mtctr a2 + lea a2,__indirection + stw a0,0(a4) + stw a2,0-NODE_POINTER_OFFSET(a1) + lwz a2,4-NODE_POINTER_OFFSET(a1) + stw a0,4-NODE_POINTER_OFFSET(a1) + lwz g1,20-NODE_POINTER_OFFSET(a1) + lwz a0,12-NODE_POINTER_OFFSET(a1) + stw g1,4(a4) + lwz g1,16-NODE_POINTER_OFFSET(a1) + lwz a1,8-NODE_POINTER_OFFSET(a1) + stw g1,8(a4) + addi a4,a4,12 + bctr + + .text + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_6: + mtctr a2 + lea a2,__indirection + stw a0,0(a4) + stw a2,0-NODE_POINTER_OFFSET(a1) + lwz a2,4-NODE_POINTER_OFFSET(a1) + stw a0,4-NODE_POINTER_OFFSET(a1) + lwz g1,24-NODE_POINTER_OFFSET(a1) + lwz a0,12-NODE_POINTER_OFFSET(a1) + stw g1,4(a4) + lwz g1,20-NODE_POINTER_OFFSET(a1) + stw g1,8(a4) + lwz g1,16-NODE_POINTER_OFFSET(a1) + lwz a1,8-NODE_POINTER_OFFSET(a1) + stw g1,12(a4) + addi a4,a4,16 + bctr + + .text + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_7: + li d0,0 + li d1,20 +eval_upd_n: + mtctr a2 + lea a2,__indirection + stw a0,0(a4) + stw a2,0-NODE_POINTER_OFFSET(a1) + lwz a2,4-NODE_POINTER_OFFSET(a1) + stw a0,4-NODE_POINTER_OFFSET(a1) + add a1,a1,d1 + lwz g1,8-NODE_POINTER_OFFSET(a1) + stw g1,4(a4) + lwz g1,4-NODE_POINTER_OFFSET(a1) + stw g1,8(a4) + lwz g1,0-NODE_POINTER_OFFSET(a1) + stw g1,12(a4) + addi a4,a4,16 +eval_upd_n_lp: + lwz g1,-4-NODE_POINTER_OFFSET(a1) + subi a1,a1,4 + stw g1,0(a4) + subic. d0,d0,1 + addi a4,a4,4 + bge eval_upd_n_lp + + lwz a0,-4-NODE_POINTER_OFFSET(a1) + lwz a1,-8-NODE_POINTER_OFFSET(a1) + bctr + + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_8: + li d0,1 + li d1,24 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_9: + li d0,2 + li d1,28 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_10: + li d0,3 + li d1,32 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_11: + li d0,4 + li d1,36 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_12: + li d0,5 + li d1,40 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_13: + li d0,6 + li d1,44 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_14: + li d0,7 + li d1,48 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_15: + li d0,8 + li d1,52 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_16: + li d0,9 + li d1,56 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_17: + li d0,10 + li d1,60 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_18: + li d0,11 + li d1,64 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_19: + li d0,12 + li d1,68 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_20: + li d0,13 + li d1,72 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_21: + li d0,14 + li d1,76 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_22: + li d0,15 + li d1,80 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_23: + li d0,16 + li d1,84 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_24: + li d0,17 + li d1,88 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_25: + li d0,18 + li d1,92 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_26: + li d0,19 + li d1,96 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_27: + li d0,20 + li d1,100 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_28: + li d0,21 + li d1,104 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_29: + li d0,22 + li d1,108 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_30: + li d0,23 + li d1,112 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_31: + li d0,24 + li d1,116 + b eval_upd_n + .if PROFILE + mflr r0 + bl profile_n + .endif +eval_upd_32: + li d0,25 + li d1,120 + b eval_upd_n + +# comment +# comment STRINGS +# comment + .text +catAC: + .if NODE_POINTER_OFFSET==0 + lwzu d0,4(a0) + lwzu d1,4(a1) + .else + lwz d0,4-NODE_POINTER_OFFSET(a0) + baddi a0,4 + lwz d1,4-NODE_POINTER_OFFSET(a1) + baddi a1,4 + .endif + add d2,d0,d1 + addi d5,d2,3+8 + srwi d5,d5,2 + sub. d7,d7,d5 +# comment reserve one word extra, because +# comment word after the string may change + addi d6,d2,3 + ble gc_3 +gc_r_3: + + lea o1,__STRING__+2 + addi d3,a6,4+NODE_POINTER_OFFSET + stw o1,4(a6) + stwu d2,8(a6) + +# comment copy string 1 + + addi d2,d1,3 + srwi d2,d2,2 + mr a2,a6 + + subic. d2,d2,1 + blt cat_string_4 +cat_string_3: + .if NODE_POINTER_OFFSET==0 + lwzu o0,4(a1) + .else + lwz o0,4-NODE_POINTER_OFFSET(a1) + baddi a1,4 + .endif + subic. d2,d2,1 + stwu o0,4(a2) + bge cat_string_3 +cat_string_4: + +# comment copy string 2 + + addi d0,d0,3 + srwi d0,d0,2 + subic. d0,d0,1 + add a2,a6,d1 + blt cat_string_1 + +cat_string_0: + .if NODE_POINTER_OFFSET==0 + lwzu o0,4(a0) + .else + lwz o0,4-NODE_POINTER_OFFSET(a0) + baddi a0,4 + .endif + subic. d0,d0,1 + stwu o0,4(a2) + bge cat_string_0 +cat_string_1: + + clrrwi d6,d6,2 + mr a0,d3 + add a6,a6,d6 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +gc_3: subi d7,d7,1 + subi a0,a0,4 + subi a1,a1,4 + mflr r0 + bl collect_2 + addi a0,a0,4 + addi a1,a1,4 + addi d7,d7,1 + b gc_r_3 + + .text +empty_string: + lea a0,zero_length_string + lwz r0,0(sp) + addi sp,sp,4 + blr + +sliceAC: + lwz d2,4-NODE_POINTER_OFFSET(a0) + addi a2,a0,4-NODE_POINTER_OFFSET + cmpwi 0,d1,0 + bge slice_string_1 + + li d1,0 + +slice_string_1: + cmpw 0,d1,d2 + bge empty_string + cmpw 0,d0,d1 + addi d0,d0,1 + blt empty_string + + cmpw 0,d0,d2 + ble slice_string_2 + + mr d0,d2 + +slice_string_2: + sub d0,d0,d1 + + subi d7,d7,2 + + addi d2,d0,3 + srwi d2,d2,2 + + sub. d7,d7,d2 + blt gc_4 +r_gc_4: + lea o1,__STRING__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o1,4(a6) + stwu d0,8(a6) + + add a2,a2,d1 + subic. d2,d2,1 + blt slice_string__1 + +slice_string__0: + lwzu o0,4(a2) + subic. d2,d2,1 + stwu o0,4(a6) + bge slice_string__0 +slice_string__1: + + lwz r0,0(sp) + addi sp,sp,4 + blr + +gc_4: mflr r0 + bl collect_1 + addi a2,a0,4-NODE_POINTER_OFFSET + b r_gc_4 + + .text +updateAC: + lwz d2,4-NODE_POINTER_OFFSET(a0) + addi a2,a0,4-NODE_POINTER_OFFSET + cmplw 0,d1,d2 + bge update_string_error + + addi d3,d2,3 + subi d7,d7,2 + + srwi d3,d3,2 + sub. d7,d7,d3 + blt gc_5 +r_gc_5: + lea o1,__STRING__+2 + + subic. d3,d3,1 + + addi a0,a6,4+NODE_POINTER_OFFSET + stw o1,4(a6) + stwu d2,8(a6) + blt update_string_5 + +update_string_4: + lwzu o0,4(a2) + subic. d3,d3,1 + stwu o0,4(a6) + bge update_string_4 +update_string_5: + + addi d1,d1,8 + lwz r0,0(sp) + stbx d0,a0,d1 + addi sp,sp,4 + blr + +gc_5: mflr r0 + bl collect_1 + addi a2,a0,4-NODE_POINTER_OFFSET + b r_gc_5 + + +update_string_error: + lea o0,high_index_string + cmpwi 0,d1,0 + bge print_error + + lea o0,low_index_string +update_string_error_2: + b print_error + + .text +eqAC: + lwzu d0,4-NODE_POINTER_OFFSET(a0) + lwzu o0,4-NODE_POINTER_OFFSET(a1) + cmpw 0,d0,o0 + bne equal_string_ne + + andi. d1,d0,3 + srwi d0,d0,2 + subic. d0,d0,1 + blt equal_string_b + +equal_string_1: + lwzu o0,4(a1) + lwzu o1,4(a0) + + cmpw o1,o0 + bne equal_string_ne + + subic. d0,d0,1 + bge equal_string_1 + +equal_string_b: + subic. d1,d1,1 + blt equal_string_eq + +equal_string_2: + lbz o0,4(a1) + addi a1,a1,1 + lbz o1,4(a0) + addi a0,a0,1 + cmpw o1,o0 + bne equal_string_ne + + subic. d1,d1,1 + bge equal_string_2 + +equal_string_eq: + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr +equal_string_ne: + li d0,0 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +cmpAC: + lwzu d1,4-NODE_POINTER_OFFSET(a0) + lwzu d2,4-NODE_POINTER_OFFSET(a1) + + cmplw 0,d2,d1 + blt cmp_string_less + + li d0,0 + beq cmp_string_chars + + li d0,1 + b cmp_string_chars + +cmp_string_less: + li d0,-1 + mr d1,d2 +cmp_string_chars: + andi. d2,d1,3 + srwi d1,d1,2 + subic. d1,d1,1 + blt cmp_string_b + +cmp_string_1: + lwzu o0,4(a0) + lwzu o1,4(a1) + + cmplw 0,o1,o0 + bne cmp_string_ne + + subic. d1,d1,1 + bge cmp_string_1 + +cmp_string_b: + subic. d2,d2,1 + blt cmp_string_eq + +cmp_string_2: + lbz o0,4(a0) + lbz o1,4(a1) + addi a0,a0,1 + + cmplw 0,o1,o0 + addi a1,a1,1 + bne cmp_string_ne + + subic. d2,d2,1 + bge cmp_string_2 + +cmp_string_eq: + lwz r0,0(sp) + addi sp,sp,4 + blr + +cmp_string_ne: + bgt cmp_string_r1 + + li d0,-1 + + lwz r0,0(sp) + addi sp,sp,4 + blr +cmp_string_r1: + li d0,1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +string_to_string_node: + lwz d0,0(a0) + addi a0,a0,4 + + addi d1,d0,3 + srwi d1,d1,2 + + subi d7,d7,2 + sub. d7,d7,d1 + blt string_to_string_node_gc + +string_to_string_node_r: + lea o0,__STRING__+2 + stw o0,4(a6) + addi d2,a6,4+NODE_POINTER_OFFSET + stwu d0,8(a6) + b string_to_string_node_4 + +string_to_string_node_2: + lwz o0,0(a0) + addi a0,a0,4 + stwu o0,4(a6) +string_to_string_node_4: + subic. d1,d1,1 + bge string_to_string_node_2 + + mr a0,d2 + + lwz r0,0(sp) + addi sp,sp,4 + blr + +string_to_string_node_gc: + mflr r0 + stwu a0,-4(sp) + bl collect_0 + + lwz a0,0(sp) + addi sp,sp,4 + b string_to_string_node_r + + .text + .long 3 +_c3: b __cycle__in__spine + .long 4 +_c4: b __cycle__in__spine + .long 5 +_c5: b __cycle__in__spine + .long 6 +_c6: b __cycle__in__spine + .long 7 +_c7: b __cycle__in__spine + .long 8 +_c8: b __cycle__in__spine + .long 9 +_c9: b __cycle__in__spine + .long 10 +_c10: b __cycle__in__spine + .long 11 +_c11: b __cycle__in__spine + .long 12 +_c12: b __cycle__in__spine + .long 13 +_c13: b __cycle__in__spine + .long 14 +_c14: b __cycle__in__spine + .long 15 +_c15: b __cycle__in__spine + .long 16 +_c16: b __cycle__in__spine + .long 17 +_c17: b __cycle__in__spine + .long 18 +_c18: b __cycle__in__spine + .long 19 +_c19: b __cycle__in__spine + .long 20 +_c20: b __cycle__in__spine + .long 21 +_c21: b __cycle__in__spine + .long 22 +_c22: b __cycle__in__spine + .long 23 +_c23: b __cycle__in__spine + .long 24 +_c24: b __cycle__in__spine + .long 25 +_c25: b __cycle__in__spine + .long 26 +_c26: b __cycle__in__spine + .long 27 +_c27: b __cycle__in__spine + .long 28 +_c28: b __cycle__in__spine + .long 29 +_c29: b __cycle__in__spine + .long 30 +_c30: b __cycle__in__spine + .long 31 +_c31: b __cycle__in__spine + .long 32 +_c32: b __cycle__in__spine + +# comment +# comment ARRAYS +# comment + + .text +create_arrayB: + mr d2,d1 + addi d1,d1,3 + srwi d1,d1,2 + subi d7,d7,3 + sub. d7,d7,d1 + bge+ no_collect_4575 + + mflr r0 + bl collect_0 + +no_collect_4575: + slwi d3,d0,8 + or d0,d0,d3 + slwi d3,d0,16 + or d0,d0,d3 + lea o0,__ARRAY__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stw d2,8(a6) + stwu bool_reg,12(a6) + b create_arrayBCI + + .text +create_arrayC: + mr d2,d1 + addi d1,d1,3 + srwi d1,d1,2 + subi d7,d7,2 + sub. d7,d7,d1 + bge+ no_collect_4578 + + mflr r0 + bl collect_0 + +no_collect_4578: + slwi d3,d0,8 + or d0,d0,d3 + slwi d3,d0,16 + or d0,d0,d3 + lea o0,__STRING__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stwu d2,8(a6) + b create_arrayBCI + + .text +create_arrayI: + subi d7,d7,3 + sub. d7,d7,d1 + bge+ no_collect_4577 + + mflr r0 + bl collect_0 + +no_collect_4577: + lea o0,__ARRAY__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stw d1,8(a6) + stwu int_reg,12(a6) + +create_arrayBCI: + andi. o0,d1,1 + beq st_filli_array + + stwu d0,4(a6) + +st_filli_array: + srwi. d1,d1,1 + beq skip_filli_array + + mtctr d1 +filli_array: + stw d0,4(a6) + stwu d0,8(a6) + bdnz filli_array + +skip_filli_array: + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +create_arrayR: + stfd f14,-8(sp) + sub d7,d7,d0 + + lwz d1,-8(sp) + subi d7,d7,3+1 + + lwz d2,-4(sp) + sub. d7,d7,d0 + bge+ no_collect_4579 + + mflr r0 + bl collect_0 + +no_collect_4579: + addi a6,a6,4 + + rlwinm d3,a6,32-2,31,31 + lea o0,__ARRAY__+2 + + rlwinm a6,a6,0,0,31-3 + add d7,d7,d3 + + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + + cmpwi 0,d0,0 + + stw d0,8(a6) + stwu real_reg,12(a6) + beq skip_fillr_array + + mtctr d0 +fillr_array: + stw d1,4(a6) + stwu d2,8(a6) + bdnz fillr_array + +skip_fillr_array: + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +create_array: + subi d7,d7,3 + sub. d7,d7,d0 + bge+ no_collect_4576 + + mflr r0 + bl collect_1 + +no_collect_4576: + mr d1,a0 + lea o0,__ARRAY__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stw d0,8(a6) + li g0,0 + stwu g0,12(a6) + lwz r0,0(sp) + addi sp,sp,4 + b fillr1_array + +create_R_array: + subic. d2,d2,2 + blt create_R_array_1 + beq create_R_array_2 + subic. d2,d2,2 + blt create_R_array_3 + beq create_R_array_4 + b create_R_array_5 + +create_R_array_1: + subi d7,d7,3 + sub. d7,d7,d0 + bge+ no_collect_4581 + + mflr r0 + bl collect_0 + +no_collect_4581: + lea o0,__ARRAY__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stw d0,8(a6) + stwu d1,12(a6) + cmpwi 0,d3,0 + + lwz r0,0(sp) + addi sp,sp,4 + beq r_array_1_b + + lwz d1,-4(a4) + b fillr1_array + +r_array_1_b: + lwz d1,0(sp) + +fillr1_array: + andi. o0,d0,1 + beq st_fillr1_array_1 + + stwu d1,4(a6) +st_fillr1_array_1: + srwi. d0,d0,1 + beq skip_fillr1_array_lp + + mtctr d0 +fillr1_array_lp: + stw d1,4(a6) + stwu d1,8(a6) + bdnz fillr1_array_lp + +skip_fillr1_array_lp: + blr + +create_R_array_2: + subi d7,d7,3 + sub d7,d7,d0 + sub. d7,d7,d0 + bge+ no_collect_4582 + + mflr r0 + bl collect_0 + +no_collect_4582: + lea o0,__ARRAY__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stw d0,8(a6) + stwu d1,12(a6) + + lwz r0,0(sp) + addi sp,sp,4 + + subic. d3,d3,1 + blt r_array_2_bb + beq r_array_2_ab +r_array_2_aa: + lwz d1,-4(a4) + lwz d2,-8(a4) + b st_fillr2_array +r_array_2_ab: + lwz d1,-4(a4) + lwz d2,0(sp) + b st_fillr2_array +r_array_2_bb: + lwz d1,0(sp) + lwz d2,4(sp) + b st_fillr2_array + +st_fillr2_array: + cmpwi 0,d0,0 + beq skip_fillr2_array_1 + + mtctr d0 +fillr2_array_1: + stw d1,4(a6) + stwu d2,8(a6) + bdnz fillr2_array_1 + +skip_fillr2_array_1: + blr + +create_R_array_3: + subi d7,d7,3 + sub d7,d7,d0 + sub d7,d7,d0 + sub. d7,d7,d0 + bge+ no_collect_4583 + + mflr r0 + bl collect_0 + +no_collect_4583: + lea o0,__ARRAY__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stw d0,8(a6) + stwu d1,12(a6) + + cmpwi 0,d3,0 + + lwz r0,0(sp) + addi a2,sp,4 + addi sp,sp,4 + + beq r_array_3 + + slwi d4,d3,2 + sub a3,a4,d4 + subi d3,d3,1 + +copy_a_to_b_lp3: + subic. d3,d3,1 + + lwz o0,0(a3) + addi a3,a3,4 + stwu o0,-4(sp) + bge copy_a_to_b_lp3 + +r_array_3: + lwz d1,0(sp) + cmpwi 0,d0,0 + + lwz d2,4(sp) + lwz d3,8(sp) + mr sp,a2 + + beq skip_fillr3_array + + mtctr d0 +fillr3_array_1: + stw d1,4(a6) + stw d2,8(a6) + stwu d3,12(a6) + bdnz fillr3_array_1 + +skip_fillr3_array: + blr + +create_R_array_4: + subi d7,d7,3 + slwi d2,d0,2 + sub. d7,d7,d2 + bge+ no_collect_4584 + + mflr r0 + bl collect_0 + +no_collect_4584: + lea o1,__ARRAY__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o1,4(a6) + stw d0,8(a6) + stwu d1,12(a6) + + cmpwi 0,d3,0 + + lwz r0,0(sp) + addi a2,sp,4 + addi sp,sp,4 + + beq r_array_4 + + slwi d4,d3,2 + sub a3,a4,d4 + subi d3,d3,1 + +copy_a_to_b_lp4: + subic. d3,d3,1 + lwz o1,0(a3) + addi a3,a3,4 + stwu o1,-4(sp) + bge copy_a_to_b_lp4 + +r_array_4: + lwz d1,0(sp) + lwz d2,4(sp) + cmpwi 0,d0,0 + + lwz d3,8(sp) + lwz d4,12(sp) + mr sp,a2 + beq skip_fillr4_array + + mtctr d0 +fillr4_array: + stw d1,4(a6) + stw d2,8(a6) + stw d3,12(a6) + stwu d4,16(a6) + bdnz fillr4_array + +skip_fillr4_array: + blr + +create_R_array_5: + subi d7,d7,3 + slwi d4,d0,2 + sub d7,d7,d4 + mr d5,d2 +sub_size_lp: + subic. d5,d5,1 + sub d7,d7,d0 + bgt sub_size_lp + + tst d7 + bge+ no_collect_4585 + + mflr r0 + bl collect_0 + +no_collect_4585: + lea o0,__ARRAY__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stw d0,8(a6) + stwu d1,12(a6) + + cmpwi 0,d3,0 + + lwz r0,0(sp) + addi a2,sp,4 + addi sp,sp,4 + mr d5,d2 + + beq r_array_5 + + slwi d4,d3,2 + sub a3,a4,d4 + subi d3,d3,1 + +copy_a_to_b_lp5: + subic. d3,d3,1 + + lwz o0,0(a3) + addi a3,a3,4 + stwu o0,-4(sp) + bge copy_a_to_b_lp5 + +r_array_5: + lwz d1,0(sp) + lwz d2,4(sp) + lwz d3,8(sp) + lwz d4,12(sp) + b st_fillr5_array + +fillr5_array_1: + stw d1,4(a6) + stw d2,8(a6) + mtctr d5 + stw d3,12(a6) + addi a3,sp,16 + stwu d4,16(a6) + +copy_elem_lp5: + lwz o0,0(a3) + addi a3,a3,4 + stwu o0,4(a6) + bdnz copy_elem_lp5 + +st_fillr5_array: + subic. d0,d0,1 + bge fillr5_array_1 + + mr sp,a2 + blr + + .text +e__system__sAP: + lwz a2,0(a1) + lwz a2,4-2(a2) + mtctr a2 + bctr + +# comment _ARRAYS + + .text +_create_arrayB: + mr d1,d0 + addi d0,d0,3 + srwi d0,d0,2 + subi d7,d7,3 + sub. d7,d7,d0 + bge+ no_collect_3575 + + mflr r0 + bl collect_0 + +no_collect_3575: + lea o0,__ARRAY__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stw d1,8(a6) + stwu bool_reg,12(a6) + slwi d0,d0,2 + add a6,a6,d0 + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +_create_arrayC: + mr d1,d0 + addi d0,d0,3 + srwi d0,d0,2 + subi d7,d7,2 + sub. d7,d7,d0 + bge+ no_collect_3578 + + mflr r0 + bl collect_0 + +no_collect_3578: + lea o0,__STRING__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stwu d1,8(a6) + slwi d0,d0,2 + add a6,a6,d0 + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +_create_arrayI: + subi d7,d7,3 + sub. d7,d7,d0 + bge+ no_collect_3577 + + mflr r0 + bl collect_0 + +no_collect_3577: + lea o0,__ARRAY__+2 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stw d0,8(a6) + stwu int_reg,12(a6) + slwi d0,d0,2 + add a6,a6,d0 + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +_create_arrayR: + sub d7,d7,d0 + subi d7,d7,3+1 + sub. d7,d7,d0 + bge+ no_collect_3579 + + mflr r0 + bl collect_0 + +no_collect_3579: + addi a6,a6,4 + + lea o0,__ARRAY__+2 + rlwinm d3,a6,32-2,31,31 + + rlwinm a6,a6,0,0,31-3 + add d7,d7,d3 + + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stw d0,8(a6) + slwi d0,d0,3 + stwu real_reg,12(a6) + add a6,a6,d0 + lwz r0,0(sp) + addi sp,sp,4 + blr + +# comment d0: number of elements, d1: element descriptor, d2: element size, +# comment d3: element a size a0: a_element -> a0: array + + .text +_create_r_array: + subi d7,d7,3 + mr d5,d2 +sub_size_lp2: + subic. d5,d5,1 + sub d7,d7,d0 + bgt sub_size_lp2 + + tst d7 + bge+ no_collect_3585 + + mflr r0 + bl collect_1 + +no_collect_3585: + lea o0,__ARRAY__+2 + mr d4,a0 + addi a0,a6,4+NODE_POINTER_OFFSET + stw o0,4(a6) + stw d0,8(a6) + stwu d1,12(a6) + + tst d3 + lwz r0,0(sp) + addi sp,sp,4 + beq _create_r_array_0 + subic. d3,d3,2 + blt _create_r_array_1 + beq _create_r_array_2 + subic. d3,d3,2 + blt _create_r_array_3 + beq _create_r_array_4 + b _create_r_array_5 + +_create_r_array_0: + tst d2 + mtctr d2 + slwi d0,d0,2 + beq _skip_fillr0_array_lp +_fillr0_array_1: + add a6,a6,d0 + bdnz _fillr0_array_1 +_skip_fillr0_array_lp: + blr + +_create_r_array_1: + tst d0 + mtctr d0 + slwi d2,d2,2 + beq _skip_fillr1_array_lp +_fillr1_array_lp: + stw d4,4(a6) + add a6,a6,d2 + bdnz _fillr1_array_lp +_skip_fillr1_array_lp: + blr + +_create_r_array_2: + tst d0 + mtctr d0 + slwi d2,d2,2 + beq _skip_fillr2_array_1 +_fillr2_array_1: + stw d4,4(a6) + stw d4,8(a6) + add a6,a6,d2 + bdnz _fillr2_array_1 +_skip_fillr2_array_1: + blr + +_create_r_array_3: + tst d0 + mtctr d0 + slwi d2,d2,2 + beq _skip_fillr3_array +_fillr3_array_1: + stw d4,4(a6) + stw d4,8(a6) + stw d4,12(a6) + add a6,a6,d2 + bdnz _fillr3_array_1 +_skip_fillr3_array: + blr + +_create_r_array_4: + tst d0 + mtctr d0 + slwi d2,d2,2 + beq _skip_fillr4_array +_fillr4_array: + stw d4,4(a6) + stw d4,8(a6) + stw d4,12(a6) + stw d4,16(a6) + add a6,a6,d2 + bdnz _fillr4_array +_skip_fillr4_array: + blr + +_create_r_array_5: + mr d1,d3 + subi d2,d2,4 + sub d2,d2,d3 + slwi d2,d2,2 + b _st_fillr5_array + +_fillr5_array_1: + stw d4,4(a6) + stw d4,8(a6) + mtctr d1 + stw d4,12(a6) + stwu d4,16(a6) + +_copy_elem_lp5: + stwu d4,4(a6) + bdnz _copy_elem_lp5 + add a6,a6,d2 +_st_fillr5_array: + subic. d0,d0,1 + bge _fillr5_array_1 + blr + + .text +yet_args_needed: +# comment for more than 4 arguments + lwz d1,0(a1) + lhz d0,-2(d1) + subi d7,d7,3 + sub. d7,d7,d0 + blt gc_1 + +gc_r_1: lwz d3,4(a1) + subi d0,d0,1+4 + lwz a1,8(a1) + addi d2,a6,4 + lwz o0,0(a1) + lwz o1,4(a1) + stw o0,4(a6) + lwz o2,8(a1) + stw o1,8(a6) + addi a1,a1,12 + stwu o2,12(a6) + +cp_a: lwz o0,0(a1) + addi a1,a1,4 + stwu o0,4(a6) + subic. d0,d0,1 + bge cp_a + + stw a0,4(a6) + addi d1,d1,8 + stw d1,8(a6) + addi a0,a6,8 + stw d3,12(a6) + stwu d2,16(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +gc_1: mflr r0 + bl collect_2 + b gc_r_1 + + .text +yet_args_needed_0: + subic. d7,d7,2 + blt gc_20 +gc_r_20: stwu a0,8(a6) + lwz d0,0(a1) + addi a0,a6,4-8 + addi d0,d0,8 + stw d0,4-8(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +gc_20: mflr r0 + bl collect_2 + b gc_r_20 + + .text +yet_args_needed_1: + subic. d7,d7,3 + blt gc_21 +gc_r_21: stwu a0,12(a6) + lwz d0,0(a1) + addi a0,a6,4-12 + addi d0,d0,8 + stw d0,4-12(a6) + lwz d1,4(a1) + stw d1,8-12(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +gc_21: mflr r0 + bl collect_2 + b gc_r_21 + + .text +yet_args_needed_2: + subic. d7,d7,5 + blt gc_22 +gc_r_22: + lwz d0,0(a1) + stw a0,8(a6) + addi d0,d0,8 + lwz d2,4(a1) + stw d0,12(a6) + addi a0,a6,12 + lwz o0,8(a1) + stw d2,16(a6) + stwu o0,4(a6) + stwu a6,16(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +gc_22: mflr r0 + bl collect_2 + b gc_r_22 + + .text +yet_args_needed_3: + subic. d7,d7,6 + blt gc_23 +gc_r_23: + lwz d0,0(a1) + stw a0,12(a6) + addi d0,d0,8 + lwz d2,4(a1) + stw d0,16(a6) + lwz a1,8(a1) + stw d2,20(a6) + lwz o0,0(a1) + lwz o1,4(a1) + stwu o0,4(a6) + stwu a6,20(a6) + addi a0,a6,16-24 + stw o1,8-24(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +gc_23: mflr r0 + bl collect_2 + b gc_r_23 + + .text +yet_args_needed_4: + subic. d7,d7,7 + blt gc_24 +gc_r_24: + lwz d0,0(a1) + stw a0,16(a6) + addi d0,d0,8 + lwz d2,4(a1) + stw d0,20(a6) + lwz a1,8(a1) + stw d2,24(a6) + lwz o0,0(a1) + lwz o1,4(a1) + stwu o0,4(a6) + stwu a6,24(a6) + addi a0,a6,20-28 + lwz o2,8(a1) + stw o1,8-28(a6) + stw o2,12-28(a6) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +gc_24: mflr r0 + bl collect_2 + b gc_r_24 + + .text +repl_args_b: + cmpwi 0,d0,0 + ble repl_args_b_1 + + subic. d0,d0,1 + beq repl_args_b_4 + + lwz a1,8(a0) + subic. d1,d1,2 + bne repl_args_b_2 + + stw a1,0(a4) + addi a4,a4,4 + b repl_args_b_4 + +repl_args_b_2: + slwi d1,d0,2 + add a1,a1,d1 + subi d0,d0,1 +repl_args_b_3: + lwzu o0,-4(a1) + addi a4,a4,4 + stw o0,0-4(a4) + cmpwi 0,d0,0 + subi d0,d0,1 + bne repl_args_b_3 +repl_args_b_4: + lwz o0,4(a0) + addi a4,a4,4 + stw o0,0-4(a4) +repl_args_b_1: + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +push_arg_b: + cmplwi 0,d1,2 + blt push_arg_b_1 + bne push_arg_b_2 + + cmpw 0,d1,d0 + beq push_arg_b_1 +push_arg_b_2: + lwz a0,8(a0) + subi d1,d1,2 +push_arg_b_1: + slwi d1,d1,2 + lwzx a0,a0,d1 + + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +del_args: + lwz d1,0(a0) + sub d1,d1,d0 + lhz d0,-2(d1) + subic. d0,d0,2 + bge del_args_2 + + lwz o0,4(a0) + stw d1,0(a1) + lwz o1,8(a0) + stw o0,4(a1) + stw o1,8(a1) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +del_args_2: + bne del_args_3 + + lwz o0,4(a0) + stw d1,0(a1) + lwz o1,8(a0) + stw o0,4(a1) + lwz o1,0(o1) + stw o1,8(a1) + + lwz r0,0(sp) + addi sp,sp,4 + blr + +del_args_3: + sub. d7,d7,d0 + blt del_args_gc +del_args_r_gc: + stw d1,0(a1) + lwz o0,4(a0) + stw a6,8(a1) + lwz a0,8(a0) + stw o0,4(a1) + +del_args_copy_args: + lwz o0,0(a0) + addi a0,a0,4 + stw o0,0(a6) + addi a6,a6,4 + subic. d0,d0,1 + bgt del_args_copy_args + + lwz r0,0(sp) + addi sp,sp,4 + blr + +del_args_gc: + mflr r0 + bl collect_2 + b del_args_r_gc + + .if 0 + .text +o__S_P2: + lwz d0,0(a0) + lha d0,-2(d0) + cmpwi 0,d0,2 + lwz a0,8(a0) + beq o__S_P2_2 + lwz a0,0(a0) +o__S_P2_2: + lwz r0,0(sp) + addi sp,sp,4 + blr + + .text +ea__S_P2: + lea a2,__indirection + lwz d0,4(a1) + stw a2,0(a1) + stw a0,4(a1) + mr a1,d0 + lwz d0,0(a1) + andi. r0,d0,2 + bne ea__S_P2_1 + + stw a0,0(a4) + addi a4,a4,4 + + mtctr d0 + + mr a0,a1 + + mflr r0 + stwu r0,-4(sp) + bctrl + mtlr r0 + + mr a1,a0 + lwzu a0,-4(a4) + +ea__S_P2_1: + lwz d0,0(a1) + lha d0,-2(d0) + lwz a1,8(a1) + cmpwi 0,d0,2 + beq ea__S_P2_2 + lwz a1,0(a1) +ea__S_P2_2: + lwz d0,0(a1) + andi. r0,d0,2 + bne ea__S_P2_3 + + subi d0,d0,20 + mtctr d0 + bctr + +ea__S_P2_3: + stw d0,0(a0) + lwz g1,4(a1) + stw g1,4(a0) + lwz g1,8(a1) + stw g1,8(a0) + + lwz r0,0(sp) + addi sp,sp,4 + blr + .endif + + .text +acos_real: + mflr r0 + stwu r0,-4(sp) + fmr f1,f14 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_acos$stub + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + .else + lwz r0,64(sp) + .endif + fmr f14,f1 + mtlr r0 + .if MACOSX + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + blr + + .text +asin_real: + mflr r0 + stwu r0,-4(sp) + fmr f1,f14 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_asin$stub + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + .else + lwz r0,64(sp) + .endif + fmr f14,f1 + mtlr r0 + .if MACOSX + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + blr + + .text +atan_real: + mflr r0 + stwu r0,-4(sp) + fmr f1,f14 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_atan$stub + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + .else + lwz r0,64(sp) + .endif + fmr f14,f1 + mtlr r0 + .if MACOSX + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + blr + + .text +cos_real: + mflr r0 + stwu r0,-4(sp) + fmr f1,f14 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_cos$stub + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + .else + lwz r0,64(sp) + .endif + fmr f14,f1 + mtlr r0 + .if MACOSX + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + blr + + .text +sin_real: + mflr r0 + stwu r0,-4(sp) + fmr f1,f14 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_sin$stub + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + .else + lwz r0,64(sp) + .endif + fmr f14,f1 + mtlr r0 + .if MACOSX + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + blr + + .text +tan_real: + mflr r0 + stwu r0,-4(sp) + fmr f1,f14 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_tan$stub + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + .else + lwz r0,64(sp) + .endif + fmr f14,f1 + mtlr r0 + .if MACOSX + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + blr + + .text +ln_real: + mflr r0 + stwu r0,-4(sp) + fmr f1,f14 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_log$stub + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + .else + lwz r0,64(sp) + .endif + fmr f14,f1 + mtlr r0 + .if MACOSX + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + blr + + .text +log10_real: + mflr r0 + stwu r0,-4(sp) + fmr f1,f14 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_log10$stub + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + .else + lwz r0,64(sp) + .endif + fmr f14,f1 + mtlr r0 + .if MACOSX + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + blr + + .text +exp_real: + mflr r0 + stwu r0,-4(sp) + fmr f1,f14 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_exp$stub + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + .else + lwz r0,64(sp) + .endif + fmr f14,f1 + mtlr r0 + .if MACOSX + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + blr + + .text +sqrt_real: + mflr r0 + stwu r0,-4(sp) + fmr f1,f14 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_sqrt$stub + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + .else + lwz r0,64(sp) + .endif + fmr f14,f1 + mtlr r0 + .if MACOSX + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + blr + + .text +pow_real: + mflr r0 + stwu r0,-4(sp) + fmr f2,f14 + fmr f1,f15 + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + bl L_pow$stub + .if USE_DCBZ + li g2,32 + .endif + .if MACOSX + lwz sp,0(sp) + lwz r0,0(sp) + .else + lwz r0,64(sp) + .endif + fmr f14,f1 + mtlr r0 + .if MACOSX + lwz r0,4(sp) + addi sp,sp,8 + .else + lwz r0,68(sp) + addi sp,sp,72 + .endif + blr + + .text +entier_real: + lea o0,entier_constants_and_buffers + fctiwz f2,f14 + lfd f1,0(o0) + stfd f2,8(o0) + fcmpo 0,f14,f1 + lwz d0,12(o0) + bge+ entier_real_2 + + lfd f31,24(o0) + xoris o1,d0,0x8000 + stw o1,20(o0) + lfd f1,16(o0) + fsub f1,f1,f31 + fcmpo 0,f14,f1 + beq entier_real_2 + + subi d0,d0,1 +entier_real_2: + lwz r0,0(sp) + addi sp,sp,4 + blr + +.picsymbol_stub +L_sin$stub: + .indirect_symbol _sin + mflr r0 + bcl 20,31,L0$pb +L0$pb: + mflr r11 + addis r11,r11,ha16(L0$lz-L0$pb) + mtlr r0 + lwz r12,lo16(L0$lz-L0$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L0$lz-L0$pb ) + bctr +.lazy_symbol_pointer +L0$lz: + .indirect_symbol _sin + .long dyld_stub_binding_helper + +.picsymbol_stub +L_cos$stub: + .indirect_symbol _cos + mflr r0 + bcl 20,31,L1$pb +L1$pb: + mflr r11 + addis r11,r11,ha16(L1$lz-L1$pb) + mtlr r0 + lwz r12,lo16(L1$lz-L1$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L1$lz-L1$pb ) + bctr +.lazy_symbol_pointer +L1$lz: + .indirect_symbol _cos + .long dyld_stub_binding_helper + +.picsymbol_stub +L_tan$stub: + .indirect_symbol _tan + mflr r0 + bcl 20,31,L2$pb +L2$pb: + mflr r11 + addis r11,r11,ha16(L2$lz-L2$pb) + mtlr r0 + lwz r12,lo16(L2$lz-L2$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L2$lz-L2$pb ) + bctr +.lazy_symbol_pointer +L2$lz: + .indirect_symbol _tan + .long dyld_stub_binding_helper + +.picsymbol_stub +L_asin$stub: + .indirect_symbol _asin + mflr r0 + bcl 20,31,L3$pb +L3$pb: + mflr r11 + addis r11,r11,ha16(L3$lz-L3$pb) + mtlr r0 + lwz r12,lo16(L3$lz-L3$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L3$lz-L3$pb ) + bctr +.lazy_symbol_pointer +L3$lz: + .indirect_symbol _asin + .long dyld_stub_binding_helper + +.picsymbol_stub +L_acos$stub: + .indirect_symbol _acos + mflr r0 + bcl 20,31,L4$pb +L4$pb: + mflr r11 + addis r11,r11,ha16(L4$lz-L4$pb) + mtlr r0 + lwz r12,lo16(L4$lz-L4$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L4$lz-L4$pb ) + bctr +.lazy_symbol_pointer +L4$lz: + .indirect_symbol _acos + .long dyld_stub_binding_helper + +.picsymbol_stub +L_atan$stub: + .indirect_symbol _atan + mflr r0 + bcl 20,31,L5$pb +L5$pb: + mflr r11 + addis r11,r11,ha16(L5$lz-L5$pb) + mtlr r0 + lwz r12,lo16(L5$lz-L5$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L5$lz-L5$pb ) + bctr +.lazy_symbol_pointer +L5$lz: + .indirect_symbol _atan + .long dyld_stub_binding_helper + +.picsymbol_stub +L_sqrt$stub: + .indirect_symbol _sqrt + mflr r0 + bcl 20,31,L6$pb +L6$pb: + mflr r11 + addis r11,r11,ha16(L6$lz-L6$pb) + mtlr r0 + lwz r12,lo16(L6$lz-L6$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L6$lz-L6$pb ) + bctr +.lazy_symbol_pointer +L6$lz: + .indirect_symbol _sqrt + .long dyld_stub_binding_helper + +.picsymbol_stub +L_pow$stub: + .indirect_symbol _pow + mflr r0 + bcl 20,31,L7$pb +L7$pb: + mflr r11 + addis r11,r11,ha16(L7$lz-L7$pb) + mtlr r0 + lwz r12,lo16(L7$lz-L7$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L7$lz-L7$pb ) + bctr +.lazy_symbol_pointer +L7$lz: + .indirect_symbol _pow + .long dyld_stub_binding_helper + +.picsymbol_stub +L_exp$stub: + .indirect_symbol _exp + mflr r0 + bcl 20,31,L8$pb +L8$pb: + mflr r11 + addis r11,r11,ha16(L8$lz-L8$pb) + mtlr r0 + lwz r12,lo16(L8$lz-L8$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L8$lz-L8$pb ) + bctr +.lazy_symbol_pointer +L8$lz: + .indirect_symbol _exp + .long dyld_stub_binding_helper + +.picsymbol_stub +L_log$stub: + .indirect_symbol _log + mflr r0 + bcl 20,31,L9$pb +L9$pb: + mflr r11 + addis r11,r11,ha16(L9$lz-L9$pb) + mtlr r0 + lwz r12,lo16(L9$lz-L9$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L9$lz-L9$pb ) + bctr +.lazy_symbol_pointer +L9$lz: + .indirect_symbol _log + .long dyld_stub_binding_helper + +.picsymbol_stub +L_log10$stub: + .indirect_symbol _log10 + mflr r0 + bcl 20,31,L10$pb +L10$pb: + mflr r11 + addis r11,r11,ha16(L10$lz-L10$pb) + mtlr r0 + lwz r12,lo16(L10$lz-L10$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L10$lz-L10$pb ) + bctr +.lazy_symbol_pointer +L10$lz: + .indirect_symbol _log10 + .long dyld_stub_binding_helper + +.picsymbol_stub +L_sprintf$stub: + .indirect_symbol _sprintf + mflr r0 + bcl 20,31,L11$pb +L11$pb: + mflr r11 + addis r11,r11,ha16(L11$lz-L11$pb) + mtlr r0 + lwz r12,lo16(L11$lz-L11$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L11$lz-L11$pb ) + bctr +.lazy_symbol_pointer +L11$lz: + .indirect_symbol _sprintf + .long dyld_stub_binding_helper + + +.picsymbol_stub +L_TickCount$stub: + .indirect_symbol _TickCount + mflr r0 + bcl 20,31,L12$pb +L12$pb: + mflr r11 + addis r11,r11,ha16(L12$lz-L12$pb) + mtlr r0 + lwz r12,lo16(L12$lz-L12$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L12$lz-L12$pb ) + bctr +.lazy_symbol_pointer +L12$lz: + .indirect_symbol _TickCount + .long dyld_stub_binding_helper + +.picsymbol_stub +L_DisposePtr$stub: + .indirect_symbol _DisposePtr + mflr r0 + bcl 20,31,L13$pb +L13$pb: + mflr r11 + addis r11,r11,ha16(L13$lz-L13$pb) + mtlr r0 + lwz r12,lo16(L13$lz-L13$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L13$lz-L13$pb ) + bctr +.lazy_symbol_pointer +L13$lz: + .indirect_symbol _DisposePtr + .long dyld_stub_binding_helper + +.picsymbol_stub +L_NewPtr$stub: + .indirect_symbol _NewPtr + mflr r0 + bcl 20,31,L14$pb +L14$pb: + mflr r11 + addis r11,r11,ha16(L14$lz-L14$pb) + mtlr r0 + lwz r12,lo16(L14$lz-L14$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L14$lz-L14$pb ) + bctr +.lazy_symbol_pointer +L14$lz: + .indirect_symbol _NewPtr + .long dyld_stub_binding_helper + +
\ No newline at end of file diff --git a/macho/ptrace.a b/macho/ptrace.a new file mode 100644 index 0000000..05de0e3 --- /dev/null +++ b/macho/ptrace.a @@ -0,0 +1,739 @@ + +.macro lea_ &r,&a + lis $0,ha16($1) + addi $0,$0,lo16($1) +.endmacro + +MACOSX = 1 +USE_TEMPORARY_MEMORY = 1 +CHECK_STACK_OVERFLOWS = 0 +MODULE_NAMES = 1 + +#define sp r1 + +#define d0 r24 +#define d1 r25 +#define d2 r26 +#define d3 r27 +#define d4 r28 +#define d5 r29 +#define d6 r30 +#define d7 r31 + +#define a0 r23 +#define a1 r22 +#define a2 r21 +#define a3 r20 +#define a4 r19 +#define a5 r18 +#define a6 r17 + +#define o0 r3 +#define o1 r4 +#define o2 r5 +#define o3 r6 +#define o4 r7 +#define o5 r8 + +#define g2 r9 +#define g3 r10 + +#define g0 r11 +#define g1 r12 + +#define int_reg r16 +#define char_reg r15 +#define real_reg r14 +#define bool_reg r13 + + .globl init_profiler + .globl profile_r + .globl profile_l + .globl profile_l2 + .globl profile_n + .globl profile_n2 + .globl profile_s + .globl profile_s2 + .globl profile_t + .globl profile_ti + .globl write_profile_information + .globl write_profile_stack + + .if USE_TEMPORARY_MEMORY + .globl _TempNewHandle + .globl _TempHLock + .globl _TempHUnlock + .globl _TempDisposeHandle + .else + .globl _NewPtr + .endif + .globl __STRING__ + .globl writeFC + .globl writeFI + .globl print_error + .globl _stack_size + .globl _er_print_string + .globl _er_print_char + .if CHECK_STACK_OVERFLOWS + .globl _Debugger + .endif + +#define FunctionProfile_next 0 +#define FunctionProfile_name 4 + +#define FunctionProfile 8 + +#define Globals_n_free_records_in_block 0 + # comment 0 n free records in block +#define Globals_last_allocated_block 4 + # comment 4 latest allocated block +#define Globals_profile_records 8 + # comment 8 profile record list +#define Globals_stack_pointer 12 + # comment 12 stack pointer +#define Globals_n_words_free 16 + .if USE_TEMPORARY_MEMORY +#define Globals_temp_handle_list 20 +#define Globals_profile_stack_handle 24 + .if CHECK_STACK_OVERFLOWS +Globals_end_profile_stack = 28 +Globals = 32 + .else +Globals = 28 + .endif + .else + .if CHECK_STACK_OVERFLOWS +Globals_end_profile_stack = 20 +Globals = 24 + .else +Globals = 20 + .endif + .endif + + .text +profile_ti: + lea_ r5,profile_globals + b profile_t_ + +profile_t: + mflr r12 + lea_ r5,profile_globals + mtctr r12 + mtlr r0 +profile_t_: + lwz r6,Globals_stack_pointer(r5) + lwzu r4,-4(r6) + stw r6,Globals_stack_pointer(r5) + bctr + +profile_r: + lea_ r5,profile_globals + lwz r6,Globals_stack_pointer(r5) + lwzu r4,-4(r6) + stw r6,Globals_stack_pointer(r5) + blr + +profile_l: + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r6,Globals_stack_pointer(r5) + stw r4,0(r6) + addi r6,r6,4 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + mtlr r0 + bctr + +profile_l2: + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r6,Globals_stack_pointer(r5) + stw r4,0(r6) + stw r4,4(r6) + addi r6,r6,8 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + + mtlr r0 + bctr + +profile_n: + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r6,Globals_stack_pointer(r5) + stw r4,0(r6) + addi r6,r6,4 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + mtlr r0 + bctr + +profile_n2: + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r6,Globals_stack_pointer(r5) + stw r4,0(r6) + stw r4,4(r6) + addi r6,r6,8 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + mtlr r0 + bctr + +profile_s2: + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r6,Globals_stack_pointer(r5) + stw r4,0(r6) + stw r4,4(r6) + addi r6,r6,8 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + mtlr r0 + bctr + +profile_s: + mflr r12 + lea_ r5,profile_globals + lwz r4,0(r3) + mtctr r12 + + cmpwi 0,r4,0 + beql allocate_function_profile_record + + lwz r6,Globals_stack_pointer(r5) + + stw r4,0(r6) + addi r6,r6,4 + .if CHECK_STACK_OVERFLOWS + lwz r12,Globals_end_profile_stack(r5) + .endif + stw r6,Globals_stack_pointer(r5) + .if CHECK_STACK_OVERFLOWS + cmpw r6,r12 + bge profile_stack_overflow + .endif + mtlr r0 + bctr + +allocate_function_profile_record: + lwz r6,Globals_n_free_records_in_block(r5) + lwz r4,Globals_last_allocated_block(r5) + cmpwi 0,r6,0 + bne+ no_alloc + + stw r0,-4(sp) + stw r3,-8(sp) + stw r9,-12(sp) + stw r10,-16(sp) + mfctr r11 + stw r11,-20(sp) + mflr r12 + stw r12,-24(sp) + + .if USE_TEMPORARY_MEMORY + li r3,(512*FunctionProfile)+4 + .else + li r3,512*FunctionProfile + .endif + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+32+28)(sp) + .else + stwu sp,-(64+32)(sp) + .endif + .if USE_TEMPORARY_MEMORY + bl allocate_temp_memory_handle + .else + bl _NewPtr + nop + .endif + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64+32 + .endif + and. r4,r3,r3 + + lwz r12,-24(sp) + lwz r11,-20(sp) + mtlr r12 + lwz r10,-16(sp) + mtctr r11 + lwz r9,-12(sp) + lwz r3,-8(sp) + lwz r0,-4(sp) + + lea_ r5,profile_globals + + beq profiler_memory_error + + .if USE_TEMPORARY_MEMORY + lwz r6,Globals_temp_handle_list(r5) + stw r4,Globals_temp_handle_list(r5) + lwz r4,0(r4) + stw r6,0(r4) + addi r4,r4,4 + .endif + li r6,512 + stw r4,Globals_last_allocated_block(r5) + +no_alloc: + subi r6,r6,1 + stw r6,Globals_n_free_records_in_block(r5) + addi r7,r4,FunctionProfile + stw r7,Globals_last_allocated_block(r5) + + lwz r6,Globals_profile_records(r5) + li r8,0 + stw r6,FunctionProfile_next(r4) + stw r4,Globals_profile_records(r5) + stw r3,FunctionProfile_name(r4) + + stw r4,0(r3) + blr + +write_profile_information: + .if USE_TEMPORARY_MEMORY + mflr r0 + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(96+28)(sp) + .else + stwu sp,-96(sp) + .endif + stw r0,96-4(sp) + lea_ r5,profile_globals + lwz r3,Globals_profile_stack_handle(r5) + bl free_temp_memory_handle + + lea_ r5,profile_globals + + stw r31,96-8(sp) + + lwz r31,Globals_temp_handle_list(r5) + b free_temp_handles + +free_temp_handles_lp: + mr r3,r31 + lwz r31,0(r31) + lwz r31,0(r31) + bl free_temp_memory_handle + +free_temp_handles: + cmpwi 0,r31,0 + bne free_temp_handles_lp + + lwz r31,96-8(sp) + + lwz r0,96-4(sp) + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,96 + .endif + mtlr r0 + .endif + lwz r0,0(sp) + addi sp,sp,4 + blr + +write_profile_stack: + mflr r0 + lea_ d0,profile_globals + stwu r0,-4(sp) + lwz d0,Globals_stack_pointer(d0) + + cmpwi 0,d0,0 + beq stack_not_initialised + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + lea_ o0,stack_trace_string + bl _er_print_string + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + + li d2,12 +write_functions_on_stack: + lwzu d1,-4(d0) + cmpwi 0,d1,0 + beq end_profile_stack + + lwz o0,FunctionProfile_name(d1) + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + addi o0,o0,4 + bl _er_print_string + li o0,13 + bl _er_print_char + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + + subic. d2,d2,1 + .if 0 + b write_functions_on_stack + .else + bne write_functions_on_stack + .endif + +end_profile_stack: +stack_not_initialised: + lwz r0,0(sp) + mtlr r0 + lwz r0,4(sp) + addi sp,sp,8 + blr + +init_profiler: + .if 0 + mflr r0 + stw r0,-4(sp) + stwu sp,-64(sp) + + bl .Debugger + nop + + lwz r0,64-4(sp) + addi sp,sp,64 + mtlr r0 + .endif + + mflr r0 + stwu r0,-4(sp) + + .if 1 + lea_ r3,_stack_size + lwz r3,0(r3) + .else + li r3, (512*1024) % 65536 + addis r3,r3,(512*1024) / 65536 + .endif + + .if MACOSX + mr g0,sp + ori sp,sp,28 + stwu g0,-(64+28)(sp) + .else + stwu sp,-64(sp) + .endif + .if USE_TEMPORARY_MEMORY + bl allocate_temp_memory_handle + .else + bl _NewPtr + nop + .endif + .if MACOSX + lwz sp,0(sp) + .else + addi sp,sp,64 + .endif + lea_ r5,profile_globals + + and. r9,r3,r3 + beq init_profiler_error + + .if USE_TEMPORARY_MEMORY + stw r9,Globals_profile_stack_handle(r5) + lwz r9,0(r9) + li r0,0 + stw r0,Globals_temp_handle_list(r5) + .endif + .if CHECK_STACK_OVERFLOWS + .if 1 + lea_ r3,_stack_size + lwz r3,0(r3) + .else + li r3, (512*1024) % 65536 + addis r3,r3,(512*1024) / 65536 + .endif + add r3,r3,r9 + stw r3,Globals_end_profile_stack(r5) + .endif + lea_ r3,start_string + bl allocate_function_profile_record + + lwz r0,0(sp) + addi sp,sp,4 + mtlr r0 + + li r0,0 + stw r4,4(r9) + stw r0,0(r9) + addi r9,r9,8 + stw r9,Globals_stack_pointer(r5) + stw d7,Globals_n_words_free(r5) + + lwz r0,0(sp) + addi sp,sp,4 + + blr + + .if USE_TEMPORARY_MEMORY +allocate_temp_memory_handle: + mflr r0 + stw r31,-4(sp) + stw r0,8(sp) + stwu sp,-96(sp) + + addi r4,sp,56 + bl L_TempNewHandle$stub + nop + + mr. r31,r3 + beq return_r31 + + addi r4,sp,56 + bl L_TempHLock$stub + nop + + lha r0,56(sp) + cmpwi r0,0 + beq+ return_r31 + + mr r3,r31 + addi r4,sp,56 + bl L_TempDisposeHandle$stub + nop + + li r31,0 +return_r31: + lwz r0,104(sp) + mr r3,r31 + mtlr r0 + addi sp,sp,96 + lwz r31,-4(sp) + blr + +free_temp_memory_handle: + mflr r0 + stw r3,-4(sp) + stw r0,8(sp) + stwu sp,-96(sp) + + addi r4,sp,56 + bl L_TempHUnlock$stub + nop + + lwz r3,96-4(sp) + addi r4,sp,56 + bl L_TempDisposeHandle$stub + nop + + lwz r0,104(sp) + addi sp,sp,96 + mtlr r0 + blr + .endif + +init_profiler_error: + lea_ o0,not_enough_memory_for_profile_stack + lea_ r5,profile_globals + li r4,0 + stw r4,Globals_stack_pointer(r5) + b print_error +profiler_memory_error: + lea_ o0,not_enough_memory_for_profiler + b print_error + .if CHECK_STACK_OVERFLOWS +profile_stack_overflow: + mflr r0 + stw r0,-4(sp) + stwu sp,-64(sp) + + bl .Debugger + nop + + lwz r0,64-4(sp) + addi sp,sp,64 + mtlr r0 + b profile_stack_overflow + .endif + + .data + .align 2 + .comm profile_globals,Globals + + .align 2 + .if MODULE_NAMES +m_system_: + .long 6 + .ascii "System" + .byte 0,0 + .long m_system_ + .endif +start_string: + .long 0 + .ascii "start" + .byte 0 + .align 2 +not_enough_memory_for_profile_stack: + .ascii "not enough memory for profile stack" + .byte 13 + .byte 0 +not_enough_memory_for_profiler: + .ascii "not enough memory for profiler" + .byte 13 + .byte 0 +stack_trace_string: + .ascii "Stack trace:" + .byte 13 + .byte 0 + .align 2 + +.picsymbol_stub +L_TempDisposeHandle$stub: + .indirect_symbol _TempDisposeHandle + mflr r0 + bcl 20,31,L21$pb +L21$pb: + mflr r11 + addis r11,r11,ha16(L21$lz-L21$pb) + mtlr r0 + lwz r12,lo16(L21$lz-L21$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L21$lz-L21$pb ) + bctr +.lazy_symbol_pointer +L21$lz: + .indirect_symbol _TempDisposeHandle + .long dyld_stub_binding_helper + + +.picsymbol_stub +L_TempHLock$stub: + .indirect_symbol _TempHLock + mflr r0 + bcl 20,31,L22$pb +L22$pb: + mflr r11 + addis r11,r11,ha16(L22$lz-L22$pb) + mtlr r0 + lwz r12,lo16(L22$lz-L22$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L22$lz-L22$pb ) + bctr +.lazy_symbol_pointer +L22$lz: + .indirect_symbol _TempHLock + .long dyld_stub_binding_helper + + + +.picsymbol_stub +L_TempHUnlock$stub: + .indirect_symbol _TempHUnlock + mflr r0 + bcl 20,31,L23$pb +L23$pb: + mflr r11 + addis r11,r11,ha16(L23$lz-L23$pb) + mtlr r0 + lwz r12,lo16(L23$lz-L23$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L23$lz-L23$pb ) + bctr +.lazy_symbol_pointer +L23$lz: + .indirect_symbol _TempHUnlock + .long dyld_stub_binding_helper + + + +.picsymbol_stub +L_TempNewHandle$stub: + .indirect_symbol _TempNewHandle + mflr r0 + bcl 20,31,L24$pb +L24$pb: + mflr r11 + addis r11,r11,ha16(L24$lz-L24$pb) + mtlr r0 + lwz r12,lo16(L24$lz-L24$pb)(r11) + mtctr r12 + addi r11,r11,lo16(L24$lz-L24$pb ) + bctr +.lazy_symbol_pointer +L24$lz: + .indirect_symbol _TempNewHandle + .long dyld_stub_binding_helper + |