diff options
-rw-r--r-- | scompact.s | 2044 | ||||
-rw-r--r-- | scopy.s | 1113 | ||||
-rw-r--r-- | sfileIO2.s | 698 | ||||
-rw-r--r-- | smark.s | 1744 | ||||
-rw-r--r-- | sreals.s | 161 | ||||
-rw-r--r-- | sstartup.s | 4456 |
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 @@ -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 @@ -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 |