diff options
Diffstat (limited to 'smark.s')
-rw-r--r-- | smark.s | 1744 |
1 files changed, 1744 insertions, 0 deletions
@@ -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 |