diff options
-rw-r--r-- | scompact.s | 433 | ||||
-rw-r--r-- | scopy.s | 9 | ||||
-rw-r--r-- | smark.s | 1810 | ||||
-rw-r--r-- | sstartup.s | 369 |
4 files changed, 1323 insertions, 1298 deletions
@@ -12,22 +12,13 @@ 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 @@ -35,18 +26,12 @@ mark_cafs_lp: 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) @@ -272,7 +257,7 @@ mark_hnf_3: mov 128,%o3 - sub a1,%l6,d0 + sub a1,d6,d0 srl d0,2,d0 srl d0,3,%o0 @@ -332,7 +317,7 @@ mark_hnf_1: mark_indirection_node: sub a0,4,%o1 - sub %o1,%l6,%o1 + sub %o1,d6,%o1 srl %o1,2,%o1 srl %o1,3,d2 @@ -357,9 +342,8 @@ mark_selector_node_1: inccc d2 ble mark_record_selector_node_1 - nop - srl %o1,3,d2 + ldub [%o4+d2],%g1 and %o1,7,%g2 mov 128,%g3 @@ -420,10 +404,8 @@ small_tuple_or_record: 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 @@ -443,8 +425,6 @@ mark_record_selector_node_1: 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 @@ -476,9 +456,8 @@ mark_strict_record_selector_node_1: nop select_from_small_record: - dec 4,a0 - ld [d0-8],%g1 + dec 4,a0 ld [%g1+4],%g1 dec 4,sp @@ -499,7 +478,7 @@ mark_hnf_2: mov d2,a0 mark_node: - sub a0,%l6,d0 + sub a0,d6,d0 #ifdef SHARE_CHAR_INT cmp d0,%l7 bcc mark_next_node_after_static @@ -603,7 +582,7 @@ mark_hnf_0: bcc mark_next_node nop - sub a0,%l6,d1 + sub a0,d6,d1 srl d1,2,d1 srl d1,3,d0 @@ -662,24 +641,23 @@ no_char_3: 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 + ld [a0+8],d1 + tst d1 be,a mark_lazy_array ld [a0+4],d0 - lduh [d0-2+2],d1 - tst d1 + lduh [d1-2],d0 + tst d0 be,a mark_b_record_array sub a0,d6,d0 - lduh [d0-2],d0 - tst d0 + lduh [d1-2+2],d1 + tst d1 be,a mark_b_record_array sub a0,d6,d0 @@ -697,6 +675,7 @@ mark_ab_record_array: ld [a0+4],d2 inc 8,a0 + mov a0,%g4 sll d2,2,d2 @@ -758,6 +737,7 @@ mul_array_length: mark_lazy_array: inc 8,a0 + mark_lr_array: sub a0,d6,d1 srl d1,2,d1 @@ -806,11 +786,9 @@ mark_array_length_0_1: 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 @@ -1101,142 +1079,14 @@ free_finalizer_list_empty: 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 + inc 4,a2 find_non_zero_long_2: - deccc %l5 + deccc d5 bpos,a skip_zeros_2 - ld [%i2],d4 + ld [a2],d4 b,a end_compact_heap @@ -1247,8 +1097,9 @@ end_skip_zeros: add %l7,%l6,%l7 skip_zero_bits: - set first_one_bit_table,%o0 + seth (first_one_bit_table,%o0) ! srl d4,24,%o1 + setl (first_one_bit_table,%o0) ldsb [%o0+%o1],d1 tst d1 bpos,a copy_nodes @@ -1262,7 +1113,7 @@ more_than_7: sll d4,8,d4 btst d4,%o2 beq more_than_7 - inc 8<<2,%l7 + inc 8<<2,d7 less_than_8: srl d4,24,%o1 @@ -1270,25 +1121,17 @@ less_than_8: 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 + sll d4,1,d4 - bclr 1,d0 + ld [d7+d1],d0 + add d7,d1,a0 + add a0,4,d7 + inc 4,a0 btst 2,d0 beq begin_update_list_2 - bclr 2,d0 + bclr 3,d0 ld [d0-8],d3 mov d0,a1 @@ -1659,8 +1502,9 @@ move_hnf_0: set INT+2,%l3 cmp d0,%l3 blu move_real_file_or_string - nop - set CHAR+2,%o0 + seth (CHAR+2,%o0) + + setl (CHAR+2,%o0) cmp d0,%o0 bleu move_int_bool_or_char nop @@ -1691,6 +1535,200 @@ cp_s_arg_lp3: b,a skip_zero_bits +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 + +move_real_array: + tst d4 + bneg clear_bit_in_this_word + sll d4,1,d4 + + ld [a2],d4 + dec d5 + sub a2,%o4,d7 + inc 4,a2 + sll d7,5,d7 + add d7,%l6,d7 + + sll d4,1,d4 +clear_bit_in_this_word: + inc 4,d7 + + add %g6,8,d1 + andn d1,4,d1 + + ld [a0],d0 + ba begin_array_update_list_2 + bclr 1,d0 + +update_array_list_2: + st d1,[a1] +begin_array_update_list_2: + mov d0,a1 + ld [a1],d0 +update_array_list__2: + btst 1,d0 + be end_update_array_list_2 + bclr 1,d0 + btst 2,d0 + be update_array_list_2 + bclr 2,d0 + mov d0,a1 + ba update_array_list__2 + ld [a1],d0 + +end_update_array_list_2: + st d1,[a1] + + st d0,[d1] + inc 4,d1 + + ld [a0+4],d0 + inc 4,a0 + + inc 16,%g6 + + sll d0,3,%o0 + sll d0,1,d0 + + add %g6,%o0,%g6 + +move_real_array_reals: + ld [a0],%o0 ! + inc 4,a0 + st %o0,[d1] + inc 4,d1 + deccc d0 + bge,a move_real_array_reals+4 + ld [a0],%o0 + + b,a skip_zero_bits + skip_zeros_2_a: ld [a2],d4 dec d5 @@ -1699,15 +1737,17 @@ 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 + sub %i2,%o4,d7 + dec 4,d7 + sll d7,5,d7 + add d7,%l6,d7 move_array: + skip_zero_bits_a: - set first_one_bit_table,%o0 + seth (first_one_bit_table,%o0) ! srl d4,24,%o1 + setl (first_one_bit_table,%o0) ldsb [%o0+%o1],d1 tst d1 bpos,a end_array_bit @@ -1721,7 +1761,7 @@ more_than_7_a: sll d4,8,d4 btst d4,%o2 beq more_than_7_a - inc 8<<2,%l7 + inc 8<<2,d7 less_than_8_a: srl d4,24,%o1 @@ -1732,9 +1772,9 @@ end_array_bit: sll d4,1,d4 sll d1,2,d1 - add %l7,d1,%l7 + add d7,d1,d7 - mov %l7,d1 + mov d7,d1 cmp d7,a0 bne move_a_array inc 4,d7 @@ -1785,7 +1825,7 @@ move_a_array: deccc 1,d1 blu end_array nop - + ld [a0],%o0 ld [a1-4],d0 st %o0,[a1-4] @@ -1802,6 +1842,7 @@ move_a_array: lduh [d0-2+2],d3 lduh [d0-2],d0 dec 256,d0 + cmp d0,d3 be st_move_array_lp nop @@ -794,19 +794,20 @@ copy_string_or_array_2: inc 4,a2 ld [a0+4],d2 - sub %o4,8,a1 + ld [a0],%o0 inc 3,d2 + srl d2,2,d2 sll d2,2,d1 + sub %o4,8,a1 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] @@ -838,7 +839,6 @@ copy_string_constant: copy_array_2: ld [a0+8],d0 - tst d0 be copy_array_a2 ld [a0+4],d2 @@ -847,7 +847,7 @@ copy_array_2: tst d1 be copy_strict_basic_array_2 nop - + sub d1,257,d0 mov d2,d1 mov 0,d2 @@ -858,7 +858,6 @@ mul_length_2: copy_array_a2: mov a6,a1 - sll d2,2,d1 add a6,d1,a6 inc 12,a6 @@ -1,6 +1,4 @@ -! record selectors not yet implemented - ldg (heap_size_33,d0) _fill_ones: btst 3,d0 @@ -14,10 +12,10 @@ _end_fill_ones: clr d4 ldg (heap_size_33,d7) - + stg (d4,lazy_array_list) sethi %hi 0x80000000,%g3 - sub sp,2000,d3 + sub sp,4000,a3 sll d7,5,d7 ldg (caf_list,d0) @@ -28,10 +26,13 @@ _end_fill_ones: be _end_mark_cafs dec 4,sp + dec 4,sp + _mark_cafs_lp: - ld [d0-4],%g5 + ld [d0-4],%g1 add d0,4,a2 ld [d0],d0 + st %g1,[sp] sll d0,2,d0 add a2,d0,a4 @@ -39,10 +40,13 @@ _mark_cafs_lp: call _mark_stack_nodes st %o7,[sp] - addcc %g5,0,d0 + ld [sp],d0 + addcc d0,0,d0 bne _mark_cafs_lp nop + inc 4,sp + _end_mark_cafs: ldg (stack_p,a2) @@ -50,6 +54,85 @@ _end_mark_cafs: call _mark_stack_nodes st %o7,[sp] + ldg (lazy_array_list,a0) + + tst a0 + beq end_restore_arrays + nop + +restore_arrays: + ld [a0],d3 ! size + ld [a0+4],d1 ! second last element + + set __ARRAY__+2,%o0 + ld [a0+8],d2 ! last element + + cmp d3,1 + beq restore_array_size_1 + st %o0,[a0] + + sll d3,2,a1 + add a0,a1,a1 + + ld [a1+8],d0 ! descriptor + + tst d0 + beq restore_lazy_array + nop + + lduh [d0-2+2],%o0 + udiv d3,%o0,d3 + +restore_lazy_array: + st d3,[a0+4] + ld [a1+4],a3 ! next + st d0,[a0+8] + + st d1,[a1+4] + + tst d0 + beq no_reorder_array + st d2,[a1+8] + + lduh [d0-2],%o1 + dec 256,%o1 + cmp %o1,%o0 + beq no_reorder_array + nop + + mov %o1,d0 + mov %o0,d1 + sll d3,2,d3 + umul d3,d0,d3 + inc 12,a0 + add a0,d3,a1 + sub d0,d1,d0 + + call reorder + mov d4,%g1 + + mov %g1,d4 + +no_reorder_array: + addcc a3,0,a0 + bne restore_arrays + nop + + b,a end_restore_arrays + +restore_array_size_1: + st d3,[a0+4] + ld [a0+12],a3 ! descriptor + + st d1,[a0+12] + st a3,[a0+8] + + addcc d2,0,a0 + bne restore_arrays + nop + +end_restore_arrays: + #ifdef FINALIZERS set finalizer_list,a0 set free_finalizer_list,a1 @@ -166,7 +249,7 @@ _zero_bits: mov a0,a1 _skip_zero_bits_lp: - ld [a0],d1 ! + ld [a0],d1 inc 4,a0 tst d1 bne _end_zero_bits @@ -178,7 +261,7 @@ _skip_zero_bits_lp: sub a0,a1,d1 _end_zero_bits: - clr [a0-4] ! + clr [a0-4] sub a0,a1,d1 sll d1,3,d1 @@ -244,109 +327,46 @@ _end_scan: b,a compact_gc +_mark_stack_nodes: + cmp a2,a4 + be _end_mark_nodes + inc 4,a2 -_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 + ld [a2-4],a0 - srl d0,3,%o0 + sub a0,d6,d1 +#ifdef SHARE_CHAR_INT + cmp d1,d7 + bcc _mark_stack_nodes +#endif + srl d1,5,%o0 + srl d1,2,d1 andn %o0,3,%o0 ld [%o4+%o0],%o1 - srl %g3,d0,%o3 + srl %g3,d1,%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] + bne _mark_stack_nodes + nop - inc 4,%o0 +#if 0 + add a2,-4,%o0 + mov 0,d3 + mov 1,d5 + st %o0,[sp-4] + call __mark__node + dec 4,sp - ld [%o4+%o0],%o1 - bset %g3,%o1 - ba _mark_next_node - st %o1,[%o4+%o0] +_mark_next_node: + b,a _mark_stack_nodes +#else + clr [sp-4] + ba _mark_arguments + dec 4,sp -_mark_record_2: +_mark_hnf_2: cmp %o3,4 - bgeu fits_in_word_12 + bgeu fits_in_word_6 bset %o3,%o1 st %o1,[%o4+%o0] @@ -354,39 +374,25 @@ _mark_record_2: ld [%o4+%o0],%o1 bset %g3,%o1 -fits_in_word_12: +fits_in_word_6: st %o1,[%o4+%o0] inc 3,d4 - cmp %g1,1 - bgu _mark_record_2_c - nop - - be,a _mark_node +_mark_record_2_c: + ld [a0+4],%o0 + dec 4,sp + cmp sp,a3 + blu __mark_using_reversal + st %o0,[sp] + 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 - +_mark_node: sub a0,d6,d1 -#ifdef SHARE_CHAR_INT +# ifdef SHARE_CHAR_INT cmp d1,d7 - bcc _mark_stack_nodes -#endif + bcc _mark_next_node +# endif srl d1,2,d1 srl d1,3,%o0 @@ -395,19 +401,15 @@ _mark_stack_nodes: srl %g3,d1,%o3 btst %o3,%o1 - bne _mark_stack_nodes + bne _mark_next_node 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 @@ -436,9 +438,8 @@ fits_in_word_1: ld [a0+4],a1 sub a1,d6,d0 + srl d0,5,%o0 srl d0,2,d0 - - srl d0,3,%o0 andn %o0,3,%o0 ld [%o4+%o0],%o1 srl %g3,d0,%o3 @@ -449,13 +450,14 @@ fits_in_word_1: _no_shared_argument_part: sll d2,2,%o2 - add a1,%o2,a1 - inc 1,d2 - add d4,d2,d4 + add a1,%o2,a1 and d0,31,%o2 + add %o2,d2,%o2 + add d4,d2,d4 + cmp %o2,32 bleu fits_in_word_2 bset %o3,%o1 @@ -481,15 +483,15 @@ _push_hnf_args: bcc _push_hnf_args dec 4,sp - cmp sp,d3 + cmp sp,a3 bgeu,a _mark_node ld [a0],a0 b,a __mark_using_reversal -_mark_lazy_node_1: - cmp %o3,4 - bgeu fits_in_word_3 +_mark_hnf_1: + cmp %o3,2 + bgeu fits_in_word_4 bset %o3,%o1 st %o1,[%o4+%o0] @@ -497,19 +499,17 @@ _mark_lazy_node_1: ld [%o4+%o0],%o1 bset %g3,%o1 -fits_in_word_3: +fits_in_word_4: st %o1,[%o4+%o0] + inc 2,d4 - tst d2 - bne _mark_selector_node_1 - inc 3,d4 - +_shared_argument_part: ba _mark_node ld [a0],a0 -_mark_hnf_1: - cmp %o3,2 - bgeu fits_in_word_4 +_mark_lazy_node_1: + cmp %o3,4 + bgeu fits_in_word_3 bset %o3,%o1 st %o1,[%o4+%o0] @@ -517,28 +517,28 @@ _mark_hnf_1: ld [%o4+%o0],%o1 bset %g3,%o1 -fits_in_word_4: +fits_in_word_3: st %o1,[%o4+%o0] - inc 2,d4 -_shared_argument_part: - ba _mark_node - ld [a0],a0 + cmp d2,1 + bne _mark_selector_node_1 + inc 3,d4 -! selectors -_mark_indirection_node: ba _mark_node - mov a1,a0 + ld [a0],a0 _mark_selector_node_1: - cmp d2,-2 - bne _mark_indirection_node + inccc 2,d2 + beq _mark_indirection_node ld [a0],a1 sub a1,d6,d1 + srl d1,5,%o0 + + inccc 1,d2 + ble _mark_record_selector_node_1 srl d1,2,d1 - srl d1,3,%o0 andn %o0,3,%o0 ld [%o4+%o0],%o1 srl %g3,d1,%o3 @@ -554,14 +554,15 @@ _mark_selector_node_1: ldsh [d2-2],%g1 cmp %g1,2 - bleu _small_tuple + bleu _small_tuple_or_record nop +_large_tuple_or_record: ld [a1+8],d1 sub d1,d6,d1 + srl d1,5,%o0 srl d1,2,d1 - srl d1,3,%o0 andn %o0,3,%o0 ld [%o4+%o0],%g1 srl %g3,d1,%o3 @@ -570,7 +571,7 @@ _mark_selector_node_1: bne,a _mark_node mov a1,a0 -_small_tuple: +_small_tuple_or_record: sub a0,4,d2 ld [d0-8],%g1 @@ -586,45 +587,74 @@ _small_tuple: 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 +_mark_record_selector_node_1: + beq _mark_strict_record_selector_node_1 + andn %o0,3,%o0 ld [%o4+%o0],%o1 - bset %g3,%o1 -fits_in_word_6: - st %o1,[%o4+%o0] - inc 3,d4 + srl %g3,d1,%o3 -_mark_record_2_c: - ld [a0+4],%o0 - dec 4,sp - cmp sp,d3 - blu __mark_using_reversal - st %o0,[sp] - - ld [a0],a0 + btst %o3,%o1 + bne,a _mark_node + mov a1,a0 -_mark_node: - sub a0,d6,d1 -#ifdef SHARE_CHAR_INT - cmp d1,d7 - bcc _mark_next_node -#endif - srl d1,2,d1 + ld [a1],d2 + btst 2,d2 + be,a _mark_node + mov a1,a0 - srl d1,3,%o0 - andn %o0,3,%o0 + 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: ld [%o4+%o0],%o1 srl %g3,d1,%o3 btst %o3,%o1 - be _mark_arguments + 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,258 + bleu _select_from_small_record nop + + ld [a1+8],d1 + sub d1,d6,d1 + srl d1,5,%o0 + srl d1,2,d1 + + andn %o0,3,%o0 + ld [%o4+%o0],%g1 + srl %g3,d1,%o3 + + btst %o3,%g1 + bne,a _mark_node + mov a1,a0 + +_select_from_small_record: + ld [d0-8],%g1 + dec 4,a0 + ld [%g1+4],%g1 + + dec 4,sp + call %g1 + st %o7,[sp] + + b,a _mark_next_node + +_mark_indirection_node: + ba _mark_node + mov a1,a0 _mark_next_node: ld [sp],a0 @@ -635,20 +665,23 @@ _mark_next_node: 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 + cmp d2,1 ble,a _mark_lazy_node_1 inc 4,a0 + + cmp d2,256 + bge _mark_closure_with_unboxed_arguments + nop - inc 2,d2 - add d4,d2,d4 - + inc 1,d2 and d1,31,%o2 + add d4,d2,d4 add %o2,d2,%o2 + cmp %o2,32 bleu fits_in_word_7 bset %o3,%o1 @@ -673,20 +706,56 @@ _push_lazy_args: bcc _push_lazy_args dec 4,sp - cmp sp,d3 + cmp sp,a3 bgeu,a _mark_node ld [a0-4],a0 ba __mark_using_reversal dec 4,a0 +_mark_closure_with_unboxed_arguments: + srl d2,8,%g2 + and d2,255,d2 + deccc 1,d2 + beq _mark_real_or_file + inc 2,d2 + + and d1,31,%o2 + add d4,d2,d4 + 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] + + sub d2,%g2,d2 + sll d2,2,%g2 + deccc 2,d2 + blt _mark_next_node + nop + + bne _push_lazy_args + add a0,%g2,a0 + +_mark_closure_with_one_boxed_argument: + ba _mark_node + ld [a0-4],a0 + _mark_hnf_0: set INT+2,%g1 cmp d0,%g1 blu _mark_real_file_or_string - nop + seth (CHAR+2,%g1) - set CHAR+2,%g1 + setl (CHAR+2,%g1) cmp d0,%g1 bgu _mark_normal_hnf_0 nop @@ -714,411 +783,411 @@ _mark_normal_hnf_0: inc 1,d4 _mark_real_file_or_string: - set __ARRAY__+2,%g1 + set __STRING__+2,%g1 cmp d0,%g1 - bne _no_mark_array + bleu _mark_string_or_array nop - ld [a0+8],d0 - tst d0 - be _mark_lazy_array - nop +_mark_real_or_file: + cmp %o3,4 + bgeu fits_in_word_9 + bset %o3,%o1 - lduh [d0-2+2],d1 - tst d1 - be _mark_b_record_array - nop + st %o1,[%o4+%o0] + inc 4,%o0 - lduh [d0-2],d0 - dec 256,d0 - cmp d0,d1 - be _mark_a_record_array - nop + ld [%o4+%o0],%o1 + bset %g3,%o1 +fits_in_word_9: + st %o1,[%o4+%o0] + ba _mark_next_node + inc 3,d4 -_mark_ab_record_array: - mov d2,%o2 - mov d3,%o3 - mov d4,%g2 - mov d5,%o5 - mov d6,%g3 +_mark_record: + deccc 258,d2 + be,a _mark_record_2 + lduh [d0-2+2],%g1 - ld [a0+4],d2 - inc 8,a0 - mov a0,%g4 + blu,a _mark_record_1 + lduh [d0-2+2],%g1 - 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 +_mark_record_3: + cmp %o3,4 + lduh [d0-2+2],d1 + bgeu fits_in_word_13 + bset %o3,%o1 - sub d0,d1,d0 - inc 4,a0 - call reorder - add a1,a0,a1 + st %o1,[%o4+%o0] + inc 4,%o0 - 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 + ld [%o4+%o0],%o1 + bset %g3,%o1 +fits_in_word_13: + st %o1,[%o4+%o0] -_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 + ld [a0+4],a1 + inc 3,d4 -_mark_a_record_array: - ld [a0+4],d0 - deccc 2,d1 - blu _mark_lr_array - inc 8,a0 + sub a1,d6,d0 + srl d0,5,%o0 + srl d0,2,d0 + andn %o0,3,%o0 - mov d0,d2 -_mul_array_length: deccc 1,d1 - bcc _mul_array_length - add d0,d2,d0 + ld [%o4+%o0],%o1 + blu _mark_record_3_bb + srl %g3,d0,%o3 - b,a _mark_lr_array + btst %o3,%o1 + bne,a _mark_node + ld [a0],a0 -_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) + inc 1,d2 + and d0,31,%o2 + add d4,d2,d4 + add %o2,d2,%o2 - cmp d0,1 - bleu _mark_array_length_0_1 - nop + bset %o3,%o1 + cmp %o2,32 + bleu _push_record_arguments + st %o1,[%o4+%o0] - mov a0,a1 - sll d0,2,d0 - add a0,d0,a0 + inc 4,%o0 - 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 [%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 - 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 + ld [a0],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 +_mark_record_3_bb: + btst %o3,%o1 + bne _mark_next_node + inc 1,d2 -_no_mark_array: - set STRING+2,%g1 - cmp %g1,%l0 - beq _mark_string - nop + and d0,31,%o2 + add d4,d2,d4 + add %o2,d2,%o2 -_mark_real_or_file: - cmp %o3,4 - bgeu fits_in_word_9 bset %o3,%o1 - + cmp %o2,32 + bleu _mark_next_node 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 + st %o1,[%o4+%o0] - cmp %g1,3 - bgeu fits_in_word_10 - bset %g1,%o1 +_mark_record_2: + cmp %o3,4 + bgeu fits_in_word_12 + bset %o3,%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: + bset %g3,%o1 +fits_in_word_12: st %o1,[%o4+%o0] - inc 2,d4 - ld [a0+4],a1 + cmp %g1,1 + bgu _mark_record_2_c + inc 3,d4 - sub a1,d6,d0 - cmp d0,d7 - bcc _mark_next_node - srl d0,2,d0 + be,a _mark_node + ld [a0],a0 - ld [a1+4],d1 - inc 7,d1 - srl d1,2,d1 + b,a _mark_next_node - cmp d1,32 - bcc _mark_large_string - add d4,d1,d4 +_mark_record_1: + tst %g1 + bne _mark_hnf_1 + nop + b,a _mark_bool_or_small_string - srl d0,3,%o0 - andn %o0,3,%o0 - mov -1,%o3 - ld [%o4+%o0],%o1 - srl %o3,d1,%o3 - not %o3 +_mark_string_or_array: + beq,a _mark_string + ld [a0+4],d0 - srl %o3,d0,%g1 +_mark_array: + ld [a0+8],d1 + tst d1 + be _mark_lazy_array + nop - and d0,31,%o2 - add %o2,d1,%o2 - cmp %o2,32 - bleu fits_in_word_11 - bset %g1,%o1 + lduh [d1-2],d0 + tst d0 + be _mark_strict_basic_array + nop - st %o1,[%o4+%o0] - inc 4,%o0 + lduh [d1-2+2],d1 + tst d1 + be _mark_b_record_array + nop + cmp sp,a3 + blu __mark_array_using_reversal + nop - neg d0 - ld [%o4+%o0],%o1 - sll %o3,d0,%o3 - + ld [a0+4],d2 + sub d0,256,d3 bset %o3,%o1 -fits_in_word_11: - ba _mark_next_node + st %o1,[%o4+%o0] + umul d2,d3,d0 -_mark_large_string: - b,a _mark_large_string + cmp d1,d3 + beq _mark_lazy_or_a_record_array + inc d4 -_end_mark_nodes: - ld [sp],%o7 - retl - inc 4,sp +_mark_ab_record_array: + inc 3-1,d0 + add d4,d0,d4 -__mark__record: - deccc 258,d2 - be,a __mark__record__2 - lduh [d0-2+2],%g1 + sll d0,2,d0 + add a0,d0,d0 + + sub d0,d6,d0 + srl d0,5,d0 + andn d0,3,d0 + cmp %o0,d0 + bgeu _end_set_ab_array_bits + nop + + inc 4,%o0 + cmp %o0,d0 + bgeu _last_ab_array_bits + nop - blu,a __mark__record__1 - lduh [d0-2+2],%g1 +_mark_ab_array_lp: + st %g3,[%o4+%o0] + inc 4,%o0 + cmp %o0,d0 + bltu,a _mark_ab_array_lp+4 + st %g3,[%o4+%o0] -__mark__record__3: - lduh [d0-2+2],d2 - deccc 1,d2 - blu,a __mark__record__3__bb - dec 4,a0 +_last_ab_array_bits: + ld [%o4+%o0],%o1 + bset %g3,%o1 + st %o1,[%o4+%o0] + +_end_set_ab_array_bits: + st a2,[sp-8] + st a4,[sp-4] - be __mark__record__3__ab - nop + sll d3,2,d3 + add a0,12,a2 - deccc 1,d2 - be __mark__record__3__aab + st d3,[sp-20] + sll d1,2,d1 + st d1,[sp-16] + dec 28,sp + + cmp d2,0 + beq _mark_ab_array_0 nop - b,a __mark__hnf__3 +_mark_ab_array: + ld [sp+12],d1 + st d2,[sp+4] + st a2,[sp] + + add a2,d1,a4 -__mark__record__3__bb: - ld [a0+8],a1 + dec 4,sp + call _mark_stack_nodes + st %o7,[sp] - sub a1,d6,d0 - srl d0,2,d0 - setmbit (%o4,d0,d1,%o0,%o1,%o2) + ld [sp+4],d2 + ld [sp],a2 + ld [sp+8],d3 + + deccc d2 + bne _mark_ab_array + add a2,d3,a2 + +_mark_ab_array_0: + inc 28,sp + ld [sp-8],a2 + ba _mark_next_node + ld [sp-4],a4 - cmp a1,a0 - bgu __mark__next__node +_mark_lazy_array: + cmp sp,a3 + blu __mark_array_using_reversal nop - cmp %o0,1 - bne __not__next__byte__1 - srl %o0,1,%o0 + ld [a0+4],d0 + bset %o3,%o1 + inc d4 + st %o1,[%o4+%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 +_mark_lazy_or_a_record_array: + mov d0,d2 + + inc 3-1,d0 + st a2,[sp-8] + add a0,12,a2 + + add d4,d0,d4 + sll d0,2,d0 + add a0,d0,d0 - sub a0,d6,d0 - srl d0,2,d0 - inc 2,d0 - setmbit (%o4,d0,d1,%o0,%o1,%o2) + sub d0,d6,d0 + srl d0,5,d0 + andn d0,3,d0 - ld [a1],%o0 - add a0,8+2+1,d0 - st %o0,[a0+8] - ba __mark__next__node - st d0,[a1] + cmp %o0,d0 + bgeu _end_set_lazy_array_bits + sll d2,2,d2 -__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] + inc 4,%o0 + cmp %o0,d0 + bgeu _last_lazy_array_bits + nop -__mark__record__3__ab: - ld [a0+4],a1 +_mark_lazy_array_lp: + st %g3,[%o4+%o0] + inc 4,%o0 + cmp %o0,d0 + bltu,a _mark_lazy_array_lp+4 + st %g3,[%o4+%o0] - sub a1,d6,d0 - srl d0,2,d0 - setmbit (%o4,d0,d1,%o0,%o1,%o2) +_last_lazy_array_bits: + ld [%o4+%o0],%o1 + bset %g3,%o1 + st %o1,[%o4+%o0] + +_end_set_lazy_array_bits: + st a4,[sp-4] + st d1,[sp-12] + add a2,d2,a4 - cmp a1,a0 - bgu __mark__hnf__1 - nop + dec 16,sp + call _mark_stack_nodes + st %o7,[sp] - cmp %o0,1 - bne __not__next__byte__2 - srl %o0,1,%o0 + ld [sp],d1 + inc 12,sp + ld [sp-8],a2 + ba _mark_next_node + ld [sp-4],a4 - 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 +__mark_array_using_reversal: + mov 0,d3 + st d3,[sp-4] + mov 1,d5 + b __mark__node + dec 4,sp - sub a0,d6,d0 +_mark_strict_basic_array: + ld [a0+4],d0 + set INT+2,%g1 + cmp d1,%g1 + beq,a _mark_basic_array_ + inc 3,d0 + set BOOL+2,%g1 + cmp d1,%g1 + beq,a _mark_strict_bool_array + inc 12+3,d0 +_mark_strict_real_array: + add d0,d0,d0 + ba _mark_basic_array_ + inc 3,d0 +_mark_strict_bool_array: + ba _mark_basic_array_ 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_b_record_array: + ld [a0+4],d1 + dec 256,d0 + umul d1,d0,d0 -__mark__record__3__aab: - ld [a0+4],a1 + ba _mark_basic_array_ + inc 3,d0 - sub a1,d6,d0 +_mark_string: + inc 8+3,d0 srl d0,2,d0 - tstmbit (%o4,d0,d1,%o0,%o1,%o2) - bne __shared__argument__part - bset %o0,%o1 - - stb %o1,[%o4+d1] +_mark_basic_array_: + bset %o3,%o1 + st %o1,[%o4+%o0] + add d4,d0,d4 - ld [a0],%o0 - inc 4,a0 - or %o0,2,%o0 - st %o0,[a0-4] - or d3,d5,d3 - st d3,[a0] + sll d0,2,d0 + add a0,d0,a0 + dec 4,a0 + sub a0,d6,d0 + srl d0,5,d0 + andn d0,3,d0 - ld [a1],d2 - st a0,[a1] - mov a1,d3 - mov 1,d5 - ba __mark__node - mov d2,a0 + cmp %o0,d0 + bge _mark_next_node + inc 4,%o0 -__mark__record__2: - cmp %g1,1 - bgu __mark__hnf__2 + cmp %o0,d0 + bge _last_string_bits nop - be __mark__hnf__1 - nop - ba __mark__next__node - dec 4,a0 + +_mark_string_lp: + st %g3,[%o4+%o0] + inc 4,%o0 + cmp %o0,d0 + bltu,a _mark_string_lp+4 + st %g3,[%o4+%o0] -__mark__record__1: - tst %g1 - bne __mark__hnf__1 - nop - ba __mark__next__node - dec 4,a0 +_last_string_bits: + ld [%o4+%o0],%o1 + bset %g3,%o1 + ba _mark_next_node + st %o1,[%o4+%o0] +#endif -__end_mark_using_reversal: - ld [sp],d3 +_end_mark_nodes: + ld [sp],%o7 + retl + inc 4,sp + +__end__mark__using__reversal: + ld [sp],a1 + tst a1 + beq _mark_next_node + inc 4,sp ba _mark_next_node - inc 8,sp + st a0,[a1] -__end_mark_using_reversal_after_static: - ld [sp+4],a1 - ld [sp],d3 +__end__mark__using__reversal__after__static: + ld [sp],a1 st a0,[a1] ba _mark_next_node - inc 8,sp + inc 4,sp __mark_using_reversal: st a0,[sp-4] - st d3,[sp-8] - mov 0,d3 - mov 1,d5 ld [a0],a0 + mov 1,d5 ba __mark__node - dec 8,sp + 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 @@ -1133,8 +1202,9 @@ __mark__arguments: __mark__hnf__3: cmp %o3,4 - bgeu fits__in__word__1 bset %o3,%o1 + bgeu fits__in__word__1 + ld [a0+4],a1 st %o1,[%o4+%o0] inc 4,%o0 @@ -1143,13 +1213,10 @@ __mark__hnf__3: bset %g3,%o1 fits__in__word__1: st %o1,[%o4+%o0] - - ld [a0+4],a1 sub a1,d6,d0 + srl d0,5,%o0 srl d0,2,d0 - - srl d0,3,%o0 andn %o0,3,%o0 ld [%o4+%o0],%o1 srl %g3,d0,%o3 @@ -1159,29 +1226,22 @@ fits__in__word__1: 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 + st d3,[a0+4] + inc 4,a0 ld [a1],%g1 - sll d2,2,d2 - bset 1,%g1 - st %g1,[a1] - add a1,d2,a1 - - srl d2,2,d2 + sll d2,2,d1 inc 1,d2 + + bset 1,%g1 add d4,d2,d4 and d0,31,%o2 + st %g1,[a1] add %o2,d2,%o2 + add a1,d1,a1 + cmp %o2,32 bleu fits__in__word__2 bset %o3,%o1 @@ -1195,17 +1255,17 @@ fits__in__word__2: st %o1,[%o4+%o0] ld [a1],d2 + clr d5 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 +__mark__selector__1: cmp %o3,4 bgeu fits__in__word__3 bset %o3,%o1 @@ -1235,45 +1295,28 @@ fits__in__word__4: 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: + ld [a0],d2 + bset d5,d3 + st d3,[a0] + mov a0,d3 + mov 2,d5 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 + mov d2,a0 __mark__selector__node__1: - cmp d2,-2 - bne __mark__indirection__node + inccc 2,d2 + beq __mark__indirection__node ld [a0],a1 + inccc 1,d2 + sub a1,d6,%o2 + srl %o2,5,d2 srl %o2,2,%o2 - - srl %o2,3,d2 andn d2,3,d2 ld [%o4+d2],%g1 + + ble __mark__record__selector__node__1 srl %g3,%o2,%g2 btst %g2,%g1 @@ -1287,14 +1330,14 @@ __mark__selector__node__1: ldsh [d2-2],%g1 cmp %g1,2 - bleu __small__tuple + bleu __small__tuple__or__record nop - + +__large__tuple__or__record: ld [a1+8],%o2 sub %o2,d6,%o2 + srl %o2,5,d2 srl %o2,2,%o2 - - srl %o2,3,d2 andn d2,3,d2 ld [%o4+d2],%g1 srl %g3,%o2,%g2 @@ -1303,7 +1346,7 @@ __mark__selector__node__1: bne __mark__selector__1 nop -__small__tuple: +__small__tuple__or__record: sub a0,4,d2 ld [d0-8],%g1 @@ -1319,6 +1362,64 @@ __small__tuple: ba __mark__node st a0,[d2+4] +__mark__record__selector__node__1: + beq __mark__strict__record__selector__node__1 + 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,258 + bleu __small__tuple__or__record + nop + b,a __large__tuple__or__record + +__mark__strict__record__selector__node__1: + bne __mark__selector__1 + nop + + ld [a1],d2 + btst 2,d2 + be __mark__selector__1 + nop + + ldsh [d2-2],%g1 + cmp %g1,258 + ble __select__from__small__record + nop + + ld [a1+8],%o2 + sub %o2,d6,%o2 + srl %o2,5,d2 + srl %o2,2,%o2 + andn d2,3,d2 + ld [%o4+d2],%g1 + srl %g3,%o2,%g2 + + btst %g2,%g1 + bne __mark__selector__1 + nop + +__select__from__small__record: + ld [d0-8],%g1 + dec 4,a0 + ld [%g1+4],%g1 + + dec 4,sp + call %g1 + st %o7,[sp] + + b,a __mark__node + +__mark__indirection__node: + ba __mark__node + mov a1,a0 + __mark__hnf__2: cmp %o3,4 bgeu fits__in__word__6 @@ -1333,16 +1434,16 @@ fits__in__word__6: st %o1,[%o4+%o0] inc 3,d4 - ld [%i0],%o0 +__mark__record__2__c: + ld [a0],%o0 + bset d5,d3 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 + st %o0,[a0] + ld [a0+4],d2 + st d3,[a0+4] + add a0,4,d3 + clr d5 + mov d2,a0 __mark__node: sub a0,d6,d1 @@ -1350,47 +1451,47 @@ __mark__node: cmp d1,d7 bcc __mark__next__node__after__static #endif + srl d1,5,%o0 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 + beq __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 + ld [d3-4],d2 + dec 4,d3 + ld [d3+4],%o0 + and d2,3,d5 - st %o0,[%l3] + st %o0,[d3] - st %i0,[%l3+4] + st a0,[d3+4] ba __mark__node - andn %l2,3,%i0 + andn d2,3,a0 __mark__lazy__node: - ldsh [d0-2],d2 tst d2 - be __mark__real__or__file - add d0,-2,a1 - - deccc d2 + beq __mark__real__or__file + cmp d2,1 ble __mark__lazy__node__1 inc 4,a0 - inc 2,d2 - add d4,d2,d4 + cmp d2,256 + bgeu __mark_closure_with_unboxed_arguments + nop + inc 1,d2 and d1,31,%o2 + add d4,d2,d4 add %o2,d2,%o2 cmp %o2,32 bleu fits__in__word__7 @@ -1405,20 +1506,56 @@ fits__in__word__7: st %o1,[%o4+%o0] dec 2,d2 - - ld [%i0],%o0 +__mark_closure_with_unboxed_arguments__2: + ld [a0],%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 + st %o0,[a0] + add a0,d2,a0 + + ld [a0],d2 + bset d5,d3 + st d3,[a0] + mov a0,d3 + clr d5 ba __mark__node - mov %l2,%i0 + mov d2,a0 + +__mark_closure_with_unboxed_arguments: + srl d2,8,d0 + and d2,255,d2 + deccc 1,d2 + beq __mark_closure_1_with_unboxed_argument + inc 2,d2 + + and d1,31,%o2 + add d4,d2,d4 + 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] + + sub d2,d0,d2 + deccc 2,d2 + bgt __mark_closure_with_unboxed_arguments__2 + nop + beq __shared__argument__part + nop + ba __mark__next__node + dec 4,a0 + +__mark_closure_1_with_unboxed_argument: + ba __mark__real__or__file + dec 4,a0 __mark__hnf__0: set INT+2,%g1 @@ -1453,9 +1590,9 @@ ____small____int: __no__int__3: blu __mark__real__file__or__string - seth ((CHAR+2),%g1) + seth (CHAR+2,%g1) - setl ((CHAR+2),%g1) + setl (CHAR+2,%g1) cmp d0,%g1 bne __no__char__3 nop @@ -1472,248 +1609,385 @@ __no__char__3: ba __mark__next__node__after__static sub d0,12+2,a0 - + __mark__real__file__or__string: - set __ARRAY__+2,%g1 + set __STRING__+2,%g1 cmp d0,%g1 - bne __no__mark__array + bleu __mark__string__or__array nop - ld [a0+8],d0 - tst d0 - be __mark__lazy__array - 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__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 + bset %o3,%o1 + bgeu fits__in__word__13 + ld [a0+4],a1 + + 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 + + sub a1,d6,d0 + srl d0,5,%o0 + srl d0,2,d0 + andn %o0,3,%o0 + ld [%o4+%o0],%o1 + srl %g3,d0,%o3 + + btst %o3,%o1 + bne __shared__record__argument__part + inc 3,d4 + + inc 1,d2 + and d0,31,%o2 + + add %o2,d2,%o2 + add d4,d2,d4 + + cmp %o2,32 + bleu fits__in__word__14 + bset %o3,%o1 + + st %o1,[%o4+%o0] + inc 4,%o0 + + ld [%o4+%o0],%o1 + bset %g3,%o1 +fits__in__word__14: + st %o1,[%o4+%o0] + + deccc 1,d1 + blu,a __mark__next__node + dec 4,a0 + + be __shared__argument__part + nop + + deccc 1,d1 + bset d5,d3 + st d3,[a0+4] + be __mark__record__3__aab + inc 4,a0 + + ld [a1],%g1 + sll d1,2,d1 + bset 1,%g1 + st %g1,[a1] + + add a1,d1,a1 + + ld [a1],d2 + clr d5 + st a0,[a1] + mov a1,d3 + ba __mark__node + mov d2,a0 + +__mark__record__3__aab: + ld [a1],d2 + mov 1,d5 + st a0,[a1] + mov a1,d3 + ba __mark__node + mov d2,a0 + +__shared__record__argument__part: tst d1 - be __mark__b__record__array + bne __shared__argument__part + nop + ba __mark__next__node + dec 4,a0 + +__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 __shared__argument__part nop + ba __mark__next__node + dec 4,a0 - lduh [d0-2],d0 +__mark__record__1: + tst %g1 + bne __mark__hnf__1 + nop + ba __mark__bool__or__small__string + dec 4,a0 + +__mark__string__or__array: + beq __mark__string__ + nop + +__mark__array: + ld [a0+8],d1 + tst d1 + be __mark__lazy__array + nop + + lduh [d1-2],d0 + tst d0 + be,a __mark__strict__basic__array + ld [a0+4],d0 + + lduh [d1-2+2],d1 + tst d1 + beq __mark__b__record__array dec 256,d0 + cmp d0,d1 - be __mark__a__record__array - nop + be,a __mark__a__record__array + ld [a0+4],%g1 __mark__ab__record__array: mov d2,%o2 - mov d3,%o3 - mov d4,%g2 + st d3,[sp-12] + mov d4,%g1 mov d5,%o5 - mov d6,%g3 + mov d6,%g2 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 + st a0,[sp-4] + umul d2,d0,a1 + st %o0,[sp-8] 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 + ld [sp-8],%o0 + mov %g2,d6 mov %o5,d5 - mov %g2,d4 - mov %o3,d3 - ba __mark__lr__array + ld [sp-4],a0 + mov %g1,d4 + ld [sp-12],d3 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 + ld [a0-4],%g1 + mov d0,a1 + umul %g1,d1,d0 + umul %g1,a1,d1 + add d4,d1,d4 + add d1,d0,d1 + + sll d1,2,d1 + add a0,d1,d1 + sll d0,2,a1 + add a0,a1,a1 + ba __mark__r__array + sub d1,d6,d1 __mark__a__record__array: - ld [a0+4],d0 - deccc 2,d1 - blu __mark__lr__array + umul %g1,d0,d0 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) + sll d0,2,a1 + add a0,a1,a1 + sub a1,d6,d1 +__mark__r__array: + srl d1,5,d1 + inc 3,d4 + bset %o3,%o1 + + andn d1,3,d1 + cmp %o0,d1 + bgeu __skip__mark__lazy__array__bits + st %o1,[%o4+%o0] + +__mark__lazy__array__bits: + inc 4,%o0 + ld [%o4+%o0],%o1 + bset %g3,%o1 + cmp %o0,d1 + bltu __mark__lazy__array__bits + st %o1,[%o4+%o0] + +__skip__mark__lazy__array__bits: + set lazy_array_list,%o2 cmp d0,1 bleu __mark__array__length__0__1 - nop - - mov a0,a1 - sll d0,2,d0 - add a0,d0,a0 + add d4,d0,d4 - ld [a0],d2 - ld [a1],%o0 - st d2,[a1] - st %o0,[a0] + ld [a1],d2 + ld [a0],%o0 + st d2,[a0] + st %o0,[a1] - ld [a0-4],d2 - dec 4,a0 + ld [a1-4],d2 + dec 4,a1 + ld [%o2],%o1 inc 2,d2 - ld [a1-4],%o0 + st %o1,[a1] + st d2,[a0-4] + st d0,[a0-8] + dec 8,a0 + st a0,[%o2] + + ld [a1-4],a0 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 + bset d5,d3 mov 0,d5 + st d3,[a1] ba __mark__node - mov d2,a0 + mov a1,d3 __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 + dec 8,a0 -__no__mark__array: - set STRING+2,%g1 - cmp %g1,%l0 - beq __mark__string - nop + ld [a0+12],d1 + ld [a0+8],%o0 + ld [%o2],%o3 + st %o0,[a0+12] + st %o3,[a0+8] + st d0,[a0] -__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 + st a0,[%o2] + st d1,[a0+4] -__mark__string: - sethi %hi 0xc0000000,%o3 - srl %o3,d1,%g1 + inc 4,a0 - cmp %g1,3 - bgeu fits__in__word__10 - bset %g1,%o1 + ld [a0],d2 + bset d5,d3 + mov 2,d5 + st d3,[a0] + mov a0,d3 + ba __mark__node + mov d2,a0 - st %o1,[%o4+%o0] - inc 4,%o0 +__mark__b__record__array: + ld [a0+4],d1 + umul d1,d0,d0 + ba __mark__basic__array + inc 3,d0 - neg d1 - ld [%o4+%o0],%o1 - sll %o3,d1,%o3 - - bset %o3,%o1 -fits__in__word__10: - st %o1,[%o4+%o0] - inc 2,d4 +__mark__strict__basic__array: + set INT+2,%g1 + cmp d1,%g1 + beq,a __mark__basic__array + inc 3,d0 + set BOOL+2,%g1 + cmp d1,%g1 + beq __mark__strict__bool__array + nop +__mark__strict__real__array: + add d0,d0,d0 + ba __mark__basic__array + inc 3,d0 +__mark__strict__bool__array: + inc 12+3,d0 + b __mark__basic__array + srl d0,2,d0 - ld [a0+4],a1 +__mark__string__: + ld [a0+4],d0 + inc 8+3,d0 - 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 +__mark__basic__array: + bset %o3,%o1 + add d4,d0,d4 - srl d0,3,%o0 - andn %o0,3,%o0 - mov -1,%o3 - ld [%o4+%o0],%o1 - srl %o3,d1,%o3 - not %o3 + st %o1,[%o4+%o0] - srl %o3,d0,%g1 + sll d0,2,d0 + add a0,d0,d0 + dec 4,d0 - and d0,31,%o2 - add %o2,d1,%o2 - cmp %o2,32 - bleu fits__in__word__11 - bset %g1,%o1 + sub d0,d6,d0 + srl d0,5,d0 + andn d0,3,d0 + + cmp %o0,d0 + bge __mark__next__node + inc 4,%o0 - st %o1,[%o4+%o0] + cmp %o0,d0 + bge __last__string__bits + nop + +__mark__string__lp: + st %g3,[%o4+%o0] inc 4,%o0 + cmp %o0,d0 + bltu,a __mark__string__lp+4 + st %g3,[%o4+%o0] - neg d0 +__last__string__bits: ld [%o4+%o0],%o1 - sll %o3,d0,%o3 - - bset %o3,%o1 -fits__in__word__11: + bset %g3,%o1 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 + be __end__mark__using__reversal deccc d5 - be __argument__part__parent ld [d3],d2 + be __argument__part__parent + st a0,[d3] - st %i0,[%l3] - sub %l3,4,%i0 - and %l2,3,%l5 + sub d3,4,a0 + and d2,3,d5 ba __mark__next__node - andn %l2,3,%l3 + andn d2,3,d3 __argument__part__parent: mov d3,a1 - st a0,[a1] andn d2,3,d3 dec 4,d3 @@ -1731,14 +2005,14 @@ __mark__next__node__after__static: beq __mark__next__node2 tst d3 - be __end_mark_using_reversal_after_static + be __end__mark__using__reversal__after__static deccc d5 - be __argument__part__parent ld [d3],d2 + be __argument__part__parent + st a0,[d3] - st %i0,[%l3] - sub %l3,4,%i0 - and %l2,3,%l5 + sub d3,4,a0 + and d2,3,d5 ba __mark__next__node - andn %l2,3,%l3 + andn d2,3,d3 @@ -8,11 +8,10 @@ #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 MARK_GC #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 @@ -21,8 +20,8 @@ #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 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 ;\ @@ -108,6 +107,7 @@ bit_vector_p: .long 0 zero_bits_before_mark: .long 1 free_after_mark: .long 1000 last_heap_free: .long 0 +lazy_array_list: .long 0 #endif caf_list: .word 0 @@ -318,11 +318,7 @@ free_finalizer_list: .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 @@ -356,7 +352,13 @@ free_finalizer_list: .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 e__system__nind + .global e__system__eaind +! old names of the previous two labels for compatibility, remove later + .global __indirection,__eaind + .global e__system__dind + .global 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 @@ -2294,6 +2296,7 @@ halt: call @longjmp mov 1,%o1 +e__system__eaind: __eaind: eval_fill: st a0,[%i4] @@ -2318,11 +2321,12 @@ eval_fill: retl inc 4,sp - b,a eval_fill + b,a e__system__eaind nop nop - .word 0 + .word e__system__dind .word -2 +e__system__nind: __indirection: ld [a0+4],a1 ld [a1],d0 @@ -2586,6 +2590,7 @@ catAC: inc 8,a0 ld [a1+4],d1 inc 8,a1 + add d0,d1,d2 add d2,3+8,d5 srl d5,2,d5 @@ -2599,7 +2604,7 @@ gc_r_3: set __STRING__+2,%o0 st %o0,[a6] mov a6,d5 - inc 8,%g6 + inc 8,a6 st d2,[a6-4] ! copy string 1 @@ -2676,8 +2681,10 @@ cat_string_al0_1: retl inc 4,sp -gc_3: dec 8,a0 +gc_3: + dec 8,a0 dec 8,a1 + dec 4,sp call collect_2 st %o7,[sp] @@ -2695,6 +2702,7 @@ empty_string: sliceAC: ld [a0+4],d2 add a0,8,a2 + tst d1 bl,a slice_string_1 clr d1 @@ -2773,7 +2781,6 @@ gc_4: dec 4,sp st %o7,[sp] ba r_gc_4 add a0,8,a2 - updateAC: ld [a0+4],d2 @@ -2816,7 +2823,6 @@ gc_5: dec 4,sp ba r_gc_5 add a0,8,a2 - update_string_error: set high_index_string,%o0 tst d0 @@ -2882,6 +2888,7 @@ cmpAC: inc 8,a0 ld [a1+4],d2 inc 8,a1 + cmp d2,d1 bcs,a cmp_string_less mov -1,d0 @@ -3068,8 +3075,8 @@ no_collect_4575: or d0,d3,d0 sll d0,16,d3 or d0,d3,d0 - mov a6,a0 set __ARRAY__+2,%o0 + mov a6,a0 st %o0,[a6] st d2,[a6+4] set BOOL+2,%o0 @@ -3113,13 +3120,14 @@ create_arrayI: st %o7,[sp] no_collect_4577: - mov a6,a0 set __ARRAY__+2,%o0 + mov a6,a0 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 @@ -3165,7 +3173,6 @@ no_collect_4579: st %o0,[a6+8] ba st_fillr_array inc 12,a6 - fillr_array: st d2,[a6+4] inc 8,a6 @@ -3173,7 +3180,6 @@ st_fillr_array: deccc 1,d0 bcc,a fillr_array st d1,[a6] - ld [sp],%o7 retl inc 4,sp @@ -3188,315 +3194,17 @@ create_array: 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] + st %g0,[a6+8] inc 12,a6 - ld [sp],a1 + ba fillr1_array 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 @@ -3519,11 +3227,12 @@ create_R_array_1: call collect_0 st %o7,[sp] no_collect_4581: - mov a6,a0 set __ARRAY__+2,%o0 + mov a6,a0 st %o0,[a6] st d0,[a6+4] st d1,[a6+8] + inc 12,a6 ld [sp],a1 @@ -3566,8 +3275,9 @@ create_R_array_2: call collect_0 st %o7,[sp] no_collect_4582: - mov a6,a0 set __ARRAY__+2,%o0 + + mov a6,a0 st %o0,[a6] st d0,[a6+4] st d1,[a6+8] @@ -3616,8 +3326,8 @@ create_R_array_3: call collect_0 st %o7,[sp] no_collect_4583: - mov a6,a0 set __ARRAY__+2,%o0 + mov a6,a0 st %o0,[a6] st d0,[a6+4] st d1,[a6+8] @@ -3668,8 +3378,8 @@ create_R_array_4: call collect_0 st %o7,[sp] no_collect_4584: - mov a6,a0 set __ARRAY__+2,%o1 + mov a6,a0 st %o1,[a6] st d0,[a6+4] st d1,[a6+8] @@ -3731,8 +3441,8 @@ sub_size_lp: call collect_0 st %o7,[sp] no_collect_4585: - mov a6,a0 set __ARRAY__+2,%o0 + mov a6,a0 st %o0,[a6] st d0,[a6+4] st d1,[a6+8] @@ -3785,7 +3495,6 @@ st_fillr5_array: jmp a1+8 mov a2,sp -#endif ! ! AP code @@ -3867,13 +3576,14 @@ _create_arrayB: st %o7,[sp] no_collect_3575: - mov a6,a0 set __ARRAY__+2,%o0 + mov a6,a0 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 @@ -3894,8 +3604,8 @@ _create_arrayC: st %o7,[sp] no_collect_3578: - mov a6,a0 set __STRING__+2,%o0 + mov a6,a0 st %o0,[a6] st d1,[a6+4] inc 8,a6 @@ -3916,13 +3626,14 @@ _create_arrayI: st %o7,[sp] no_collect_3577: - mov a6,a0 set __ARRAY__+2,%o0 + mov a6,a0 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 @@ -3973,8 +3684,8 @@ sub_size_lp2: no_collect_3585: mov a0,d4 - mov a6,a0 set __ARRAY__+2,%o0 + mov a6,a0 st %o0,[a6] st d0,[a6+4] st d1,[a6+8] |