summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--macho/Makefile57
-rw-r--r--macho/pcompact.a1749
-rw-r--r--macho/pcopy.a985
-rw-r--r--macho/pfileIO3.a1390
-rw-r--r--macho/pmacros.a45
-rw-r--r--macho/pmark.a2107
-rw-r--r--macho/pprofile.a1488
-rw-r--r--macho/pstartup.a6116
-rw-r--r--macho/ptrace.a739
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
+