summaryrefslogtreecommitdiff
path: root/smark.s
diff options
context:
space:
mode:
Diffstat (limited to 'smark.s')
-rw-r--r--smark.s1744
1 files changed, 1744 insertions, 0 deletions
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