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) stg (d4,lazy_array_list) sethi %hi 0x80000000,%g3 sub sp,4000,a3 sll d7,5,d7 ldg (caf_list,d0) st a4,[sp-4] tst d0 be _end_mark_cafs dec 4,sp dec 4,sp _mark_cafs_lp: ld [d0-4],%g1 add d0,4,a2 ld [d0],d0 st %g1,[sp] sll d0,2,d0 add a2,d0,a4 dec 4,sp call _mark_stack_nodes st %o7,[sp] ld [sp],d0 addcc d0,0,d0 bne _mark_cafs_lp nop inc 4,sp _end_mark_cafs: ldg (stack_p,a2) ld [sp],a4 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 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_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,5,%o0 srl d1,2,d1 andn %o0,3,%o0 ld [%o4+%o0],%o1 srl %g3,d1,%o3 btst %o3,%o1 bne _mark_stack_nodes nop #if 0 add a2,-4,%o0 mov 0,d3 mov 1,d5 st %o0,[sp-4] call __mark__node dec 4,sp _mark_next_node: b,a _mark_stack_nodes #else clr [sp-4] ba _mark_arguments dec 4,sp _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,a3 blu __mark_using_reversal st %o0,[sp] ld [a0],a0 _mark_node: sub a0,d6,d1 cmp d1,d7 bcc _mark_next_node 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_next_node nop _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 _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,5,%o0 srl d0,2,d0 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 inc 1,d2 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 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,a3 bgeu,a _mark_node ld [a0],a0 b,a __mark_using_reversal _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 _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] cmp d2,1 bne _mark_selector_node_1 inc 3,d4 ba _mark_node ld [a0],a0 _mark_selector_node_1: 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 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_or_record nop _large_tuple_or_record: ld [a1+8],d1 sub d1,d6,%o0 srl %o0,5,%g1 srl %o0,2,%o0 andn %g1,3,%g1 ld [%o4+%g1],%g1 srl %g3,%o0,%o3 btst %o3,%g1 bne,a _mark_node mov a1,a0 #ifdef NEW_DESCRIPTORS ld [d0-8],d0 set __indirection,%g1 st %g1,[a0-4] sub a0,4,d2 lduh [d0+4],d0 cmp d0,8 bltu,a _mark_tuple_selector_node_1 ld [a1+d0],a0 beq _mark_tuple_selector_node_2 mov d1,a1 sub d0,12,d0 ld [a1+d0],a0 ba _mark_node st a0,[d2+4] _mark_tuple_selector_node_2: ld [a1],a0 ba _mark_node st a0,[d2+4] #endif _small_tuple_or_record: #ifdef NEW_DESCRIPTORS ld [d0-8],d0 set __indirection,%g1 st %g1,[a0-4] sub a0,4,d2 lduh [d0+4],d0 ld [a1+d0],a0 _mark_tuple_selector_node_1: ba _mark_node st a0,[d2+4] #else 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] #endif _mark_record_selector_node_1: beq _mark_strict_record_selector_node_1 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,258 bleu _small_tuple_or_record nop #ifdef NEW_DESCRIPTORS ld [a1+8],d1 sub d1,d6,%o0 srl %o0,5,%g1 srl %o0,2,%o0 andn %g1,3,%g1 ld [%o4+%g1],%g1 srl %g3,%o0,%o3 btst %o3,%g1 bne,a _mark_node mov a1,a0 ld [d0-8],d0 set __indirection,%g1 st %g1,[a0-4] mov a0,d2 lduh [d0+4],d0 cmp d0,8 bleu _mark_record_selector_node_2 nop mov d1,a1 sub d0,12,d0 _mark_record_selector_node_2: ld [a1+d0],a0 ba _mark_node st a0,[d2] #else b,a _large_tuple_or_record #endif _mark_strict_record_selector_node_1: 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,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: #ifdef NEW_DESCRIPTORS ld [d0-8],d0 dec 4,a0 lduh [d0+4],%g1 cmp %g1,8 bleu,a _mark_strict_record_selector_node_2 ld [a1+%g1],%g1 dec 12,%g1 ld [d1+%g1],%g1 _mark_strict_record_selector_node_2: st %g1,[a0+4] lduh [d0+6],%g1 tst %g1 beq _mark_strict_record_selector_node_5 ld [d0-4],d0 cmp %g1,8 bleu,a _mark_strict_record_selector_node_4 ld [a1+%g1],%g1 dec 12,%g1 ld [d1+%g1],%g1 _mark_strict_record_selector_node_4: st %g1,[a0+8] _mark_strict_record_selector_node_5: ba _mark_next_node st d0,[a0] #else ld [d0-8],%g1 dec 4,a0 ld [%g1+4],%g1 dec 4,sp call %g1 st %o7,[sp] b,a _mark_next_node #endif _mark_indirection_node: ba _mark_node mov a1,a0 _mark_next_node: ld [sp],a0 inc 4,sp tst a0 bne _mark_node nop b,a _mark_stack_nodes _mark_lazy_node: tst d2 be _mark_real_or_file add d0,-2,a1 cmp d2,1 ble,a _mark_lazy_node_1 inc 4,a0 cmp d2,256 bge _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 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,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 seth (CHAR+2,%g1) setl (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 __STRING__+2,%g1 cmp d0,%g1 bleu _mark_string_or_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 lduh [d0-2+2],d1 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] ld [a0+4],a1 inc 3,d4 sub a1,d6,d0 srl d0,5,%o0 srl d0,2,d0 andn %o0,3,%o0 deccc 1,d1 ld [%o4+%o0],%o1 blu _mark_record_3_bb srl %g3,d0,%o3 btst %o3,%o1 bne,a _mark_node ld [a0],a0 inc 1,d2 and d0,31,%o2 add d4,d2,d4 add %o2,d2,%o2 bset %o3,%o1 cmp %o2,32 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: btst %o3,%o1 bne _mark_next_node inc 1,d2 and d0,31,%o2 add d4,d2,d4 add %o2,d2,%o2 bset %o3,%o1 cmp %o2,32 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] cmp %g1,1 bgu _mark_record_2_c inc 3,d4 be,a _mark_node ld [a0],a0 b,a _mark_next_node _mark_record_1: tst %g1 bne _mark_hnf_1 nop b,a _mark_bool_or_small_string _mark_string_or_array: beq,a _mark_string ld [a0+4],d0 _mark_array: ld [a0+8],d1 tst d1 be _mark_lazy_array nop lduh [d1-2],d0 tst d0 be _mark_strict_basic_array nop lduh [d1-2+2],d1 tst d1 be _mark_b_record_array nop cmp sp,a3 blu __mark_array_using_reversal nop ld [a0+4],d2 sub d0,256,d3 bset %o3,%o1 st %o1,[%o4+%o0] umul d2,d3,d0 cmp d1,d3 beq _mark_lazy_or_a_record_array inc d4 _mark_ab_record_array: inc 3-1,d0 add d4,d0,d4 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 _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] _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] sll d3,2,d3 add a0,12,a2 st d3,[sp-20] sll d1,2,d1 st d1,[sp-16] dec 28,sp cmp d2,0 beq _mark_ab_array_0 nop _mark_ab_array: ld [sp+12],d1 st d2,[sp+4] st a2,[sp] add a2,d1,a4 dec 4,sp call _mark_stack_nodes st %o7,[sp] 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 _mark_lazy_array: cmp sp,a3 blu __mark_array_using_reversal nop ld [a0+4],d0 bset %o3,%o1 inc d4 st %o1,[%o4+%o0] _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 d0,d6,d0 srl d0,5,d0 andn d0,3,d0 cmp %o0,d0 bgeu _end_set_lazy_array_bits sll d2,2,d2 inc 4,%o0 cmp %o0,d0 bgeu _last_lazy_array_bits nop _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] _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 dec 16,sp call _mark_stack_nodes st %o7,[sp] ld [sp],d1 inc 12,sp ld [sp-8],a2 ba _mark_next_node ld [sp-4],a4 __mark_array_using_reversal: mov 0,d3 st d3,[sp-4] mov 1,d5 b __mark__node dec 4,sp _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 _mark_b_record_array: ld [a0+4],d1 dec 256,d0 umul d1,d0,d0 ba _mark_basic_array_ inc 3,d0 _mark_string: inc 8+3,d0 srl d0,2,d0 _mark_basic_array_: bset %o3,%o1 st %o1,[%o4+%o0] add d4,d0,d4 sll d0,2,d0 add a0,d0,a0 dec 4,a0 sub a0,d6,d0 srl d0,5,d0 andn d0,3,d0 cmp %o0,d0 bge _mark_next_node inc 4,%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] _last_string_bits: ld [%o4+%o0],%o1 bset %g3,%o1 ba _mark_next_node st %o1,[%o4+%o0] #endif _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 st a0,[a1] __end__mark__using__reversal__after__static: ld [sp],a1 st a0,[a1] ba _mark_next_node inc 4,sp __mark_using_reversal: st a0,[sp-4] mov 0,d3 ld [a0],a0 mov 1,d5 ba __mark__node dec 4,sp __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 __mark__hnf__2 nop bcs __mark__hnf__1 nop __mark__hnf__3: cmp %o3,4 bset %o3,%o1 bgeu fits__in__word__1 ld [a0+4],a1 st %o1,[%o4+%o0] inc 4,%o0 ld [%o4+%o0],%o1 bset %g3,%o1 fits__in__word__1: st %o1,[%o4+%o0] 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__argument__part inc 3,d4 __no__shared__argument__part: bset d5,d3 st d3,[a0+4] inc 4,a0 ld [a1],%g1 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 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 clr d5 st a0,[a1] mov a1,d3 ba __mark__node mov d2,a0 __mark__lazy__node__1: bne __mark__selector__node__1 nop __mark__selector__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] 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 [a0],d2 bset d5,d3 st d3,[a0] mov a0,d3 mov 2,d5 ba __mark__node mov d2,a0 __mark__selector__node__1: 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 andn d2,3,d2 ld [%o4+d2],%g1 ble __mark__record__selector__node__1 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__or__record nop __large__tuple__or__record: ld [a1+8],d1 sub d1,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 #ifdef NEW_DESCRIPTORS ld [d0-8],d0 set __indirection,%g1 st %g1,[a0-4] mov a0,d2 lduh [d0+4],d0 cmp d0,8 bltu,a __mark_tuple_selector_node_1 ld [a1+d0],a0 beq __mark_tuple_selector_node_2 mov d1,a1 dec 12,d0 ld [a1+d0],a0 ba __mark__node st a0,[d2] __mark_tuple_selector_node_2: ld [a1],a0 ba __mark__node st a0,[d2] #endif __small__tuple__or__record: #ifdef NEW_DESCRIPTORS ld [d0-8],d0 set __indirection,%g1 st %g1,[a0-4] mov a0,d2 lduh [d0+4],d0 ld [a1+d0],a0 __mark_tuple_selector_node_1: ba __mark__node st a0,[d2] #else 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] #endif __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 #ifdef NEW_DESCRIPTORS bleu __small__record nop ld [a1+8],d1 sub d1,d6,%o0 srl %o0,5,%g1 srl %o0,2,%o0 andn %g1,3,%g1 ld [%o4+%g1],%g1 srl %g3,%o0,%o3 btst %o3,%g1 bne __mark__selector__1 nop __small__record: ld [d0-8],d0 set __indirection,%g1 st %g1,[a0-4] lduh [d0+4],d0 cmp d0,8 bleu __mark_record_selector_node_2 mov a0,d2 mov d1,a1 dec 12,d0 __mark_record_selector_node_2: ld [a1+d0],a0 ba __mark__node st a0,[d2] #else bleu __small__tuple__or__record nop b,a __large__tuple__or__record #endif __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: #ifdef NEW_DESCRIPTORS ld [d0-8],d0 dec 4,a0 lduh [d0+4],%g1 cmp %g1,8 bleu,a __mark_strict_record_selector_node_2 ld [a1+%g1],%g1 dec 12,%g1 ld [d1+%g1],%g1 __mark_strict_record_selector_node_2: st %g1,[a0+4] lduh [d0+6],%g1 tst %g1 beq __mark_strict_record_selector_node_5 ld [d0-4],d0 cmp %g1,8 bleu,a __mark_strict_record_selector_node_4 ld [a1+%g1],%g1 mov d1,a1 dec 12,%g1 ld [a1+%g1],%g1 __mark_strict_record_selector_node_4: st %g1,[a0+8] __mark_strict_record_selector_node_5: ba __mark__node st d0,[a0] #else ld [d0-8],%g1 dec 4,a0 ld [%g1+4],%g1 dec 4,sp call %g1 st %o7,[sp] b,a __mark__node #endif __mark__indirection__node: ba __mark__node mov a1,a0 __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],%o0 bset d5,d3 bset 2,%o0 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 #ifdef SHARE_CHAR_INT cmp d1,d7 bcc __mark__next__node__after__static #endif srl d1,5,%o0 srl d1,2,d1 andn %o0,3,%o0 ld [%o4+%o0],%o1 srl %g3,d1,%o3 btst %o3,%o1 beq __mark__arguments nop __mark__next__node: tst d5 bne __mark__parent nop __mark__next__node2: ld [d3-4],d2 dec 4,d3 ld [d3+4],%o0 and d2,3,d5 st %o0,[d3] st a0,[d3+4] ba __mark__node andn d2,3,a0 __mark__lazy__node: tst d2 beq __mark__real__or__file cmp d2,1 ble __mark__lazy__node__1 inc 4,a0 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 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 __mark_closure_with_unboxed_arguments__2: ld [a0],%o0 sll d2,2,d2 bset 2,%o0 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 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 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,2-ZERO_ARITY_DESCRIPTOR_OFFSET,a0 __mark__real__file__or__string: set __STRING__+2,%g1 cmp d0,%g1 bleu __mark__string__or__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 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 __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,a __mark__a__record__array ld [a0+4],%g1 __mark__ab__record__array: mov d2,%o2 st d3,[sp-12] mov d4,%g1 mov d5,%o5 mov d6,%g2 ld [a0+4],d2 inc 8,a0 sll d2,2,d2 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 ld [sp-8],%o0 mov %g2,d6 mov %o5,d5 ld [sp-4],a0 mov %g1,d4 ld [sp-12],d3 mov %o2,d2 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: umul %g1,d0,d0 inc 8,a0 b,a __mark__lr__array __mark__lazy__array: ld [a0+4],d0 inc 8,a0 __mark__lr__array: 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 add d4,d0,d4 ld [a1],d2 ld [a0],%o0 st d2,[a0] st %o0,[a1] ld [a1-4],d2 dec 4,a1 ld [%o2],%o1 inc 2,d2 st %o1,[a1] st d2,[a0-4] st d0,[a0-8] dec 8,a0 st a0,[%o2] ld [a1-4],a0 dec 4,a1 bset d5,d3 mov 0,d5 st d3,[a1] ba __mark__node mov a1,d3 __mark__array__length__0__1: blu __mark__next__node dec 8,a0 ld [a0+12],d1 ld [a0+8],%o0 ld [%o2],%o3 st %o0,[a0+12] st %o3,[a0+8] st d0,[a0] st a0,[%o2] st d1,[a0+4] inc 4,a0 ld [a0],d2 bset d5,d3 mov 2,d5 st d3,[a0] mov a0,d3 ba __mark__node mov d2,a0 __mark__b__record__array: ld [a0+4],d1 umul d1,d0,d0 ba __mark__basic__array inc 3,d0 __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 __mark__string__: ld [a0+4],d0 inc 8+3,d0 srl d0,2,d0 __mark__basic__array: bset %o3,%o1 add d4,d0,d4 st %o1,[%o4+%o0] sll d0,2,d0 add a0,d0,d0 dec 4,d0 sub d0,d6,d0 srl d0,5,d0 andn d0,3,d0 cmp %o0,d0 bge __mark__next__node inc 4,%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] __last__string__bits: ld [%o4+%o0],%o1 bset %g3,%o1 ba __mark__next__node st %o1,[%o4+%o0] __mark__parent: tst d3 be __end__mark__using__reversal deccc d5 ld [d3],d2 be __argument__part__parent st a0,[d3] sub d3,4,a0 and d2,3,d5 ba __mark__next__node andn d2,3,d3 __argument__part__parent: mov d3,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 ld [d3],d2 be __argument__part__parent st a0,[d3] sub d3,4,a0 and d2,3,d5 ba __mark__next__node andn d2,3,d3