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