summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scompact.s2044
-rw-r--r--scopy.s1113
-rw-r--r--sfileIO2.s698
-rw-r--r--smark.s1744
-rw-r--r--sreals.s161
-rw-r--r--sstartup.s4456
6 files changed, 10216 insertions, 0 deletions
diff --git a/scompact.s b/scompact.s
new file mode 100644
index 0000000..e0dfc54
--- /dev/null
+++ b/scompact.s
@@ -0,0 +1,2044 @@
+
+! mark used nodes and pointers in argument parts and link backward pointers
+
+ ldg (heap_size_33,d7)
+ sll d7,5,d7
+
+ ldg (caf_list,d0)
+
+ st a4,[sp-4]
+
+ tst d0
+ be end_mark_cafs
+ dec 4,sp
+
+#ifdef SP_G5
+ dec 4,sp
+#endif
+
+mark_cafs_lp:
+#ifdef SP_G5
+ ld [d0-4],%g1
+#else
+ ld [d0-4],%g5
+#endif
+ add d0,4,a2
+ ld [d0],d0
+
+#ifdef SP_G5
+ st %g1,[sp]
+#endif
+ sll d0,2,d0
+ add a2,d0,a4
+
+ dec 4,sp
+ call mark_stack_nodes
+ st %o7,[sp]
+
+#ifdef SP_G5
+ ld [sp],d0
+ addcc d0,0,d0
+#else
+ addcc %g5,0,d0
+#endif
+ bne mark_cafs_lp
+ nop
+
+#ifdef SP_G5
+ inc 4,sp
+#endif
+
+end_mark_cafs:
+ ldg (stack_p,a2)
+
+ ld [sp],a4
+ call mark_stack_nodes
+ st %o7,[sp]
+
+ b,a compact_heap
+
+mark_record:
+ deccc 258,d2
+ be,a mark_record_2
+ lduh [d0-2+2],%g1
+
+ blu,a mark_record_1
+ lduh [d0-2+2],%g1
+
+mark_record_3:
+ lduh [d0-2+2],d2
+ deccc 1,d2
+ blu,a mark_record_3_bb
+ dec 4,a0
+
+ be mark_record_3_ab
+ nop
+
+ deccc 1,d2
+ be mark_record_3_aab
+ nop
+
+ b,a mark_hnf_3
+
+mark_record_3_bb:
+ ld [a0+8],a1
+
+ sub a1,d6,d0
+ srl d0,2,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+
+ cmp a1,a0
+ bgu mark_next_node
+ nop
+
+ cmp %o0,1
+ bne not_next_byte_1
+ srl %o0,1,%o0
+
+ inc 1,d1
+ ldub [%o4+d1],%o1
+ mov 128,%o0
+not_next_byte_1:
+ btst %o0,%o1
+ be not_yet_linked_bb
+ bset %o0,%o1
+
+ sub a0,d6,d0
+ srl d0,2,d0
+ inc 2,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+
+ ld [a1],%o0
+ add a0,8+2+1,d0
+ st %o0,[a0+8]
+ ba mark_next_node
+ st d0,[a1]
+
+not_yet_linked_bb:
+ stb %o1,[%o4+d1]
+ ld [a1],%o0
+ add a0,8+2+1,d0
+ st %o0,[a0+8]
+ ba mark_next_node
+ st d0,[a1]
+
+mark_record_3_ab:
+ ld [a0+4],a1
+
+ sub a1,d6,d0
+ srl d0,2,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+
+ cmp a1,a0
+ bgu mark_hnf_1
+ nop
+
+ cmp %o0,1
+ bne not_next_byte_2
+ srl %o0,1,%o0
+
+ inc 1,d1
+ ldub [%o4+d1],%o1
+ mov 128,%o0
+not_next_byte_2:
+ btst %o0,%o1
+ be not_yet_linked_ab
+ bset %o0,%o1
+
+ sub a0,d6,d0
+ srl d0,2,d0
+ inc 1,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+
+ ld [a1],%o0
+ add a0,4+2+1,d0
+ st %o0,[a0+4]
+ ba mark_hnf_1
+ st d0,[a1]
+
+not_yet_linked_ab:
+ stb %o1,[%o4+d1]
+ ld [a1],%o0
+ add a0,4+2+1,d0
+ st %o0,[a0+4]
+ ba mark_hnf_1
+ st d0,[a1]
+
+mark_record_3_aab:
+ ld [a0+4],a1
+
+ sub a1,d6,d0
+ srl d0,2,d0
+
+ tstmbit (%o4,d0,d1,%o0,%o1,%o2)
+ bne shared_argument_part
+ bset %o0,%o1
+
+ stb %o1,[%o4+d1]
+
+ ld [a0],%o0
+ inc 4,a0
+ or %o0,2,%o0
+ st %o0,[a0-4]
+ or d3,d5,d3
+ st d3,[a0]
+
+ ld [a1],d2
+ st a0,[a1]
+ mov a1,d3
+ mov 1,d5
+ ba mark_node
+ mov d2,a0
+
+mark_record_2:
+ cmp %g1,1
+ bgu,a mark_hnf_2
+ ld [a0],%o0
+
+ be mark_hnf_1
+ nop
+ ba mark_next_node
+ dec 4,a0
+
+mark_record_1:
+ tst %g1
+ bne mark_hnf_1
+ nop
+ ba mark_next_node
+ dec 4,a0
+
+
+
+mark_stack_nodes3:
+ ba mark_stack_nodes
+ st a0,[%i2-4]
+
+mark_stack_nodes2:
+ ld [a0],%g1
+ add %i2,1-4,d0
+ st %g1,[%i2-4]
+ st d0,[a0]
+
+mark_stack_nodes:
+ cmp a4,a2
+ be end_mark_nodes
+ inc 4,a2
+
+ ld [a2-4],a0
+
+ mov 128,%o3
+
+ sub a0,d6,d0
+#ifdef SHARE_CHAR_INT
+ cmp d0,d7
+ bcc mark_stack_nodes
+#endif
+ srl d0,2,d0
+
+ srl d0,3,%o0
+ ldub [%o4+%o0],%o1
+ and d0,7,%o2
+ srl %o3,%o2,%o3
+ btst %o3,%o1
+ bne mark_stack_nodes2
+ bset %o3,%o1
+
+ stb %o1,[%o4+%o0]
+
+ clr %l3
+ mov 1,%l5
+
+mark_arguments:
+ ld [a0],d0
+ btst 2,d0
+ be mark_lazy_node
+ ldsh [d0-2],d2
+
+ tst d2
+ be mark_hnf_0
+ cmp d2,256
+ bgeu mark_record
+ inc 4,a0
+
+ deccc 2,d2
+ be,a mark_hnf_2
+ ld [a0],%o0
+
+ bcs mark_hnf_1
+ nop
+
+mark_hnf_3:
+ ld [a0+4],a1
+
+ mov 128,%o3
+
+ sub a1,%l6,d0
+ srl d0,2,d0
+
+ srl d0,3,%o0
+ ldub [%o4+%o0],%o1
+ and d0,7,%o2
+ srl %o3,%o2,%o3
+ btst %o3,%o1
+ bne shared_argument_part
+ bset %o3,%o1
+
+ stb %o1,[%o4+%o0]
+
+no_shared_argument_part:
+ ld [a0],%o0
+ bset %l5,%l3
+ bset 2,%o0
+ st %o0,[a0]
+ st %l3,[a0+4]
+ inc 4,a0
+
+ ld [a1],%o0
+ sll d2,2,d2
+ bset 1,%o0
+ st %o0,[a1]
+ add a1,d2,a1
+
+ ld [a1],d2
+ st a0,[a1]
+ mov a1,%l3
+ clr %l5
+ ba mark_node
+ mov d2,a0
+
+shared_argument_part:
+ cmp a1,a0
+ bgu mark_hnf_1
+ nop
+
+ ld [a1],%o0
+ add a0,4+2+1,d0
+ st d0,[a1]
+ ba mark_hnf_1
+ st %o0,[a0+4]
+
+mark_lazy_node_1:
+ bne mark_selector_node_1
+ nop
+
+mark_hnf_1:
+ ld [a0],d2
+ bset d5,d3
+ st d3,[a0]
+ mov a0,d3
+ mov 2,d5
+ ba mark_node
+ mov d2,a0
+
+mark_indirection_node:
+ sub a0,4,%o1
+ sub %o1,%l6,%o1
+ srl %o1,2,%o1
+
+ srl %o1,3,d2
+ ldub [%o4+d2],%g1
+ and %o1,7,%g2
+ mov 128,%g3
+ srl %g3,%g2,%g3
+ bclr %g3,%g1
+ stb %g1,[%o4+d2]
+
+ ba mark_node
+ ld [a0],a0
+
+mark_selector_node_1:
+ inccc 3,d2
+ be mark_indirection_node
+ nop
+
+ ld [a0],a1
+ sub a1,d6,%o1
+ srl %o1,2,%o1
+
+ inccc d2
+ ble mark_record_selector_node_1
+ nop
+
+ srl %o1,3,d2
+ ldub [%o4+d2],%g1
+ and %o1,7,%g2
+ mov 128,%g3
+ srl %g3,%g2,%g3
+ btst %g3,%g1
+ bne mark_hnf_1
+ nop
+
+ ld [a1],d2
+ btst 2,d2
+ be mark_hnf_1
+ nop
+
+ ldsh [d2-2],%g1
+ cmp %g1,2
+ bleu small_tuple_or_record
+ nop
+
+large_tuple_or_record:
+ ld [a1+8],d1
+ sub d1,d6,%o1
+ srl %o1,2,%o1
+
+ srl %o1,3,d2
+ ldub [%o4+d2],%g1
+ and %o1,7,%g2
+ mov 128,%g3
+ srl %g3,%g2,%g3
+ btst %g3,%g1
+ bne mark_hnf_1
+ nop
+
+small_tuple_or_record:
+ sub a0,4,d2
+ sub d2,d6,%o1
+ srl %o1,2,%o1
+
+ srl %o1,3,d1
+ ldub [%o4+d1],%g1
+ and %o1,7,%g2
+ mov 128,%g3
+ srl %g3,%g2,%g3
+ bclr %g3,%g1
+ stb %g1,[%o4+d1]
+
+ ld [d0-8],%g1
+ mov a1,a0
+ ld [%g1+4],%g1
+
+ dec 4,sp
+ call %g1
+ st %o7,[sp]
+
+ set __indirection,%g1
+ st %g1,[d2]
+ ba mark_node
+ st a0,[d2+4]
+
+mark_record_selector_node_1:
+ beq mark_strict_record_selector_node_1
+ nop
+
+ srl %o1,3,d2
+ ldub [%o4+d2],%g1
+ and %o1,7,%g2
+ mov 128,%g3
+ srl %g3,%g2,%g3
+ btst %g3,%g1
+ bne mark_hnf_1
+ nop
+
+ ld [a1],d2
+ btst 2,d2
+ be mark_hnf_1
+ nop
+
+ ldsh [d2-2],%g1
+ cmp %g1,258
+ bleu small_tuple_or_record
+ nop
+ b,a large_tuple_or_record
+
+mark_strict_record_selector_node_1:
+ srl %o1,3,d2
+ ldub [%o4+d2],%g1
+ and %o1,7,%g2
+ mov 128,%g3
+ srl %g3,%g2,%g3
+ btst %g3,%g1
+ bne mark_hnf_1
+ nop
+
+ ld [a1],d2
+ btst 2,d2
+ be mark_hnf_1
+ nop
+
+ ldsh [d2-2],%g1
+ cmp %g1,258
+ bleu select_from_small_record
+ nop
+
+ ld [a1+8],d1
+ sub d1,d6,%o1
+ srl %o1,2,%o1
+
+ srl %o1,3,d2
+ ldub [%o4+d2],%g1
+ and %o1,7,%g2
+ mov 128,%g3
+ srl %g3,%g2,%g3
+ btst %g3,%g1
+ bne mark_hnf_1
+ nop
+
+select_from_small_record:
+ dec 4,a0
+
+ ld [d0-8],%g1
+ ld [%g1+4],%g1
+
+ dec 4,sp
+ call %g1
+ st %o7,[sp]
+
+ b,a mark_next_node
+
+mark_hnf_2:
+ bset 2,%o0
+ st %o0,[a0]
+ inc 4,a0
+ ld [a0],d2
+ bset d5,d3
+ st d3,[a0]
+ mov a0,%l3
+ clr d5
+ mov d2,a0
+
+mark_node:
+ sub a0,%l6,d0
+#ifdef SHARE_CHAR_INT
+ cmp d0,%l7
+ bcc mark_next_node_after_static
+#endif
+ srl d0,2,d0
+
+ srl d0,3,%o0
+ ldub [%o4+%o0],%o1
+ and d0,7,%o2
+ mov 128,%o3
+ srl %o3,%o2,%o3
+ btst %o3,%o1
+ bset %o3,%o1
+ be mark_arguments
+ stb %o1,[%o4+%o0]
+
+mark_next_node:
+ tst d5 !
+ bne,a mark_parent+4
+ tst d3
+
+ ld [d3-4],d2
+ dec 4,d3
+
+ and d2,3,d5
+ cmp d5,3
+ be argument_part_cycle1
+ ld [d3+4],%o0
+
+ st %o0,[d3]
+
+c_argument_part_cycle1:
+ cmp a0,d3
+ bgu no_reverse_1
+ nop
+
+ ld [a0],%o0
+ add %l3,4+1,d0
+ st %o0,[%l3+4]
+ st d0,[a0]
+ ba mark_node
+ andn d2,3,a0
+
+no_reverse_1:
+ st a0,[%l3+4]
+ ba mark_node
+ andn d2,3,a0
+
+mark_lazy_node:
+ tst d2
+ be mark_next_node
+ add d0,-2,a1
+
+ deccc d2
+ ble mark_lazy_node_1
+ inc 4,a0
+
+ cmp d2,255
+ bgeu,a mark_closure_with_unboxed_arguments
+ srl d2,8,d0
+
+mark_closure_with_unboxed_arguments_:
+ ld [a0],%o0
+ sll d2,2,d2
+ bset 2,%o0
+ st %o0,[a0]
+ add a0,d2,a0
+
+ ld [a0],d2
+ bset %l5,%l3
+ st %l3,[a0]
+ mov a0,%l3
+ clr %l5
+ ba mark_node
+ mov d2,a0
+
+mark_closure_with_unboxed_arguments:
+! inc d2
+! srl d2,8,d0
+ and d2,255,d2
+ subcc d2,d0,d2
+! deccc d2
+ bgt mark_closure_with_unboxed_arguments_
+ nop
+
+ beq mark_hnf_1
+ nop
+
+ b mark_next_node
+ dec 4,a0
+
+mark_hnf_0:
+#ifdef SHARE_CHAR_INT
+ set INT+2,%g1
+ cmp d0,%g1
+ bne no_int_3
+ nop
+
+ ld [a0+4],d2
+ cmp d2,33
+ bcc mark_next_node
+ nop
+
+ sub a0,%l6,d1
+ srl d1,2,d1
+
+ srl d1,3,d0
+ ldub [%o4+d0],%g1
+ and d1,7,%g2
+ mov 128,%g3
+ srl %g3,%g2,%g3
+ bclr %g3,%g1
+ stb %g1,[%o4+d0]
+
+ set small_integers,a0
+ sll d2,3,d2
+ ba mark_next_node_after_static
+ add a0,d2,a0
+no_int_3:
+
+ set CHAR+2,%g1
+ cmp d0,%g1
+ bne no_char_3
+ nop
+
+ sub a0,%l6,d1
+ srl d1,2,d1
+
+ srl d1,3,d0
+ ldub [%o4+d0],%g1
+ and d1,7,%g2
+ mov 128,%g3
+ srl %g3,%g2,%g3
+ bclr %g3,%g1
+ stb %g1,[%o4+d0]
+
+ ldub [a0+7],d2
+ set static_characters,a0
+ sll d2,3,d2
+ ba mark_next_node_after_static
+ add a0,d2,a0
+
+no_char_3:
+ blu no_normal_hnf_0
+ nop
+
+ sub a0,%l6,d1
+ srl d1,2,d1
+
+ sub d0,12+2,a0
+
+ srl d1,3,d0
+ ldub [%o4+d0],%g1
+ and d1,7,%g2
+ mov 128,%g3
+ srl %g3,%g2,%g3
+ bclr %g3,%g1
+ ba mark_next_node_after_static
+ stb %g1,[%o4+d0]
+
+no_normal_hnf_0:
+#endif
+
+ set __ARRAY__+2,%o0
+ cmp d0,%o0
+ bne,a mark_next_node+4
+ tst d5
+
+ ld [a0+8],d0
+ tst d0
+ be,a mark_lazy_array
+ ld [a0+4],d0
+
+ lduh [d0-2+2],d1
+ tst d1
+ be,a mark_b_record_array
+ sub a0,d6,d0
+
+ lduh [d0-2],d0
+ tst d0
+ be,a mark_b_record_array
+ sub a0,d6,d0
+
+ dec 256,d0
+ cmp d0,d1
+ be,a mark_a_record_array
+ ld [a0+4],d0
+
+mark_ab_record_array:
+ mov d2,%o2
+ mov d3,%o3
+ mov d4,%g2
+ mov d5,%o5
+ mov d6,%g3
+
+ ld [a0+4],d2
+ inc 8,a0
+ mov a0,%g4
+
+ sll d2,2,d2
+ sub d0,2,d3
+ mov d2,a1
+mul_array_length_ab1:
+ deccc 1,d3
+ bcc mul_array_length_ab1
+ add a1,d2,a1
+
+ sub d0,d1,d0
+ inc 4,a0
+ call reorder
+ add a1,a0,a1
+
+! mov a0,d0
+
+ mov %g4,a0
+
+! sub d0,a0,d0
+! srl d0,2,d0
+! dec 1,d0
+
+ ld [a0-4],d2
+ deccc 2,d1
+ bcs skip_mul_array_length_a1_
+ mov d2,d0
+mul_array_length_a1_:
+ deccc 1,d1
+ bcc mul_array_length_a1_
+ add d0,d2,d0
+skip_mul_array_length_a1_:
+
+ mov %g3,d6
+ mov %o5,d5
+ mov %g2,d4
+ mov %o3,d3
+ ba mark_lr_array
+ mov %o2,d2
+
+mark_b_record_array:
+ srl d0,2,d0
+ inc 1,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+ b,a mark_next_node
+
+mark_a_record_array:
+ deccc 2,d1
+ blu mark_lr_array
+ inc 8,a0
+
+ mov d0,d2
+mul_array_length:
+ deccc 1,d1
+ bcc mul_array_length
+ add d0,d2,d0
+
+ b,a mark_lr_array
+
+mark_lazy_array:
+ inc 8,a0
+mark_lr_array:
+ sub a0,d6,d1
+ srl d1,2,d1
+ add d1,d0,d1
+ setmbit (%o4,d1,d2,%o0,%o1,%o2)
+
+ cmp d0,1
+ bleu mark_array_length_0_1
+ nop
+
+ mov a0,a1
+ sll d0,2,d0
+ add a0,d0,a0
+
+ ld [a0],d2
+ ld [a1],%o0
+ st d2,[a1]
+ st %o0,[a0]
+
+ ld [a0-4],d2
+ dec 4,a0
+ inc 2,d2
+ ld [a1-4],%o0
+ dec 4,a1
+ st %o0,[a0]
+ st d2,[a1]
+
+ ld [a0-4],d2
+ dec 4,a0
+ or d3,d5,d3
+ st d3,[a0]
+ mov a0,d3
+ mov 0,d5
+ ba mark_node
+ mov d2,a0
+
+mark_array_length_0_1:
+ blu,a mark_next_node
+ dec 8,a0
+
+ ld [a0+4],d1
+ ld [a0],%o0
+ ld [a0-4],%o1
+ st %o0,[a0+4]
+ st %o1,[a0]
+ st d1,[a0-4]
+ ba mark_hnf_1
+ dec 4,a0
+!
+mark_parent:
+ tst d3
+! selectors:
+! be mark_stack_nodes
+ be mark_stack_nodes2
+ nop
+
+ deccc d5
+ be argument_part_parent
+ nop
+
+ ld [%l3],d2
+
+ cmp a0,%l3
+ bgu no_reverse_2
+ nop
+
+ mov a0,a1
+ add %l3,1,d0
+ ld [a1],a0
+ st d0,[a1]
+
+no_reverse_2:
+ st a0,[%l3]
+ sub %l3,4,a0
+ and d2,3,%l5
+ ba mark_next_node
+ andn d2,3,%l3
+
+argument_part_parent:
+ mov %l3,a1
+ mov a0,%l3
+ mov a1,a0
+
+ ld [a1],d2
+skip_upward_pointers:
+ and d2,3,d0
+ cmp d0,3
+ bne no_upward_pointer
+ nop
+ andn d2,3,a1
+ ba skip_upward_pointers
+ ld [a1],d2
+
+no_upward_pointer:
+ cmp %l3,a0
+ bgu no_reverse_3
+ nop
+
+ mov %l3,%g6
+ ld [%l3],%l3
+ add a0,1,d0
+ st d0,[%g6]
+
+no_reverse_3:
+ st %l3,[a1]
+
+ andn d2,3,%l3
+
+ dec 4,%l3
+ mov %l3,a1
+ ld [a1],d2
+ and d2,3,%l5
+ ld [a1+4],%o0
+
+ cmp a0,a1
+ bgu no_reverse_4
+ st %o0,[a1]
+
+ ld [a0],%o0
+ st %o0,[a1+4]
+ add a1,4+2+1,d0
+ st d0,[a0]
+ ba mark_node
+ andn d2,3,a0
+
+no_reverse_4:
+ st a0,[a1+4]
+ ba mark_node
+ andn d2,3,a0
+
+argument_part_cycle1:
+ mov a1,d1
+!
+skip_pointer_list1:
+ andn d2,3,a1
+ ld [a1],d2
+ and d2,3,d5
+ cmp d5,3
+ be,a skip_pointer_list1+4
+ andn d2,3,a1
+
+ st %o0,[a1]
+ ba c_argument_part_cycle1
+ mov d1,a1
+
+#ifdef SHARE_CHAR_INT
+mark_next_node_after_static:
+ tst d5
+ bne mark_parent_after_static
+ nop
+
+ dec 4,%l3
+ ld [%l3],d2
+ ld [%l3+4],%o0
+ and d2,3,%l5
+
+ cmp %l5,3
+ be argument_part_cycle2
+ nop
+
+ st %o0,[%l3]
+
+c_argument_part_cycle2:
+ st a0,[%l3+4]
+ ba mark_node
+ andn d2,3,a0
+
+mark_parent_after_static:
+ tst d3
+ be mark_stack_nodes3
+ nop
+
+ deccc d5
+ be argument_part_parent_after_static
+ nop
+
+ ld [d3],d2
+ st a0,[d3]
+ sub d3,4,a0
+ and d2,3,d5
+ ba mark_next_node
+ andn d2,3,d3
+
+argument_part_parent_after_static:
+ mov d3,a1
+ mov a0,d3
+ mov a1,a0
+
+ ld [a1],d2
+skip_upward_pointers_2:
+ and d2,3,d0
+ cmp d0,3
+ bne no_reverse_3
+ nop
+ andn d2,3,a1
+ ba skip_upward_pointers_2
+ ld [a1],d2
+
+argument_part_cycle2:
+ mov a1,d1
+
+skip_pointer_list2:
+ andn d2,3,a1
+ ld [a1],d2
+ and d2,3,%l5
+ cmp %l5,3
+ be skip_pointer_list2
+ nop
+
+ st %o0,[a1]
+ ba c_argument_part_cycle2
+ mov d1,a1
+#endif
+
+end_mark_nodes:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+! compact the heap
+compact_heap:
+
+#ifdef FINALIZERS
+ set finalizer_list,a0
+ set free_finalizer_list,a1
+
+ ld [a0],a2
+determine_free_finalizers_after_compact1:
+ set __Nil-8,%o0
+ cmp %o0,a2
+ beq end_finalizers_after_compact1
+ mov 128,%o3
+
+ sub a2,d6,d0
+ srl d0,2,d0
+ srl d0,3,%o0
+ ldub [%o4+%o0],%o1
+ and d0,7,%o2
+ srl %o3,%o2,%o3
+ btst %o3,%o1
+ beq finalizer_not_used_after_compact1
+ nop
+
+ ld [a2],d0
+ b finalizer_find_descriptor
+ mov a2,a3
+
+finalizer_find_descriptor_lp:
+ andn d0,3,d0
+ mov d0,a3
+ ld [d0],d0
+finalizer_find_descriptor:
+ btst 1,d0
+ bne finalizer_find_descriptor_lp
+ nop
+
+ set e____system__kFinalizerGCTemp+2,%o0
+ st %o0,[a3]
+
+ cmp a2,a0
+ bgt finalizer_no_reverse
+ nop
+
+ ld [a2],d0
+ add a0,1,a3
+ st a3,[a2]
+ st d0,[a0]
+
+finalizer_no_reverse:
+ add a2,4,a0
+ ba determine_free_finalizers_after_compact1
+ ld [a2+4],a2
+
+finalizer_not_used_after_compact1:
+ set e____system__kFinalizerGCTemp+2,%o0
+ st %o0,[a2]
+
+ st a2,[a1]
+ add a2,4,a1
+
+ ld [a2+4],a2
+ ba determine_free_finalizers_after_compact1
+ st a2,[a0]
+
+end_finalizers_after_compact1:
+ st a2,[a1]
+
+ set finalizer_list,%o1
+ ld [%o1],a0
+ set __Nil-8,%o0
+ cmp %o0,a0
+ beq finalizer_list_empty
+ nop
+
+ btst 3,a0
+ bne finalizer_list_already_reversed
+ nop
+
+ ld [a0],d0
+ add %o1,1,%o0
+ st %o0,[a0]
+ st d0,[%o1]
+finalizer_list_already_reversed:
+finalizer_list_empty:
+
+ set free_finalizer_list,a2
+ set __Nil-8,%o0
+ ld [a2],%o1
+ cmp %o0,%o1
+ beq free_finalizer_list_empty
+ nop
+
+ dec 8,sp
+ st a4,[sp+4]
+
+ add a2,4,a4
+
+ call mark_stack_nodes
+ st %o7,[sp]
+
+ ld [sp],a4
+ inc 4,sp
+
+free_finalizer_list_empty:
+#endif
+
+
+ ldg (heap_size_33,d5)
+ sll d5,5,d2
+
+#ifdef SHARE_CHAR_INT
+ add d2,%l6,d2
+#endif
+
+ inc 3,%l5
+ srl %l5,2,%l5
+! set INT+2,%l3
+
+ mov %o4,%i2
+ mov %l6,%g6
+ ba find_non_zero_long_2
+ clr d4
+
+move_record:
+ deccc 258,d1
+ blu,a move_record_1
+ lduh [d0-2+2],%g1
+ be,a move_record_2
+ lduh [d0-2+2],%g1
+
+move_record_3:
+ lduh [d0-2+2],d1
+ deccc 1,d1
+ bgu copy_hnf_3
+ nop
+
+ ld [a0],a1
+ blu move_record_3_1b
+ inc 4,a0
+
+move_record_3_1a:
+ cmp a1,a0
+ blu move_record_3_1b
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bgeu move_record_3_1b
+#endif
+ add a6,1,d0
+ ld [a1],d1
+ st d0,[a1]
+ mov d1,a1
+move_record_3_1b:
+ st a1,[a6]
+ inc 4,a6
+
+ ld [a0],a1
+ cmp a1,a0
+ blu move_record_3_2
+ inc 4,a0
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bgeu move_record_3_2
+#endif
+ sub a1,d6,d0
+ srl d0,2,d0
+ inc 1,d0
+
+ tstmbit (%o4,d0,d1,%o0,%o1,%o2)
+ be not_linked_record_argument_part_3_b
+ bset %o0,%o1
+
+ sub a6,d6,d0
+ srl d0,2,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+ b,a linked_record_argument_part_3_b
+
+not_linked_record_argument_part_3_b:
+ stb %o1,[%o4+d1]
+
+ sub a6,d6,d0
+ srl d0,2,d0
+ clrmbit (%o4,d0,d1,%o0,%o1,%o2)
+
+linked_record_argument_part_3_b:
+ ld [a1],d1
+ add a6,2+1,d0
+ st d0,[a1]
+ mov d1,a1
+move_record_3_2:
+ st a1,[a6]
+ inc 4,a6
+
+ sub %i2,%o4,%o0
+ sll %o0,5,%o0
+ add %o0,%l6,%o0
+
+ cmp %o0,d7
+ be,a bit_in_next_long
+ sethi %hi 0xc0000000,%o1
+
+ inc 4,d7
+ cmp %o0,d7
+ inc 4,d7
+ bne skip_zero_bits
+ sll d4,2,d4
+
+ sethi %hi 0x80000000,%o1
+
+bit_in_next_long:
+ deccc %l5
+ bneg end_compact_heap
+ nop
+
+ ld [%i2],d4
+ ba skip_zeros_2
+ bclr %o1,d4
+
+move_record_2:
+ cmp %g1,1
+ bgu copy_hnf_2
+ nop
+ blu move_real_or_file
+ nop
+move_record_2_ab:
+ ld [a0],a1
+ cmp a1,a0
+ blu move_record_2_1
+ inc 4,a0
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bgeu move_record_2_1
+ add a6,1,d0
+#endif
+ ld [a1],d1
+ st d0,[a1]
+ mov d1,a1
+move_record_2_1:
+ st a1,[a6]
+ ld [a0],%o0
+ inc 4,a0
+ st %o0,[a6+4]
+ ba skip_zero_bits
+ inc 8,a6
+
+move_record_1:
+ tst %g1
+ bne copy_hnf_1
+ nop
+ ba move_int_bool_or_char
+ nop
+
+skip_zeros_2:
+ tst d4
+ bne end_skip_zeros
+ inc 4,%i2
+find_non_zero_long_2:
+ deccc %l5
+ bpos,a skip_zeros_2
+ ld [%i2],d4
+
+ b,a end_compact_heap
+
+end_skip_zeros:
+ sub %i2,%o4,%l7
+ dec 4,%l7
+ sll %l7,5,%l7
+ add %l7,%l6,%l7
+
+skip_zero_bits:
+ set first_one_bit_table,%o0
+ srl d4,24,%o1
+ ldsb [%o0+%o1],d1
+ tst d1
+ bpos,a copy_nodes
+ sll d4,d1,d4
+
+ tst d4
+ be find_non_zero_long_2
+ sethi %hi 0xff000000,%o2
+
+more_than_7:
+ sll d4,8,d4
+ btst d4,%o2
+ beq more_than_7
+ inc 8<<2,%l7
+
+less_than_8:
+ srl d4,24,%o1
+ ldsb [%o0+%o1],d1
+ sll d4,d1,d4
+
+copy_nodes:
+! sethi %hi 0x80000000,%o0
+! bclr %o0,d4
+ sll d4,1,d4
+
+ sll d1,2,d1
+ add %l7,d1,%l7
+
+! mov %l7,a0
+! ld [a0],d0
+! inc 4,a0
+ ld [d7],d0
+ inc 4,d7
+ mov d7,a0
+
+ bclr 1,d0
+
+ btst 2,d0
+ beq begin_update_list_2
+ bclr 2,d0
+
+ ld [d0-8],d3
+ mov d0,a1
+ btst 1,d3
+ be end_list_2
+ bclr 1,d3
+find_descriptor_2:
+ andn d3,2,a1
+ ld [a1],d3
+ btst 1,d3
+ bne find_descriptor_2
+ bclr 1,d3
+end_list_2:
+ lduh [d3-2],d1
+
+ cmp d1,256
+ blu no_record_arguments
+ nop
+
+ lduh [d3-2+2],d3
+ deccc 2,d3
+ bgeu copy_record_arguments_aa
+ nop
+ dec 256+3,d1
+
+copy_record_arguments_all_b:
+ mov d1,%g2
+
+update_up_list_1r:
+ mov d0,a1
+ sub d0,d6,d0
+ srl d0,2,d0
+
+ tstmbit (%o4,d0,d1,%o0,%o1,%o2)
+ beq copy_argument_part_1r
+ nop
+
+ ld [a1],d0
+ st a6,[a1]
+ ba update_up_list_1r
+ dec 3,d0
+
+copy_argument_part_1r:
+ ld [a1],d0
+ st a6,[a1]
+ st d0,[a6]
+ inc 4,a6
+
+ mov %g2,d1
+
+copy_b_record_argument_part_arguments:
+ ld [a0],%o0
+ inc 4,a0
+ st %o0,[%g6]
+ deccc d1
+ bcc copy_b_record_argument_part_arguments
+ inc 4,%g6
+
+ sub %i2,%o4,%o0
+ sll %o0,5,%o0
+ add %o0,%l6,%o0
+
+ cmp %o0,d7
+ inc 4,d7
+ bne skip_zero_bits
+ sll d4,1,d4
+
+ deccc %l5
+ bneg end_compact_heap
+ sethi %hi 0x80000000,%o1
+
+ ld [%i2],d4
+ ba skip_zeros_2
+ bclr %o1,d4
+
+copy_record_arguments_aa:
+ dec 256+2,d1
+ sub d1,d3,d1
+ mov d1,%g2
+
+update_up_list_2r:
+ mov d0,a1
+ ld [a1],d0
+ and d0,3,d1
+ deccc 3,d1
+ bne copy_argument_part_2r
+ st a6,[a1]
+
+ ba update_up_list_2r
+ dec 3,d0
+
+copy_argument_part_2r:
+ cmp d0,a0
+ bleu copy_record_argument_2
+ nop
+#ifdef SHARE_CHAR_INT
+ cmp d0,d2
+ bgeu copy_record_argument_2
+ nop
+#endif
+ mov d0,a1
+ ld [a1],d0
+ add a6,1,d1
+ st d1,[a1]
+copy_record_argument_2:
+ st d0,[a6]
+ inc 4,a6
+
+ deccc 1,d3
+ bcs no_pointers_in_record
+ nop
+copy_record_pointers:
+ ld [a0],a1
+ inc 4,a0
+ cmp a1,a0
+ blu copy_record_pointers_2
+ nop
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bgeu copy_record_pointers_2
+ nop
+#endif
+ ld [a1],d1
+ add a6,1,d0
+ st d0,[a1]
+ mov d1,a1
+copy_record_pointers_2:
+ st a1,[a6]
+ deccc 1,d3
+ bcc copy_record_pointers
+ inc 4,a6
+
+no_pointers_in_record:
+ tst %g2
+ be no_non_pointers_in_record
+ sub %g2,1,d1
+
+copy_non_pointers_in_record:
+ ld [a0],%o0
+ inc 4,a0
+ st %o0,[a6]
+! deccc 1,d2
+ deccc 1,d1
+ bcc copy_non_pointers_in_record
+ inc 4,a6
+no_non_pointers_in_record:
+ b,a skip_zero_bits
+
+no_record_arguments:
+ dec 3,d1
+update_up_list_2:
+ mov d0,a1
+ ld [a1],d0
+ and d0,3,d3
+ cmp d3,3
+ bne,a copy_argument_part_2
+ st a6,[a1]
+
+ st %g6,[a1]
+ ba update_up_list_2
+ andn d0,3,d0
+
+copy_argument_part_2:
+
+! update_up_list_2:
+! mov d0,a1
+! ld [a1],d0
+! and d0,3,d1
+! cmp d1,3
+! bne copy_argument_part_2
+! nop
+! st %g6,[a1]
+! ba update_up_list_2
+! andn d0,3,d0
+!
+! copy_argument_part_2:
+! st %g6,[a1]
+!
+! ld [a1-8],d1
+! btst 1,d1
+! beq end_list_2
+! nop
+! andn d1,3,a1
+! find_descriptor_2:
+! ld [a1],d1
+! btst 1,d1
+! bne,a find_descriptor_2
+! andn d1,3,a1
+! end_list_2:
+!
+! lduh [d1-2],d1
+! dec 3,d1
+
+ cmp d0,a0
+ bcs copy_arguments_1
+ inc 4,%g6
+
+#ifdef SHARE_CHAR_INT
+ cmp d0,d2
+ bcc copy_arguments_1
+#endif
+ mov d0,a1
+ ld [a1],d0
+ add %g6,1-4,%l3
+ st %l3,[a1]
+copy_arguments_1:
+ st d0,[%g6-4]
+
+copy_argument_part_arguments:
+ ld [a0],a1
+ inc 4,a0
+ cmp a1,a0
+ bcs copy_arguments_2
+ nop
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bcc copy_arguments_2
+#endif
+ or %g6,1,d0
+ ld [a1],%l3
+ st d0,[a1]
+ mov %l3,a1
+
+copy_arguments_2:
+ st a1,[%g6]
+ deccc 1,d1
+ bcc copy_argument_part_arguments
+ inc 4,%g6
+
+ b,a skip_zero_bits
+
+update_list_2:
+ st %g6,[a1]
+begin_update_list_2:
+ mov d0,a1
+ ld [a1],d0
+update_list__2:
+ btst 1,d0
+ be end_update_list_2
+ bclr 1,d0
+ btst 2,d0
+ be update_list_2
+ bclr 2,d0
+ mov d0,a1
+ ba update_list__2
+ ld [a1],d0
+
+end_update_list_2:
+ st %g6,[a1]
+
+ btst 2,d0
+ st d0,[%g6]
+ be move_lazy_node
+ inc 4,%g6
+
+ lduh [d0-2],d1
+ tst d1
+ be move_hnf_0
+ cmp d1,256
+ bgeu move_record
+ nop
+
+ deccc 2,d1
+ bcs copy_hnf_1
+ nop
+ be copy_hnf_2
+ nop
+
+copy_hnf_3:
+ ld [a0],a1
+ cmp a1,a0
+ bcs copy_hnf_3_1
+ inc 4,a0
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bcc copy_hnf_3_1
+#endif
+ or %g6,1,d0
+ ld [a1],d1
+ st d0,[a1]
+ mov d1,a1
+copy_hnf_3_1:
+ st a1,[%g6]
+
+ ld [a0],a1
+ cmp a1,a0
+ bcs copy_hnf_3_2
+ inc 4,a0
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bcc copy_hnf_3_2
+#endif
+ add %g6,4+2+1,d0
+ ld [a1],d1
+ st d0,[a1]
+ mov d1,a1
+copy_hnf_3_2:
+ st a1,[%g6+4]
+ ba skip_zero_bits
+ inc 8,%g6
+
+copy_hnf_2:
+ ld [a0],a1
+ cmp a1,a0
+ bcs copy_hnf_2_1
+ inc 4,a0
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bcc copy_hnf_2_1
+#endif
+ or %g6,1,d0
+ ld [a1],d1
+ st d0,[a1]
+ mov d1,a1
+copy_hnf_2_1:
+ st a1,[%g6]
+
+ ld [a0],a1
+ cmp a1,a0
+ bcs copy_hnf_2_2
+ inc 4,a0
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bcc copy_hnf_2_2
+#endif
+ add %g6,4+1,d0
+ ld [a1],d1
+ st d0,[a1]
+ mov d1,a1
+copy_hnf_2_2:
+ st a1,[%g6+4]
+ ba skip_zero_bits
+ inc 8,%g6
+
+copy_hnf_1:
+ ld [a0],a1
+ cmp a1,a0
+ bcs copy_hnf_1_
+ inc 4,a0
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bcc copy_hnf_1_
+#endif
+ or %g6,1,d0
+ ld [a1],d1
+ st d0,[a1]
+ mov d1,a1
+copy_hnf_1_:
+ st a1,[%g6]
+ ba skip_zero_bits
+ inc 4,%g6
+
+move_real_or_file:
+ ld [a0],%o0
+ inc 4,a0
+ st %o0,[%g6]
+ inc 4,%g6
+move_int_bool_or_char:
+ ld [a0],%o0
+ inc 4,a0
+ st %o0,[%g6]
+ inc 4,%g6
+copy_normal_hnf_0:
+ ba skip_zero_bits
+ nop
+
+move_hnf_0:
+ set INT+2,%l3
+ cmp d0,%l3
+ blu move_real_file_or_string
+ nop
+ set CHAR+2,%o0
+ cmp d0,%o0
+ bleu move_int_bool_or_char
+ nop
+! b,a copy_normal_hnf_0
+ b,a skip_zero_bits
+
+move_real_file_or_string:
+ set __STRING__+2,%o0
+ cmp d0,%o0
+ bgu move_real_or_file
+ nop
+ bne move_array
+ nop
+
+move_string:
+ ld [a0],d0
+ inc 3,d0
+ srl d0,2,d0
+
+cp_s_arg_lp3:
+ ld [a0],%o0 !
+ inc 4,a0
+ st %o0,[%g6]
+ inc 4,%g6
+ deccc d0
+ bge,a cp_s_arg_lp3+4
+ ld [a0],%o0
+
+ b,a skip_zero_bits
+
+skip_zeros_2_a:
+ ld [a2],d4
+ dec d5
+ tst d4
+ beq skip_zeros_2_a
+ inc 4,a2
+
+end_skip_zeros_a:
+ sub %i2,%o4,%l7
+ dec 4,%l7
+ sll %l7,5,%l7
+ add %l7,%l6,%l7
+
+move_array:
+skip_zero_bits_a:
+ set first_one_bit_table,%o0
+ srl d4,24,%o1
+ ldsb [%o0+%o1],d1
+ tst d1
+ bpos,a end_array_bit
+ sll d4,d1,d4
+
+ tst d4
+ be skip_zeros_2_a
+ sethi %hi 0xff000000,%o2
+
+more_than_7_a:
+ sll d4,8,d4
+ btst d4,%o2
+ beq more_than_7_a
+ inc 8<<2,%l7
+
+less_than_8_a:
+ srl d4,24,%o1
+ ldsb [%o0+%o1],d1
+ sll d4,d1,d4
+
+end_array_bit:
+ sll d4,1,d4
+
+ sll d1,2,d1
+ add %l7,d1,%l7
+
+ mov %l7,d1
+ cmp d7,a0
+ bne move_a_array
+ inc 4,d7
+
+move_b_array:
+ ld [a0],a1
+ inc 4,a0
+ st a1,[a6]
+ ld [a0],d1
+ lduh [d1-2],d0
+ tst d0
+ beq move_strict_basic_array
+ inc 4,a6
+
+ sub d0,257,d1
+ mov 0,d0
+mul_array_lp:
+ deccc d1
+ bcc mul_array_lp
+ add d0,a1,d0
+
+ ba cp_s_arg_lp3+4
+ ld [a0],%o0
+
+move_strict_basic_array:
+ set INT+2,%o0
+ cmp d1,%o0
+ beq cp_s_arg_lp3
+ mov a1,d0
+
+ set BOOL+2,%o0
+ cmp d1,%o0
+ beq move_bool_array
+ nop
+
+ ba cp_s_arg_lp3
+ add d0,d0,d0
+
+move_bool_array:
+ inc 3,d0
+ ba cp_s_arg_lp3
+ srl d0,2,d0
+
+move_a_array:
+ mov d1,a1
+ sub d1,a0,d1
+ srl d1,2,d1
+ deccc 1,d1
+ blu end_array
+ nop
+
+ ld [a0],%o0
+ ld [a1-4],d0
+ st %o0,[a1-4]
+ st d0,[a6]
+ ld [a1],d0
+ ld [a0+4],%o0
+ inc 8,a0
+ st %o0,[a1]
+ st d0,[a6+4]
+ tst d0
+ be st_move_array_lp
+ inc 8,a6
+
+ lduh [d0-2+2],d3
+ lduh [d0-2],d0
+ dec 256,d0
+ cmp d0,d3
+ be st_move_array_lp
+ nop
+
+move_array_ab:
+ mov d4,%o2
+ mov d5,%o3
+ mov d6,%o5
+
+ mov d2,%g2
+ mov a0,%g3
+
+ ld [a6-8],d2
+ mov d3,d1
+
+ mov d0,d3
+ sll d2,2,d2
+ dec 2,d3
+ mov d2,a1
+mul_array_length_ab2:
+ deccc d3
+ bcc mul_array_length_ab2
+ add a1,d2,a1
+
+ sub d0,d1,d0
+ call reorder
+ add a1,a0,a1
+
+ ld [a6-8],d3
+ mov %g3,a0
+ mov %g2,d2
+ dec 1,d1
+ ba st_move_array_lp_ab
+ dec 1,d0
+
+move_array_ab_lp1:
+ mov d1,d4 !
+move_array_ab_a_elements:
+ ld [a0],d5
+ inc 4,a0
+ cmp d5,a0
+ blu,a move_array_element_ab+4
+ st d5,[a6]
+#ifdef SHARE_CHAR_INT
+ cmp d5,d2
+ bgeu,a move_array_element_ab+4
+ st d5,[a6]
+#endif
+ mov d5,a1
+ mov 1,d6
+ ld [a1],d5
+ add d6,a6,d6
+ st d6,[a1]
+move_array_element_ab:
+ st d5,[a6] !
+ deccc d4
+ bcc move_array_ab_a_elements
+ inc 4,a6
+
+ mov d0,d4
+move_array_ab_b_elements:
+ ld [a0],%o0
+ inc 4,a0
+ st %o0,[a6]
+ deccc d4
+ bcc move_array_ab_b_elements
+ inc 4,a6
+st_move_array_lp_ab:
+ deccc d3
+ bcc,a move_array_ab_lp1+4
+ mov d1,d4 !
+
+end_array_ab:
+ mov %o5,d6
+ mov %o3,d5
+ ba end_array
+ mov %o2,d4
+
+move_array_lp1:
+ ld [a0],d0 !
+ inc 4,a0
+ cmp d0,a0
+ blu move_array_element
+ inc 4,a6
+#ifdef SHARE_CHAR_INT
+ cmp d0,d2
+ bgeu,a move_array_element+4
+ st d0,[a6-4]
+#endif
+ ld [d0],%o0
+ mov d0,a1
+ st %o0,[a6-4]
+ add a6,-4+1,d0
+ st d0,[a1]
+
+ deccc d1
+ bcc,a move_array_lp1+4
+ ld [a0],d0
+
+ b,a end_array
+
+move_array_element:
+ st d0,[a6-4] !
+st_move_array_lp:
+ deccc d1
+ bcc,a move_array_lp1+4
+ ld [a0],d0
+end_array:
+ b,a skip_zero_bits
+
+move_lazy_node:
+ mov d0,a1
+ ldsh [d0-2],d1
+
+ tst d1
+ be move_lazy_node_0
+
+ deccc d1
+ ble move_lazy_node_1
+
+ cmp d1,256
+ bgeu,a move_closure_with_unboxed_arguments
+ inc d1
+
+copy_lazy_node_arguments:
+ ld [a0],a1
+ cmp a1,a0
+ bcs copy_lazy_node_arguments_
+ inc 4,a0
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bcc copy_lazy_node_arguments__
+ inc 4,%g6
+#endif
+ ld [a1],%o0
+ st %o0,[%g6-4]
+ add %g6,1-4,d0
+ deccc d1
+ bpos copy_lazy_node_arguments
+ st d0,[a1]
+
+ b,a skip_zero_bits
+
+copy_lazy_node_arguments_:
+ inc 4,%g6
+copy_lazy_node_arguments__:
+ deccc d1
+ bpos copy_lazy_node_arguments
+ st a1,[%g6-4]
+
+ b,a skip_zero_bits
+
+move_lazy_node_1:
+ ld [a0],a1
+ cmp a1,a0
+ bcs move_lazy_node_1_
+ inc 4,a0
+#ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bcc move_lazy_node_1_
+#endif
+ add %g6,1,d0
+ ld [a1],d1
+ st d0,[a1]
+ mov d1,a1
+move_lazy_node_1_:
+ st a1,[%g6]
+ ba skip_zero_bits
+ inc 8,%g6
+
+move_lazy_node_0:
+ ba skip_zero_bits
+ inc 8,a6
+
+move_closure_with_unboxed_arguments:
+! inc d1
+ srl d1,8,d0
+ beq move_closure_with_unboxed_arguments_1
+ and d1,255,d1
+
+ subcc d1,d0,d1
+ beq copy_non_pointers_of_closure
+ nop
+
+move_pointers_in_closure:
+ ld [a0],a1
+ cmp a1,a0
+ bcs move_pointers_in_closure_
+ inc 4,a0
+# ifdef SHARE_CHAR_INT
+ cmp a1,d2
+ bcc move_pointers_in_closure_
+# endif
+ add a6,1,%o1
+ ld [a1],%o0
+ st %o1,[a1]
+ mov %o0,a1
+
+move_pointers_in_closure_:
+ deccc d1
+ inc 4,a6
+ bne move_pointers_in_closure
+ st a1,[a6-4]
+
+copy_non_pointers_of_closure:
+ deccc d0
+
+ ld [a0],d1
+ inc 4,a0
+
+ inc 4,a6
+ bne copy_non_pointers_of_closure
+ st d1,[a6-4]
+
+ b,a skip_zero_bits
+
+move_closure_with_unboxed_arguments_1:
+ ld [a0],d0
+ inc 8,a6
+ b skip_zero_bits
+ st d0,[a6-8]
+
+end_compact_heap:
+
+#ifdef FINALIZERS
+ ldg (finalizer_list,a0)
+
+restore_finalizer_descriptors:
+ set __Nil-8,%o0
+ cmp %o0,a0
+ beq end_restore_finalizer_descriptors
+ nop
+
+ set e____system__kFinalizer+2,%o0
+ st %o0,[a0]
+ ba restore_finalizer_descriptors
+ ld [a0+4],a0
+
+end_restore_finalizer_descriptors:
+#endif
diff --git a/scopy.s b/scopy.s
new file mode 100644
index 0000000..a0c5ec0
--- /dev/null
+++ b/scopy.s
@@ -0,0 +1,1113 @@
+
+ ldg (heap_p2,a6)
+
+#ifdef COPIED_VECTOR
+ ldg (@flags,%o0)
+ btst 64,%o0
+ bne no_copied_vector4
+ nop
+
+ ldg (heap_size_129,d7)
+ ba copied_vector4
+ sll d7,6,d7
+no_copied_vector4:
+#endif
+ ldg (@heap_size,d7)
+ srl d7,1,d7
+
+copied_vector4:
+ add a6,d7,%o4
+
+ set INT+2,d3
+ set CHAR+2,d4
+
+ ldg (caf_list,d0)
+ tst d0
+ beq end_copy_cafs
+ nop
+
+#ifdef SP_G5
+ dec 4,sp
+#endif
+
+copy_cafs_lp:
+#ifdef SP_G5
+ ld [d0-4],%g1
+#else
+ ld [d0-4],%g5
+#endif
+ add d0,4,a2
+ ld [d0],d5
+#ifdef SP_G5
+ st %g1,[sp]
+#endif
+ call copy_lp2
+ dec d5
+
+#ifdef SP_G5
+ ld [sp],d0
+ addcc d0,0,d0
+#else
+ addcc %g5,0,d0
+#endif
+ bne copy_cafs_lp
+ nop
+
+#ifdef SP_G5
+ inc 4,sp
+#endif
+
+end_copy_cafs:
+
+ ldg (stack_p,a2)
+
+ sub a4,a2,d5
+ deccc 4,d5
+ blu no_call_copy_lp2
+ srl d5,2,d5
+
+ call copy_lp2+4
+ ld [a2],a1
+
+no_call_copy_lp2:
+ ldg (heap_p2,a2)
+
+
+!
+! Copy all referenced nodes to the other semi space
+!
+
+st_copy_lp1:
+ set copy_lp1-8,%o7
+copy_lp1:
+ cmp a2,a6
+ bcc end_copy1
+ nop
+
+ ld [a2],d0
+ btst 2,d0
+ be not_in_hnf_1
+ inc 4,a2
+
+in_hnf_1:
+ lduh [d0-2],d5
+
+ tst d5
+ be copy_array_21
+ cmp d5,2
+ bleu,a copy_lp2
+ dec d5
+
+ cmp d5,256
+ bgeu copy_record_21
+ nop
+
+ ld [%i2+4],%o0
+ btst 1,%o0
+ bne node_without_arguments_part
+ mov d5,d6
+
+in_hnf_1_c:
+ call copy_lp2
+ mov 0,d5
+
+ inc 4,a2
+ sub d6,2,d5
+
+ ba copy_lp2
+ inc copy_lp1-8-in_hnf_1_c,%o7
+
+node_without_arguments_part:
+ bclr 1,%o0
+ st %o0,[%i2+4]
+node_without_arguments_part_c:
+ call copy_lp2
+ clr d5
+ inc 4,a2
+ ba copy_lp1
+ inc copy_lp1-8-node_without_arguments_part_c,%o7
+
+copy_record_21:
+ deccc 258,d5
+ bgu copy_record_arguments_3
+ nop
+
+ blu copy_record_arguments_1
+ lduh [d0-2+2],d5
+
+ deccc 1,d5
+ bgu,a copy_lp2+4
+ ld [a2],a1
+
+ be copy_node_arity1
+ nop
+ ba copy_lp1
+ inc 8,a2
+
+copy_record_arguments_1:
+ tst d5
+ bne copy_lp2
+ mov 0,d5
+ ba copy_lp1
+ inc 4,a2
+
+copy_record_arguments_3:
+#ifdef COPIED_VECTOR
+ ld [a2+4],%o1
+ btst 1,%o1
+ bne record_node_without_arguments_part
+#endif
+ lduh [d0-2+2],d1
+ tst d1
+ be copy_record_arguments_3b
+ inc 2+1,d5
+
+ deccc 1,d1
+ be,a copy_record_arguments_3abb
+ dec 1,d5
+
+ sll d5,2,d5
+ add a2,d5,%o1
+ dec 4,sp
+ st %o1,[sp]
+ mov d1,d6
+ call copy_lp2
+ mov 0,d5
+
+ inc 4,a2
+copy_record_arguments_3_c:
+ call copy_lp2
+ sub d6,1,d5
+
+ ld [sp],a2
+ inc 4,sp
+ ba copy_lp1
+ inc copy_lp1-8-copy_record_arguments_3_c,%o7
+
+copy_record_arguments_3abb:
+ sll d5,2,d6
+copy_record_arguments_3abb_c:
+ call copy_lp2
+ mov 0,d5
+
+ add a2,d6,a2
+ ba copy_lp1
+ inc copy_lp1-8-copy_record_arguments_3abb_c,%o7
+
+copy_record_arguments_3b:
+ sll d5,2,d5
+ ba copy_lp1
+ add a2,d5,a2
+
+#ifdef COPIED_VECTOR
+record_node_without_arguments_part:
+ bclr 1,%o1
+ st %o1,[a2+4]
+ tst d1
+ be,a copy_lp1
+ inc 8,a2
+record_node_without_arguments_part_c:
+ call copy_lp2
+ clr d5
+
+ inc 4,a2
+ ba copy_lp1
+ inc copy_lp1-8-record_node_without_arguments_part_c,%o7
+#endif
+
+not_in_hnf_1:
+ ld [d0-4],d5
+
+ cmp d5,257
+ bge,a copy_unboxed_closure_arguments
+ srl d5,8,d6
+
+ deccc d5
+ bg,a copy_lp2+4
+ ld [a2],a1
+
+copy_node_arity1:
+ call copy_lp2
+ clr %l5
+
+ inc 4,a2
+ ba copy_lp1
+ inc copy_lp1-8-copy_node_arity1,%o7
+
+copy_unboxed_closure_arguments:
+! srl d5,8,d6
+ be copy_unboxed_closure_arguments1
+ andcc d5,255,d5
+
+ subcc d5,d6,d5
+ be no_pointers_in_unboxed_closure
+ sll d6,2,d6
+
+copy_unboxed_closure_arguments_c:
+ call copy_lp2
+ dec d5
+
+ add a2,d6,a2
+ ba copy_lp1
+ inc copy_lp1-8-copy_unboxed_closure_arguments_c,%o7
+
+no_pointers_in_unboxed_closure:
+ ba copy_lp1
+ add a2,d6,a2
+
+copy_unboxed_closure_arguments1:
+ ba copy_lp1
+ inc 8,a2
+
+copy_array_21:
+ ld [a2+4],d1
+ ld [a2],d5
+ inc 8,a2
+ tst d1
+ be,a copy_array_21_a
+ deccc 1,d5
+
+ lduh [d1-2],d0
+ lduh [d1-2+2],d1
+ dec 256,d0
+ tst d1
+ be copy_array_21_b
+ cmp d0,d1
+ be copy_array_21_r_a
+ nop
+
+copy_array_21_ab:
+ deccc 1,d5
+ bcs,a copy_lp1
+ cmp a2,a6
+
+ sub d0,d1,d0
+ sll d0,2,d0
+ dec 1,d1
+
+ mov d5,d6
+ st d1,[sp-4]
+ st d0,[sp-8]
+ dec 8,sp
+copy_array_21_lp_ab:
+ call copy_lp2
+ ld [sp+4],d5
+
+ ld [sp],%o1
+ deccc d6
+ bcc copy_array_21_lp_ab
+ add a2,%o1,a2
+
+ inc 8,sp
+ ba copy_lp1
+ inc copy_lp1-8-copy_array_21_lp_ab,%o7
+
+copy_array_21_b:
+ dec 1,d0
+ mov 0,d2
+mul_array_length_lp_1:
+ deccc d0
+ bcc mul_array_length_lp_1
+ add d2,d5,d2
+
+ sll d2,2,d2
+ ba copy_lp1
+ add a2,d2,a2
+
+copy_array_21_r_a:
+ dec 1,d0
+ mov 0,d2
+mul_array_length_lp_2:
+ deccc d0
+ bcc mul_array_length_lp_2
+ add d2,d5,d2
+
+ subcc d2,1,d5
+copy_array_21_a:
+ bcc,a copy_lp2+4
+ ld [a2],a1
+
+ b,a copy_lp1
+
+!
+! Copy root nodes to the other semi-space
+!
+
+copy_lp2:
+ ld [a2],a1 !
+
+continue_after_selector_2:
+ ld [a1],d0
+ btst 2,d0
+ bne in_hnf_2
+ btst 1,d0
+ bne already_copied_2
+ bclr 1,d0
+
+ ldsb [d0-1],d2
+ tst d2
+ be copy_arity_0_node2_
+ mov d0,a0
+
+copy_node2_1_:
+ deccc 2,d2
+ bl copy_arity_1_node2
+ nop
+
+copy_node2_3:
+ st %g6,[%i2]
+ inc 4,%i2
+ st d0,[%g6]
+ or %g6,1,a0
+ st a0,[a1]
+ ld [a1+4],%o0
+ inc 8,a1
+ st %o0,[%g6+4]
+ inc 8,%g6
+
+cp_arg_lp2:
+ ld [a1],%o0
+ inc 4,a1
+ st %o0,[%g6]
+ deccc d2
+ bpos cp_arg_lp2
+ inc 4,%g6
+
+ deccc d5
+ bpos,a copy_lp2+4
+ ld [a2],a1
+
+ retl
+ nop
+
+copy_arity_1_node2:
+ bcc copy_selector_2
+ nop
+
+copy_arity_1_node2_:
+ st %g6,[%i2]
+ or %g6,1,a0
+ st a0,[a1]
+ ld [a1+4],%o0
+ st d0,[%g6]
+ inc 4,a2
+ st %o0,[%g6+4]
+
+ deccc d5
+ bpos copy_lp2
+ inc 12,%g6
+
+ retl
+ nop
+
+copy_indirection_2:
+ mov a1,d1
+ ld [a1+4],a1
+
+ ld [a1],d0
+
+ btst 2,d0
+ bne in_hnf_2
+
+ btst 1,d0
+ bne already_copied_2
+ bclr 1,d0
+
+ ldsb [d0-1],d2
+ tst d2
+ be copy_arity_0_node2_
+ mov d0,a0
+
+ cmp d2,-2
+ bne copy_node2_1_
+ nop
+
+skip_indirections_2:
+ ld [a1+4],a1
+ ld [a1],d0
+
+ btst 2,d0
+ bne update_indirection_list_2
+
+ btst 1,d0
+ bne update_indirection_list_2
+ bclr 1,d0
+
+ ld [d0-4],%o0
+ cmp %o0,-2
+ be skip_indirections_2
+ mov d0,a0
+
+update_indirection_list_2:
+ add d1,4,a0
+ ld [a0],d1
+ st a1,[a0]
+ cmp a1,d1
+ bne update_indirection_list_2
+ nop
+
+ b,a continue_after_selector_2
+
+copy_selector_2:
+ inccc 4,d2
+ be copy_indirection_2
+ nop
+ bl,a copy_record_selector_2
+ inccc 1,d2
+
+ ld [a0-8],d2
+
+ ld [a1+4],a0
+ ld [a0],d1
+ btst 2,d1
+ be copy_arity_1_node2_
+ nop
+
+ ldsh [d1-2],%g1
+ cmp %g1,2
+ bleu copy_selector_2_
+ nop
+
+ ld [a0+8],%g1
+ ld [%g1],%g1
+ btst 1,%g1
+ bne copy_arity_1_node2_
+ nop
+
+copy_selector_2_:
+ ld [d2+4],%g1
+ mov a1,d2
+
+ mov %o7,%o5
+
+ dec 4,sp
+ call %g1
+ st %o7,[sp]
+
+ mov %o5,%o7
+
+ st a0,[d2+4]
+ set __indirection,%g1
+ st %g1,[d2]
+
+ ba continue_after_selector_2
+ mov a0,a1
+
+copy_record_selector_2:
+ beq copy_strict_record_selector_2
+ ld [a0-8],d2
+
+ ld [a1+4],a0
+ ld [a0],d1
+ btst 2,d1
+ be copy_arity_1_node2_
+ nop
+
+ ldsh [d1-2],%g1
+ cmp %g1,258
+ bleu copy_selector_2_
+ nop
+
+#ifdef COPIED_VECTOR
+ ld [a0+8],%o3
+ ldg (heap_p1,%o1)
+ ldg (heap_copied_vector,%g1)
+ sub %o3,%o1,%o3
+ srl %o3,2+1,%o3
+
+ tstmbit (%g1,%o3,d1,%o0,%o1,%o2)
+ bne copy_arity_1_node2_
+ nop
+#endif
+ b,a copy_selector_2_
+
+copy_strict_record_selector_2:
+ ld [a1+4],a0
+ ld [a0],d1
+ btst 2,d1
+ be copy_arity_1_node2_
+ nop
+
+ ldsh [d1-2],%g1
+ cmp %g1,258
+ bleu copy_strict_record_selector_2_
+ nop
+
+#ifdef COPIED_VECTOR
+ ld [a0+8],%o3
+ ldg (heap_p1,%o1)
+ ldg (heap_copied_vector,%g1)
+ sub %o3,%o1,%o3
+ srl %o3,2+1,%o3
+
+ tstmbit (%g1,%o3,d1,%o0,%o1,%o2)
+ bne copy_arity_1_node2_
+ nop
+#endif
+
+copy_strict_record_selector_2_:
+ ld [d2+4],%g1
+
+ mov a1,d0
+ mov a0,a1
+ mov d0,a0
+
+ mov %o7,%o5
+
+ dec 4,sp
+ call %g1
+ st %o7,[sp]
+
+ mov %o5,%o7
+
+ mov a0,a1
+ ba in_hnf_2
+ ld [a1],d0
+
+copy_arity_0_node2_:
+ st d0,[%o4-12]
+ dec 12,%o4
+ st %o4,[%i2]
+ or %o4,1,d2
+ st d2,[a1]
+ inc 4,%i2
+
+ deccc %l5
+ bpos,a copy_lp2+4
+ ld [a2],a1
+
+ retl
+ nop
+
+in_hnf_2: lduh [d0-2],d2
+ tst d2
+ beq copy_arity_0_node2
+
+ cmp d2,256
+ bgeu copy_record_2
+ deccc 2,d2
+
+ bgu copy_hnf_node2_3
+ st a6,[a2]
+
+ bcs copy_hnf_node2_1
+ or a6,1,a0
+
+ st d0,[a6]
+ ld [a1+4],%o0
+ st a0,[a1]
+ ld [a1+8],%o1
+ st %o0,[a6+4]
+ inc 4,a2
+ st %o1,[a6+8]
+ inc 12,a6
+
+ deccc d5
+ bpos,a copy_lp2+4
+ ld [a2],a1
+
+ retl
+ nop
+
+copy_hnf_node2_1:
+ st d0,[%g6]
+ inc 4,%i2
+ st a0,[a1]
+ ld [a1+4],%o0
+ st %o0,[%g6+4]
+ inc 8,%g6
+
+ deccc d5
+ bpos,a copy_lp2+4
+ ld [a2],a1
+
+ retl
+ nop
+
+copy_hnf_node2_3:
+ inc 4,a2
+ st d0,[a6]
+ or a6,1,d1
+ st d1,[a1]
+ ld [a1+4],%o0
+ st %o0,[a6+4]
+
+ ld [a1+8],a0
+ ld [a0],d1
+ btst 1,d1
+ bne arguments_already_copied_2
+ inc 12,a6
+
+ st a6,[a6-4]
+ or a6,1,a1
+ st d1,[a6]
+ inc 4,a6
+ st a1,[a0]
+ inc 4,a0
+
+cp_hnf_arg_lp2:
+ ld [a0],%o0
+ inc 4,a0
+ st %o0,[a6]
+ deccc d2
+ bg cp_hnf_arg_lp2
+ inc 4,a6
+
+ deccc d5
+ bpos,a copy_lp2+4
+ ld [a2],a1
+
+ retl
+ nop
+
+arguments_already_copied_2:
+ deccc %l5
+ bpos copy_lp2
+ st d1,[%g6-4]
+
+ retl
+ nop
+
+copy_arity_0_node2:
+ cmp d0,d3
+ blu copy_real_file_or_string_2
+
+ cmp d0,d4
+ bgu copy_normal_hnf_0_2
+ nop
+
+copy_int_bool_or_char_2:
+#ifdef SHARE_CHAR_INT
+ bne no_char_2
+ cmp d3,d0
+
+ ldub [a1+7],d2
+ set static_characters,a0
+ sll d2,3,d2
+ add a0,d2,a0
+ st a0,[%i2]
+
+ deccc %l5
+ bpos copy_lp2
+ inc 4,%i2
+
+ retl
+ nop
+
+no_char_2:
+ bne no_small_int_or_char_2
+ ld [a1+4],%o0
+
+ cmp %o0,33
+ bcc no_small_int_or_char_2
+ sll %o0,3,d2
+
+ set small_integers,a0
+ add a0,d2,a0
+ st a0,[%i2]
+
+ deccc %l5
+ bpos copy_lp2
+ inc 4,%i2
+
+ retl
+ nop
+
+no_small_int_or_char_2:
+#else
+no_small_int_or_char_2:
+ ld [a1+4],%o0
+#endif
+ st d0,[%o4-8]
+ dec 8,%o4
+ st %o0,[%o4+4]
+ or %o4,1,d2
+ st %o4,[%i2]
+ inc 4,%i2
+
+ deccc %l5
+ bpos copy_lp2
+ st d2,[a1]
+
+ retl
+ nop
+
+copy_normal_hnf_0_2:
+#ifdef SHARE_CHAR_INT
+ sub d0,12+2,a0
+ st a0,[%i2]
+#else
+ st d0,[%o4-4]
+ dec 4,%o4
+ st %o4,[%i2]
+ or %o4,1,d2
+ st d2,[a1]
+#endif
+ deccc %l5
+ bpos copy_lp2
+ inc 4,%i2
+
+ retl
+ nop
+
+copy_real_file_or_string_2:
+ set __STRING__+2,%o0
+ cmp d0,%o0
+ bleu copy_string_or_array_2
+ nop
+
+copy_real_or_file_2:
+ st d0,[%o4-12]
+ ld [a1+4],%o0
+ add %o4,1-12,d2
+ st d2,[a1]
+ ld [a1+8],%o1
+ st %o0,[%o4-8]
+ inc 4,a2
+ st %o1,[%o4-4]
+ dec 12,%o4
+
+ deccc d5
+ bge copy_lp2
+ st %o4,[a2-4]
+
+ retl
+ nop
+
+already_copied_2:
+ st d0,[a2]
+ deccc d5
+ bpos copy_lp2
+ inc 4,a2
+
+ retl
+ nop
+
+copy_string_or_array_2:
+ bne copy_array_2
+ mov a1,a0
+
+ ldg (heap_p1,d1)
+ sub a1,d1,d1
+ cmp d1,d7
+ bcc copy_string_constant
+ inc 4,a2
+
+ ld [a0+4],d2
+ sub %o4,8,a1
+
+ inc 3,d2
+ srl d2,2,d2
+
+ sll d2,2,d1
+ sub a1,d1,a1
+
+ st a1,[a2-4]
+ add a1,1,d0
+
+ mov a1,%o4
+ ld [a0],%o0
+ inc 4,a1
+ st %o0,[a1-4]
+ st d0,[a0]
+ inc 4,a0
+
+cp_s_arg_lp2:
+ ld [a0],%o0
+ inc 4,a0
+ st %o0,[a1]
+ inc 4,a1
+ deccc d2
+ bge,a cp_s_arg_lp2+4
+ ld [a0],%o0
+
+ deccc d5
+ bge,a copy_lp2+4
+ ld [a2],a1
+
+ retl
+ nop
+
+copy_string_constant:
+ deccc d5
+ bge copy_lp2
+ st a1,[a2-4]
+
+ retl
+ nop
+
+copy_array_2:
+ ld [a0+8],d0
+
+ tst d0
+ be copy_array_a2
+ ld [a0+4],d2
+
+ lduh [d0-2],d1
+ tst d1
+ be copy_strict_basic_array_2
+ nop
+
+ sub d1,257,d0
+ mov d2,d1
+ mov 0,d2
+mul_length_2:
+ deccc d0
+ bcc mul_length_2
+ add d2,d1,d2
+
+copy_array_a2:
+ mov a6,a1
+
+ sll d2,2,d1
+ add a6,d1,a6
+ inc 12,a6
+
+ st a1,[a2]
+ inc 4,a2
+ add a1,1,d0
+
+ ld [a0],%o0
+ inc 4,a1
+ st %o0,[a1-4]
+ st d0,[a0]
+ inc 4,a0
+
+ ba cp_s_arg_lp2
+ inc 1,d2
+
+copy_strict_basic_array_2:
+ cmp d0,d3
+ beq copy_int_array_2
+ nop
+
+ set BOOL+2,%o0
+ cmp d0,%o0
+ beq,a copy_bool_array_2
+ inc 3,d2
+
+ add d2,d2,d2
+copy_int_array_2:
+ sll d2,2,d1
+ sub %o4,12,a1
+ sub a1,d1,a1
+
+ st a1,[a2]
+ inc 4,a2
+ add a1,1,d0
+
+ ld [a0],%o0
+ mov a1,%o4
+ inc 4,a1
+ st %o0,[a1-4]
+ st d0,[a0]
+ inc 4,a0
+
+ ba cp_s_arg_lp2
+ inc d2
+
+copy_bool_array_2:
+ ba copy_int_array_2
+ srl d2,2,d2
+
+copy_record_2:
+ deccc 258-2,d2
+ bgu,a copy_record_node2_3
+ lduh [d0-2+2],%o0
+
+ bcs copy_record_node2_1
+ nop
+
+ st a6,[a2]
+ st d0,[a6]
+ add a6,1,a0
+ st a0,[a1]
+ ld [a1+4],%o1
+ inc 4,a2
+ st %o1,[a6+4]
+ ld [a1+8],%o1
+ st %o1,[a6+8]
+
+ deccc d5
+ bge copy_lp2
+ inc 12,a6
+
+ retl
+ nop
+
+copy_record_node2_1:
+ st a6,[a2]
+ st d0,[a6]
+ add a6,1,a0
+ st a0,[a1]
+ ld [a1+4],%o1
+ inc 4,a2
+ st %o1,[a6+4]
+
+ deccc d5
+ bge copy_lp2
+ inc 8,a6
+
+ retl
+ nop
+
+copy_record_node2_3:
+ tst %o0
+ beq copy_strict_record_node2_3
+ nop
+
+ st a6,[a2]
+ st d0,[a6]
+ add a6,1,d1
+ st d1,[a1]
+ ld [a1+4],%o1
+ inc 4,a2
+ st %o1,[a6+4]
+ ld [a1+8],a0
+
+#ifdef COPIED_VECTOR
+ ldg (heap_copied_vector,a1)
+ ldg (heap_p1,%o1)
+ sub a0,%o1,d0
+ srl d0,2+1,d0
+ tstmbit (a1,d0,d1,%o0,%o1,%o2)
+ bne record_arguments_already_copied_2
+ bset %o0,%o1
+
+ stb %o1,[a1+d1]
+#endif
+ add a6,12,a1
+ st a1,[a6+8]
+ ld [a0],%o1
+ inc 1,a1
+ st a1,[a0]
+ inc 4,a0
+ st %o1,[a6+12]
+ inc 16,a6
+ dec 1,d2
+ ld [a0],%o1
+cp_record_arg_lp2:
+ inc 4,a0
+ st %o1,[a6]
+ inc 4,a6
+ deccc 1,d2
+ bcc,a cp_record_arg_lp2
+ ld [a0],%o1
+
+ deccc d5
+ bge,a copy_lp2+4
+ ld [a2],a1
+
+ retl
+ nop
+
+copy_strict_record_node2_3:
+ dec 12,%o4
+ st %o4,[a2]
+ st d0,[%o4]
+ add %o4,1,d1
+ st d1,[a1]
+ ld [a1+4],%o1
+ inc 4,a2
+ st %o1,[%o4+4]
+ ld [a1+8],a0
+
+#ifdef COPIED_VECTOR
+ ldg (heap_copied_vector,a1)
+ ldg (heap_p1,%o1)
+ sub a0,%o1,d0
+ srl d0,2+1,d0
+ tstmbit (a1,d0,d1,%o0,%o1,%o2)
+ bne strict_record_arguments_already_copied_2
+ bset %o0,%o1
+
+ stb %o1,[a1+d1]
+#endif
+ inc d2
+ sll d2,2,d2
+ sub %o4,d2,a1
+ st a1,[%o4+8]
+ ld [a0],%o1
+ add a1,1,%o0
+ st %o0,[a0]
+ inc 4,a0
+ st %o1,[a1]
+ mov a1,%o4
+ dec 8,d2
+ ld [a0],%o1
+
+cp_strict_record_arg_lp2:
+ inc 4,a0
+ st %o1,[a1+4]
+ inc 4,a1
+ deccc 4,d2
+ bcc,a cp_strict_record_arg_lp2
+ ld [a0],%o1
+
+ deccc d5
+ bge,a copy_lp2+4
+ ld [a2],a1
+
+ retl
+ nop
+
+
+#ifdef COPIED_VECTOR
+strict_record_arguments_already_copied_2:
+ ld [a0],%o0
+ dec 1,%o0
+
+ deccc d5
+ bge copy_lp2
+ st %o0,[%o4+8]
+
+ retl
+ nop
+
+
+record_arguments_already_copied_2:
+ ld [a0],%o0
+ inc 12,a6
+
+ deccc d5
+ bge copy_lp2
+ st %o0,[a6-4]
+
+ retl
+ nop
+#endif
+
+end_copy1:
+
+#ifdef FINALIZERS
+ set finalizer_list,a0
+ set free_finalizer_list,a1
+ ld [a0],a2
+
+determine_free_finalizers_after_copy:
+ ld [a2],d0
+ btst 1,d0
+ beq finalizer_not_used_after_copy
+ nop
+
+ ld [a2+4],a2
+ dec d0
+ st d0,[a0]
+ b determine_free_finalizers_after_copy
+ add d0,4,a0
+
+finalizer_not_used_after_copy:
+ set __Nil-8,%o0
+ cmp a2,%o0
+ beq end_finalizers_after_copy
+ nop
+
+ st a2,[a1]
+ add a2,4,a1
+ b determine_free_finalizers_after_copy
+ ld [a2+4],a2
+
+end_finalizers_after_copy:
+ st a2,[a0]
+ st a2,[a1]
+#endif
diff --git a/sfileIO2.s b/sfileIO2.s
new file mode 100644
index 0000000..2e3b86f
--- /dev/null
+++ b/sfileIO2.s
@@ -0,0 +1,698 @@
+
+! File: cgsfileIO2.s
+! Author: John van Groningen
+! At: University of Nijmegen
+! Machine: Sun 4
+
+#define SP_G5
+
+#define d0 %l0
+#define d1 %l1
+#define d2 %l2
+#define d3 %l3
+#define d4 %l4
+#define d5 %l5
+#define d6 %l6
+#define d7 %l7
+#define a0 %i0
+#define a1 %i1
+#define a2 %i2
+#define a3 %i3
+#define a4 %i4
+#define a5 %i5
+#define a6 %g6
+#ifdef SP_G5
+# define sp %g5
+#else
+# define sp %g7
+#endif
+
+ .data
+
+ .align 8
+
+tmp_real: .double 0
+
+ .text
+
+ .global stderrF
+ .global stdioF
+ .global openF
+ .global closeF
+ .global reopenF
+ .global readFC
+ .global readFI
+ .global readFR
+ .global readFS
+ .global readLineF
+ .global writeFC
+ .global writeFI
+ .global writeFR
+ .global writeFS
+ .global endF
+ .global errorF
+ .global positionF
+ .global seekF
+ .global shareF
+
+ .global openSF
+ .global readSFC
+ .global readSFI
+ .global readSFR
+ .global readSFS
+ .global readLineSF
+ .global endSF
+ .global positionSF
+ .global seekSF
+
+! imports
+
+ .global @IO_error
+ .global @open_stdio
+ .global @open_stderr
+ .global @open_file
+ .global @re_open_file
+ .global @close_file
+ .global @file_read_char
+ .global @file_read_int
+ .global @file_read_real
+ .global @file_read_string
+ .global @file_read_line
+ .global @file_write_char
+ .global @file_write_int
+ .global @file_write_real
+ .global @file_write_string
+ .global @file_end
+ .global @file_error
+ .global @file_position
+ .global @file_seek
+ .global @file_share
+
+ .global @open_s_file
+ .global @file_read_s_char
+ .global @file_read_s_int
+ .global @file_read_s_real
+ .global @file_read_s_string
+ .global @file_read_s_line
+ .global @file_s_end
+ .global @file_s_position
+ .global @file_s_seek
+
+ .global collect_0
+ .global collect_1
+ .global out_of_memory_4
+
+ .global __STRING__
+
+stdioF: call @open_stdio
+ nop
+
+ mov %o0,%l1
+ mov -1,%l0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+stderrF: call @open_stderr
+ nop
+
+ mov %o0,%l1
+ mov -1,%l0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+openF: mov %l0,%o1
+ call @open_file
+ add %i0,4,%o0
+
+ orcc %o0,%g0,%l1
+ mov -1,%l0
+ ld [sp],%o7
+ clr %l2
+ bpos,a openF_1
+ mov -1,%l2
+openF_1:
+ retl
+ inc 4,sp
+
+closeF: call @close_file
+ mov %l1,%o0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+reopenF:
+ mov %l2,%o0
+ call @re_open_file
+ mov %l0,%o1
+
+ mov %l2,%l1
+ mov %o0,%l2
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+readFC:
+ call @file_read_char
+ mov %l1,%o0
+
+ mov %o0,%l2
+ addcc %o0,1,%g0
+ be readFC_eof
+ set -1,%l0
+
+ ld [sp],%o7
+ set -1,%l3
+ retl
+ inc 4,sp
+
+readFC_eof:
+ ld [sp],%o7
+ clr %l2
+ clr %l3
+ retl
+ inc 4,sp
+
+readFI:
+ sub sp,4,%o1
+ call @file_read_int
+ mov %l1,%o0
+
+ ld [sp-4],%l2
+ set -1,%l0
+ ld [sp],%o7
+ mov %o0,%l3
+ retl
+ inc 4,sp
+
+readFR:
+ set tmp_real,%o1
+ call @file_read_real
+ mov %l1,%o0
+
+ sethi %hi tmp_real,%g1
+ ldd [%g1+%lo tmp_real],%f0
+ mov %o0,%l2
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+readFS:
+ add %l0,8+3,%l5
+ srl %l5,2,%l5
+ subcc %l7,%l5,%l7
+ bneg readFS_gc
+ nop
+
+readFS_r_gc:
+ add d7,%l5,d7
+ mov %l2,%l4
+ mov %g6,%l3
+
+ set __STRING__+2,%o0
+ st %o0,[%g6]
+ inc 4,%g6
+
+ mov %g6,%o2
+ mov %l0,%o1
+ call @file_read_string
+ mov %l2,%o0
+
+readFS_end:
+ inc 3,d0
+ and d0,-4,d0
+ inc 4,%g6
+ add a6,d0,a6
+ srl d0,2,d0
+ inc 2,d0
+ sub d7,d0,d7
+
+ mov %l3,%i0
+ mov %l4,%l1
+ ld [sp],%o7
+ set -1,d0
+ retl
+ inc 4,sp
+
+readFS_gc: dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+ b,a readFS_r_gc
+
+readLineF:
+ mov 32+2,%l5
+ subcc %l7,%l5,%g0
+ bneg readLineF_gc
+ nop
+
+readLineF_r_gc:
+ mov %l1,%l4
+ mov a6,%l3
+
+ set __STRING__+2,%o0
+ st %o0,[a6]
+ inc 4,a6
+
+ add a6,4,%o2
+ sub %l7,2,%o1
+ sll %o1,2,%o1
+ call @file_read_line
+ mov %l4,%o0
+
+ orcc %o0,%g0,%l0
+ bpos readFS_end
+ st %l0,[a6]
+
+ tst %l5
+ be out_of_memory_4
+ nop
+
+ sub %l7,2,%l0
+ sll %l0,2,%l0
+ st %l0,[a6]
+ inc 4,a6
+ add a6,%l0,a6
+
+ add %l7,32+2,%l5
+ neg %l5,%l7
+ mov %l3,%i0
+
+ dec 4,sp
+ call collect_1
+ st %o7,[sp]
+
+ add %l7,%l5,%l7
+ mov %i0,%i1
+
+ ld [%i1+4],%l0
+ inc 8,%i1
+ add %l0,3,%l1
+ srl %l1,2,%l1
+ dec 2,%l7
+ sub %l7,%l1,%l7
+
+ set __STRING__+2,%o0
+ st %o0,[a6]
+ mov a6,%l3
+ st %l0,[a6+4]
+ b st_copy_string1
+ inc 8,a6
+copy_st_lp1:
+ inc 4,%i1
+ st %g1,[a6]
+ inc 4,a6
+st_copy_string1:
+ deccc 1,%l1
+ bcc,a copy_st_lp1
+ ld [%i1],%g1
+
+ mov a6,%o2
+ sll %l7,2,%o1
+ call @file_read_line
+ mov %l4,%o0
+
+ orcc %o0,%g0,%l0
+ bneg out_of_memory_4
+ mov %l3,%i0
+
+ ld [%i0+4],%g1
+
+ add %l0,3,%l1
+
+ add %g1,%l0,%g1
+ st %g1,[%i0+4]
+
+ srl %l1,2,%l1
+ sub %l7,%l1,%l7
+ sll %l1,2,%l1
+ add a6,%l1,a6
+
+ mov %l4,%l1
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+readLineF_gc:
+ sub %l7,%l5,%l7
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+ add %l7,%l5,%l7
+ b readLineF_r_gc
+ clr %l5
+
+writeFC:
+ mov %l1,%o1
+ call @file_write_char
+ mov %l2,%o0
+
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+writeFI:
+ mov %l1,%o1
+ call @file_write_int
+ mov %l2,%o0
+
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+writeFR:
+ sethi %hi tmp_real,%g1
+ std %f0,[%g1+%lo tmp_real]
+ mov %l1,%o2
+ call @file_write_real
+ ldd [%g1+%lo tmp_real],%o0
+
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+writeFS:
+ mov %l1,%o1
+ call @file_write_string
+ add %i0,4,%o0
+
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+endF:
+ call @file_end
+ mov %l1,%o0
+
+ mov %o0,%l2
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+errorF:
+ call @file_error
+ mov %l1,%o0
+
+ mov %o0,%l2
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+positionF:
+ call @file_position
+ mov %l1,%o0
+
+ mov %o0,%l2
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+seekF:
+ mov %l0,%o2
+ mov %l1,%o1
+ mov %l3,%o0
+ call @file_seek
+ mov %l3,%l1
+
+ mov %o0,%l2
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+shareF:
+ call @file_share
+ mov %l1,%o0
+
+ ld [sp],%o7
+ set -1,%l0
+ retl
+ inc 4,sp
+
+openSF: mov %l0,%o1
+ call @open_s_file
+ add %i0,4,%o0
+
+ orcc %o0,%g0,%l1
+ mov 0,%l0
+ ld [sp],%o7
+ clr %l2
+ bpos,a openSF_1
+ mov -1,%l2
+openSF_1:
+ retl
+ inc 4,sp
+
+readSFC:
+ sub sp,4,%o1
+ st %l0,[sp-4]
+ call @file_read_s_char
+ mov %l1,%o0
+
+ mov %o0,%l2
+ addcc %o0,1,%g0
+ be readSFC_eof
+ ld [sp-4],%l0
+
+ ld [sp],%o7
+ mov -1,%l3
+ retl
+ inc 4,sp
+
+readSFC_eof:
+ clr %l2
+ ld [sp],%o7
+ clr %l3
+ retl
+ inc 4,sp
+
+readSFI:
+ sub sp,4,%o2
+ st %l0,[sp-4]
+ sub sp,8,%o1
+ call @file_read_s_int
+ mov %l1,%o0
+
+ ld [sp-8],%l2
+ ld [sp-4],%l0
+ ld [sp],%o7
+ mov %o0,%l3
+ retl
+ inc 4,sp
+
+readSFR:
+ sub sp,4,%o2
+ st %l0,[sp-4]
+ set tmp_real,%o1
+ call @file_read_s_real
+ mov %l1,%o0
+
+ sethi %hi tmp_real,%g1
+ ldd [%g1+%lo tmp_real],%f0
+ ld [sp-4],%l0
+ ld [sp],%o7
+ mov %o0,%l2
+ retl
+ inc 4,sp
+
+readSFS:
+ add %l0,8+3,%l5
+ srl %l5,2,%l5
+ subcc %l7,%l5,%l7
+ bneg readSFS_gc
+ nop
+
+readSFS_r_gc:
+ add %l7,%l5,%l7
+ mov %l2,%l4
+ mov %g6,%l3
+
+ set __STRING__+2,%o0
+ st %o0,[%g6]
+ inc 4,%g6
+
+ sub sp,4,%o3
+ st %l1,[sp-4]
+ mov %g6,%o2
+ mov %l0,%o1
+ call @file_read_s_string
+ mov %l2,%o0
+
+readSFS_end:
+ inc 3,%l0
+ and %l0,-4,%l0
+ inc 4,%g6
+ add %g6,%l0,%g6
+ srl %l0,2,%l0
+ inc 4,%l0
+ sub %l7,%l0,%l7
+
+ mov %l3,%i0
+ mov %l4,%l1
+ ld [sp],%o7
+ ld [sp-4],%l0
+ retl
+ inc 4,sp
+
+readSFS_gc: dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+ b,a readSFS_r_gc
+
+readLineSF:
+ mov 32+2,%l5
+ subcc %l7,%l5,%g0
+ bneg readLineSF_gc
+ nop
+
+readLineSF_r_gc:
+ st %l0,[sp-4]
+ mov %l1,%l4
+ mov %g6,%l3
+
+ set __STRING__+2,%o0
+ st %o0,[%g6]
+ inc 4,%g6
+
+ sub sp,4,%o3
+ add %g6,4,%o2
+ sub %l7,2,%o1
+ sll %o1,2,%o1
+ call @file_read_s_line
+ mov %l4,%o0
+
+ orcc %o0,%g0,%l0
+ bpos readSFS_end
+ st %l0,[%g6]
+
+ tst %l5
+ be out_of_memory_4
+ nop
+
+ sub %l7,2,%l0
+ sll %l0,2,%l0
+ st %l0,[%g6]
+ inc 4,%g6
+ add %g6,%l0,%g6
+
+ add %l7,32+2,%l5
+ neg %l5,%l7
+ mov %l3,%i0
+
+ dec 4,sp
+ call collect_1
+ st %o7,[sp]
+
+ add %l7,%l5,%l7
+
+ mov %i0,%i1
+ ld [%i1+4],%l0
+ inc 8,%i1
+ add %l0,3,%l1
+ srl %l1,2,%l1
+ dec 2,%l7
+ sub %l7,%l1,%l7
+
+ set __STRING__+2,%o0
+ st %o0,[%g6]
+ mov %g6,%l3
+ st %l0,[%g6+4]
+ b st_copy_string2
+ inc 8,%g6
+
+copy_st_lp2:
+ inc 4,%i1
+ st %g1,[%g6]
+ inc 4,%g6
+st_copy_string2:
+ deccc 1,%l1
+ bcc,a copy_st_lp2
+ ld [%i1],%g1
+
+ sub sp,4,%o3
+ mov %g6,%o2
+ sll %l7,2,%o1
+ call @file_read_s_line
+ mov %l4,%o0
+
+ orcc %o0,%g0,%l0
+ bneg out_of_memory_4
+ mov %l3,%i0
+
+ ld [%i0+4],%g1
+ add %l0,3,%l1
+
+ add %g1,%l0,%g1
+ st %g1,[%i0+4]
+
+ srl %l1,2,%l1
+ sub %l7,%l1,%l7
+ sll %l1,2,%l1
+ add %g6,%l1,%g6
+
+ ld [sp-4],%l0
+ ld [sp],%o7
+ mov %l4,%l1
+ retl
+ inc 4,sp
+
+readLineSF_gc:
+ sub %l7,%l5,%l7
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+ add %l7,%l5,%l7
+ b readLineSF_r_gc
+ clr %l5
+
+endSF:
+ mov %l0,%o1
+ call @file_s_end
+ mov %l1,%o0
+
+ ld [sp],%o7
+ mov %o0,%l0
+ retl
+ inc 4,sp
+
+positionSF:
+ mov %l0,%o1
+ call @file_s_position
+ mov %l1,%o0
+
+ ld [sp],%o7
+ mov %o0,%l0
+ retl
+ inc 4,sp
+
+seekSF:
+ sub sp,4,%o3
+ st %l2,[sp-4]
+ mov %l0,%o2
+ mov %l1,%o1
+ mov %l3,%o0
+ call @file_s_seek
+ mov %l3,%l1
+
+ ld [sp-4],%l0
+ ld [sp],%o7
+ mov %o0,%l2
+ retl
+ inc 4,sp
diff --git a/smark.s b/smark.s
new file mode 100644
index 0000000..da66f71
--- /dev/null
+++ b/smark.s
@@ -0,0 +1,1744 @@
+
+! record selectors not yet implemented
+
+ ldg (heap_size_33,d0)
+
+_fill_ones: btst 3,d0
+ beq _end_fill_ones
+ mov -1,%o1
+
+ stb %o1,[%o4+d0]
+ ba _fill_ones
+ inc 1,d0
+_end_fill_ones:
+
+ clr d4
+ ldg (heap_size_33,d7)
+
+ sethi %hi 0x80000000,%g3
+
+ sub sp,2000,d3
+ sll d7,5,d7
+
+ ldg (caf_list,d0)
+
+ st a4,[sp-4]
+
+ tst d0
+ be _end_mark_cafs
+ dec 4,sp
+
+_mark_cafs_lp:
+ ld [d0-4],%g5
+ add d0,4,a2
+ ld [d0],d0
+ sll d0,2,d0
+ add a2,d0,a4
+
+ dec 4,sp
+ call _mark_stack_nodes
+ st %o7,[sp]
+
+ addcc %g5,0,d0
+ bne _mark_cafs_lp
+ nop
+
+_end_mark_cafs:
+ ldg (stack_p,a2)
+
+ ld [sp],a4
+ call _mark_stack_nodes
+ st %o7,[sp]
+
+#ifdef FINALIZERS
+ set finalizer_list,a0
+ set free_finalizer_list,a1
+
+ ld [a0],a2
+determine_free_finalizers_after_mark:
+ set __Nil-8,%o0
+ cmp %o0,a2
+ beq end_finalizers_after_mark
+ sub a2,d6,d1
+
+ srl d1,2,d1
+
+ srl d1,3,%o0
+ andn %o0,3,%o0
+ ld [%o4+%o0],%o1
+ srl %g3,d1,%o3
+
+ btst %o3,%o1
+ beq finalizer_not_used_after_mark
+ nop
+
+ add a2,4,a0
+ ba determine_free_finalizers_after_mark
+ ld [a2+4],a2
+
+finalizer_not_used_after_mark:
+ st a2,[a1]
+ add a2,4,a1
+
+ ld [a2+4],a2
+ ba determine_free_finalizers_after_mark
+ st a2,[a0]
+
+end_finalizers_after_mark:
+ st a2,[a1]
+#endif
+
+ dec 4,sp
+ call add_garbage_collect_time
+ st %o7,[sp]
+
+ ldg (heap_size_33,d5)
+ inc 3,d5
+ srl d5,2,d5
+
+ stg (d5,bit_counter)
+ stg (%o4,bit_vector_p)
+
+ sll d4,2,d4
+
+ ldg (heap_size_33,d0)
+ sll d0,5,d0
+ sub d0,d4,d0
+
+ stg (d0,last_heap_free)
+
+#ifdef COUNT_GARBAGE_COLLECTIONS
+ sethi %hi n_garbage_collections,%o1
+ ld [%o1+%lo n_garbage_collections],%o2
+ inc 1,%o2
+#endif
+ ldg (@flags,%o0)
+ btst 2,%o0
+ beq _no_heap_use_message2
+#ifdef COUNT_GARBAGE_COLLECTIONS
+ st %o2,[%o1+%lo n_garbage_collections]
+#else
+ nop
+#endif
+
+ st %o4,[sp-4]
+
+ seth (marked_gc_string_1,%o0)
+ call @ew_print_string
+ setl (marked_gc_string_1,%o0)
+
+ call @ew_print_int
+ mov d4,%o0
+
+ seth (heap_use_after_gc_string_2,%o0)
+ call @ew_print_string
+ setl (heap_use_after_gc_string_2,%o0)
+
+ ld [sp-4],%o4
+
+_no_heap_use_message2:
+#ifdef FINALIZERS
+ call call_finalizers
+ nop
+ ldg (heap_vector,%o4)
+#endif
+
+ ldg (alloc_size,d2)
+ mov d5,d0
+ mov %o4,a0
+
+ stg (%g0,free_after_mark)
+
+_scan_bits:
+ ld [a0],%o0 !
+ inc 4,a0
+ tst %o0
+ beq _zero_bits
+ deccc d0
+ clr [a0-4]
+ bne,a _scan_bits+4
+ ld [a0],%o0
+
+ b,a _end_scan
+
+_zero_bits:
+ beq _end_bits
+ mov a0,a1
+
+_skip_zero_bits_lp:
+ ld [a0],d1 !
+ inc 4,a0
+ tst d1
+ bne _end_zero_bits
+ deccc d0
+ bne,a _skip_zero_bits_lp+4
+ ld [a0],d1
+
+ ba _end_bits+4
+ sub a0,a1,d1
+
+_end_zero_bits:
+ clr [a0-4] !
+
+ sub a0,a1,d1
+ sll d1,3,d1
+
+ seth (free_after_mark,%o0)
+ ld [%o0+%lo free_after_mark],%o1
+ cmp d1,d2
+ add %o1,d1,%o1
+ blu _scan_next
+ st %o1,[%o0+%lo free_after_mark]
+
+_found_free_memory:
+ stg (d0,bit_counter)
+ stg (a0,bit_vector_p)
+
+ sub d1,d2,d7
+
+ ldg (heap_vector,%o1)
+ sub a1,4,d0
+ sub d0,%o1,d0
+ ldg (heap_p3,%o1)
+ sll d0,5,d0
+ add d0,%o1,d0
+ mov d0,a6
+
+ sll d1,2,d1
+ add d0,d1,d0
+ stg (d0,heap_end_after_gc)
+
+ ld [sp],d0
+ ld [sp+4],d1
+ ld [sp+8],d2
+ ld [sp+12],d3
+ ld [sp+16],d4
+ ld [sp+20],d5
+ ld [sp+24],d6
+
+ ld [sp+28],%o7
+ retl
+ inc 32,sp
+
+_scan_next:
+ tst d0
+ bne,a _scan_bits+4
+ ld [a0],%o0
+
+ b,a _end_scan
+
+_end_bits:
+ sub a0,a1,d1 !
+ inc 4,d1
+ sll d1,3,d1
+
+ seth (free_after_mark,%o0)
+ ld [%o0+%lo free_after_mark],%o1
+ cmp d1,d2
+ add %o1,d1,%o1
+ bgeu _found_free_memory
+ st %o1,[%o0+%lo free_after_mark]
+
+_end_scan:
+ stg (d0,bit_counter)
+ b,a compact_gc
+
+
+
+_mark_record:
+ deccc 258,d2
+ be,a _mark_record_2
+ lduh [d0-2+2],%g1
+
+ blu,a _mark_record_1
+ lduh [d0-2+2],%g1
+
+_mark_record_3:
+ cmp %o3,4
+ bgeu fits_in_word_13
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_13:
+ st %o1,[%o4+%o0]
+
+ lduh [d0-2+2],d1
+ deccc 1,d1
+ blu _mark_record_3_bb
+ inc 3,d4
+
+ ld [a0+4],a1
+
+ sub a1,d6,d0
+ srl d0,2,d0
+
+ srl d0,3,%o0
+ andn %o0,3,%o0
+ ld [%o4+%o0],%o1
+ srl %g3,d0,%o3
+
+ btst %o3,%o1
+ bne,a _mark_node
+ ld [a0],a0
+
+ inc 1,d2
+ add d4,d2,d4
+
+ and d0,31,%o2
+ add %o2,d2,%o2
+
+ cmp %o2,32
+ bset %o3,%o1
+ bleu _push_record_arguments
+ st %o1,[%o4+%o0]
+
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+ st %o1,[%o4+%o0]
+
+_push_record_arguments:
+ subcc d1,1,d2
+
+ sll d1,2,d1
+ bgeu _push_hnf_args
+ add a1,d1,a1
+
+ ba _mark_node
+ ld [a0],a0
+
+_mark_record_3_bb:
+ ld [a0+4],a1
+
+ sub a1,d6,d0
+ srl d0,2,d0
+
+ srl d0,3,%o0
+ andn %o0,3,%o0
+ ld [%o4+%o0],%o1
+ srl %g3,d0,%o3
+
+ btst %o3,%o1
+ bne _mark_next_node
+ inc 1,d2
+
+ add d4,d2,d4
+
+ and d0,31,%o2
+ add %o2,d2,%o2
+
+ cmp %o2,32
+ bset %o3,%o1
+ bleu _mark_next_node
+ st %o1,[%o4+%o0]
+
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+ ba _mark_next_node
+ st %o1,[%o4+%o0]
+
+_mark_record_2:
+ cmp %o3,4
+ bgeu fits_in_word_12
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_12:
+ st %o1,[%o4+%o0]
+ inc 3,d4
+
+ cmp %g1,1
+ bgu _mark_record_2_c
+ nop
+
+ be,a _mark_node
+ ld [a0],a0
+
+ ba _mark_next_node
+ dec 4,a0
+
+_mark_record_1:
+ tst %g1
+ bne _mark_hnf_1
+ nop
+ b,a _mark_bool_or_small_string
+
+
+_mark_stack_nodes:
+ cmp a2,a4
+ be _end_mark_nodes
+ inc 4,a2
+
+ ld [a2-4],a0
+
+ sub a0,d6,d1
+#ifdef SHARE_CHAR_INT
+ cmp d1,d7
+ bcc _mark_stack_nodes
+#endif
+ srl d1,2,d1
+
+ srl d1,3,%o0
+ andn %o0,3,%o0
+ ld [%o4+%o0],%o1
+ srl %g3,d1,%o3
+
+ btst %o3,%o1
+ bne _mark_stack_nodes
+ nop
+
+ clr [sp-4]
+ dec 4,sp
+
+_mark_arguments:
+ ld [a0],d0
+ btst 2,d0
+ be _mark_lazy_node
+ nop
+
+ ldsh [d0-2],d2
+ tst d2
+ be _mark_hnf_0
+ cmp d2,256
+ bgeu _mark_record
+ inc 4,a0
+
+ deccc 2,d2
+ be _mark_hnf_2
+ nop
+ bcs _mark_hnf_1
+ nop
+
+_mark_hnf_3:
+ cmp %o3,4
+ bgeu fits_in_word_1
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_1:
+ st %o1,[%o4+%o0]
+
+ ld [a0+4],a1
+
+ sub a1,d6,d0
+ srl d0,2,d0
+
+ srl d0,3,%o0
+ andn %o0,3,%o0
+ ld [%o4+%o0],%o1
+ srl %g3,d0,%o3
+
+ btst %o3,%o1
+ bne _shared_argument_part
+ inc 3,d4
+
+_no_shared_argument_part:
+ sll d2,2,%o2
+ add a1,%o2,a1
+
+ inc 1,d2
+ add d4,d2,d4
+
+ and d0,31,%o2
+ add %o2,d2,%o2
+ cmp %o2,32
+ bleu fits_in_word_2
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_2:
+ st %o1,[%o4+%o0]
+
+ ld [a1],%o0
+ dec 2,d2
+ st %o0,[sp-4]
+ dec 4,sp
+
+_push_hnf_args:
+ ld [a1-4],%o0
+ dec 4,a1
+ st %o0,[sp-4]
+ deccc d2
+ bcc _push_hnf_args
+ dec 4,sp
+
+ cmp sp,d3
+ bgeu,a _mark_node
+ ld [a0],a0
+
+ b,a __mark_using_reversal
+
+_mark_lazy_node_1:
+ cmp %o3,4
+ bgeu fits_in_word_3
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_3:
+ st %o1,[%o4+%o0]
+
+ tst d2
+ bne _mark_selector_node_1
+ inc 3,d4
+
+ ba _mark_node
+ ld [a0],a0
+
+_mark_hnf_1:
+ cmp %o3,2
+ bgeu fits_in_word_4
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_4:
+ st %o1,[%o4+%o0]
+ inc 2,d4
+
+_shared_argument_part:
+ ba _mark_node
+ ld [a0],a0
+
+! selectors
+_mark_indirection_node:
+ ba _mark_node
+ mov a1,a0
+
+_mark_selector_node_1:
+ cmp d2,-2
+ bne _mark_indirection_node
+ ld [a0],a1
+
+ sub a1,d6,d1
+ srl d1,2,d1
+
+ srl d1,3,%o0
+ andn %o0,3,%o0
+ ld [%o4+%o0],%o1
+ srl %g3,d1,%o3
+
+ btst %o3,%o1
+ bne,a _mark_node
+ mov a1,a0
+
+ ld [a1],d2
+ btst 2,d2
+ be,a _mark_node
+ mov a1,a0
+
+ ldsh [d2-2],%g1
+ cmp %g1,2
+ bleu _small_tuple
+ nop
+
+ ld [a1+8],d1
+ sub d1,d6,d1
+ srl d1,2,d1
+
+ srl d1,3,%o0
+ andn %o0,3,%o0
+ ld [%o4+%o0],%g1
+ srl %g3,d1,%o3
+
+ btst %o3,%g1
+ bne,a _mark_node
+ mov a1,a0
+
+_small_tuple:
+ sub a0,4,d2
+
+ ld [d0-8],%g1
+ mov a1,a0
+ ld [%g1+4],%g1
+
+ dec 4,sp
+ call %g1
+ st %o7,[sp]
+
+ set __indirection,%g1
+ st %g1,[d2]
+ ba _mark_node
+ st a0,[d2+4]
+
+_mark_hnf_2:
+ cmp %o3,4
+ bgeu fits_in_word_6
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_6:
+ st %o1,[%o4+%o0]
+ inc 3,d4
+
+_mark_record_2_c:
+ ld [a0+4],%o0
+ dec 4,sp
+ cmp sp,d3
+ blu __mark_using_reversal
+ st %o0,[sp]
+
+ ld [a0],a0
+
+_mark_node:
+ sub a0,d6,d1
+#ifdef SHARE_CHAR_INT
+ cmp d1,d7
+ bcc _mark_next_node
+#endif
+ srl d1,2,d1
+
+ srl d1,3,%o0
+ andn %o0,3,%o0
+ ld [%o4+%o0],%o1
+ srl %g3,d1,%o3
+
+ btst %o3,%o1
+ be _mark_arguments
+ nop
+
+_mark_next_node:
+ ld [sp],a0
+ inc 4,sp
+ tst a0
+ bne _mark_node
+ nop
+ b,a _mark_stack_nodes
+
+_mark_lazy_node:
+ ldsh [d0-2],d2
+ tst d2
+ be _mark_real_or_file
+ add d0,-2,a1
+
+ deccc d2
+ ble,a _mark_lazy_node_1
+ inc 4,a0
+
+ inc 2,d2
+ add d4,d2,d4
+
+ and d1,31,%o2
+ add %o2,d2,%o2
+ cmp %o2,32
+ bleu fits_in_word_7
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_7:
+ st %o1,[%o4+%o0]
+
+ sll d2,2,%g2
+ add a0,%g2,a0
+
+ dec 3,d2
+_push_lazy_args:
+ ld [a0-4],%o0
+ dec 4,a0
+ st %o0,[sp-4]
+ deccc d2
+ bcc _push_lazy_args
+ dec 4,sp
+
+ cmp sp,d3
+ bgeu,a _mark_node
+ ld [a0-4],a0
+
+ ba __mark_using_reversal
+ dec 4,a0
+
+_mark_hnf_0:
+ set INT+2,%g1
+ cmp d0,%g1
+ blu _mark_real_file_or_string
+ nop
+
+ set CHAR+2,%g1
+ cmp d0,%g1
+ bgu _mark_normal_hnf_0
+ nop
+
+_mark_bool_or_small_string:
+ cmp %o3,2
+ bgeu fits_in_word_8
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_8:
+ st %o1,[%o4+%o0]
+ ba _mark_next_node
+ inc 2,d4
+
+_mark_normal_hnf_0:
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ ba _mark_next_node
+ inc 1,d4
+
+_mark_real_file_or_string:
+ set __ARRAY__+2,%g1
+ cmp d0,%g1
+ bne _no_mark_array
+ nop
+
+ ld [a0+8],d0
+ tst d0
+ be _mark_lazy_array
+ nop
+
+ lduh [d0-2+2],d1
+ tst d1
+ be _mark_b_record_array
+ nop
+
+ lduh [d0-2],d0
+ dec 256,d0
+ cmp d0,d1
+ be _mark_a_record_array
+ nop
+
+_mark_ab_record_array:
+ mov d2,%o2
+ mov d3,%o3
+ mov d4,%g2
+ mov d5,%o5
+ mov d6,%g3
+
+ ld [a0+4],d2
+ inc 8,a0
+ mov a0,%g4
+
+ sll d2,2,d2
+ sub d0,2,d3
+ mov d2,a1
+_mul_array_length_ab1:
+ deccc 1,d3
+ bcc _mul_array_length_ab1
+ add a1,d2,a1
+
+ sub d0,d1,d0
+ inc 4,a0
+ call reorder
+ add a1,a0,a1
+
+ mov %g4,a0
+ ld [a0-4],d2
+ deccc 2,d1
+ bcs _skip_mul_array_length_a1_
+ mov d2,d0
+_mul_array_length_a1_:
+ deccc 1,d1
+ bcc _mul_array_length_a1_
+ add d0,d2,d0
+_skip_mul_array_length_a1_:
+
+ mov %g3,d6
+ mov %o5,d5
+ mov %g2,d4
+ mov %o3,d3
+ ba _mark_lr_array
+ mov %o2,d2
+
+_mark_b_record_array:
+ sub a0,d6,d0
+ srl d0,2,d0
+ inc 1,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+ b,a _mark_next_node
+
+_mark_a_record_array:
+ ld [a0+4],d0
+ deccc 2,d1
+ blu _mark_lr_array
+ inc 8,a0
+
+ mov d0,d2
+_mul_array_length:
+ deccc 1,d1
+ bcc _mul_array_length
+ add d0,d2,d0
+
+ b,a _mark_lr_array
+
+_mark_lazy_array:
+ ld [a0+4],d0
+ inc 8,a0
+_mark_lr_array:
+ sub a0,d6,d1
+ srl d1,2,d1
+ add d1,d0,d1
+ setmbit (%o4,d1,d2,%o0,%o1,%o2)
+
+ cmp d0,1
+ bleu _mark_array_length_0_1
+ nop
+
+ mov a0,a1
+ sll d0,2,d0
+ add a0,d0,a0
+
+ ld [a0],d2
+ ld [a1],%o0
+ st d2,[a1]
+ st %o0,[a0]
+
+ ld [a0-4],d2
+ dec 4,a0
+ inc 2,d2
+ ld [a1-4],%o0
+ dec 4,a1
+ st %o0,[a0]
+ st d2,[a1]
+
+ ld [a0-4],d2
+ dec 4,a0
+ or d3,d5,d3
+ st d3,[a0]
+ mov a0,d3
+ mov 0,d5
+ ba _mark_node
+ mov d2,a0
+
+_mark_array_length_0_1:
+ blu _mark_next_node
+ nop
+
+ ld [a0+4],d1
+ ld [a0],%o0
+ ld [a0-4],%o1
+ st %o0,[a0+4]
+ st %o1,[a0]
+ st d1,[a0-4]
+ ba _mark_hnf_1
+ dec 4,a0
+
+_no_mark_array:
+ set STRING+2,%g1
+ cmp %g1,%l0
+ beq _mark_string
+ nop
+
+_mark_real_or_file:
+ cmp %o3,4
+ bgeu fits_in_word_9
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits_in_word_9:
+ st %o1,[%o4+%o0]
+ ba _mark_next_node
+ inc 3,d4
+
+_mark_string:
+ sethi %hi 0xc0000000,%o3
+ srl %o3,d1,%g1
+
+ cmp %g1,3
+ bgeu fits_in_word_10
+ bset %g1,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ neg d1
+ ld [%o4+%o0],%o1
+ sll %o3,d1,%o3
+
+ bset %o3,%o1
+fits_in_word_10:
+ st %o1,[%o4+%o0]
+ inc 2,d4
+
+ ld [a0+4],a1
+
+ sub a1,d6,d0
+ cmp d0,d7
+ bcc _mark_next_node
+ srl d0,2,d0
+
+ ld [a1+4],d1
+ inc 7,d1
+ srl d1,2,d1
+
+ cmp d1,32
+ bcc _mark_large_string
+ add d4,d1,d4
+
+ srl d0,3,%o0
+ andn %o0,3,%o0
+ mov -1,%o3
+ ld [%o4+%o0],%o1
+ srl %o3,d1,%o3
+ not %o3
+
+ srl %o3,d0,%g1
+
+ and d0,31,%o2
+ add %o2,d1,%o2
+ cmp %o2,32
+ bleu fits_in_word_11
+ bset %g1,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ neg d0
+ ld [%o4+%o0],%o1
+ sll %o3,d0,%o3
+
+ bset %o3,%o1
+fits_in_word_11:
+ ba _mark_next_node
+ st %o1,[%o4+%o0]
+
+_mark_large_string:
+ b,a _mark_large_string
+
+_end_mark_nodes:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+__mark__record:
+ deccc 258,d2
+ be,a __mark__record__2
+ lduh [d0-2+2],%g1
+
+ blu,a __mark__record__1
+ lduh [d0-2+2],%g1
+
+__mark__record__3:
+ lduh [d0-2+2],d2
+ deccc 1,d2
+ blu,a __mark__record__3__bb
+ dec 4,a0
+
+ be __mark__record__3__ab
+ nop
+
+ deccc 1,d2
+ be __mark__record__3__aab
+ nop
+
+ b,a __mark__hnf__3
+
+__mark__record__3__bb:
+ ld [a0+8],a1
+
+ sub a1,d6,d0
+ srl d0,2,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+
+ cmp a1,a0
+ bgu __mark__next__node
+ nop
+
+ cmp %o0,1
+ bne __not__next__byte__1
+ srl %o0,1,%o0
+
+ inc 1,d1
+ ldub [%o4+d1],%o1
+ mov 128,%o0
+__not__next__byte__1:
+ btst %o0,%o1
+ be __not__yet__linked__bb
+ bset %o0,%o1
+
+ sub a0,d6,d0
+ srl d0,2,d0
+ inc 2,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+
+ ld [a1],%o0
+ add a0,8+2+1,d0
+ st %o0,[a0+8]
+ ba __mark__next__node
+ st d0,[a1]
+
+__not__yet__linked__bb:
+ stb %o1,[%o4+d1]
+ ld [a1],%o0
+ add a0,8+2+1,d0
+ st %o0,[a0+8]
+ ba __mark__next__node
+ st d0,[a1]
+
+__mark__record__3__ab:
+ ld [a0+4],a1
+
+ sub a1,d6,d0
+ srl d0,2,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+
+ cmp a1,a0
+ bgu __mark__hnf__1
+ nop
+
+ cmp %o0,1
+ bne __not__next__byte__2
+ srl %o0,1,%o0
+
+ inc 1,d1
+ ldub [%o4+d1],%o1
+ mov 128,%o0
+__not__next__byte__2:
+ btst %o0,%o1
+ be __not__yet__linked__ab
+ bset %o0,%o1
+
+ sub a0,d6,d0
+ srl d0,2,d0
+ inc 1,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+
+ ld [a1],%o0
+ add a0,4+2+1,d0
+ st %o0,[a0+4]
+ ba __mark__hnf__1
+ st d0,[a1]
+
+__not__yet__linked__ab:
+ stb %o1,[%o4+d1]
+ ld [a1],%o0
+ add a0,4+2+1,d0
+ st %o0,[a0+4]
+ ba __mark__hnf__1
+ st d0,[a1]
+
+__mark__record__3__aab:
+ ld [a0+4],a1
+
+ sub a1,d6,d0
+ srl d0,2,d0
+
+ tstmbit (%o4,d0,d1,%o0,%o1,%o2)
+ bne __shared__argument__part
+ bset %o0,%o1
+
+ stb %o1,[%o4+d1]
+
+ ld [a0],%o0
+ inc 4,a0
+ or %o0,2,%o0
+ st %o0,[a0-4]
+ or d3,d5,d3
+ st d3,[a0]
+
+ ld [a1],d2
+ st a0,[a1]
+ mov a1,d3
+ mov 1,d5
+ ba __mark__node
+ mov d2,a0
+
+__mark__record__2:
+ cmp %g1,1
+ bgu __mark__hnf__2
+ nop
+ be __mark__hnf__1
+ nop
+ ba __mark__next__node
+ dec 4,a0
+
+__mark__record__1:
+ tst %g1
+ bne __mark__hnf__1
+ nop
+ ba __mark__next__node
+ dec 4,a0
+
+__end_mark_using_reversal:
+ ld [sp],d3
+ ba _mark_next_node
+ inc 8,sp
+
+__end_mark_using_reversal_after_static:
+ ld [sp+4],a1
+ ld [sp],d3
+ st a0,[a1]
+ ba _mark_next_node
+ inc 8,sp
+
+__mark_using_reversal:
+ st a0,[sp-4]
+ st d3,[sp-8]
+
+ mov 0,d3
+ mov 1,d5
+ ld [a0],a0
+ ba __mark__node
+ dec 8,sp
+
+__mark__arguments:
+ ld [a0],d0
+ btst 2,d0
+ be __mark__lazy__node
+ nop
+
+ ldsh [d0-2],d2
+ tst d2
+ be __mark__hnf__0
+ cmp d2,256
+ bgeu __mark__record
+ inc 4,a0
+
+ deccc 2,d2
+ be __mark__hnf__2
+ nop
+ bcs __mark__hnf__1
+ nop
+
+__mark__hnf__3:
+ cmp %o3,4
+ bgeu fits__in__word__1
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__1:
+ st %o1,[%o4+%o0]
+
+ ld [a0+4],a1
+
+ sub a1,d6,d0
+ srl d0,2,d0
+
+ srl d0,3,%o0
+ andn %o0,3,%o0
+ ld [%o4+%o0],%o1
+ srl %g3,d0,%o3
+
+ btst %o3,%o1
+ bne __shared__argument__part
+ inc 3,d4
+
+__no__shared__argument__part:
+#if XXX
+ ld [%i0],%g1
+#endif
+ bset d5,d3
+#if XXX
+ bset 2,%g1
+ st %g1,[%i0]
+#endif
+ st d3,[%i0+4]
+ inc 4,%i0
+
+ ld [a1],%g1
+ sll d2,2,d2
+ bset 1,%g1
+ st %g1,[a1]
+ add a1,d2,a1
+
+ srl d2,2,d2
+ inc 1,d2
+ add d4,d2,d4
+
+ and d0,31,%o2
+ add %o2,d2,%o2
+ cmp %o2,32
+ bleu fits__in__word__2
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__2:
+ st %o1,[%o4+%o0]
+
+ ld [a1],d2
+ st a0,[a1]
+ mov a1,d3
+ clr d5
+ ba __mark__node
+ mov d2,a0
+
+__mark__lazy__node__1:
+! selectors:
+ bne __mark__selector__node__1
+ nop
+
+ cmp %o3,4
+ bgeu fits__in__word__3
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__3:
+ st %o1,[%o4+%o0]
+ ba __shared__argument__part
+ inc 3,d4
+
+__mark__hnf__1:
+ cmp %o3,2
+ bgeu fits__in__word__4
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__4:
+ st %o1,[%o4+%o0]
+ inc 2,d4
+
+__shared__argument__part:
+ ld [%i0],%l2
+ bset %l5,%l3
+ st %l3,[%i0]
+ mov %i0,%l3
+ mov 2,%l5
+ ba __mark__node
+ mov %l2,%i0
+
+! selectors
+__mark__indirection__node:
+ ba __mark__node
+ mov a1,a0
+
+__mark__selector__1:
+ cmp %o3,4
+ bgeu fits__in__word__5
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__5:
+ st %o1,[%o4+%o0]
+ ba __shared__argument__part
+ inc 3,d4
+
+__mark__selector__node__1:
+ cmp d2,-2
+ bne __mark__indirection__node
+ ld [a0],a1
+
+ sub a1,d6,%o2
+ srl %o2,2,%o2
+
+ srl %o2,3,d2
+ andn d2,3,d2
+ ld [%o4+d2],%g1
+ srl %g3,%o2,%g2
+
+ btst %g2,%g1
+ bne __mark__selector__1
+ nop
+
+ ld [a1],d2
+ btst 2,d2
+ be __mark__selector__1
+ nop
+
+ ldsh [d2-2],%g1
+ cmp %g1,2
+ bleu __small__tuple
+ nop
+
+ ld [a1+8],%o2
+ sub %o2,d6,%o2
+ srl %o2,2,%o2
+
+ srl %o2,3,d2
+ andn d2,3,d2
+ ld [%o4+d2],%g1
+ srl %g3,%o2,%g2
+
+ btst %g2,%g1
+ bne __mark__selector__1
+ nop
+
+__small__tuple:
+ sub a0,4,d2
+
+ ld [d0-8],%g1
+ mov a1,a0
+ ld [%g1+4],%g1
+
+ dec 4,sp
+ call %g1
+ st %o7,[sp]
+
+ set __indirection,%g1
+ st %g1,[d2]
+ ba __mark__node
+ st a0,[d2+4]
+
+__mark__hnf__2:
+ cmp %o3,4
+ bgeu fits__in__word__6
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__6:
+ st %o1,[%o4+%o0]
+ inc 3,d4
+
+ ld [%i0],%o0
+ bset 2,%o0
+ st %o0,[%i0]
+ inc 4,%i0
+ ld [%i0],%l2
+ bset %l5,%l3
+ st %l3,[%i0]
+ mov %i0,%l3
+ clr %l5
+ mov %l2,%i0
+
+__mark__node:
+ sub a0,d6,d1
+#ifdef SHARE_CHAR_INT
+ cmp d1,d7
+ bcc __mark__next__node__after__static
+#endif
+ srl d1,2,d1
+
+ srl d1,3,%o0
+ andn %o0,3,%o0
+ ld [%o4+%o0],%o1
+ srl %g3,d1,%o3
+
+ btst %o3,%o1
+ be __mark__arguments
+ nop
+
+__mark__next__node:
+ tst d5
+ bne __mark__parent
+ nop
+__mark__next__node2:
+ dec 4,%l3
+ ld [%l3],%l2
+ ld [%l3+4],%o0
+ and %l2,3,%l5
+
+ st %o0,[%l3]
+
+ st %i0,[%l3+4]
+ ba __mark__node
+ andn %l2,3,%i0
+
+__mark__lazy__node:
+ ldsh [d0-2],d2
+ tst d2
+ be __mark__real__or__file
+ add d0,-2,a1
+
+ deccc d2
+ ble __mark__lazy__node__1
+ inc 4,a0
+
+ inc 2,d2
+ add d4,d2,d4
+
+ and d1,31,%o2
+ add %o2,d2,%o2
+ cmp %o2,32
+ bleu fits__in__word__7
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__7:
+ st %o1,[%o4+%o0]
+
+ dec 2,d2
+
+ ld [%i0],%o0
+ sll d2,2,d2
+ bset 2,%o0
+ st %o0,[%i0]
+ add %i0,d2,%i0
+
+ ld [%i0],%l2
+ bset %l5,%l3
+ st %l3,[%i0]
+ mov %i0,%l3
+ clr %l5
+ ba __mark__node
+ mov %l2,%i0
+
+__mark__hnf__0:
+ set INT+2,%g1
+ cmp d0,%g1
+ bne __no__int__3
+ nop
+
+ ld [a0+4],d2
+ cmp d2,33
+ bcs ____small____int
+ sll d2,3,d2
+
+__mark__bool__or__small__string:
+ cmp %o3,2
+ bgeu fits__in__word__8
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__8:
+ st %o1,[%o4+%o0]
+ ba __mark__next__node
+ inc 2,d4
+
+____small____int:
+ set small_integers,a0
+ ba __mark__next__node__after__static
+ add a0,d2,a0
+
+__no__int__3:
+ blu __mark__real__file__or__string
+ seth ((CHAR+2),%g1)
+
+ setl ((CHAR+2),%g1)
+ cmp d0,%g1
+ bne __no__char__3
+ nop
+
+ ldub [a0+7],d2
+ set static_characters,a0
+ sll d2,3,d2
+ ba __mark__next__node__after__static
+ add a0,d2,a0
+
+__no__char__3:
+ blu __mark__bool__or__small__string
+ nop
+
+ ba __mark__next__node__after__static
+ sub d0,12+2,a0
+
+__mark__real__file__or__string:
+ set __ARRAY__+2,%g1
+ cmp d0,%g1
+ bne __no__mark__array
+ nop
+
+ ld [a0+8],d0
+ tst d0
+ be __mark__lazy__array
+ nop
+
+ lduh [d0-2+2],d1
+ tst d1
+ be __mark__b__record__array
+ nop
+
+ lduh [d0-2],d0
+ dec 256,d0
+ cmp d0,d1
+ be __mark__a__record__array
+ nop
+
+__mark__ab__record__array:
+ mov d2,%o2
+ mov d3,%o3
+ mov d4,%g2
+ mov d5,%o5
+ mov d6,%g3
+
+ ld [a0+4],d2
+ inc 8,a0
+ mov a0,%g4
+
+ sll d2,2,d2
+ sub d0,2,d3
+ mov d2,a1
+__mul__array__length__ab1:
+ deccc 1,d3
+ bcc __mul__array__length__ab1
+ add a1,d2,a1
+
+ sub d0,d1,d0
+ inc 4,a0
+ call reorder
+ add a1,a0,a1
+
+ mov %g4,a0
+ ld [a0-4],d2
+ deccc 2,d1
+ bcs __skip_mul_array_length_a1_
+ mov d2,d0
+__mul_array_length_a1_:
+ deccc 1,d1
+ bcc __mul_array_length_a1_
+ add d0,d2,d0
+__skip_mul_array_length_a1_:
+
+ mov %g3,d6
+ mov %o5,d5
+ mov %g2,d4
+ mov %o3,d3
+ ba __mark__lr__array
+ mov %o2,d2
+
+__mark__b__record__array:
+ sub a0,d6,d0
+ srl d0,2,d0
+ inc 1,d0
+ setmbit (%o4,d0,d1,%o0,%o1,%o2)
+ b,a __mark__next__node
+
+__mark__a__record__array:
+ ld [a0+4],d0
+ deccc 2,d1
+ blu __mark__lr__array
+ inc 8,a0
+
+ mov d0,d2
+__mul__array__length:
+ deccc 1,d1
+ bcc __mul__array__length
+ add d0,d2,d0
+
+ b,a __mark__lr__array
+
+__mark__lazy__array:
+ ld [a0+4],d0
+ inc 8,a0
+__mark__lr__array:
+ sub a0,d6,d1
+ srl d1,2,d1
+ add d1,d0,d1
+ setmbit (%o4,d1,d2,%o0,%o1,%o2)
+
+ cmp d0,1
+ bleu __mark__array__length__0__1
+ nop
+
+ mov a0,a1
+ sll d0,2,d0
+ add a0,d0,a0
+
+ ld [a0],d2
+ ld [a1],%o0
+ st d2,[a1]
+ st %o0,[a0]
+
+ ld [a0-4],d2
+ dec 4,a0
+ inc 2,d2
+ ld [a1-4],%o0
+ dec 4,a1
+ st %o0,[a0]
+ st d2,[a1]
+
+ ld [a0-4],d2
+ dec 4,a0
+ or d3,d5,d3
+ st d3,[a0]
+ mov a0,d3
+ mov 0,d5
+ ba __mark__node
+ mov d2,a0
+
+__mark__array__length__0__1:
+ blu __mark__next__node
+ nop
+
+ ld [a0+4],d1
+ ld [a0],%o0
+ ld [a0-4],%o1
+ st %o0,[a0+4]
+ st %o1,[a0]
+ st d1,[a0-4]
+ ba __mark__hnf__1
+ dec 4,a0
+
+__no__mark__array:
+ set STRING+2,%g1
+ cmp %g1,%l0
+ beq __mark__string
+ nop
+
+__mark__real__or__file:
+ cmp %o3,4
+ bgeu fits__in__word__9
+ bset %o3,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ neg d1
+ ld [%o4+%o0],%o1
+ bset %g3,%o1
+fits__in__word__9:
+ st %o1,[%o4+%o0]
+ ba __mark__next__node
+ inc 3,d4
+
+__mark__string:
+ sethi %hi 0xc0000000,%o3
+ srl %o3,d1,%g1
+
+ cmp %g1,3
+ bgeu fits__in__word__10
+ bset %g1,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ neg d1
+ ld [%o4+%o0],%o1
+ sll %o3,d1,%o3
+
+ bset %o3,%o1
+fits__in__word__10:
+ st %o1,[%o4+%o0]
+ inc 2,d4
+
+ ld [a0+4],a1
+
+ sub a1,d6,d0
+ cmp d0,d7
+ bcc __mark__next__node
+ srl d0,2,d0
+
+ ld [a1+4],d1
+ inc 7,d1
+ srl d1,2,d1
+
+ cmp d1,32
+ bcc __mark__large__string
+ add d4,d1,d4
+
+ srl d0,3,%o0
+ andn %o0,3,%o0
+ mov -1,%o3
+ ld [%o4+%o0],%o1
+ srl %o3,d1,%o3
+ not %o3
+
+ srl %o3,d0,%g1
+
+ and d0,31,%o2
+ add %o2,d1,%o2
+ cmp %o2,32
+ bleu fits__in__word__11
+ bset %g1,%o1
+
+ st %o1,[%o4+%o0]
+ inc 4,%o0
+
+ neg d0
+ ld [%o4+%o0],%o1
+ sll %o3,d0,%o3
+
+ bset %o3,%o1
+fits__in__word__11:
+ ba __mark__next__node
+ st %o1,[%o4+%o0]
+
+__mark__large__string:
+ b,a __mark__large__string
+
+__mark__parent:
+ tst d3
+ be __end_mark_using_reversal
+
+ deccc d5
+ be __argument__part__parent
+ ld [d3],d2
+
+ st %i0,[%l3]
+ sub %l3,4,%i0
+ and %l2,3,%l5
+ ba __mark__next__node
+ andn %l2,3,%l3
+
+__argument__part__parent:
+ mov d3,a1
+ st a0,[a1]
+
+ andn d2,3,d3
+ dec 4,d3
+
+ ld [d3],a0
+ ld [d3+4],%o0
+ mov 2,d5
+ st %o0,[d3]
+
+ ba __mark__node
+ st a1,[d3+4]
+
+__mark__next__node__after__static:
+ tst d5
+ beq __mark__next__node2
+
+ tst d3
+ be __end_mark_using_reversal_after_static
+
+ deccc d5
+ be __argument__part__parent
+ ld [d3],d2
+
+ st %i0,[%l3]
+ sub %l3,4,%i0
+ and %l2,3,%l5
+ ba __mark__next__node
+ andn %l2,3,%l3
diff --git a/sreals.s b/sreals.s
new file mode 100644
index 0000000..2489b00
--- /dev/null
+++ b/sreals.s
@@ -0,0 +1,161 @@
+
+#define SP_G5
+
+#ifdef SP_G5
+# define sp %g5
+#else
+# define sp %g7
+#endif
+
+ .global r_to_i_real
+ .global entier_real
+ .global acos_real
+ .global pow_real
+ .global cos_real
+ .global exp_real
+ .global asin_real
+ .global atan_real
+ .global log10_real
+ .global tan_real
+ .global ln_real
+ .global sin_real
+
+!
+! REALS
+!
+
+exp_real:
+ std %f0,[%fp-8]
+ ld [%fp-8],%o0
+ call @exp
+ ld [%fp-4],%o1
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+ln_real:
+ std %f0,[%fp-8]
+ ld [%fp-8],%o0
+ call @log
+ ld [%fp-4],%o1
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+log10_real:
+ std %f0,[%fp-8]
+ ld [%fp-8],%o0
+ call @log10
+ ld [%fp-4],%o1
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+pow_real:
+ std %f2,[%fp-8]
+ ld [%fp-8],%o0
+ ld [%fp-4],%o1
+ std %f0,[%fp-8]
+ ld [%fp-8],%o2
+ call @pow
+ ld [%fp-4],%o3
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+sin_real:
+ std %f0,[%fp-8]
+ ld [%fp-8],%o0
+ call @sin
+ ld [%fp-4],%o1
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+cos_real:
+ std %f0,[%fp-8]
+ ld [%fp-8],%o0
+ call @cos
+ ld [%fp-4],%o1
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+tan_real:
+ std %f0,[%fp-8]
+ ld [%fp-8],%o0
+ call @tan
+ ld [%fp-4],%o1
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+acos_real:
+ std %f0,[%fp-8]
+ ld [%fp-8],%o0
+ call @acos
+ ld [%fp-4],%o1
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+asin_real:
+ std %f0,[%fp-8]
+ ld [%fp-8],%o0
+ call @asin
+ ld [%fp-4],%o1
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+atan_real:
+ std %f0,[%fp-8]
+ ld [%fp-8],%o0
+ call @atan
+ ld [%fp-4],%o1
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+entier_real:
+ sethi %hi d_0,%o0
+ ldd [%o0+%lo d_0],%f2
+ fdtoi %f0,%f4
+ ld [sp],%o7
+ st %f4,[%fp-4]
+ fcmpd %f0,%f2
+ ld [%fp-4],%l0
+ fbge entier_real_2
+ nop
+ fitod %f4,%f2
+ fcmpd %f0,%f2
+ nop
+ fbne,a entier_real_2
+ dec %l0
+entier_real_2:
+ retl
+ inc 4,sp
+
+ .data
+ .align 8
+d_0: .double 0r0.0
+d_0_5: .double 0r0.5
+ .text
+
+r_to_i_real:
+ sethi %hi d_0,%o0
+ ldd [%o0+%lo d_0],%f2
+ sethi %hi d_0_5,%o0
+ fcmpd %f0,%f2
+ ldd [%o0+%lo d_0_5],%f4
+ nop
+ fbge,a r_to_i_real_2
+ faddd %f0,%f4,%f0
+ fsubd %f0,%f4,%f0
+r_to_i_real_2:
+ fdtoi %f0,%f2
+ st %f2,[%fp-4]
+ ld [sp],%o7
+ ld [%fp-4],%l0
+ retl
+ inc 4,sp
diff --git a/sstartup.s b/sstartup.s
new file mode 100644
index 0000000..31cfe11
--- /dev/null
+++ b/sstartup.s
@@ -0,0 +1,4456 @@
+! File: sstartup.s
+! Author: John van Groningen
+! At: University of Nijmegen
+! Machine: Sun 4
+
+#define SHARE_CHAR_INT
+#define COPIED_VECTOR
+#define MY_ITOS
+#define FINALIZERS
+#define STACK_OVERFLOW_EXCEPTION_HANDLER
+#undef MARK_GC
+#undef ADD_SYSTEM_TIME
+#undef COUNT_GARBAGE_COLLECTIONS
+
+#define SP_G5
+
+#define ldg(g,r) sethi %hi g,%o0 ; ld [%o0+%lo g],r
+#define ldgr(g,r,ir) sethi %hi g,ir ; ld [ir+%lo g],r
+#define stg(r,g) sethi %hi g,%o0 ; st r,[%o0+%lo g]
+#define stgr(r,g,ir) sethi %hi g,ir ; st r,[ir+%lo g]
+#define ldgsb(g,r) sethi %hi g,%o0 ; ldsb [%o0+%lo g],r
+#define ldgub(g,r) sethi %hi g,%o0 ; ldub [%o0+%lo g],r
+#define stgb(r,g) sethi %hi g,%o0 ; stb r,[%o0+%lo g]
+#define seth(g,r) sethi %hi g,r
+#define setl(g,r) add r,%lo g,r
+
+#define setmbit(vector,bit_n,byte_offset,bit,byte,scratch) \
+ mov 128,bit ;\
+ srl bit_n,3,byte_offset ;\
+ ldub [vector+byte_offset],byte ;\
+ and bit_n,7,scratch ;\
+ srl bit,scratch,bit ;\
+ bset bit,byte ;\
+ stb byte,[vector+byte_offset]
+
+#define tstmbit(vector,bit_n,byte_offset,bit,byte,scratch) \
+ mov 128,bit ;\
+ srl bit_n,3,byte_offset ;\
+ ldub [vector+byte_offset],byte ;\
+ and bit_n,7,scratch ;\
+ srl bit,scratch,bit ;\
+ btst bit,byte
+
+#define clrmbit(vector,bit_n,byte_offset,bit,byte,scratch) \
+ mov 128,bit ;\
+ srl bit_n,3,byte_offset ;\
+ ldub [vector+byte_offset],byte ;\
+ and bit_n,7,scratch ;\
+ srl bit,scratch,bit ;\
+ bclr bit,byte ;\
+ stb byte,[vector+byte_offset]
+
+#ifdef SOLARIS
+#define lcomm(a) .comm a,4,4
+#else
+#define lcomm(a) .comm a,4
+#endif
+
+#define d0 %l0
+#define d1 %l1
+#define d2 %l2
+#define d3 %l3
+#define d4 %l4
+#define d5 %l5
+#define d6 %l6
+#define d7 %l7
+#define a0 %i0
+#define a1 %i1
+#define a2 %i2
+#define a3 %i3
+#define a4 %i4
+#define a5 %i5
+#define a6 %g6
+#ifdef SP_G5
+# define sp %g5
+#else
+# define sp %g7
+#endif
+ .data
+
+ lcomm (heap_mbp)
+#ifdef STACK_OVERFLOW_EXCEPTION_HANDLER
+ lcomm (begin_b_stack_p)
+#else
+ lcomm (stack_mbp)
+#endif
+ lcomm (heap_p)
+ lcomm (heap_p1)
+ lcomm (heap_p2)
+heap_p3: .long 0
+heap_vector: .long 0
+ lcomm (heap_size_33)
+#ifdef COPIED_VECTOR
+ lcomm (heap_size_129)
+ lcomm (heap_copied_vector)
+ lcomm (heap_copied_vector_size)
+#endif
+heap_end_after_gc: .long 0
+ lcomm (extra_heap)
+ lcomm (extra_heap_size)
+ lcomm (stack_p)
+ .global halt_sp
+ lcomm (halt_sp)
+
+#ifdef 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
+#endif
+
+caf_list: .word 0
+ .global caf_listp
+caf_listp: .word 0
+! number of long words requested from the garbage collector
+ lcomm (alloc_size)
+ lcomm (basic_only)
+
+#ifdef SOLARIS
+ lcomm (last_time)
+ lcomm (execute_time)
+ lcomm (garbage_collect_time)
+ lcomm (IO_time)
+#else
+ .comm last_time,8
+ .comm execute_time,8
+ .comm garbage_collect_time,8
+ .comm IO_time,8
+#endif
+
+#ifdef SOLARIS
+ .comm jump_buffer,9*4,4
+#else
+ .comm jump_buffer,9*4
+#endif
+
+zero_length_string:
+ .word __STRING__+2
+ .word 0
+true_string:
+ .word __STRING__+2
+ .word 4
+true_c_string:
+ .ascii "True"
+ .byte 0,0,0,0
+false_string:
+ .word __STRING__+2
+ .word 5
+false_c_string:
+ .ascii "False"
+ .byte 0,0,0
+file_c_string:
+ .ascii "File"
+ .byte 0,0,0,0
+garbage_collect_flag:
+ .byte 0
+ .byte 0,0,0
+#ifdef COUNT_GARBAGE_COLLECTIONS
+n_garbage_collections: .word 0
+#endif
+
+#ifdef SOLARIS
+ .comm sprintf_buffer,32,4
+#else
+ .comm sprintf_buffer,32
+#endif
+out_of_memory_string_1:
+ .ascii "Not enough memory to allocate heap and stack"
+ .byte 10,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:
+ .asciz "A stack: "
+garbage_collect_string_2:
+ .asciz " bytes. BC stack: "
+garbage_collect_string_3:
+ .ascii " bytes."
+ .byte 10,0
+heap_use_after_gc_string_1:
+ .ascii "Heap use after garbage collection: "
+ .byte 0
+heap_use_after_gc_string_2:
+ .ascii " Bytes."
+ .byte 10,0
+stack_overflow_string:
+ .ascii "Stack overflow."
+ .byte 10,0
+out_of_memory_string_4:
+ .ascii "Heap full."
+ .byte 10,0
+time_string_1:
+ .ascii "Execution: "
+ .byte 0
+time_string_2:
+ .ascii " Garbage collection: "
+#ifdef COUNT_GARBAGE_COLLECTIONS
+ .ascii "("
+#endif
+ .byte 0
+#ifdef COUNT_GARBAGE_COLLECTIONS
+time_string_3:
+ .ascii ") "
+ .byte 0
+#endif
+time_string_4:
+ .ascii " Total: "
+ .byte 0
+high_index_string:
+ .ascii "Index too high in UPDATE string."
+ .byte 10,0
+low_index_string:
+ .ascii "Index negative in UPDATE string."
+ .byte 10,0
+IO_error_string:
+ .ascii "IO error: "
+ .byte 0
+new_line_string:
+ .byte 10,0
+
+sprintf_time_string:
+ .ascii "%d.%02d"
+ .byte 0
+#ifdef MARK_GC
+marked_gc_string_1:
+ .ascii "Marked: "
+ .byte 0
+#endif
+
+#ifdef SOLARIS
+ .comm sprintf_time_buffer,20
+ .align 4
+#else
+ .comm sprintf_time_buffer,20
+ .align 2
+#endif
+first_one_bit_table:
+ .byte -1,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4
+ .byte 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
+ .byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
+ .byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
+ .byte 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ .byte 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ .byte 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ .byte 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+ .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+#ifdef SHARE_CHAR_INT
+ .global small_integers
+ .global static_characters
+#ifdef SOLARIS
+ .comm small_integers,33*8,4
+ .comm static_characters,256*8,4
+#else
+ .comm small_integers,33*8
+ .comm static_characters,256*8
+#endif
+#endif
+
+#ifdef FINALIZERS
+ .global __Nil
+ .global e____system__kFinalizer
+ .global e____system__kFinalizerGCTemp
+ .global finalizer_list
+finalizer_list:
+ .long 0
+free_finalizer_list:
+ .long 0
+#endif
+
+ .text
+
+ .global @abc_main
+ .global print
+ .global print_char
+ .global print_int
+ .global print_real
+ .global print__string__
+ .global print__chars__sc
+ .global print_sc
+ .global print_symbol
+ .global print_symbol_sc
+ .global printD
+ .global DtoAC
+
+ .global push_t_r_args
+ .global push_a_r_args
+
+ .global halt
+ .global dump
+
+ .global catAC
+ .global sliceAC
+ .global updateAC
+ .global eqAC
+ .global cmpAC
+ .global string_to_string_node
+
+ .global create_array
+ .global create_arrayB
+ .global create_arrayC
+ .global create_arrayI
+ .global create_arrayR
+#if 0
+ .global create_r_array
+#else
+ .global create_R_array
+#endif
+
+ .global _create_arrayB
+ .global _create_arrayC
+ .global _create_arrayI
+ .global _create_arrayR
+ .global _create_r_array
+
+ .global BtoAC
+ .global ItoAC
+ .global RtoAC
+ .global eqD
+
+ .global collect_0
+ .global collect_1
+ .global collect_2
+ .global collect_3
+
+#if 0
+ .global e__system__nAP
+ .global e__system__eaAP
+#endif
+ .global e__system__sAP
+ .global yet_args_needed
+ .global yet_args_needed_0
+ .global yet_args_needed_1
+ .global yet_args_needed_2
+ .global yet_args_needed_3
+ .global yet_args_needed_4
+
+ .global _c3,_c4,_c5,_c6,_c7,_c8,_c9,_c10,_c11,_c12
+ .global _c13,_c14,_c15,_c16,_c17,_c18,_c19,_c20,_c21,_c22
+ .global _c23,_c24,_c25,_c26,_c27,_c28,_c29,_c30,_c31,_c32
+
+ .global __indirection,__eaind,eval_fill
+ .global eval_upd_0,eval_upd_1,eval_upd_2,eval_upd_3,eval_upd_4
+ .global eval_upd_5,eval_upd_6,eval_upd_7,eval_upd_8,eval_upd_9
+ .global eval_upd_10,eval_upd_11,eval_upd_12,eval_upd_13,eval_upd_14
+ .global eval_upd_15,eval_upd_16,eval_upd_17,eval_upd_18,eval_upd_19
+ .global eval_upd_20,eval_upd_21,eval_upd_22,eval_upd_23,eval_upd_24
+ .global eval_upd_25,eval_upd_26,eval_upd_27,eval_upd_28,eval_upd_29
+ .global eval_upd_30,eval_upd_31,eval_upd_32
+
+ .global repl_args_b
+ .global push_arg_b
+ .global del_args
+#if 0
+ .global o__S_P2
+ .global ea__S_P2
+#endif
+
+ .global add_IO_time
+ .global add_execute_time
+
+ .global @IO_error
+ .global stack_overflow
+
+ .global out_of_memory_4
+
+#ifdef SOLARIS
+ .global __start
+#else
+ .global _start
+#endif
+ .global __driver
+
+! from system.abc:
+ .global INT
+ .global CHAR
+ .global BOOL
+ .global REAL
+ .global FILE
+ .global __STRING__
+ .global __ARRAY__
+ .global __cycle__in__spine
+ .global __print__graph
+ .global __eval__to__nf
+
+! from cgscon.c:
+ .global @w_print_char
+ .global @w_print_string
+ .global @w_print_text
+ .global @w_print_int
+ .global @w_print_real
+
+ .global @ew_print_char
+ .global @ew_print_text
+ .global @ew_print_string
+ .global @ew_print_int
+
+ .global @ab_stack_size
+ .global @heap_size
+ .global @flags
+ .global @execution_aborted
+
+! from standard c library:
+ .global @malloc
+ .global @free
+! .global @rand
+ .global @sprintf
+ .global @strlen
+
+@abc_main:
+ save %o6,-128,%o6
+ save %o6,-256,%o6
+
+ ldg (@flags,d0)
+ and d0,1,d0
+ stg (d0,basic_only)
+
+ ldg (@heap_size,d0)
+ sub d0,3,%o0
+ call .udiv
+ mov 33,%o1
+ stgr (%o0,heap_size_33,%o1)
+
+#ifdef COPIED_VECTOR
+ ldg (@heap_size,d0)
+ sub d0,3,%o0
+ call .udiv
+ mov 129,%o1
+ stgr (%o0,heap_size_129,%o1)
+ inc 3,%o0
+ andn %o0,3,%o0
+ stgr (%o0,heap_copied_vector_size,%o1)
+#endif
+
+ ldgr (@heap_size,%o0,%o1)
+ inc 7,%o0
+ andn %o0,7,%o0
+ stgr (%o0,@heap_size,%o1)
+ call @malloc
+ inc 3+4,%o0
+
+ tst %o0
+ beq no_memory_2
+ nop
+
+ stgr (%o0,heap_mbp,%o1)
+ inc 3,%o0
+ and %o0,-4,a6
+ stg (a6,heap_p)
+ stg (a6,heap_p1)
+
+#ifdef COPIED_VECTOR
+ ldg (@flags,%o0)
+ btst 64,%o0
+ bne no_copied_vector1
+ nop
+
+ ldg (heap_size_129,d1)
+ sll d1,6,d1
+ add a6,d1,d0
+ stg (d0,heap_copied_vector)
+ stg (d0,heap_end_after_gc)
+ ldg (heap_copied_vector_size,%o1)
+ add d0,%o1,d0
+ stg (d0,heap_p2)
+ b,a copied_vector1
+no_copied_vector1:
+#endif
+
+ ldg (@heap_size,d1)
+ srl d1,1,d1
+ add a6,d1,d0
+ stg (d0,heap_end_after_gc)
+ stg (d0,heap_p2)
+copied_vector1:
+
+ ldg (@ab_stack_size,d0)
+#ifdef STACK_OVERFLOW_EXCEPTION_HANDLER
+ call @allocate_stack
+ add d0,0,%o0
+#else
+ call @malloc
+ add d0,3,%o0
+#endif
+
+ tst %o0
+ beq no_memory_3
+ nop
+
+#ifdef STACK_OVERFLOW_EXCEPTION_HANDLER
+ ldgr (@ab_stack_size,d0,%o1)
+ inc 3,d0
+ and d0,-4,d0
+
+ sub %o0,d0,%i4
+ stgr (%i4,stack_p,%o1)
+
+ add %o0,d0,sp
+ set 8192,%o1
+ add sp,%o1,sp
+ stg (sp,begin_b_stack_p)
+#else
+ stgr (%o0,stack_mbp,%o1)
+ inc 3,%o0
+ and %o0,-4,d0
+
+ mov d0,%i4
+ ldg (@ab_stack_size,sp)
+ add sp,d0,sp
+ stg (d0,stack_p)
+#endif
+
+#ifdef SHARE_CHAR_INT
+ set small_integers,a0
+ mov 0,d0
+ set INT+2,d1
+make_small_integers_lp:
+ st d1,[a0]
+ st d0,[a0+4]
+ inc 1,d0
+ cmp d0,33
+ bne make_small_integers_lp
+ inc 8,a0
+
+ set static_characters,a0
+ mov 0,d0
+ set CHAR+2,d1
+make_static_characters_lp:
+ st d1,[a0]
+ st d0,[a0+4]
+ inc 1,d0
+ cmp d0,256
+ bne make_static_characters_lp
+ inc 8,a0
+#endif
+
+ set caf_list+4,a0
+ stg (a0,caf_listp)
+
+#ifdef FINALIZERS
+ set __Nil-8,a0
+ stg (a0,finalizer_list)
+ stg (a0,free_finalizer_list)
+#endif
+
+#ifdef COPIED_VECTOR
+ ldg (@flags,%o0)
+ btst 64,%o0
+ bne no_copied_vector2
+ nop
+
+ ldg (heap_size_129,d7)
+ ba copied_vector2
+ sll d7,6-2,d7
+no_copied_vector2:
+#endif
+ ldg (@heap_size,d7)
+ srl d7,3,d7
+
+copied_vector2:
+
+ seth (garbage_collect_flag,%o0)
+ clrb [%o0+%lo garbage_collect_flag]
+
+ ldg (@flags,d0)
+ btst 32+64,d0
+ beq no_compact_or_mark_gc
+ nop
+
+ ldg (heap_size_33,d0)
+ sll d0,3,d7
+ stg (a6,heap_vector)
+ add a6,d0,a6
+ add a6,3,a6
+ andn a6,3,a6
+ stg (a6,heap_p3)
+ sll d0,5,d0
+ add d0,a6,d0
+ stg (d0,heap_end_after_gc)
+ mov -1,d0
+ seth (garbage_collect_flag,%o0)
+ stb d0,[%o0+%lo garbage_collect_flag]
+
+no_compact_or_mark_gc:
+
+ dec 4,sp
+ call init_timer
+ st %o7,[sp]
+
+ stg (sp,halt_sp)
+
+ seth (jump_buffer,%o0)
+ call @setjmp
+ setl (jump_buffer,%o0)
+
+ tst %o0
+ bne exit
+ nop
+
+ set __cycle__in__spine,a5
+
+ dec 4,sp
+#ifdef SOLARIS
+ call __start
+#else
+ call _start
+#endif
+ st %o7,[sp]
+
+exit:
+ dec 4,sp
+ call add_execute_time
+ st %o7,[sp]
+
+ ldg (@flags,d0)
+ andcc d0,8,%g0
+ beq no_print_execution_time
+ nop
+
+ seth (time_string_1,%o0)
+ call @ew_print_string
+ setl (time_string_1,%o0)
+
+ set execute_time,a0
+ ld [a0],d0
+#ifndef SOLARIS
+ ld [a0+4],d1
+#endif
+ dec 4,sp
+ call print_time
+ st %o7,[sp]
+
+ seth (time_string_2,%o0)
+ call @ew_print_string
+ setl (time_string_2,%o0)
+
+#ifdef COUNT_GARBAGE_COLLECTIONS
+ sethi %hi n_garbage_collections,%o0
+ call @ew_print_int
+ ld [%o0+%lo n_garbage_collections],%o0
+
+ seth (time_string_3,%o0)
+ call @ew_print_string
+ setl (time_string_3,%o0)
+#endif
+
+ set garbage_collect_time,a0
+ ld [a0],d0
+#ifndef SOLARIS
+ ld [a0+4],d1
+#endif
+ dec 4,sp
+ call print_time
+ st %o7,[sp]
+
+ seth (time_string_4,%o0)
+ call @ew_print_string
+ setl (time_string_4,%o0)
+
+#ifdef SOLARIS
+ set execute_time,a0
+ ld [a0],d0
+ set garbage_collect_time,a0
+ ld [a0],d2
+ add d0,d2,d0
+ set IO_time,a0
+ ld [a0],d2
+ add d0,d2,d0
+#else
+ set execute_time,a0
+ ld [a0],d0
+ ld [a0+4],d1
+
+ set garbage_collect_time,a0
+ ld [a0],d2
+ ld [a0+4],%l3
+ add d0,d2,d0
+ add d1,d3,d1
+ set 1000000,d4
+ cmp d1,d4
+ bcs no_usec_overflow_1
+ nop
+ sub d1,d4,d1
+ inc 1,d0
+no_usec_overflow_1:
+
+ set IO_time,a0
+ ld [a0],d2
+ ld [a0+4],d3
+ add d0,d2,d0
+ add d1,d3,d1
+ cmp d1,d4
+ bcs no_usec_overflow_2
+ nop
+ sub d1,d4,d1
+ inc 1,d0
+no_usec_overflow_2:
+#endif
+ dec 4,sp
+ call print_time
+ st %o7,[sp]
+
+ call @ew_print_char
+ mov 10,%o0
+
+no_print_execution_time:
+exit_3:
+#ifndef STACK_OVERFLOW_EXCEPTION_HANDLER
+ seth (stack_mbp,%o1)
+ call @free
+ ld [%o1+%lo stack_mbp],%o0
+#endif
+exit_2:
+ seth (heap_mbp,%o1)
+ call @free
+ ld [%o1+%lo heap_mbp],%o0
+
+exit_1:
+ restore
+ ret
+ restore
+
+__driver:
+ ldgr (@flags,%o0,%o1)
+ btst 16,%o0
+ beq __print__graph
+ nop
+ b,a __eval__to__nf
+
+print_time:
+#ifdef SOLARIS
+ call _sysconf
+ mov 3,%o0
+
+ mov %o0,d2
+
+ mov %o0,%o1
+ call .udiv
+ mov d0,%o0
+
+ mov %o0,d3
+
+ mov d2,%o1
+ call .urem
+ mov d0,%o0
+
+ call .umul
+ mov 100,%o1
+
+ call .udiv
+ mov d2,%o1
+
+ mov %o0,%o3
+ set sprintf_time_string,%o1
+ set sprintf_time_buffer,%o0
+ call @sprintf
+ mov d3,%o2
+#else
+ set 10000,%o1
+ call .udiv
+ mov d1,%o0
+
+ mov %o0,%o3
+ set sprintf_time_string,%o1
+ set sprintf_time_buffer,%o0
+ call @sprintf
+ mov d0,%o2
+#endif
+
+ sethi %hi sprintf_time_buffer,%o0
+ call @ew_print_string
+ or %o0,%lo sprintf_time_buffer,%o0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+no_memory_2:
+ seth (out_of_memory_string_1,%o0)
+ call @ew_print_string
+ setl (out_of_memory_string_1,%o0)
+ b,a exit_1
+
+no_memory_3:
+ seth (out_of_memory_string_1,%o0)
+ call @ew_print_string
+ setl (out_of_memory_string_1,%o0)
+ b,a exit_1
+
+print_sc:
+ ldg (basic_only,%o1)
+ tst %o1
+ bne end_print
+ nop
+print:
+ call @w_print_string
+ mov d0,%o0
+
+end_print:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+dump:
+ dec 4,sp
+ call print
+ st %o7,[sp]
+
+ b,a halt
+
+printD: btst 2,d0
+ bne printD_
+ nop
+ ba print_string_a2
+ mov d0,a2
+
+DtoAC: btst 2,d0
+ bne DtoAC_
+ nop
+
+ ba DtoAC_string_a2
+ mov d0,a2
+
+DtoAC_: add d0,-2,a2
+ ldsh [a2],d1
+ cmp d1,256
+ bgeu DtoAC_record
+ sll d1,3,d1
+ sub a2,d1,a2
+DtoAC_record:
+ ba DtoAC_string_a2
+ ld [a2-4],a2
+
+DtoAC_string_a2:
+ ld [a2],d0
+ ba build_string
+ add a2,4,a0
+
+print_symbol:
+ ba print_symbol_2
+ clr d1
+
+print_symbol_sc:
+ ldg (basic_only,d1)
+print_symbol_2:
+ ld [a0],d0
+
+ set INT+2,%o0
+ cmp %o0,d0
+ beq print_int_node
+ nop
+ set CHAR+2,%o0
+ cmp %o0,d0
+ beq print_char_node
+ nop
+ set BOOL+2,%o0
+ cmp %o0,d0
+ beq print_bool
+ nop
+ set REAL+2,%o0
+ cmp %o0,d0
+ beq print_real_node
+ nop
+
+ tst d1
+ bne end_print_symbol
+ nop
+
+printD_: add d0,-2,a2
+ ldsh [a2],d1
+ cmp d1,256
+ bgeu print_record
+ sll d1,3,d1
+ sub a2,d1,a2
+print_record:
+ ba print_string_a2
+ ld [a2-4],a2
+
+end_print_symbol:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+print_int_node:
+ call @w_print_int
+ ld [a0+4],%o0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+print_int:
+ call @w_print_int
+ mov d0,%o0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+print_char:
+ ldg (basic_only,d1)
+ tst d1
+ bne print_char_node_bo
+ nop
+ b,a print_char_node_sc
+
+print_char_node:
+ tst d1
+ bne print_char
+ ld [a0+4],d0
+print_char_node_sc:
+ call @w_print_char
+ mov 0x27,%o0
+
+ call @w_print_char
+ mov d0,%o0
+
+ call @w_print_char
+ mov 0x27,%o0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+print_char_node_bo:
+ call @w_print_char
+ mov d0,%o0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+print_bool:
+ ldsb [a0+7],%o0
+
+ tst %o0
+ beq print_false
+ nop
+print_true:
+ sethi %hi true_c_string,%o0
+ call @w_print_string
+ or %o0,%lo true_c_string,%o0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+print_false:
+ sethi %hi false_c_string,%o0
+ call @w_print_string
+ or %o0,%lo false_c_string,%o0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+print_real:
+ st %f0,[sp-8]
+ st %f1,[sp-4]
+ ld [sp-8],%o0
+ call @w_print_real
+ ld [sp-4],%o1
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+print_real_node:
+ ld [a0+4],%o0
+ call @w_print_real
+ ld [a0+8],%o1
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+print_string_a2:
+ ld [a2],%o1
+ call @w_print_text
+ add a2,4,%o0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+print__chars__sc:
+ ldg (basic_only,%o1)
+ tst %o1
+ bne no_print_chars
+ nop
+
+print__string__:
+ ld [a0+4],%o1
+ call @w_print_text
+ add a0,8,%o0
+no_print_chars:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+push_a_r_args:
+ ld [a0+8],a1
+ dec 2,a1
+ lduh [a1],d3
+ dec 256,d3
+ lduh [a1+2],d1
+ inc 4,a1
+ sub d3,d1,d2
+ sll d0,2,d0
+ mov 0,d4
+ dec d3
+mul_array_size_lp:
+ deccc d3
+ bcc mul_array_size_lp
+ add d4,d0,d4
+
+ inc 12,a0
+ add a0,d4,a0
+ ld [sp],%o7
+ inc 4,sp
+
+ sll d1,2,%o0
+ add a0,%o0,a0
+ ba push_a_elements
+ mov a0,a3
+
+push_a_elements_lp:
+ dec 4,a3
+ st %o0,[a4]
+ inc 4,a4
+push_a_elements:
+ deccc d1
+ bcc,a push_a_elements_lp
+ ld [a3-4],%o0
+
+ sll d2,2,%o0
+ ba push_b_elements
+ add a0,%o0,a0
+
+push_b_elements_lp:
+ dec 4,a0
+ st %o0,[sp-4]
+ dec 4,sp
+push_b_elements:
+ deccc d2
+ bcc,a push_b_elements_lp
+ ld [a0-4],%o0
+
+ retl
+ mov a1,d0
+
+push_t_r_args:
+ ld [a0],a1
+ inc 4,a0
+ dec 2,a1
+ lduh [a1],d3
+ lduh [a1+2],d1
+ dec 256,d3
+ add a1,4,d0
+ sub d3,d1,d2
+
+ sll d3,2,d4
+ cmp d3,2
+ bleu small_record
+ add a0,d4,a1
+
+ ld [a0+4],a1
+ dec 4,a1
+ add a1,d4,a1
+small_record:
+ ld [sp],%o7
+ ba push_r_b_elements
+ inc 4,sp
+
+push_r_b_elements_lp:
+ bne not_first_arg_b
+ dec 4,sp
+
+ ld [a0],%o0
+ b push_r_b_elements
+ st %o0,[sp]
+not_first_arg_b:
+ ld [a1-4],%o0
+ dec 4,a1
+ st %o0,[sp]
+push_r_b_elements:
+ deccc d2
+ bcc,a push_r_b_elements_lp
+ deccc d3
+
+ b,a push_r_a_elements
+
+push_r_a_elements_lp:
+ bne not_first_arg_a
+ inc 4,a4
+
+ ld [a0],%o0
+ b push_r_a_elements
+ st %o0,[a4-4]
+
+not_first_arg_a:
+ ld [a1-4],%o0
+ dec 4,a1
+ st %o0,[a4-4]
+push_r_a_elements:
+ deccc d1
+ bcc,a push_r_a_elements_lp
+ deccc d3
+
+ retl
+ nop
+
+BtoAC:
+ tst d0
+ be BtoAC_false
+ ld [sp],%o7
+BtoAC_true:
+ sethi %hi true_string,a0
+ or a0,%lo true_string,a0
+ retl
+ inc 4,sp
+
+BtoAC_false:
+ sethi %hi false_string,a0
+ or a0,%lo false_string,a0
+ retl
+ inc 4,sp
+
+RtoAC:
+ st %f0,[sp-8]
+ st %f1,[sp-4]
+ set printf_real_string,%o1
+ ld [sp-8],%o2
+ set sprintf_buffer,%o0
+ call @sprintf
+ ld [sp-4],%o3
+
+ b,a D_to_S_x
+
+ItoAC:
+#ifdef MY_ITOS
+ sethi %hi sprintf_buffer,a0
+
+ tst d0
+ bpos no_minus
+ or a0,%lo sprintf_buffer,a0
+
+ mov 45,%o0
+ stb %o0,[a0]
+ inc a0
+ subcc %g0,d0,d0
+no_minus:
+ be zero_digit
+ add a0,12,a2
+
+calculate_digits:
+ cmp d0,10
+ blu last_digit
+ mov d0,%o0
+
+ call .urem
+ mov 10,%o1
+
+ add %o0,48,a1
+ stb a1,[a2]
+
+ mov d0,%o0
+ call .udiv
+ mov 10,%o1
+
+ mov %o0,d0
+
+ b calculate_digits
+ inc a2
+
+last_digit:
+ tst d0
+ be no_zero
+ nop
+zero_digit:
+ add d0,48,d0
+ stb d0,[a2]
+ inc a2
+no_zero:
+ add a0,12,a1
+
+reverse_digits:
+ ldub [a2-1],d1
+ dec a2
+ stb d1,[a0]
+ cmp a2,a1
+ bne reverse_digits
+ inc a0
+
+ clrb [a0]
+
+ set sprintf_buffer,d0
+ ba sprintf_buffer_to_string
+ sub a0,d0,d0
+
+#else
+ mov d0,%o2
+ set printf_int_string,%o1
+ set sprintf_buffer,%o0
+ call @sprintf
+ nop
+#endif
+
+D_to_S_x:
+ sethi %hi sprintf_buffer,%o0
+ call @strlen
+ or %o0,%lo sprintf_buffer,%o0
+
+ mov %o0,d0
+
+#ifdef MY_ITOS
+sprintf_buffer_to_string:
+ set sprintf_buffer,a0
+! d0 : length, a0 : string
+build_string:
+#endif
+ add d0,3,d1
+ srl d1,2,d1
+ dec 2,d7
+ subcc d7,d1,d7
+ bpos D_to_S_no_gc
+ nop
+
+ mov a0,d2
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+ mov d2,a0
+
+D_to_S_no_gc:
+ mov a6,d2
+ set __STRING__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ ba D_to_S_cp_str_2
+ inc 8,a6
+D_to_S_cp_str_1:
+ ld [a0],%o0
+ inc 4,a0
+ st %o0,[a6]
+ inc 4,a6
+D_to_S_cp_str_2:
+ deccc d1
+ bpos D_to_S_cp_str_1
+ nop
+
+ ld [sp],%o7
+ mov d2,a0
+ retl
+ inc 4,sp
+
+eqD: ld [a0],d0
+ ld [a1],%o0
+ cmp d0,%o0
+ bne eqD_false
+ nop
+ set INT+2,%o0
+ cmp d0,%o0
+ be eqD_INT
+ nop
+ set CHAR+2,%o0
+ cmp d0,%o0
+ be eqD_CHAR
+ nop
+ set BOOL+2,%o0
+ cmp d0,%o0
+ be eqD_BOOL
+ nop
+ set REAL+2,%o0
+ cmp d0,%o0
+ be eqD_REAL
+ nop
+
+ ld [sp],%o7
+ mov -1,d0
+ retl
+ inc 4,sp
+
+eqD_CHAR:
+eqD_INT: ld [a0+4],d1
+ ld [a1+4],%o0
+ clr d0
+ cmp d1,%o0
+ beq,a eqD_CHAR_true
+ mov -1,d0
+eqD_CHAR_true:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+eqD_BOOL: ldsb [a0+7],d1
+ ldsb [a1+7],%o0
+ clr d0
+ cmp d1,%o0
+ beq,a eqD_BOOL_true
+ mov -1,d0
+eqD_BOOL_true:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+eqD_REAL: ld [a0+4],%f0
+ ld [a0+8],%f1
+ ld [a1+4],%f2
+ ld [a1+8],%f3
+ clr d0
+ fcmpd %f0,%f2
+ nop
+ fbe,a eqD_REAL_true
+ mov -1,d0
+eqD_REAL_true:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+eqD_false:
+ ld [sp],%o7
+ clr d0
+ retl
+ inc 4,sp
+
+!
+! the timer
+!
+
+init_timer:
+#ifdef SOLARIS
+ call @times
+ sub sp,16,%o0
+
+ ld [sp-16],d0
+
+ stg (d0,last_time)
+ stg (%g0,execute_time)
+ stg (%g0,garbage_collect_time)
+ stg (%g0,IO_time)
+#else
+ sub sp,88,%o1
+ call @getrusage
+ clr %o0
+
+ set last_time,a0
+ ld [sp-88],d0
+ ld [sp-84],d1
+
+# ifdef ADD_SYSTEM_TIME
+ ld [sp-80],%o0
+ add d0,%o0,d0
+ ld [sp-76],%o0
+ add d1,%o0,d1
+ set 1000000,%o0
+ cmp d1,%o0
+ bl no_micro_seconds_overflow1
+ nop
+ sub d1,%o0,d1
+ inc 1,d0
+no_micro_seconds_overflow1:
+# endif
+ st d0,[a0]
+ st d1,[a0+4]
+
+ set execute_time,a0
+# ifdef ADD_SYSTEM_TIME
+ st d0,[a0]
+ st d1,[a0+4]
+# else
+ clr [a0]
+ clr [a0+4]
+# endif
+ set garbage_collect_time,a0
+ clr [a0]
+ clr [a0+4]
+ set IO_time,a0
+ clr [a0]
+ clr [a0+4]
+#endif
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+get_time_diff:
+#ifdef SOLARIS
+ call @times
+ sub sp,16,%o0
+
+ ld [sp-16],d0
+ sethi %hi last_time,a0
+ ld [a0+%lo last_time],d2
+ st d0,[a0+%lo last_time]
+ sub d0,d2,d0
+#else
+ sub sp,88,%o1
+ call @getrusage
+ clr %o0
+
+ ld [sp-88],d0
+ ld [sp-84],d1
+# ifdef ADD_SYSTEM_TIME
+ ld [sp-80],%o0
+ add d0,%o0,d0
+ ld [sp-76],%o0
+ add d1,%o0,d1
+ set 1000000,%o0
+ cmp d1,%o0
+ bl no_micro_seconds_overflow2
+ nop
+ sub d1,%o0,d1
+ inc 1,d0
+no_micro_seconds_overflow2:
+# endif
+ set last_time,a0
+ ld [a0],d2
+ st d0,[a0]
+ sub d0,d2,d0
+ ld [a0+4],d2
+ st d1,[a0+4]
+ subcc d1,d2,d1
+ bpos get_time_diff_1
+ nop
+ set 1000000,d2
+ add d1,d2,d1
+ dec 1,d0
+get_time_diff_1:
+#endif
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+add_execute_time:
+ dec 4,sp
+ call get_time_diff
+ st %o7,[sp]
+
+ set execute_time,a0
+add_time:
+#ifdef SOLARIS
+ ld [a0],d2
+ add d0,d2,d0
+ st d0,[a0]
+#else
+ ld [a0],d2
+ add d0,d2,d0
+ st d0,[a0]
+ ld [a0+4],d2
+ add d1,d2,d1
+ set 1000000,d2
+ cmp d1,d2
+ bcs add_execute_time_1
+ nop
+ sub d1,d2,d1
+ inc 1,d0
+ st d0,[a0]
+add_execute_time_1:
+ st d1,[a0+4]
+#endif
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+add_garbage_collect_time:
+ dec 4,sp
+ call get_time_diff
+ st %o7,[sp]
+
+ sethi %hi garbage_collect_time,a0
+ ba add_time
+ or a0,%lo garbage_collect_time,a0
+
+add_IO_time:
+ dec 4,sp
+ call get_time_diff
+ st %o7,[sp]
+
+ sethi %hi IO_time,a0
+ ba add_time
+ or a0,%lo IO_time,a0
+
+!
+! the garbage collector
+!
+
+collect_3:
+ st a0,[%i4]
+ st a1,[%i4+4]
+ st a2,[%i4+8]
+ inc 12,%i4
+
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+ ld [%i4-12],a0
+ ld [%i4-8],a1
+ ld [%i4-4],a2
+ dec 12,%i4
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+collect_2:
+ st a0,[%i4]
+ st a1,[%i4+4]
+ inc 8,%i4
+
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+ ld [%i4-8],a0
+ ld [%i4-4],a1
+ dec 8,%i4
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+collect_1:
+ st a0,[%i4]
+ inc 4,%i4
+
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+ ld [%i4-4],a0
+ dec 4,%i4
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+collect_0:
+#ifdef MARK_GC
+ ldg (@flags,%o0)
+ btst 64,%o0
+ beq no_mark_gc1
+ seth (bit_counter,%g1)
+
+ ld [%g1+%lo bit_counter],%o2
+ tst %o2
+ beq no_scan
+ or %g1,%lo bit_counter,%g1
+
+ ld [%g1+heap_end_after_gc-bit_counter],%o4
+ ld [%g1+bit_vector_p-bit_counter],a0
+ sub %o4,a6,%o4
+ srl %o4,2,%o4
+ sub %o4,d7,%o4
+
+scan_bits:
+ ld [a0],%o0 !
+ inc 4,a0
+ tst %o0
+ beq zero_bits
+ deccc %o2
+ clr [a0-4]
+ bne,a scan_bits+4
+ ld [a0],%o0
+
+ b,a end_scan
+
+zero_bits:
+ beq end_bits
+ mov a0,a1
+
+skip_zero_bits_lp:
+ ld [a0],%o3 !
+ inc 4,a0
+ tst %o3
+ bne end_zero_bits
+ deccc %o2
+ bne,a skip_zero_bits_lp+4
+ ld [a0],%o3
+
+ ba end_bits+4
+ sub a0,a1,%o3
+
+end_zero_bits:
+ clr [a0-4] !
+
+ sub a0,a1,%o3
+ sll %o3,3,%o3
+
+ ld [%g1+free_after_mark-bit_counter],%o1
+ cmp %o3,%o4
+ add %o1,%o3,%o1
+ blu scan_next
+ st %o1,[%g1+free_after_mark-bit_counter]
+
+found_free_memory:
+ st %o2,[%g1+bit_counter-bit_counter]
+ st a0,[%g1+bit_vector_p-bit_counter]
+
+ sub %o3,%o4,d7
+
+ ld [%g1+heap_vector-bit_counter],%o1
+ sub a1,4,%o2
+ sub %o2,%o1,%o2
+ ld [%g1+heap_p3-bit_counter],%o1
+ sll %o2,5,%o2
+
+ add %o2,%o1,a6
+
+ sll %o3,2,%o3
+ add a6,%o3,%o2
+
+ ld [sp],%o7
+ st %o2,[%g1+heap_end_after_gc-bit_counter]
+ retl
+ inc 4,sp
+
+scan_next:
+ tst %o2
+ bne,a scan_bits+4
+ ld [a0],%o0
+
+ b,a end_scan
+
+end_bits:
+ sub a0,a1,%o3 !
+ inc 4,%o3
+ sll %o3,3,%o3
+
+ ld [%g1+free_after_mark-bit_counter],%o1
+ cmp %o3,%o4
+ add %o1,%o3,%o1
+ bgeu found_free_memory
+ st %o1,[%g1+free_after_mark-bit_counter]
+
+end_scan:
+ st %o2,[%g1+bit_counter-bit_counter]
+no_scan:
+
+no_mark_gc1:
+#endif
+
+ dec 28,sp
+ st d0,[sp]
+ st d1,[sp+4]
+ st d2,[sp+8]
+ st d3,[sp+12]
+ st d4,[sp+16]
+ st d5,[sp+20]
+ st d6,[sp+24]
+
+ seth (garbage_collect_flag,%g1)
+ ldsb [%g1+%lo garbage_collect_flag],%o0
+ tst %o0
+ ble collect
+ nop
+
+ dec 2,%o0
+ stb %o0,[%g1+%lo garbage_collect_flag]
+
+ ldg (heap_end_after_gc,d0)
+ sub d0,a6,d0
+ srl d0,2,d0
+ sub d0,%l7,d0
+ ldg (extra_heap_size,d1)
+ cmp d0,d1
+ bgu collect
+ nop
+
+ ldg (extra_heap_size,d1)
+ sub d1,d0,%l7
+
+ ldg (extra_heap,a6)
+ sll d1,2,d1
+ add d1,a6,d1
+ stg (d1,heap_end_after_gc)
+
+ ld [sp],d0
+ ld [sp+4],d1
+ ld [sp+8],d2
+ ld [sp+12],d3
+ ld [sp+16],d4
+ ld [sp+20],d5
+ ld [sp+24],d6
+
+ ld [sp+28],%o7
+ retl
+ inc 32,sp
+
+collect:
+ dec 4,sp
+ call add_execute_time
+ st %o7,[sp]
+
+ ldgr (@flags,%o0,%o1)
+ btst 4,%o0
+ beq no_print_stack_sizes
+ nop
+
+ seth (garbage_collect_string_1,%o0)
+ call @ew_print_string
+ setl (garbage_collect_string_1,%o0)
+
+
+ ldg (stack_p,a0)
+ sub %i4,a0,%o0
+#ifdef STACK_OVERFLOW_EXCEPTION_HANDLER
+ ldgr (@begin_b_stack_p,d0,%o1)
+#else
+ ldgr (@ab_stack_size,%o2,%o1)
+ add a0,%o2,d0
+#endif
+ call @ew_print_int
+ sub d0,sp,d0
+
+ seth (garbage_collect_string_2,%o0)
+ call @ew_print_string
+ setl (garbage_collect_string_2,%o0)
+
+ call @ew_print_int
+ mov d0,%o0
+
+ seth (garbage_collect_string_3,%o0)
+ call @ew_print_string
+ setl (garbage_collect_string_3,%o0)
+
+no_print_stack_sizes:
+ cmp %i4,sp
+ bgu stack_overflow
+ nop
+
+#ifdef MARK_GC
+ ldg (@flags,%o0)
+ btst 64,%o0
+ bne collect2_0
+ nop
+#endif
+
+ ldgsb (garbage_collect_flag,%o1)
+ tst %o1
+ bne collect2_0
+ nop
+
+#ifdef COPIED_VECTOR
+ ldg (@flags,%o0)
+ btst 64,%o0
+ bne no_copied_vector3
+ nop
+
+ ldg (heap_copied_vector,a2)
+ ldg (heap_copied_vector_size,d0)
+ srl d0,2,d0
+
+ btst 1,d0
+ be zero_bits1_1
+ srl d0,1,d0
+
+ clr [%i2]
+ inc 4,%i2
+zero_bits1_1:
+ btst 1,d0
+ be zero_bits1_5
+ srl d0,1,d0
+
+ ba zero_bits1_2
+ dec 8,%i2
+
+ clr [%i2]
+zero_bits1_4:
+ clr [%i2+4]
+zero_bits1_2:
+ clr [%i2+8]
+ clr [%i2+12]
+ inc 16,%i2
+zero_bits1_5:
+ deccc d0
+ bpos,a zero_bits1_4
+ clr [%i2]
+
+no_copied_vector3:
+#endif
+
+! calculate alloc_size
+ ldg (heap_end_after_gc,d0)
+ sub d0,a6,d0
+ srl d0,2,d0
+ sub d0,d7,d0
+ stg (d0,alloc_size)
+
+#include "scopy.a"
+
+ stg (%o4,heap_end_after_gc)
+
+ sub %o4,%g6,%l7
+ srl %l7,2,%l7
+
+ dec 4,sp
+ call add_garbage_collect_time
+ st %o7,[sp]
+
+ ldg (alloc_size,%o1)
+ subcc %l7,%o1,%l7
+ bneg switch_to_mark_scan
+! bneg out_of_memory_4
+ nop
+
+ sll %l7,2,d0
+ add d0,%l7,d0
+ sll d0,5,d0
+ ldg (@heap_size,d2)
+ sll d2,2,d1
+ add d1,d2,d1
+ sll d1,1,d1
+ add d1,d2,d1
+ cmp d0,d1
+ bcc no_mark_scan
+! ba no_mark_scan
+ nop
+
+switch_to_mark_scan:
+ ldg (heap_size_33,d0)
+ sll d0,5,d0
+ ldg (heap_p,d1)
+
+ ldg (heap_p1,d2)
+ ldg (heap_p2,%o1)
+ cmp d2,%o1
+ bcs vector_at_begin
+ nop
+
+vector_at_end:
+ stg (d1,heap_p3)
+ add d1,d0,d1
+ stg (d1,heap_vector)
+
+ ldg (heap_p1,d0)
+ stg (d0,extra_heap)
+ sub d1,d0,d1
+ srl d1,2,d1
+ stg (d1,extra_heap_size)
+ ba switch_to_mark_scan_2
+ nop
+
+vector_at_begin:
+ stg (d1,heap_vector)
+ ldgr (@heap_size,%o0,%o1)
+ add d1,%o0,d1
+ sub d1,d0,d1
+ stg (d1,heap_p3)
+
+ stg (d1,extra_heap)
+ ldg (heap_p2,d2)
+ sub d2,d1,d2
+ srl d2,2,d2
+ stg (d2,extra_heap_size)
+
+switch_to_mark_scan_2:
+ ldg (@heap_size,d0)
+ srl d0,3,d0
+ sub d0,%l7,d0
+ sll d0,2,d0
+
+ mov 1,%o1
+ stgb (%o1,garbage_collect_flag)
+
+ tst d7
+ bpos end_garbage_collect
+ nop
+
+ mov -1,%o1
+ stgb (%o1,garbage_collect_flag)
+
+ ldg (extra_heap_size,d1)
+ ldg (alloc_size,%l7)
+ subcc d1,%l7,%l7
+ bneg out_of_memory_4
+ nop
+
+ ldg (extra_heap,%g6)
+ sll d1,2,d1
+ add d1,%g6,d1
+ stg (d1,heap_end_after_gc)
+ ba end_garbage_collect
+ nop
+
+no_mark_scan:
+! exchange the semi_spaces
+
+ ldg (heap_p1,d0)
+ ldg (heap_p2,%o1)
+ stg (d0,heap_p2)
+ stg (%o1,heap_p1)
+
+#ifdef COPIED_VECTOR
+ ldg (@flags,%o0)
+ btst 64,%o0
+ bne no_copied_vector5
+ nop
+
+ ldg (heap_size_129,d0)
+ ba copied_vector5
+ sll d0,6-2,d0
+no_copied_vector5:
+#endif
+
+ ldg (@heap_size,d0)
+ srl d0,3,d0
+
+copied_vector5:
+
+ sub d0,d7,d0
+ sll d0,2,d0
+
+
+end_garbage_collect:
+#ifdef COUNT_GARBAGE_COLLECTIONS
+ sethi %hi n_garbage_collections,%o1
+ ld [%o1+%lo n_garbage_collections],%o2
+ inc 1,%o2
+#endif
+ ldg (@flags,%o0)
+ btst 2,%o0
+ beq no_heap_use_message
+#ifdef COUNT_GARBAGE_COLLECTIONS
+ st %o2,[%o1+%lo n_garbage_collections]
+#else
+ nop
+#endif
+
+ seth (heap_use_after_gc_string_1,%o0)
+ call @ew_print_string
+ setl (heap_use_after_gc_string_1,%o0)
+
+ call @ew_print_int
+ mov d0,%o0
+
+ seth (heap_use_after_gc_string_2,%o0)
+ call @ew_print_string
+ setl (heap_use_after_gc_string_2,%o0)
+
+no_heap_use_message:
+#ifdef FINALIZERS
+ call call_finalizers
+ nop
+#endif
+
+ ld [sp],d0
+ ld [sp+4],d1
+ ld [sp+8],d2
+ ld [sp+12],d3
+ ld [sp+16],d4
+ ld [sp+20],%l5
+ ld [sp+24],%l6
+
+ ld [sp+28],%o7
+ retl
+ inc 32,sp
+
+#ifdef FINALIZERS
+call_finalizers:
+ ldg (free_finalizer_list,d0)
+
+call_finalizers_lp:
+ set __Nil-8,%o1
+ cmp d0,%o1
+ beq end_call_finalizers
+ nop
+
+ ld [d0+8],d1
+ ld [d0+4],d0
+
+ ld [d1],%o1
+ ld [d1+4],%o0
+
+ save %o6,-128,%o6
+
+ call %i1
+ nop
+
+ b call_finalizers_lp
+ restore
+
+end_call_finalizers:
+ stg (%o1,free_finalizer_list)
+ retl
+ nop
+#endif
+
+out_of_memory_4:
+ dec 4,sp
+ call add_garbage_collect_time
+ st %o7,[sp]
+
+ seth (out_of_memory_string_4,%o0)
+ b print_error
+ setl (out_of_memory_string_4,%o0)
+
+
+reorder:
+ mov d0,d2
+ mov d1,d3
+ sll d0,2,d4
+ sll d1,2,d5
+ add a0,d5,a0
+ ba st_reorder_lp
+ sub a1,d4,a1
+
+reorder_lp:
+ ld [a1-4],%o0
+ st d6,[a1-4]
+ st %o0,[a0]
+
+ deccc 1,d2
+ bne next_b_in_element
+ inc 4,a0
+
+ mov d0,d2
+ add a0,d5,a0
+next_b_in_element:
+ deccc 1,d3
+ bne next_a_in_element
+ dec 4,a1
+
+ mov d1,d3
+ sub a1,d4,a1
+next_a_in_element:
+st_reorder_lp:
+ cmp a1,a0
+ bgu,a reorder_lp
+ ld [a0],d6
+
+ retl
+ nop
+!
+! the sliding compacting garbage collector
+!
+
+collect2_0:
+! zero all mark bits
+
+ ldg (heap_p3,d6)
+ ldg (heap_vector,%o4)
+ ldg (heap_end_after_gc,d5)
+ sub d5,a6,d5
+ srl d5,2,d5
+ sub d5,d7,d5
+ stg (d5,alloc_size)
+
+#ifdef MARK_GC
+ ldg (@flags,%o0)
+ btst 64,%o0
+ be no_mark_gc3
+ sethi %hi zero_bits_before_mark,%o0
+
+ ld [%o0+%lo zero_bits_before_mark],%o1
+ tst %o1
+ beq no_zero_bits
+ nop
+
+ clr [%o0+%lo zero_bits_before_mark]
+no_mark_gc3:
+#endif
+
+ mov %o4,%i2
+ ldg (heap_size_33,d0)
+ inc 3,d0
+ srl d0,2,d0
+
+ btst 1,d0
+ be zero_bits_1
+ srl d0,1,d0
+
+ clr [%i2]
+ inc 4,%i2
+zero_bits_1:
+ btst 1,d0
+ be zero_bits_5
+ srl d0,1,d0
+
+ ba zero_bits_2
+ dec 8,%i2
+
+ clr [%i2]
+zero_bits_4:
+ clr [%i2+4]
+zero_bits_2:
+ clr [%i2+8]
+ clr [%i2+12]
+ inc 16,%i2
+zero_bits_5:
+ deccc d0
+ bpos,a zero_bits_4
+ clr [%i2]
+
+#ifdef MARK_GC
+no_zero_bits:
+ ldg (@flags,%o0)
+ btst 64,%o0
+ be no_mark_gc4
+ nop
+
+ ldg (last_heap_free,d0)
+ ldg (free_after_mark,d1)
+ sll d1,2,d1
+
+ sll d1,3,d2
+ add d2,d1,d1
+ srl d1,2,d1
+
+ cmp d0,d1
+ bgu compact_gc
+ nop
+
+#include "smark.a"
+
+compact_gc:
+ mov 1,d0
+ stg (d0,zero_bits_before_mark)
+ sethi %hi last_heap_free,%o0
+ st %g0,[%o0+%lo last_heap_free]
+ mov 1000,%o1
+ stg (%o1,free_after_mark)
+
+no_mark_gc4:
+#endif
+
+#include "scompact.a"
+
+ ldg (heap_size_33,d7)
+ sll d7,5,d7
+ ldg (heap_p3,%o1)
+ add d7,%o1,d7
+ stg (d7,heap_end_after_gc)
+ sub d7,%g6,d7
+ srl d7,2,d7
+
+ ldg (alloc_size,%o1)
+ subcc d7,%o1,d7
+ bneg out_of_memory_4
+ nop
+
+ mov %l7,d0
+ sll d0,2,d0
+ add d0,%l7,d0
+ sll d0,3,d0
+ ldg (@heap_size,%o1)
+ cmp d0,%o1
+ bcs out_of_memory_4
+ nop
+
+ sll d0,2,d0
+ ldg (@heap_size,d1)
+ sll d1,5,d1
+ ldg (@heap_size,%o1)
+ sub d1,%o1,d1
+
+ ldg (@flags,%o1)
+ btst 32,%o1
+ bne no_copy_garbage_collection
+
+#ifdef MARK_GC
+ ldg (@flags,%o0)
+ btst 64,%o0
+ bne no_copy_garbage_collection
+ nop
+#endif
+
+ cmp d0,d1
+ ble no_copy_garbage_collection
+! ba no_copy_garbage_collection
+ nop
+
+ ldg (heap_p,d0)
+ stg (d0,heap_p1)
+#ifdef COPIED_VECTOR
+ ldg (@flags,%o0)
+ btst 64,%o0
+ bne no_copied_vector6
+ nop
+
+ ldg (heap_size_129,d1)
+ sll d1,6,d1
+ add d0,d1,d0
+ stg (d0,heap_copied_vector)
+ stg (d0,heap_end_after_gc)
+ ldg (heap_copied_vector_size,d1)
+ add d1,d0,d1
+ stg (d1,heap_p2)
+ b,a copied_vector6
+
+no_copied_vector6:
+#endif
+ ldg (@heap_size,d1)
+ srl d1,1,d1
+ add d0,d1,d0
+ stg (d0,heap_p2)
+ stg (d0,heap_end_after_gc)
+
+copied_vector6:
+
+ sub d0,%g6,d0
+ srl d0,2,d0
+ mov d0,%l7
+ ldg (alloc_size,%o1)
+ sub %l7,%o1,%l7
+
+ ldg (heap_p3,d0)
+ ldg (heap_vector,%o1)
+ cmp d0,%o1
+ ble vector_at_end_2
+ nop
+
+ ldg (heap_vector,d1)
+ stg (d1,extra_heap)
+ sub d0,d1,d0
+ srl d0,2,d0
+ stg (d0,extra_heap_size)
+
+ mov 2,%o1
+ stgb (%o1,garbage_collect_flag)
+
+ ba no_copy_garbage_collection
+ nop
+
+vector_at_end_2:
+ stgb (%g0,garbage_collect_flag)
+
+no_copy_garbage_collection:
+ dec 4,sp
+ call add_garbage_collect_time
+ st %o7,[sp]
+
+ mov %g6,d0
+ sub d0,%l6,d0
+ ldg (alloc_size,d1)
+ sll d1,2,d1
+
+ ba end_garbage_collect
+ add d0,d1,d0
+
+stack_overflow:
+ dec 4,sp
+ call add_execute_time
+ st %o7,[sp]
+
+ set stack_overflow_string,%o0
+ ba print_error
+ nop
+
+@IO_error:
+ save %o6,-128,%o6
+
+ set IO_error_string,%o0
+ call @ew_print_string
+ nop
+
+ call @ew_print_string
+ mov a0,%o0
+
+ set new_line_string,%o0
+ call @ew_print_string
+ nop
+
+ ba halt
+ restore
+
+print_error:
+ call @ew_print_string
+ nop
+
+halt:
+ mov 1,d0
+ stg (d0,@execution_aborted)
+
+ ldg (halt_sp,sp)
+ set jump_buffer,%o0
+ call @longjmp
+ mov 1,%o1
+
+__eaind:
+eval_fill:
+ st a0,[%i4]
+ inc 4,%i4
+ mov a1,a0
+ ld [a1],a1
+ dec 4,sp
+ call a1
+ st %o7,[sp]
+ mov a0,a1
+ ld [%i4-4],a0
+ dec 4,%i4
+
+ ld [a1],%g1
+ st %g1,[a0]
+ ld [a1+4],%g1
+ st %g1,[a0+4]
+ ld [a1+8],%g1
+ st %g1,[a0+8]
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+ b,a eval_fill
+ nop
+ nop
+ .word 0
+ .word -2
+__indirection:
+ ld [a0+4],a1
+ ld [a1],d0
+ btst 2,d0
+#ifdef MARK_GC
+ be,a eval_fill2
+ st a5,[a0]
+#else
+ be __cycle__in__spine
+ nop
+#endif
+ st d0,[a0]
+ ld [a1+4],%g1
+ st %g1,[a0+4]
+ ld [a1+8],%g1
+ st %g1,[a0+8]
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+#ifdef MARK_GC
+eval_fill2:
+ ldg (@flags,%o0)
+ btst 64,%o0
+ be __cycle__in__spine
+ st a0,[a4]
+
+ inc 4,a4
+ mov a1,a0
+
+ dec 4,sp
+ call d0
+ st %o7,[sp]
+
+ ld [a4-4],a1
+ ld [a0],%o0
+ dec 4,a4
+ st %o0,[a1]
+ ld [a0+4],%o0
+ st %o0,[a1+4]
+ ld [a0+8],%o0
+ ld [sp],%o7
+ st %o0,[a1+8]
+ mov a1,a0
+ retl
+ inc 4,sp
+#endif
+
+eval_upd_0:
+ set __indirection,%i3
+ st %i3,[a1]
+ jmp %i2
+ st a0,[a1+4]
+eval_upd_1:
+ set __indirection,%i3
+ st %i3,[a1]
+ ld [a1+4],d0
+ st a0,[a1+4]
+ jmp %i2
+ mov d0,a1
+eval_upd_2:
+ mov %i2,%i3
+ set __indirection,%i2
+ st %i2,[a1]
+ ld [a1+4],%i2
+ st a0,[a1+4]
+ jmp %i3
+ ld [a1+8],a1
+eval_upd_3:
+ mov %i2,%i3
+ set __indirection,%i2
+ st %i2,[a1]
+ ld [a1+4],%i2
+ st a0,[%i4]
+ st a0,[a1+4]
+ inc 4,%i4
+ ld [a1+12],a0
+ jmp %i3
+ ld [a1+8],a1
+eval_upd_4:
+ mov %i2,%i3
+ set __indirection,%i2
+ st %i2,[a1]
+ ld [a1+4],%i2
+ st a0,[%i4]
+ st a0,[a1+4]
+ ld [a1+16],%g1
+ st %g1,[%i4+4]
+ inc 8,%i4
+ ld [a1+12],a0
+ jmp %i3
+ ld [a1+8],a1
+eval_upd_5:
+ mov %i2,%i3
+ set __indirection,%i2
+ st %i2,[a1]
+ ld [a1+4],%i2
+ st a0,[%i4]
+ st a0,[a1+4]
+ ld [a1+20],%g1
+ st %g1,[%i4+4]
+ ld [a1+16],%g1
+ st %g1,[%i4+8]
+ inc 12,%i4
+ ld [a1+12],a0
+ jmp %i3
+ ld [a1+8],a1
+eval_upd_6:
+ mov %i2,%i3
+ set __indirection,%i2
+ st %i2,[a1]
+ ld [a1+4],%i2
+ st a0,[%i4]
+ st a0,[a1+4]
+ ld [a1+24],%g1
+ st %g1,[%i4+4]
+ ld [a1+20],%g1
+ st %g1,[%i4+8]
+ ld [a1+16],%g1
+ st %g1,[%i4+12]
+ inc 16,%i4
+ ld [a1+12],a0
+ jmp %i3
+ ld [a1+8],a1
+eval_upd_7:
+ mov 0,d0
+ mov 20,d1
+eval_upd_n:
+ mov a2,a3
+ set __indirection,a2
+ st a2,[a1]
+ ld [a1+4],a2
+ st a0,[a4]
+ st a0,[a1+4]
+ add a1,d1,a1
+ ld [a1+8],%g1
+ st %g1,[a4+4]
+ ld [a1+4],%g1
+ st %g1,[a4+8]
+ ld [a1],%g1
+ st %g1,[a4+12]
+ inc 16,a4
+eval_upd_n_lp:
+ ld [a1-4],%g1
+ dec 4,a1
+ st %g1,[a4]
+ deccc d0
+ bcc eval_upd_n_lp
+ inc 4,a4
+ ld [a1-4],a0
+ jmp a3
+ ld [a1-8],a1
+eval_upd_8:
+ mov 1,d0
+ ba eval_upd_n
+ mov 24,d1
+eval_upd_9:
+ mov 2,d0
+ ba eval_upd_n
+ mov 28,d1
+eval_upd_10:
+ mov 3,d0
+ ba eval_upd_n
+ mov 32,d1
+eval_upd_11:
+ mov 4,d0
+ ba eval_upd_n
+ mov 36,d1
+eval_upd_12:
+ mov 5,d0
+ ba eval_upd_n
+ mov 40,d1
+eval_upd_13:
+ mov 6,d0
+ ba eval_upd_n
+ mov 44,d1
+eval_upd_14:
+ mov 7,d0
+ ba eval_upd_n
+ mov 48,d1
+eval_upd_15:
+ mov 8,d0
+ ba eval_upd_n
+ mov 52,d1
+eval_upd_16:
+ mov 9,d0
+ ba eval_upd_n
+ mov 56,d1
+eval_upd_17:
+ mov 10,d0
+ ba eval_upd_n
+ mov 60,d1
+eval_upd_18:
+ mov 11,d0
+ ba eval_upd_n
+ mov 64,d1
+eval_upd_19:
+ mov 12,d0
+ ba eval_upd_n
+ mov 68,d1
+eval_upd_20:
+ mov 13,d0
+ ba eval_upd_n
+ mov 72,d1
+eval_upd_21:
+ mov 14,d0
+ ba eval_upd_n
+ mov 76,d1
+eval_upd_22:
+ mov 15,d0
+ ba eval_upd_n
+ mov 80,d1
+eval_upd_23:
+ mov 16,d0
+ ba eval_upd_n
+ mov 84,d1
+eval_upd_24:
+ mov 17,d0
+ ba eval_upd_n
+ mov 88,d1
+eval_upd_25:
+ mov 18,d0
+ ba eval_upd_n
+ mov 92,d1
+eval_upd_26:
+ mov 19,d0
+ ba eval_upd_n
+ mov 96,d1
+eval_upd_27:
+ mov 20,d0
+ ba eval_upd_n
+ mov 100,d1
+eval_upd_28:
+ mov 21,d0
+ ba eval_upd_n
+ mov 104,d1
+eval_upd_29:
+ mov 22,d0
+ ba eval_upd_n
+ mov 108,d1
+eval_upd_30:
+ mov 23,d0
+ ba eval_upd_n
+ mov 112,d1
+eval_upd_31:
+ mov 24,d0
+ ba eval_upd_n
+ mov 116,d1
+eval_upd_32:
+ mov 25,d0
+ ba eval_upd_n
+ mov 120,d1
+
+!
+! STRINGS
+!
+
+catAC:
+ ld [a0+4],d0
+ inc 8,a0
+ ld [a1+4],d1
+ inc 8,a1
+ add d0,d1,d2
+ add d2,3+8,d5
+ srl d5,2,d5
+ subcc d7,d5,d7
+! reserve one word extra, because
+! word after the string may changed
+ ble gc_3
+ add d2,3,d6
+gc_r_3:
+
+ set __STRING__+2,%o0
+ st %o0,[a6]
+ mov a6,d5
+ inc 8,%g6
+ st d2,[a6-4]
+
+! copy string 1
+
+ add d1,3,d2
+ srl d2,2,d2
+ ba cat_string_4
+ mov a6,a2
+
+cat_string_3:
+ inc 4,a1
+ st %o0,[a2]
+ inc 4,a2
+cat_string_4:
+ deccc d2
+ bge,a cat_string_3
+ ld [a1],%o0
+
+! copy string 2
+
+ andn d1,3,%o0
+ add a6,%o0,a2
+
+ inc 3,d0
+ srl d0,2,d0
+
+ andcc d1,3,%o0
+ be cat_string_al0_1
+ mov -1,%o1
+
+cat_string_al123:
+ ld [a2],d3
+ sll %o0,3,%o2
+ mov 32,%o3
+ sub %o3,%o2,%o3
+ sll %o1,%o3,%o1
+ ba cat_string_al123_1
+ and d3,%o1,d3
+
+cat_string_al123_0:
+ inc 4,a0
+ srl %o0,%o2,d4
+ or d3,d4,d3
+ st d3,[a2]
+ inc 4,a2
+ sll %o0,%o3,d3
+cat_string_al123_1:
+ deccc d0
+ bge,a cat_string_al123_0
+ ld [a0],%o0
+
+ st d3,[a2]
+
+ bclr 3,d6
+ ld [sp],%o7
+ mov d5,a0
+ add a6,d6,a6
+ retl
+ inc 4,sp
+
+cat_string_al0_0:
+ inc 4,a0
+ st %o0,[a2]
+ inc 4,a2
+cat_string_al0_1:
+ deccc d0
+ bge,a cat_string_al0_0
+ ld [a0],%o0
+
+ bclr 3,d6
+ ld [sp],%o7
+ mov d5,a0
+ add a6,d6,a6
+ retl
+ inc 4,sp
+
+gc_3: dec 8,a0
+ dec 8,a1
+ dec 4,sp
+ call collect_2
+ st %o7,[sp]
+
+ inc 8,a0
+ ba gc_r_3
+ inc 8,a1
+
+empty_string:
+ ld [sp],%o7
+ set zero_length_string,a0
+ retl
+ inc 4,sp
+
+sliceAC:
+ ld [a0+4],d2
+ add a0,8,a2
+ tst d1
+ bl,a slice_string_1
+ clr d1
+slice_string_1:
+ cmp d1,d2
+ bge empty_string
+ cmp d0,d1
+ bl empty_string
+ inc d0
+ cmp d0,d2
+ bg,a slice_string_2
+ mov d2,d0
+slice_string_2:
+ sub d0,d1,d0
+
+ add d0,3,d2
+ srl d2,2,d2
+
+ dec 2,d7
+ subcc d7,d2,d7
+ bneg gc_4
+ nop
+r_gc_4:
+ set __STRING__+2,%o0
+ st %o0,[a6]
+ mov a6,d5
+ inc 8,a6
+ st d0,[a6-4]
+
+ andcc d1,3,%o0
+ be slice_string_al0_1
+ add a2,d1,a2
+
+slice_string_al123:
+ sub a2,%o0,a2
+ sll %o0,3,%o2
+ mov 32,%o3
+ sub %o3,%o2,%o3
+ ld [a2],d3
+ ba slice_string_al123_1
+ sll d3,%o2,d4
+
+slice_string_al123_0:
+ inc 4,a2
+ srl %o0,%o3,%o1
+ or d4,%o1,d4
+ st d4,[a6]
+ inc 4,a6
+ sll %o0,%o2,d4
+slice_string_al123_1:
+ deccc d2
+ bge,a slice_string_al123_0
+ ld [a2+4],%o0
+
+ ld [sp],%o7
+ mov d5,a0
+ retl
+ inc 4,sp
+
+slice_string_al0_0:
+ inc 4,a2
+ st %o0,[a6]
+ inc 4,a6
+slice_string_al0_1:
+ deccc d2
+ bge,a slice_string_al0_0
+ ld [a2],%o0
+
+ ld [sp],%o7
+ mov d5,a0
+ retl
+ inc 4,sp
+
+gc_4: dec 4,sp
+ call collect_1
+ st %o7,[sp]
+ ba r_gc_4
+ add a0,8,a2
+
+
+updateAC:
+ ld [a0+4],d2
+ cmp d1,d2
+ bcc update_string_error
+ add a0,8,a2
+
+ add d2,3,d3
+ srl d3,2,d3
+
+ dec 2,d7
+ subcc d7,d3,d7
+ bneg gc_5
+ inc 8,d1
+r_gc_5:
+ set __STRING__+2,%o0
+ st %o0,[%g6]
+ mov a6,a0
+ inc 8,%g6
+ ba update_string_5
+ st d2,[a6-4]
+
+update_string_4:
+ inc 4,a2
+ st %o0,[a6]
+ inc 4,a6
+update_string_5:
+ deccc d3
+ bge,a update_string_4
+ ld [a2],%o0
+
+ ld [sp],%o7
+ stb d0,[a0+d1]
+ retl
+ inc 4,sp
+
+gc_5: dec 4,sp
+ call collect_1
+ st %o7,[sp]
+ ba r_gc_5
+ add a0,8,a2
+
+
+update_string_error:
+ set high_index_string,%o0
+ tst d0
+ bpos print_error
+ nop
+ set low_index_string,%o0
+update_string_error_2:
+ ba print_error
+ nop
+
+
+eqAC:
+ ld [a0+4],d0
+ ld [a1+4],%o0
+ inc 8,a0
+ cmp d0,%o0
+ bne equal_string_ne
+ inc 8,a1
+
+ and d0,3,d1
+ srl d0,2,d0
+ deccc d0
+ bcs equal_string_b
+ nop
+ ld [a1],%o0
+equal_string_1:
+ inc 4,a1
+ ld [a0],%o1
+ inc 4,a0
+ cmp %o1,%o0
+ bne equal_string_ne
+ deccc d0
+ bge,a equal_string_1
+ ld [a1],%o0
+
+equal_string_b:
+ deccc d1
+ bcs equal_string_eq
+ nop
+ ldub [a1],%o0
+equal_string_2:
+ inc a1
+ ldub [a0],%o1
+ inc a0
+ cmp %o1,%o0
+ bne equal_string_ne
+ deccc d1
+ bge,a equal_string_2
+ ldub [a1],%o0
+equal_string_eq:
+ ld [sp],%o7
+ mov -1,d0
+ retl
+ inc 4,sp
+equal_string_ne:
+ ld [sp],%o7
+ clr d0
+ retl
+ inc 4,sp
+
+cmpAC:
+ ld [a0+4],d1
+ inc 8,a0
+ ld [a1+4],d2
+ inc 8,a1
+ cmp d2,d1
+ bcs,a cmp_string_less
+ mov -1,d0
+ bgu,a cmp_string_chars
+ mov 1,d0
+ ba cmp_string_chars
+ clr d0
+cmp_string_less:
+ mov d2,d1
+cmp_string_chars:
+ and d1,3,d2
+ srl d1,2,d1
+ deccc d1
+ bcs cmp_string_b
+ nop
+ ld [a0],%o0
+cmp_string_1:
+ inc 4,a0
+ ld [a1],%o1
+ inc 4,a1
+ cmp %o1,%o0
+ bne cmp_string_ne
+ nop
+ deccc d1
+ bge,a cmp_string_1
+ ld [a0],%o0
+
+cmp_string_b:
+ deccc d2
+ bcs cmp_string_eq
+ nop
+ ldub [a0],%o0
+cmp_string_2:
+ inc a0
+ ldub [a1],%o1
+ inc a1
+ cmp %o1,%o0
+ bne cmp_string_ne
+ nop
+ deccc d2
+ bge,a cmp_string_2
+ ldub [a0],%o0
+cmp_string_eq:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+cmp_string_ne:
+ bgu cmp_string_r1
+ nop
+ ld [sp],%o7
+ mov -1,d0
+ retl
+ inc 4,sp
+cmp_string_r1:
+ ld [sp],%o7
+ mov 1,d0
+ retl
+ inc 4,sp
+
+string_to_string_node:
+ ld [a0],d0
+ inc 4,a0
+
+ add d0,3,d1
+ srl d1,2,d1
+
+ dec 2,d7
+ subcc d7,d1,d7
+ bneg string_to_string_node_gc
+ nop
+
+string_to_string_node_r:
+ set __STRING__+2,%o0
+ st %o0,[%g6]
+ mov %g6,d2
+ st d0,[%g6+4]
+ b string_to_string_node_4
+ inc 8,%g6
+
+string_to_string_node_2:
+ st %o0,[%g6]
+ inc 4,a0
+ inc 4,%g6
+string_to_string_node_4:
+ deccc d1
+ bge,a string_to_string_node_2
+ ld [a0],%o0
+
+ mov d2,a0
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+string_to_string_node_gc:
+ st a0,[sp-4]
+ dec 8,sp
+ call collect_0
+ st %o7,[sp]
+
+ ld [sp],a0
+ b string_to_string_node_r
+ inc 4,sp
+
+ .word 3
+_c3: b,a __cycle__in__spine
+ .word 4
+_c4: b,a __cycle__in__spine
+ .word 5
+_c5: b,a __cycle__in__spine
+ .word 6
+_c6: b,a __cycle__in__spine
+ .word 7
+_c7: b,a __cycle__in__spine
+ .word 8
+_c8: b,a __cycle__in__spine
+ .word 9
+_c9: b,a __cycle__in__spine
+ .word 10
+_c10: b,a __cycle__in__spine
+ .word 11
+_c11: b,a __cycle__in__spine
+ .word 12
+_c12: b,a __cycle__in__spine
+ .word 13
+_c13: b,a __cycle__in__spine
+ .word 14
+_c14: b,a __cycle__in__spine
+ .word 15
+_c15: b,a __cycle__in__spine
+ .word 16
+_c16: b,a __cycle__in__spine
+ .word 17
+_c17: b,a __cycle__in__spine
+ .word 18
+_c18: b,a __cycle__in__spine
+ .word 19
+_c19: b,a __cycle__in__spine
+ .word 20
+_c20: b,a __cycle__in__spine
+ .word 21
+_c21: b,a __cycle__in__spine
+ .word 22
+_c22: b,a __cycle__in__spine
+ .word 23
+_c23: b,a __cycle__in__spine
+ .word 24
+_c24: b,a __cycle__in__spine
+ .word 25
+_c25: b,a __cycle__in__spine
+ .word 26
+_c26: b,a __cycle__in__spine
+ .word 27
+_c27: b,a __cycle__in__spine
+ .word 28
+_c28: b,a __cycle__in__spine
+ .word 29
+_c29: b,a __cycle__in__spine
+ .word 30
+_c30: b,a __cycle__in__spine
+ .word 31
+_c31: b,a __cycle__in__spine
+ .word 32
+_c32: b,a __cycle__in__spine
+
+!
+! ARRAYS
+!
+
+create_arrayB:
+ mov d1,d2
+ inc 3,d1
+ srl d1,2,d1
+ dec 3,d7
+ subcc d7,d1,d7
+ bpos no_collect_4575
+ nop
+
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+no_collect_4575:
+ sll d0,8,d3
+ or d0,d3,d0
+ sll d0,16,d3
+ or d0,d3,d0
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d2,[a6+4]
+ set BOOL+2,%o0
+ st %o0,[a6+8]
+ ba create_arrayBCI
+ inc 12,a6
+
+create_arrayC:
+ mov d1,d2
+ inc 3,d1
+ srl d1,2,d1
+ dec 2,d7
+ subcc d7,d1,d7
+ bpos no_collect_4578
+ nop
+
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+no_collect_4578:
+ sll d0,8,d3
+ or d0,d3,d0
+ sll d0,16,d3
+ or d0,d3,d0
+ mov a6,a0
+ set __STRING__+2,%o0
+ st %o0,[a6]
+ st d2,[a6+4]
+ ba create_arrayBCI
+ inc 8,a6
+
+create_arrayI:
+ dec 3,d7
+ subcc d7,d1,d7
+ bpos no_collect_4577
+ nop
+
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+no_collect_4577:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d1,[a6+4]
+ set INT+2,%o0
+ st %o0,[a6+8]
+ inc 12,a6
+create_arrayBCI:
+ btst 1,d1
+ be st_filli_array
+ srl d1,1,d1
+
+ st d0,[a6]
+ ba st_filli_array
+ inc 4,a6
+
+filli_array:
+ st d0,[a6+4]
+ inc 8,a6
+st_filli_array:
+ deccc 1,d1
+ bcc,a filli_array
+ st d0,[a6]
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+create_arrayR:
+ st %f0,[sp-8]
+ st %f1,[sp-4]
+ ld [sp-8],d1
+ ld [sp-4],d2
+
+ dec 3,d7
+ sub d7,d0,d7
+ subcc d7,d0,d7
+ bpos no_collect_4579
+ nop
+
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+no_collect_4579:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ set REAL+2,%o0
+ st %o0,[a6+8]
+ ba st_fillr_array
+ inc 12,a6
+
+fillr_array:
+ st d2,[a6+4]
+ inc 8,a6
+st_fillr_array:
+ deccc 1,d0
+ bcc,a fillr_array
+ st d1,[a6]
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+create_array:
+ dec 3,d7
+ subcc d7,d0,d7
+ bpos no_collect_4576
+ nop
+ dec 4,sp
+ call collect_1
+ st %o7,[sp]
+no_collect_4576:
+ mov a0,d1
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ st %g0,[a6+8]
+ inc 12,a6
+ ld [sp],a1
+ ba fillr1_array
+ inc 4,sp
+
+#if 0
+create_r_array:
+ deccc 2,d2
+ bcs create_r_array_1
+ nop
+ be create_r_array_2
+ nop
+ deccc 2,d2
+ bcs create_r_array_3
+ nop
+ be create_r_array_4
+ nop
+ b,a create_r_array_5
+
+create_r_array_1:
+ dec 3,d7
+ subcc d7,d0,d7
+ bpos no_collect_4581
+ nop
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+no_collect_4581:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ st d1,[a6+8]
+ inc 12,a6
+ ld [sp],a1
+ tst d3
+ be r_array_1_b
+ inc 4,sp
+
+ ld [a4-4],d1
+ ba fillr1_array
+ dec 4,a4
+
+r_array_1_b:
+ ld [sp],d1
+ inc 4,sp
+
+fillr1_array:
+ btst 1,d0
+ be st_fillr1_array_1
+ srl d0,1,d0
+ st d1,[a6]
+ ba st_fillr1_array_1
+ inc 4,a6
+
+fillr1_array_lp:
+ st d1,[a6+4]
+ inc 8,a6
+st_fillr1_array_1:
+ deccc 1,d0
+ bcc,a fillr1_array_lp
+ st d1,[a6]
+
+ jmp a1+8
+ nop
+
+create_r_array_2:
+ dec 3,d7
+ sub d7,d0,d7
+ subcc d7,d0,d7
+ bpos no_collect_4582
+ nop
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+no_collect_4582:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ st d1,[a6+8]
+ inc 12,a6
+
+ ld [sp],a1
+ inc 4,sp
+
+ deccc 1,d3
+ bcs r_array_2_bb
+ nop
+ be r_array_2_ab
+ nop
+r_array_2_aa:
+ ld [a4-4],d1
+ ld [a4-8],d2
+ ba st_fillr2_array
+ dec 8,a4
+r_array_2_ab:
+ ld [a4-4],d1
+ ld [sp],d2
+ inc 4,sp
+ ba st_fillr2_array
+ dec 4,a4
+r_array_2_bb:
+ ld [sp],d1
+ ld [sp+4],d2
+ ba st_fillr2_array
+ inc 8,sp
+
+fillr2_array_1:
+ st d2,[a6+4]
+ inc 8,a6
+st_fillr2_array:
+ deccc 1,d0
+ bcc,a fillr2_array_1
+ st d1,[a6]
+
+ jmp a1+8
+ nop
+
+create_r_array_3:
+ dec 3,d7
+ sub d7,d0,d7
+ sub d7,d0,d7
+ subcc d7,d0,d7
+ bpos no_collect_4583
+ nop
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+no_collect_4583:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ st d1,[a6+8]
+ inc 12,a6
+
+ ld [sp],a1
+ inc 4,sp
+
+ tst d3
+ be r_array_3
+ nop
+ sll d3,2,d4
+ sub a4,d4,a4
+ mov a4,a3
+ dec 1,d3
+copy_a_to_b_lp3:
+ ld [a3],%o0
+ inc 4,a3
+ st %o0,[sp-4]
+ deccc 1,d3
+ bcc copy_a_to_b_lp3
+ dec 4,sp
+r_array_3:
+ ld [sp],d1
+ ld [sp+4],d2
+ ld [sp+8],d3
+ ba st_fillr3_array
+ inc 12,sp
+fillr3_array_1:
+ st d2,[a6+4]
+ st d3,[a6+8]
+ inc 12,a6
+st_fillr3_array:
+ deccc 1,d0
+ bcc,a fillr3_array_1
+ st d1,[a6]
+
+ jmp a1+8
+ nop
+
+create_r_array_4:
+ dec 3,d7
+ sll d0,2,d2
+ subcc d7,d2,d7
+ bpos no_collect_4584
+ nop
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+no_collect_4584:
+ mov a6,a0
+ set __ARRAY__+2,%o1
+ st %o1,[a6]
+ st d0,[a6+4]
+ st d1,[a6+8]
+ inc 12,a6
+
+ ld [sp],a1
+ inc 4,sp
+
+ tst d3
+ be r_array_4
+ nop
+
+ sll d3,2,d4
+ sub a4,d4,a4
+ mov a4,a3
+ dec 1,d3
+copy_a_to_b_lp4:
+ ld [a3],%o1
+ inc 4,a3
+ st %o1,[sp-4]
+ deccc 1,d3
+ bcc copy_a_to_b_lp4
+ dec 4,sp
+
+r_array_4:
+ ld [sp],d1
+ ld [sp+4],d2
+ ld [sp+8],d3
+ ld [sp+12],d4
+ ba st_fillr4_array
+ inc 16,sp
+
+fillr4_array:
+ st d2,[a6+4]
+ st d3,[a6+8]
+ st d4,[a6+12]
+ inc 16,a6
+st_fillr4_array:
+ deccc 1,d0
+ bcc,a fillr4_array
+ st d1,[a6]
+
+ jmp a1+8
+ nop
+
+create_r_array_5:
+ dec 3,d7
+ sll d0,2,d4
+ sub d7,d4,d7
+ dec 1,d2
+ mov d2,d5
+sub_size_lp:
+ deccc 1,d5
+ bcc sub_size_lp
+ subcc d7,d0,d7
+
+ bpos no_collect_4585
+ nop
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+no_collect_4585:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ st d1,[a6+8]
+ inc 12,a6
+
+ ld [sp],a1
+ inc 4,sp
+ mov d2,d5
+
+ tst d3
+ be r_array_5
+ nop
+ sll d3,2,d4
+ sub a4,d4,a4
+ mov a4,a3
+ dec 1,d3
+copy_a_to_b_lp5:
+ ld [a3],%o0
+ inc 4,a3
+ st %o0,[sp-4]
+ deccc 1,d3
+ bcc copy_a_to_b_lp5
+ dec 4,sp
+r_array_5:
+ ld [sp],d1
+ ld [sp+4],d2
+ ld [sp+8],d3
+ ld [sp+12],d4
+ ba st_fillr5_array
+ inc 16,sp
+
+fillr5_array_1:
+ st d2,[a6+4]
+ mov d5,d6
+ st d3,[a6+8]
+ mov sp,a3
+ st d4,[a6+12]
+ inc 16,a6
+ ld [a3],%o0
+copy_elem_lp5:
+ inc 4,a3
+ st %o0,[a6]
+ inc 4,a6
+ deccc 1,d6
+ bcc,a copy_elem_lp5
+ ld [a3],%o0
+st_fillr5_array:
+ deccc 1,d0
+ bcc,a fillr5_array_1
+ st d1,[a6]
+
+ sll d5,2,d5
+ add sp,d5,sp
+ jmp a1+8
+ inc 4,sp
+#else
+create_R_array:
+ deccc 2,d2
+ bcs create_R_array_1
+ nop
+ be create_R_array_2
+ nop
+ deccc 2,d2
+ bcs create_R_array_3
+ nop
+ be create_R_array_4
+ nop
+ b,a create_R_array_5
+
+create_R_array_1:
+ dec 3,d7
+ subcc d7,d0,d7
+ bpos no_collect_4581
+ nop
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+no_collect_4581:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ st d1,[a6+8]
+ inc 12,a6
+ ld [sp],a1
+
+ tst d3
+ be r_array_1_b
+ inc 4,sp
+
+ ba fillr1_array
+ ld [a4-4],d1
+
+r_array_1_b:
+ ld [sp],d1
+
+fillr1_array:
+ btst 1,d0
+ be st_fillr1_array_1
+ srl d0,1,d0
+ st d1,[a6]
+ ba st_fillr1_array_1
+ inc 4,a6
+
+fillr1_array_lp:
+ st d1,[a6+4]
+ inc 8,a6
+st_fillr1_array_1:
+ deccc 1,d0
+ bcc,a fillr1_array_lp
+ st d1,[a6]
+
+ jmp a1+8
+ nop
+
+create_R_array_2:
+ dec 3,d7
+ sub d7,d0,d7
+ subcc d7,d0,d7
+ bpos no_collect_4582
+ nop
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+no_collect_4582:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ st d1,[a6+8]
+ inc 12,a6
+
+ ld [sp],a1
+
+ deccc 1,d3
+ bcs r_array_2_bb
+ inc 4,sp
+
+ be r_array_2_ab
+ nop
+r_array_2_aa:
+ ld [a4-4],d1
+ ba st_fillr2_array
+ ld [a4-8],d2
+r_array_2_ab:
+ ld [a4-4],d1
+ ba st_fillr2_array
+ ld [sp],d2
+r_array_2_bb:
+ ld [sp],d1
+ ba st_fillr2_array
+ ld [sp+4],d2
+
+fillr2_array_1:
+ st d2,[a6+4]
+ inc 8,a6
+st_fillr2_array:
+ deccc 1,d0
+ bcc,a fillr2_array_1
+ st d1,[a6]
+
+ jmp a1+8
+ nop
+
+create_R_array_3:
+ dec 3,d7
+ sub d7,d0,d7
+ sub d7,d0,d7
+ subcc d7,d0,d7
+ bpos no_collect_4583
+ nop
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+no_collect_4583:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ st d1,[a6+8]
+ inc 12,a6
+
+ ld [sp],a1
+ add sp,4,a2
+
+ tst d3
+ be r_array_3
+ inc 4,sp
+
+ sll d3,2,d4
+ sub a4,d4,a3
+ dec 1,d3
+copy_a_to_b_lp3:
+ ld [a3],%o0
+ inc 4,a3
+ st %o0,[sp-4]
+ deccc 1,d3
+ bcc copy_a_to_b_lp3
+ dec 4,sp
+r_array_3:
+ ld [sp],d1
+ ld [sp+4],d2
+ ld [sp+8],d3
+ ba st_fillr3_array
+ mov a2,sp
+fillr3_array_1:
+ st d2,[a6+4]
+ st d3,[a6+8]
+ inc 12,a6
+st_fillr3_array:
+ deccc 1,d0
+ bcc,a fillr3_array_1
+ st d1,[a6]
+
+ jmp a1+8
+ nop
+
+create_R_array_4:
+ dec 3,d7
+ sll d0,2,d2
+ subcc d7,d2,d7
+ bpos no_collect_4584
+ nop
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+no_collect_4584:
+ mov a6,a0
+ set __ARRAY__+2,%o1
+ st %o1,[a6]
+ st d0,[a6+4]
+ st d1,[a6+8]
+ inc 12,a6
+
+ ld [sp],a1
+ add sp,4,a2
+
+ tst d3
+ be r_array_4
+ inc 4,sp
+
+ sll d3,2,d4
+ sub a4,d4,a3
+ dec 1,d3
+copy_a_to_b_lp4:
+ ld [a3],%o1
+ inc 4,a3
+ st %o1,[sp-4]
+ deccc 1,d3
+ bcc copy_a_to_b_lp4
+ dec 4,sp
+
+r_array_4:
+ ld [sp],d1
+ ld [sp+4],d2
+ ld [sp+8],d3
+ ld [sp+12],d4
+ ba st_fillr4_array
+ mov a2,sp
+
+fillr4_array:
+ st d2,[a6+4]
+ st d3,[a6+8]
+ st d4,[a6+12]
+ inc 16,a6
+st_fillr4_array:
+ deccc 1,d0
+ bcc,a fillr4_array
+ st d1,[a6]
+
+ jmp a1+8
+ nop
+
+create_R_array_5:
+ dec 3,d7
+ sll d0,2,d4
+ sub d7,d4,d7
+ dec 1,d2
+ mov d2,d5
+sub_size_lp:
+ deccc 1,d5
+ bcc sub_size_lp
+ subcc d7,d0,d7
+
+ bpos no_collect_4585
+ nop
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+no_collect_4585:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ st d1,[a6+8]
+ inc 12,a6
+
+ ld [sp],a1
+ add sp,4,a2
+ mov d2,d5
+
+ tst d3
+ be r_array_5
+ inc 4,sp
+
+ sll d3,2,d4
+ sub a4,d4,a3
+ dec 1,d3
+copy_a_to_b_lp5:
+ ld [a3],%o0
+ inc 4,a3
+ st %o0,[sp-4]
+ deccc 1,d3
+ bcc copy_a_to_b_lp5
+ dec 4,sp
+r_array_5:
+ ld [sp],d1
+ ld [sp+4],d2
+ ld [sp+8],d3
+ ba st_fillr5_array
+ ld [sp+12],d4
+
+fillr5_array_1:
+ st d2,[a6+4]
+ mov d5,d6
+ st d3,[a6+8]
+ add sp,16,a3
+ st d4,[a6+12]
+ inc 16,a6
+ ld [a3],%o0
+copy_elem_lp5:
+ inc 4,a3
+ st %o0,[a6]
+ inc 4,a6
+ deccc 1,d6
+ bcc,a copy_elem_lp5
+ ld [a3],%o0
+st_fillr5_array:
+ deccc 1,d0
+ bcc,a fillr5_array_1
+ st d1,[a6]
+
+ jmp a1+8
+ mov a2,sp
+#endif
+
+!
+! AP code
+!
+
+#if 0
+e__system__eaAP:
+ st a0,[%i4]
+ inc 4,%i4
+ mov a1,a0
+ ba ea_ap
+ mov %i2,a1
+
+ sethi %hi e__system__eaAP,%i2
+ ba eval_upd_2
+ inc %lo e__system__eaAP,%i2
+ .word e__system__AP
+ .word 2
+e__system__nAP:
+ st a0,[%i4]
+ st a5,[a0]
+ ld [a0+4],a1
+ ld [a0+8],a0
+ inc 4,%i4
+ea_ap:
+ ld [a1],d0
+ btst 2,d0
+ bne ap_1
+ nop
+
+ st a0,[%i4]
+ mov a1,a0
+ inc 4,%i4
+ dec 4,sp
+ call d0
+ st %o7,[sp]
+ mov a0,a1
+ ld [%i4-4],a0
+ dec 4,%i4
+ap_1:
+ ld [a1],%i2
+ ld [%i2+4-2],%i2
+ dec 4,sp
+ call %i2
+ st %o7,[sp]
+
+ ld [%i4-4],%i2
+ dec 4,%i4
+ ld [a0],d0
+ ld [a0+4],d1
+ st d0,[%i2]
+ ld [a0+8],d2
+ st d1,[%i2+4]
+ st d2,[%i2+8]
+ mov %i2,a0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+#endif
+
+e__system__sAP:
+ ld [a1],%i2
+ ld [%i2+4-2],%i2
+ jmp %i2
+ nop
+
+_create_arrayB:
+ mov d0,d1
+ inc 3,d0
+ srl d0,2,d0
+ dec 3,d7
+ subcc d7,d0,d7
+ bpos no_collect_3575
+ nop
+
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+no_collect_3575:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d1,[a6+4]
+ set BOOL+2,%o0
+ st %o0,[a6+8]
+ inc 12,a6
+ sll d0,2,d0
+ add a6,d0,a6
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+_create_arrayC:
+ mov d0,d1
+ inc 3,d0
+ srl d0,2,d0
+ dec 2,d7
+ subcc d7,d0,d7
+ bpos no_collect_3578
+ nop
+
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+no_collect_3578:
+ mov a6,a0
+ set __STRING__+2,%o0
+ st %o0,[a6]
+ st d1,[a6+4]
+ inc 8,a6
+ sll d0,2,d0
+ add a6,d0,a6
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+_create_arrayI:
+ dec 3,d7
+ subcc d7,d0,d7
+ bpos no_collect_3577
+ nop
+
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+no_collect_3577:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ set INT+2,%o0
+ st %o0,[a6+8]
+ inc 12,a6
+ sll d0,2,d0
+ add a6,d0,a6
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+_create_arrayR:
+ dec 3,d7
+ sub d7,d0,d7
+ subcc d7,d0,d7
+ bpos no_collect_3579
+ nop
+
+ dec 4,sp
+ call collect_0
+ st %o7,[sp]
+
+no_collect_3579:
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ set REAL+2,%o0
+ st %o0,[a6+8]
+ inc 12,a6
+ sll d0,3,d0
+ add a6,d0,a6
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+_create_r_array:
+ dec 3,d7
+ mov d2,d5
+sub_size_lp2:
+ deccc 1,d5
+ bg sub_size_lp2
+ sub d7,d0,d7
+
+ tst d7
+ bpos no_collect_3585
+ nop
+
+ dec 4,sp
+ call collect_1
+ st %o7,[sp]
+
+no_collect_3585:
+ mov a0,d4
+
+ mov a6,a0
+ set __ARRAY__+2,%o0
+ st %o0,[a6]
+ st d0,[a6+4]
+ st d1,[a6+8]
+ inc 12,a6
+
+ ld [sp],a1
+
+ tst d3
+ be _create_r_array_0
+ inc 4,sp
+
+ deccc 2,d3
+ bcs _create_r_array_1
+ nop
+ be _create_r_array_2
+ nop
+ deccc 2,d3
+ bcs _create_r_array_3
+ nop
+ be _create_r_array_4
+ nop
+ b,a _create_r_array_5
+
+_create_r_array_0:
+ tst d2
+ beq _skip_fillr0_array_lp
+ sll d0,2,d0
+
+_fillr0_array_1:
+ deccc d2
+ bne _fillr0_array_1
+ add a6,d0,a6
+
+_skip_fillr0_array_lp:
+ jmp a1+8
+ nop
+
+_create_r_array_1:
+ tst d0
+ beq _skip_fillr1_array_lp
+ sll d2,2,d2
+
+_fillr1_array_lp:
+ st d4,[a6]
+ deccc d0
+ bne _fillr1_array_lp
+ add a6,d2,a6
+
+_skip_fillr1_array_lp:
+ jmp a1+8
+ nop
+
+_create_r_array_2:
+ tst d0
+ beq _skip_fillr2_array_1
+ sll d2,2,d2
+
+_fillr2_array_1:
+ st d4,[a6]
+ st d4,[a6+4]
+ deccc d0
+ bne _fillr2_array_1
+ add a6,d2,a6
+
+_skip_fillr2_array_1:
+ jmp a1+8
+ nop
+
+_create_r_array_3:
+ tst d0
+ beq _skip_fillr3_array
+ sll d2,2,d2
+
+_fillr3_array_1:
+ st d4,[a6]
+ st d4,[a6+4]
+ st d4,[a6+8]
+ deccc d0
+ bne _fillr3_array_1
+ add a6,d2,a6
+
+_skip_fillr3_array:
+ jmp a1+8
+ nop
+
+_create_r_array_4:
+ tst d0
+ beq _skip_fillr4_array
+ sll d2,2,d2
+
+_fillr4_array:
+ st d4,[a6]
+ st d4,[a6+4]
+ st d4,[a6+8]
+ st d4,[a6+12]
+ deccc d0
+ bne _fillr4_array
+ add a6,d2,a6
+
+_skip_fillr4_array:
+ jmp a1+8
+ nop
+
+_create_r_array_5:
+ mov d3,d1
+ dec 4,d2
+ sub d2,d3,d2
+ ba _st_fillr5_array
+ sll d2,2,d2
+
+_fillr5_array_1:
+ st d4,[a6+4]
+ mov d1,d5
+ st d4,[a6+8]
+ st d4,[a6+12]
+ inc 16,a6
+
+_copy_elem_lp5:
+ st d4,[a6]
+ deccc d5
+ bne _copy_elem_lp5
+ inc 4,a6
+
+ add a6,d2,a6
+_st_fillr5_array:
+ deccc d0
+ bge,a _fillr5_array_1
+ st d4,[a6]
+
+ jmp a1+8
+ nop
+
+yet_args_needed:
+! for more than 4 arguments
+ ld [a1],d1
+ lduh [d1-2],d0
+ dec 3,%l7
+ subcc %l7,d0,%l7
+ bneg gc_1
+ nop
+
+gc_r_1: ld [a1+4],%l3
+ dec 1+4,d0
+ ld [a1+8],a1
+ mov %g6,d2
+ ld [a1],%o0
+ ld [a1+4],%o1
+ st %o0,[%g6]
+ ld [a1+8],%o2
+ st %o1,[%g6+4]
+ inc 12,a1
+ st %o2,[%g6+8]
+ inc 12,%g6
+
+ ld [a1],%o0
+cp_a: inc 4,a1
+ st %o0,[%g6]
+ inc 4,%g6
+ deccc d0
+ bge,a cp_a
+ ld [a1],%o0
+
+ st a0,[%g6]
+ inc 8,d1
+ st d1,[%g6+4]
+ add %g6,4,a0
+ st %l3,[%g6+8]
+ ld [sp],%o7
+ st d2,[%g6+12]
+ inc 4,sp
+ retl
+ inc 16,%g6
+
+gc_1: dec 4,sp
+ call collect_2
+ st %o7,[sp]
+ b,a gc_r_1
+
+yet_args_needed_0:
+ deccc 2,%l7
+ bneg gc_20
+ nop
+gc_r_20: st a0,[%g6+4]
+ ld [a1],d0
+ mov %g6,a0
+ inc 8,d0
+ st d0,[%g6]
+ ld [sp],%o7
+ inc 8,%g6
+ retl
+ inc 4,sp
+
+gc_20: dec 4,sp
+ call collect_2
+ st %o7,[sp]
+ ba gc_r_20
+ nop
+
+yet_args_needed_1:
+ deccc 3,%l7
+ bneg gc_21
+ nop
+gc_r_21: st a0,[%g6+8]
+ ld [a1],d0
+ mov %g6,a0
+ inc 8,d0
+ st d0,[%g6]
+ ld [a1+4],d1
+ st d1,[%g6+4]
+ ld [sp],%o7
+ inc 12,%g6
+ retl
+ inc 4,sp
+
+gc_21: dec 4,sp
+ call collect_2
+ st %o7,[sp]
+ b,a gc_r_21
+
+yet_args_needed_2:
+ deccc 5,%l7
+ bneg gc_22
+ nop
+gc_r_22:
+ ld [a1],d0
+ st a0,[%g6+4]
+ inc 8,d0
+ ld [a1+4],d2
+ st d0,[%g6+8]
+ add %g6,8,a0
+ ld [a1+8],%o0
+ st d2,[%g6+12]
+ ld [sp],%o7
+ st %o0,[%g6]
+ inc 4,sp
+ st %g6,[%g6+16]
+ retl
+ inc 20,%g6
+
+gc_22: dec 4,sp
+ call collect_2
+ st %o7,[sp]
+ ba gc_r_22
+ nop
+
+yet_args_needed_3:
+ deccc 6,%l7
+ bneg gc_23
+ nop
+gc_r_23:
+ ld [a1],d0
+ st a0,[%g6+8]
+ inc 8,d0
+ ld [a1+4],d2
+ st d0,[%g6+12]
+ ld [a1+8],a1
+ st d2,[%g6+16]
+ ld [a1],%o0
+ st %g6,[%g6+20]
+ ld [a1+4],%o1
+ add %g6,12,a0
+ st %o0,[%g6]
+ ld [sp],%o7
+ inc 4,sp
+ st %o1,[%g6+4]
+ retl
+ inc 24,%g6
+
+gc_23: dec 4,sp
+ call collect_2
+ st %o7,[sp]
+ b,a gc_r_23
+
+yet_args_needed_4:
+ deccc 7,%l7
+ bneg gc_24
+ nop
+gc_r_24:
+ ld [a1],d0
+ st a0,[%g6+12]
+ inc 8,d0
+ ld [a1+4],d2
+ st d0,[%g6+16]
+ ld [a1+8],a1
+ st d2,[%g6+20]
+ ld [a1],%o0
+ st %g6,[%g6+24]
+ ld [a1+4],%o1
+ st %o0,[%g6]
+ add %g6,16,a0
+ ld [a1+8],%o2
+ st %o1,[%g6+4]
+ ld [sp],%o7
+ inc 4,sp
+ st %o2,[%g6+8]
+ retl
+ inc 28,%g6
+
+gc_24: dec 4,sp
+ call collect_2
+ st %o7,[sp]
+ ba gc_r_24
+ nop
+
+repl_args_b:
+ tst d0
+ ble repl_args_b_1
+ nop
+ deccc 1,d0
+ beq repl_args_b_4
+ nop
+ ld [a0+8],a1
+ deccc 2,d1
+ bne repl_args_b_2
+ nop
+ st a1,[%i4]
+ ba repl_args_b_4
+ inc 4,%i4
+
+repl_args_b_2:
+ sll d0,2,d1
+ add a1,d1,a1
+ dec 1,d0
+repl_args_b_3:
+ ld [a1-4],%o0
+ st %o0,[%i4]
+ dec 4,a1
+ inc 4,%i4
+ tst d0
+ bne repl_args_b_3
+ dec d0
+repl_args_b_4:
+ ld [a0+4],%o0
+ st %o0,[%i4]
+ inc 4,%i4
+repl_args_b_1:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+push_arg_b:
+ cmp d1,2
+ bcs push_arg_b_1
+ nop
+ bne push_arg_b_2
+ nop
+ cmp d1,d0
+ beq push_arg_b_1
+ nop
+push_arg_b_2:
+ ld [a0+8],a0
+ dec 2,d1
+push_arg_b_1:
+ ld [sp],%o7
+ sll d1,2,d1
+ ld [a0+d1],a0
+ retl
+ inc 4,sp
+
+del_args:
+ ld [a0],d1
+ sub d1,d0,d1
+ lduh [d1-2],d0
+ deccc 2,d0
+ bge del_args_2
+ nop
+ ld [a0+4],%o0
+ st d1,[a1]
+ ld [a0+8],%o1
+ st %o0,[a1+4]
+ ld [sp],%o7
+ st %o1,[a1+8]
+ retl
+ inc 4,sp
+
+del_args_2:
+ bne del_args_3
+ nop
+ ld [a0+4],%o0
+ st d1,[a1]
+ ld [a0+8],%o1
+ st %o0,[a1+4]
+ ld [%o1],%o1
+ ld [sp],%o7
+ st %o1,[a1+8]
+ retl
+ inc 4,sp
+
+del_args_3:
+ subcc %l7,d0,%l7
+ bneg del_args_gc
+ nop
+del_args_r_gc:
+ st d1,[a1]
+ ld [a0+4],%o0
+ st %g6,[a1+8]
+ ld [a0+8],a0
+ st %o0,[a1+4]
+
+ ld [a0],%o0
+del_args_copy_args:
+ inc 4,a0
+ st %o0,[%g6]
+ inc 4,%g6
+ deccc d0
+ bg,a del_args_copy_args
+ ld [a0],%o0
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+del_args_gc:
+ dec 4,sp
+ call collect_2
+ st %o7,[sp]
+ b,a del_args_r_gc
+
+#if 0
+o__S_P2:
+ ld [a0],d0
+ ldsh [d0-2],d0
+ cmp d0,2
+ be o__S_P2_2
+ ld [a0+8],a0
+ ld [a0],a0
+o__S_P2_2:
+ ld [sp],%o7
+ retl
+ inc 4,sp
+
+ea__S_P2:
+ ld [a1+4],d0
+ set __indirection,%i2
+ st %i2,[a1]
+ st a0,[a1+4]
+ mov d0,a1
+ ld [a1],d0
+ btst 2,d0
+ bne ea__S_P2_1
+ nop
+
+ st a0,[%i4]
+ inc 4,%i4
+ mov a1,a0
+ dec 4,sp
+ call d0
+ st %o7,[sp]
+ mov a0,a1
+ ld [%i4-4],a0
+ dec 4,%i4
+
+ea__S_P2_1:
+ ld [a1],d0
+ ldsh [d0-2],d0
+ cmp d0,2
+ be ea__S_P2_2
+ ld [a1+8],a1
+ ld [a1],a1
+ea__S_P2_2:
+ ld [a1],d0
+ btst 2,d0
+ bne ea__S_P2_3
+ nop
+
+ jmp d0-20
+ nop
+
+ea__S_P2_3:
+ st d0,[a0]
+ ld [a1+4],%g1
+ st %g1,[a0+4]
+ ld [a1+8],%g1
+ st %g1,[a0+8]
+
+ ld [sp],%o7
+ retl
+ inc 4,sp
+#endif