! mark used nodes and pointers in argument parts and link backward pointers
ldg (heap_size_33,d7)
sll d7,5,d7
ldg (caf_list,d0)
st a4,[sp-4]
tst d0
be end_mark_cafs
dec 4,sp
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]
b,a compact_heap
mark_record:
deccc 258,d2
be,a mark_record_2
lduh [d0-2+2],%g1
blu,a mark_record_1
lduh [d0-2+2],%g1
mark_record_3:
lduh [d0-2+2],d2
deccc 1,d2
blu,a mark_record_3_bb
dec 4,a0
be mark_record_3_ab
nop
deccc 1,d2
be mark_record_3_aab
nop
b,a mark_hnf_3
mark_record_3_bb:
ld [a0+8],a1
sub a1,d6,d0
srl d0,2,d0
setmbit (%o4,d0,d1,%o0,%o1,%o2)
cmp a1,a0
bgu mark_next_node
nop
cmp %o0,1
bne not_next_byte_1
srl %o0,1,%o0
inc 1,d1
ldub [%o4+d1],%o1
mov 128,%o0
not_next_byte_1:
btst %o0,%o1
be not_yet_linked_bb
bset %o0,%o1
sub a0,d6,d0
srl d0,2,d0
inc 2,d0
setmbit (%o4,d0,d1,%o0,%o1,%o2)
ld [a1],%o0
add a0,8+2+1,d0
st %o0,[a0+8]
ba mark_next_node
st d0,[a1]
not_yet_linked_bb:
stb %o1,[%o4+d1]
ld [a1],%o0
add a0,8+2+1,d0
st %o0,[a0+8]
ba mark_next_node
st d0,[a1]
mark_record_3_ab:
ld [a0+4],a1
sub a1,d6,d0
srl d0,2,d0
setmbit (%o4,d0,d1,%o0,%o1,%o2)
cmp a1,a0
bgu rmarkr_hnf_1
nop
cmp %o0,1
bne not_next_byte_2
srl %o0,1,%o0
inc 1,d1
ldub [%o4+d1],%o1
mov 128,%o0
not_next_byte_2:
btst %o0,%o1
be not_yet_linked_ab
bset %o0,%o1
sub a0,d6,d0
srl d0,2,d0
inc 1,d0
setmbit (%o4,d0,d1,%o0,%o1,%o2)
ld [a1],%o0
add a0,4+2+1,d0
st %o0,[a0+4]
ba rmarkr_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 rmarkr_hnf_1
st d0,[a1]
mark_record_3_aab:
ld [a0+4],a1
sub a1,d6,d0
srl d0,2,d0
tstmbit (%o4,d0,d1,%o0,%o1,%o2)
bne shared_argument_part
bset %o0,%o1
stb %o1,[%o4+d1]
ld [a0],%o0
inc 4,a0
or %o0,2,%o0
st %o0,[a0-4]
or d3,d5,d3
st d3,[a0]
ld [a1],d2
st a0,[a1]
mov a1,d3
mov 1,d5
ba rmarkr_node
mov d2,a0
mark_record_2:
cmp %g1,1
bgu,a mark_hnf_2
ld [a0],%o0
be rmarkr_hnf_1
nop
ba mark_next_node
dec 4,a0
mark_record_1:
tst %g1
bne rmarkr_hnf_1
nop
ba mark_next_node
dec 4,a0
mark_stack_nodes3:
ba mark_stack_nodes
st a0,[%i2-4]
mark_stack_nodes2:
ld [a0],%g1
add %i2,1-4,d0
st %g1,[%i2-4]
st d0,[a0]
mark_stack_nodes:
cmp a4,a2
be end_mark_nodes
inc 4,a2
ld [a2-4],a0
mov 128,%o3
sub a0,d6,d0
#ifdef SHARE_CHAR_INT
cmp d0,d7
bcc mark_stack_nodes
#endif
srl d0,2,d0
srl d0,3,%o0
ldub [%o4+%o0],%o1
and d0,7,%o2
srl %o3,%o2,%o3
btst %o3,%o1
bne mark_stack_nodes2
bset %o3,%o1
stb %o1,[%o4+%o0]
clr %l3
mov 1,%l5
mark_arguments:
ld [a0],d0
btst 2,d0
be mark_lazy_node
ldsh [d0-2],d2
tst d2
be mark_hnf_0
cmp d2,256
bgeu mark_record
inc 4,a0
deccc 2,d2
be,a mark_hnf_2
ld [a0],%o0
bcs rmarkr_hnf_1
nop
mark_hnf_3:
ld [a0+4],a1
mov 128,%o3
sub a1,d6,d0
srl d0,2,d0
srl d0,3,%o0
ldub [%o4+%o0],%o1
and d0,7,%o2
srl %o3,%o2,%o3
btst %o3,%o1
bne shared_argument_part
bset %o3,%o1
stb %o1,[%o4+%o0]
no_shared_argument_part:
ld [a0],%o0
bset %l5,%l3
bset 2,%o0
st %o0,[a0]
st %l3,[a0+4]
inc 4,a0
ld [a1],%o0
sll d2,2,d2
bset 1,%o0
st %o0,[a1]
add a1,d2,a1
ld [a1],d2
st a0,[a1]
mov a1,%l3
clr %l5
ba rmarkr_node
mov d2,a0
shared_argument_part:
cmp a1,a0
bgu rmarkr_hnf_1
nop
ld [a1],%o0
add a0,4+2+1,d0
st d0,[a1]
ba rmarkr_hnf_1
st %o0,[a0+4]
mark_lazy_node_1:
bne mark_selector_node_1
nop
rmarkr_hnf_1:
ld [a0],d2
bset d5,d3
st d3,[a0]
mov a0,d3
mov 2,d5
ba rmarkr_node
mov d2,a0
mark_indirection_node:
sub a0,4,%o1
sub %o1,d6,%o1
srl %o1,2,%o1
srl %o1,3,d2
ldub [%o4+d2],%g1
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
bclr %g3,%g1
stb %g1,[%o4+d2]
ba rmarkr_node
ld [a0],a0
mark_selector_node_1:
inccc 3,d2
be mark_indirection_node
nop
ld [a0],a1
sub a1,d6,%o1
srl %o1,2,%o1
inccc d2
ble mark_record_selector_node_1
srl %o1,3,d2
ldub [%o4+d2],%g1
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
btst %g3,%g1
bne rmarkr_hnf_1
nop
ld [a1],d2
btst 2,d2
be rmarkr_hnf_1
nop
ldsh [d2-2],%g1
cmp %g1,2
bleu rmarkr_small_tuple_or_record
nop
rmarkr_large_tuple_or_record:
ld [a1+8],d1
sub d1,d6,%o1
srl %o1,2,%o1
srl %o1,3,d2
ldub [%o4+d2],%g1
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
btst %g3,%g1
bne rmarkr_hnf_1
nop
#ifdef NEW_DESCRIPTORS
ld [d0-8],d0
sub a0,4,d2
set __indirection,%g1
lduh [d0+4],d0
sub d2,d6,%o1
srl %o1,2,%o1
st %g1,[a0-4]
srl %o1,3,a0
ldub [%o4+a0],%g1
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
bclr %g3,%g1
cmp d0,8
bltu rmarkr_tuple_or_record_selector_node_2
stb %g1,[%o4+a0]
beq,a rmarkr_tuple_selector_node_2
ld [d1],a0
rmarkr_tuple_or_record_selector_node_g2:
sub d1,12,a0
ld [a0+d0],a0
rmarkr_tuple_selector_node_2:
ba rmarkr_node
st a0,[d2+4]
#else
rmarkr_small_tuple_or_record:
sub a0,4,d2
sub d2,d6,%o1
srl %o1,2,%o1
srl %o1,3,d1
ldub [%o4+d1],%g1
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
bclr %g3,%g1
stb %g1,[%o4+d1]
ld [d0-8],%g1
mov a1,a0
ld [%g1+4],%g1
dec 4,sp
call %g1
st %o7,[sp]
set __indirection,%g1
st %g1,[d2]
ba rmarkr_node
st a0,[d2+4]
#endif
mark_record_selector_node_1:
beq mark_strict_record_selector_node_1
ldub [%o4+d2],%g1
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
btst %g3,%g1
bne rmarkr_hnf_1
nop
ld [a1],d2
btst 2,d2
be rmarkr_hnf_1
nop
ldsh [d2-2],%g1
cmp %g1,258
bleu rmarkr_small_tuple_or_record
nop
#ifdef NEW_DESCRIPTORS
ld [a1+8],d1
sub d1,d6,%o1
srl %o1,2,%o1
srl %o1,3,d2
ldub [%o4+d2],%g1
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
btst %g3,%g1
bne rmarkr_hnf_1
nop
rmarkr_small_tuple_or_record:
ld [d0-8],d0
sub a0,4,d2
set __indirection,%g1
lduh [d0+4],d0
sub d2,d6,%o1
srl %o1,2,%o1
st %g1,[a0-4]
srl %o1,3,a0
ldub [%o4+a0],%g1
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
bclr %g3,%g1
cmp d0,8
bgtu rmarkr_tuple_or_record_selector_node_g2
stb %g1,[%o4+a0]
rmarkr_tuple_or_record_selector_node_2:
ld [a1+d0],a0
ba rmarkr_node
st a0,[d2+4]
#else
b,a rmarkr_large_tuple_or_record
#endif
mark_strict_record_selector_node_1:
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
btst %g3,%g1
bne rmarkr_hnf_1
nop
ld [a1],d2
btst 2,d2
be rmarkr_hnf_1
nop
ldsh [d2-2],%g1
cmp %g1,258
bleu select_from_small_record
nop
ld [a1+8],d1
sub d1,d6,%o1
srl %o1,2,%o1
srl %o1,3,d2
ldub [%o4+d2],%g1
and %o1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
btst %g3,%g1
bne rmarkr_hnf_1
nop
select_from_small_record:
#ifdef NEW_DESCRIPTORS
ld [d0-8],%g1
dec 4,a0
lduh [%g1+4],d0
cmp d0,8
bleu,a rmarkr_strict_record_selector_node_2
ld [a1+d0],d0
dec 12,d0
ld [d1+d0],d0
rmarkr_strict_record_selector_node_2:
st d0,[a0+4]
lduh [%g1+6],d0
tst d0
beq rmarkr_strict_record_selector_node_5
cmp d0,8
bleu,a rmarkr_strict_record_selector_node_4
ld [a1+d0],d0
mov d1,a1
dec 12,d0
ld [a1+d0],d0
rmarkr_strict_record_selector_node_4:
st d0,[a0+8]
rmarkr_strict_record_selector_node_5:
ld [%g1-4],d0
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_hnf_2:
bset 2,%o0
st %o0,[a0]
inc 4,a0
ld [a0],d2
bset d5,d3
st d3,[a0]
mov a0,%l3
clr d5
mov d2,a0
rmarkr_node:
sub a0,d6,d0
#ifdef SHARE_CHAR_INT
cmp d0,%l7
bcc mark_next_node_after_static
#endif
srl d0,2,d0
srl d0,3,%o0
ldub [%o4+%o0],%o1
and d0,7,%o2
mov 128,%o3
srl %o3,%o2,%o3
btst %o3,%o1
bset %o3,%o1
be mark_arguments
stb %o1,[%o4+%o0]
mark_next_node:
tst d5 !
bne,a mark_parent+4
tst d3
ld [d3-4],d2
dec 4,d3
and d2,3,d5
cmp d5,3
be argument_part_cycle1
ld [d3+4],%o0
st %o0,[d3]
c_argument_part_cycle1:
cmp a0,d3
bgu no_reverse_1
nop
ld [a0],%o0
add %l3,4+1,d0
st %o0,[%l3+4]
st d0,[a0]
ba rmarkr_node
andn d2,3,a0
no_reverse_1:
st a0,[%l3+4]
ba rmarkr_node
andn d2,3,a0
mark_lazy_node:
tst d2
be mark_next_node
add d0,-2,a1
deccc d2
ble mark_lazy_node_1
inc 4,a0
cmp d2,255
bgeu,a mark_closure_with_unboxed_arguments
srl d2,8,d0
mark_closure_with_unboxed_arguments_:
ld [a0],%o0
sll d2,2,d2
bset 2,%o0
st %o0,[a0]
add a0,d2,a0
ld [a0],d2
bset %l5,%l3
st %l3,[a0]
mov a0,%l3
clr %l5
ba rmarkr_node
mov d2,a0
mark_closure_with_unboxed_arguments:
! inc d2
! srl d2,8,d0
and d2,255,d2
subcc d2,d0,d2
! deccc d2
bgt mark_closure_with_unboxed_arguments_
nop
beq rmarkr_hnf_1
nop
b mark_next_node
dec 4,a0
mark_hnf_0:
#ifdef SHARE_CHAR_INT
set INT+2,%g1
cmp d0,%g1
bne no_int_3
nop
ld [a0+4],d2
cmp d2,33
bcc mark_next_node
nop
sub a0,d6,d1
srl d1,2,d1
srl d1,3,d0
ldub [%o4+d0],%g1
and d1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
bclr %g3,%g1
stb %g1,[%o4+d0]
set small_integers,a0
sll d2,3,d2
ba mark_next_node_after_static
add a0,d2,a0
no_int_3:
set CHAR+2,%g1
cmp d0,%g1
bne no_char_3
nop
sub a0,%l6,d1
srl d1,2,d1
srl d1,3,d0
ldub [%o4+d0],%g1
and d1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
bclr %g3,%g1
stb %g1,[%o4+d0]
ldub [a0+7],d2
set static_characters,a0
sll d2,3,d2
ba mark_next_node_after_static
add a0,d2,a0
no_char_3:
blu no_normal_hnf_0
nop
sub a0,%l6,d1
srl d1,2,d1
sub d0,2-ZERO_ARITY_DESCRIPTOR_OFFSET,a0
srl d1,3,d0
ldub [%o4+d0],%g1
and d1,7,%g2
mov 128,%g3
srl %g3,%g2,%g3
bclr %g3,%g1
ba mark_next_node_after_static
stb %g1,[%o4+d0]
no_normal_hnf_0:
#endif
set __ARRAY__+2,%o0
cmp d0,%o0
bne,a mark_next_node+4
tst d5
ld [a0+8],d1
tst d1
be,a mark_lazy_array
ld [a0+4],d0
lduh [d1-2],d0
tst d0
be,a mark_b_record_array
sub a0,d6,d0
lduh [d1-2+2],d1
tst d1
be,a mark_b_record_array
sub a0,d6,d0
dec 256,d0
cmp d0,d1
be,a mark_a_record_array
ld [a0+4],d0
mark_ab_record_array:
mov d2,%o2
mov d3,%o3
mov d4,%g2
mov d5,%o5
mov d6,%g3
ld [a0+4],d2
inc 8,a0
mov a0,%g4
sll d2,2,d2
sub d0,2,d3
mov d2,a1
mul_array_length_ab1:
deccc 1,d3
bcc mul_array_length_ab1
add a1,d2,a1
sub d0,d1,d0
inc 4,a0
call reorder
add a1,a0,a1
! mov a0,d0
mov %g4,a0
! sub d0,a0,d0
! srl d0,2,d0
! dec 1,d0
ld [a0-4],d2
deccc 2,d1
bcs skip_mul_array_length_a1_
mov d2,d0
mul_array_length_a1_:
deccc 1,d1
bcc mul_array_length_a1_
add d0,d2,d0
skip_mul_array_length_a1_:
mov %g3,d6
mov %o5,d5
mov %g2,d4
mov %o3,d3
ba mark_lr_array
mov %o2,d2
mark_b_record_array:
srl d0,2,d0
inc 1,d0
setmbit (%o4,d0,d1,%o0,%o1,%o2)
b,a mark_next_node
mark_a_record_array:
deccc 2,d1
blu mark_lr_array
inc 8,a0
mov d0,d2
mul_array_length:
deccc 1,d1
bcc mul_array_length
add d0,d2,d0
b,a mark_lr_array
mark_lazy_array:
inc 8,a0
mark_lr_array:
sub a0,d6,d1
srl d1,2,d1
add d1,d0,d1
setmbit (%o4,d1,d2,%o0,%o1,%o2)
cmp d0,1
bleu mark_array_length_0_1
nop
mov a0,a1
sll d0,2,d0
add a0,d0,a0
ld [a0],d2
ld [a1],%o0
st d2,[a1]
st %o0,[a0]
ld [a0-4],d2
dec 4,a0
inc 2,d2
ld [a1-4],%o0
dec 4,a1
st %o0,[a0]
st d2,[a1]
ld [a0-4],d2
dec 4,a0
or d3,d5,d3
st d3,[a0]
mov a0,d3
mov 0,d5
ba rmarkr_node
mov d2,a0
mark_array_length_0_1:
blu,a mark_next_node
dec 8,a0
ld [a0+4],d1
ld [a0],%o0
ld [a0-4],%o1
st %o0,[a0+4]
st %o1,[a0]
st d1,[a0-4]
ba rmarkr_hnf_1
dec 4,a0
mark_parent:
tst d3
be mark_stack_nodes2
nop
deccc d5
be argument_part_parent
nop
ld [%l3],d2
cmp a0,%l3
bgu no_reverse_2
nop
mov a0,a1
add %l3,1,d0
ld [a1],a0
st d0,[a1]
no_reverse_2:
st a0,[%l3]
sub %l3,4,a0
and d2,3,%l5
ba mark_next_node
andn d2,3,%l3
argument_part_parent:
mov %l3,a1
mov a0,%l3
mov a1,a0
ld [a1],d2
skip_upward_pointers:
and d2,3,d0
cmp d0,3
bne no_upward_pointer
nop
andn d2,3,a1
ba skip_upward_pointers
ld [a1],d2
no_upward_pointer:
cmp %l3,a0
bgu no_reverse_3
nop
mov %l3,%g6
ld [%l3],%l3
add a0,1,d0
st d0,[%g6]
no_reverse_3:
st %l3,[a1]
andn d2,3,%l3
dec 4,%l3
mov %l3,a1
ld [a1],d2
and d2,3,%l5
ld [a1+4],%o0
cmp a0,a1
bgu no_reverse_4
st %o0,[a1]
ld [a0],%o0
st %o0,[a1+4]
add a1,4+2+1,d0
st d0,[a0]
ba rmarkr_node
andn d2,3,a0
no_reverse_4:
st a0,[a1+4]
ba rmarkr_node
andn d2,3,a0
argument_part_cycle1:
mov a1,d1
!
skip_pointer_list1:
andn d2,3,a1
ld [a1],d2
and d2,3,d5
cmp d5,3
be,a skip_pointer_list1+4
andn d2,3,a1
st %o0,[a1]
ba c_argument_part_cycle1
mov d1,a1
#ifdef SHARE_CHAR_INT
mark_next_node_after_static:
tst d5
bne mark_parent_after_static
nop
dec 4,%l3
ld [%l3],d2
ld [%l3+4],%o0
and d2,3,%l5
cmp %l5,3
be argument_part_cycle2
nop
st %o0,[%l3]
c_argument_part_cycle2:
st a0,[%l3+4]
ba rmarkr_node
andn d2,3,a0
mark_parent_after_static:
tst d3
be mark_stack_nodes3
nop
deccc d5
be argument_part_parent_after_static
nop
ld [d3],d2
st a0,[d3]
sub d3,4,a0
and d2,3,d5
ba mark_next_node
andn d2,3,d3
argument_part_parent_after_static:
mov d3,a1
mov a0,d3
mov a1,a0
ld [a1],d2
skip_upward_pointers_2:
and d2,3,d0
cmp d0,3
bne no_reverse_3
nop
andn d2,3,a1
ba skip_upward_pointers_2
ld [a1],d2
argument_part_cycle2:
mov a1,d1
skip_pointer_list2:
andn d2,3,a1
ld [a1],d2
and d2,3,%l5
cmp %l5,3
be skip_pointer_list2
nop
st %o0,[a1]
ba c_argument_part_cycle2
mov d1,a1
#endif
end_mark_nodes:
ld [sp],%o7
retl
inc 4,sp
! compact the heap
compact_heap:
#ifdef FINALIZERS
set finalizer_list,a0
set free_finalizer_list,a1
ld [a0],a2
determine_free_finalizers_after_compact1:
set __Nil-8,%o0
cmp %o0,a2
beq end_finalizers_after_compact1
mov 128,%o3
sub a2,d6,d0
srl d0,2,d0
srl d0,3,%o0
ldub [%o4+%o0],%o1
and d0,7,%o2
srl %o3,%o2,%o3
btst %o3,%o1
beq finalizer_not_used_after_compact1
nop
ld [a2],d0
b finalizer_find_descriptor
mov a2,a3
finalizer_find_descriptor_lp:
andn d0,3,d0
mov d0,a3
ld [d0],d0
finalizer_find_descriptor:
btst 1,d0
bne finalizer_find_descriptor_lp
nop
set e____system__kFinalizerGCTemp+2,%o0
st %o0,[a3]
cmp a2,a0
bgt finalizer_no_reverse
nop
ld [a2],d0
add a0,1,a3
st a3,[a2]
st d0,[a0]
finalizer_no_reverse:
add a2,4,a0
ba determine_free_finalizers_after_compact1
ld [a2+4],a2
finalizer_not_used_after_compact1:
set e____system__kFinalizerGCTemp+2,%o0
st %o0,[a2]
st a2,[a1]
add a2,4,a1
ld [a2+4],a2
ba determine_free_finalizers_after_compact1
st a2,[a0]
end_finalizers_after_compact1:
st a2,[a1]
set finalizer_list,%o1
ld [%o1],a0
set __Nil-8,%o0
cmp %o0,a0
beq finalizer_list_empty
nop
btst 3,a0
bne finalizer_list_already_reversed
nop
ld [a0],d0
add %o1,1,%o0
st %o0,[a0]
st d0,[%o1]
finalizer_list_already_reversed:
finalizer_list_empty:
set free_finalizer_list,a2
set __Nil-8,%o0
ld [a2],%o1
cmp %o0,%o1
beq free_finalizer_list_empty
nop
dec 8,sp
st a4,[sp+4]
add a2,4,a4
call mark_stack_nodes
st %o7,[sp]
ld [sp],a4
inc 4,sp
free_finalizer_list_empty:
#endif
ldg (heap_size_33,d5)
sll d5,5,d2
#ifdef SHARE_CHAR_INT
add d2,%l6,d2
#endif
inc 3,%l5
srl %l5,2,%l5
! set INT+2,%l3
mov %o4,%i2
mov %l6,%g6
ba find_non_zero_long_2
clr d4
skip_zeros_2:
tst d4
bne end_skip_zeros
inc 4,a2
find_non_zero_long_2:
deccc d5
bpos,a skip_zeros_2
ld [a2],d4
b,a end_compact_heap
end_skip_zeros:
sub %i2,%o4,%l7
dec 4,%l7
sll %l7,5,%l7
add %l7,%l6,%l7
skip_zero_bits:
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
sll d4,d1,d4
tst d4
be find_non_zero_long_2
sethi %hi 0xff000000,%o2
more_than_7:
sll d4,8,d4
btst d4,%o2
beq more_than_7
inc 8<<2,d7
less_than_8:
srl d4,24,%o1
ldsb [%o0+%o1],d1
sll d4,d1,d4
copy_nodes:
sll d1,2,d1
sll d4,1,d4
ld [d7+d1],d0
add d7,d1,a0
add a0,4,d7
inc 4,a0
btst 2,d0
beq begin_update_list_2
bclr 3,d0
ld [d0-8],d3
mov d0,a1
btst 1,d3
be end_list_2
bclr 1,d3
find_descriptor_2:
andn d3,2,a1
ld [a1],d3
btst 1,d3
bne find_descriptor_2
bclr 1,d3
end_list_2:
lduh [d3-2],d1
cmp d1,256
blu no_record_arguments
nop
lduh [d3-2+2],d3
deccc 2,d3
bgeu copy_record_arguments_aa
nop
dec 256+3,d1
copy_record_arguments_all_b:
mov d1,%g2
update_up_list_1r:
mov d0,a1
sub d0,d6,d0
srl d0,2,d0
tstmbit (%o4,d0,d1,%o0,%o1,%o2)
beq copy_argument_part_1r
nop
ld [a1],d0
st a6,[a1]
ba update_up_list_1r
dec 3,d0
copy_argument_part_1r:
ld [a1],d0
st a6,[a1]
st d0,[a6]
inc 4,a6
mov %g2,d1
copy_b_record_argument_part_arguments:
ld [a0],%o0
inc 4,a0
st %o0,[%g6]
deccc d1
bcc copy_b_record_argument_part_arguments
inc 4,%g6
sub %i2,%o4,%o0
sll %o0,5,%o0
add %o0,%l6,%o0
cmp %o0,d7
inc 4,d7
bne skip_zero_bits
sll d4,1,d4
deccc %l5
bneg end_compact_heap
sethi %hi 0x80000000,%o1
ld [%i2],d4
ba skip_zeros_2
bclr %o1,d4
copy_record_arguments_aa:
dec 256+2,d1
sub d1,d3,d1
mov d1,%g2
update_up_list_2r:
mov d0,a1
ld [a1],d0
and d0,3,d1
deccc 3,d1
bne copy_argument_part_2r
st a6,[a1]
ba update_up_list_2r
dec 3,d0
copy_argument_part_2r:
cmp d0,a0
bleu copy_record_argument_2
nop
#ifdef SHARE_CHAR_INT
cmp d0,d2
bgeu copy_record_argument_2
nop
#endif
mov d0,a1
ld [a1],d0
add a6,1,d1
st d1,[a1]
copy_record_argument_2:
st d0,[a6]
inc 4,a6
deccc 1,d3
bcs no_pointers_in_record
nop
copy_record_pointers:
ld [a0],a1
inc 4,a0
cmp a1,a0
blu copy_record_pointers_2
nop
#ifdef SHARE_CHAR_INT
cmp a1,d2
bgeu copy_record_pointers_2
nop
#endif
ld [a1],d1
add a6,1,d0
st d0,[a1]
mov d1,a1
copy_record_pointers_2:
st a1,[a6]
deccc 1,d3
bcc copy_record_pointers
inc 4,a6
no_pointers_in_record:
tst %g2
be no_non_pointers_in_record
sub %g2,1,d1
copy_non_pointers_in_record:
ld [a0],%o0
inc 4,a0
st %o0,[a6]
! deccc 1,d2
deccc 1,d1
bcc copy_non_pointers_in_record
inc 4,a6
no_non_pointers_in_record:
b,a skip_zero_bits
no_record_arguments:
dec 3,d1
update_up_list_2:
mov d0,a1
ld [a1],d0
and d0,3,d3
cmp d3,3
bne,a copy_argument_part_2
st a6,[a1]
st %g6,[a1]
ba update_up_list_2
andn d0,3,d0
copy_argument_part_2:
! update_up_list_2:
! mov d0,a1
! ld [a1],d0
! and d0,3,d1
! cmp d1,3
! bne copy_argument_part_2
! nop
! st %g6,[a1]
! ba update_up_list_2
! andn d0,3,d0
!
! copy_argument_part_2:
! st %g6,[a1]
!
! ld [a1-8],d1
! btst 1,d1
! beq end_list_2
! nop
! andn d1,3,a1
! find_descriptor_2:
! ld [a1],d1
! btst 1,d1
! bne,a find_descriptor_2
! andn d1,3,a1
! end_list_2:
!
! lduh [d1-2],d1
! dec 3,d1
cmp d0,a0
bcs copy_arguments_1
inc 4,%g6
#ifdef SHARE_CHAR_INT
cmp d0,d2
bcc copy_arguments_1
#endif
mov d0,a1
ld [a1],d0
add %g6,1-4,%l3
st %l3,[a1]
copy_arguments_1:
st d0,[%g6-4]
copy_argument_part_arguments:
ld [a0],a1
inc 4,a0
cmp a1,a0
bcs copy_arguments_2
nop
#ifdef SHARE_CHAR_INT
cmp a1,d2
bcc copy_arguments_2
#endif
or %g6,1,d0
ld [a1],%l3
st d0,[a1]
mov %l3,a1
copy_arguments_2:
st a1,[%g6]
deccc 1,d1
bcc copy_argument_part_arguments
inc 4,%g6
b,a skip_zero_bits
update_list_2:
st %g6,[a1]
begin_update_list_2:
mov d0,a1
ld [a1],d0
update_list__2:
btst 1,d0
be end_update_list_2
bclr 1,d0
btst 2,d0
be update_list_2
bclr 2,d0
mov d0,a1
ba update_list__2
ld [a1],d0
end_update_list_2:
st %g6,[a1]
btst 2,d0
st d0,[%g6]
be move_lazy_node
inc 4,%g6
lduh [d0-2],d1
tst d1
be move_hnf_0
cmp d1,256
bgeu move_record
nop
deccc 2,d1
bcs copy_hnf_1
nop
be copy_hnf_2
nop
copy_hnf_3:
ld [a0],a1
cmp a1,a0
bcs copy_hnf_3_1
inc 4,a0
#ifdef SHARE_CHAR_INT
cmp a1,d2
bcc copy_hnf_3_1
#endif
or %g6,1,d0
ld [a1],d1
st d0,[a1]
mov d1,a1
copy_hnf_3_1:
st a1,[%g6]
ld [a0],a1
cmp a1,a0
bcs copy_hnf_3_2
inc 4,a0
#ifdef SHARE_CHAR_INT
cmp a1,d2
bcc copy_hnf_3_2
#endif
add %g6,4+2+1,d0
ld [a1],d1
st d0,[a1]
mov d1,a1
copy_hnf_3_2:
st a1,[%g6+4]
ba skip_zero_bits
inc 8,%g6
copy_hnf_2:
ld [a0],a1
cmp a1,a0
bcs copy_hnf_2_1
inc 4,a0
#ifdef SHARE_CHAR_INT
cmp a1,d2
bcc copy_hnf_2_1
#endif
or %g6,1,d0
ld [a1],d1
st d0,[a1]
mov d1,a1
copy_hnf_2_1:
st a1,[%g6]
ld [a0],a1
cmp a1,a0
bcs copy_hnf_2_2
inc 4,a0
#ifdef SHARE_CHAR_INT
cmp a1,d2
bcc copy_hnf_2_2
#endif
add %g6,4+1,d0
ld [a1],d1
st d0,[a1]
mov d1,a1
copy_hnf_2_2:
st a1,[%g6+4]
ba skip_zero_bits
inc 8,%g6
copy_hnf_1:
ld [a0],a1
cmp a1,a0
bcs copy_hnf_1_
inc 4,a0
#ifdef SHARE_CHAR_INT
cmp a1,d2
bcc copy_hnf_1_
#endif
or %g6,1,d0
ld [a1],d1
st d0,[a1]
mov d1,a1
copy_hnf_1_:
st a1,[%g6]
ba skip_zero_bits
inc 4,%g6
move_real_or_file:
ld [a0],%o0
inc 4,a0
st %o0,[%g6]
inc 4,%g6
move_int_bool_or_char:
ld [a0],%o0
inc 4,a0
st %o0,[%g6]
inc 4,%g6
copy_normal_hnf_0:
ba skip_zero_bits
nop
move_hnf_0:
set INT+2,%l3
cmp d0,%l3
blu move_real_file_or_string
seth (CHAR+2,%o0)
setl (CHAR+2,%o0)
cmp d0,%o0
bleu move_int_bool_or_char
nop
! b,a copy_normal_hnf_0
b,a skip_zero_bits
move_real_file_or_string:
set __STRING__+2,%o0
cmp d0,%o0
bgu move_real_or_file
nop
bne move_array
nop
move_string:
ld [a0],d0
inc 3,d0
srl d0,2,d0
cp_s_arg_lp3:
ld [a0],%o0 !
inc 4,a0
st %o0,[%g6]
inc 4,%g6
deccc d0
bge,a cp_s_arg_lp3+4
ld [a0],%o0
b,a skip_zero_bits
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
tst d4
beq skip_zeros_2_a
inc 4,a2
end_skip_zeros_a:
sub %i2,%o4,d7
dec 4,d7
sll d7,5,d7
add d7,%l6,d7
move_array:
skip_zero_bits_a:
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
sll d4,d1,d4
tst d4
be skip_zeros_2_a
sethi %hi 0xff000000,%o2
more_than_7_a:
sll d4,8,d4
btst d4,%o2
beq more_than_7_a
inc 8<<2,d7
less_than_8_a:
srl d4,24,%o1
ldsb [%o0+%o1],d1
sll d4,d1,d4
end_array_bit:
sll d4,1,d4
sll d1,2,d1
add d7,d1,d7
mov d7,d1
cmp d7,a0
bne move_a_array
inc 4,d7
move_b_array:
ld [a0],a1
inc 4,a0
st a1,[a6]
ld [a0],d1
lduh [d1-2],d0
tst d0
beq move_strict_basic_array
inc 4,a6
sub d0,257,d1
mov 0,d0
mul_array_lp:
deccc d1
bcc mul_array_lp
add d0,a1,d0
ba cp_s_arg_lp3+4
ld [a0],%o0
move_strict_basic_array:
set INT+2,%o0
cmp d1,%o0
beq cp_s_arg_lp3
mov a1,d0
set BOOL+2,%o0
cmp d1,%o0
beq move_bool_array
nop
ba cp_s_arg_lp3
add d0,d0,d0
move_bool_array:
inc 3,d0
ba cp_s_arg_lp3
srl d0,2,d0
move_a_array:
mov d1,a1
sub d1,a0,d1
srl d1,2,d1
deccc 1,d1
blu end_array
nop
ld [a0],%o0
ld [a1-4],d0
st %o0,[a1-4]
st d0,[a6]
ld [a1],d0
ld [a0+4],%o0
inc 8,a0
st %o0,[a1]
st d0,[a6+4]
tst d0
be st_move_array_lp
inc 8,a6
lduh [d0-2+2],d3
lduh [d0-2],d0
dec 256,d0
cmp d0,d3
be st_move_array_lp
nop
move_array_ab:
mov d4,%o2
mov d5,%o3
mov d6,%o5
mov d2,%g2
mov a0,%g3
ld [a6-8],d2
mov d3,d1
mov d0,d3
sll d2,2,d2
dec 2,d3
mov d2,a1
mul_array_length_ab2:
deccc d3
bcc mul_array_length_ab2
add a1,d2,a1
sub d0,d1,d0
call reorder
add a1,a0,a1
ld [a6-8],d3
mov %g3,a0
mov %g2,d2
dec 1,d1
ba st_move_array_lp_ab
dec 1,d0
move_array_ab_lp1:
mov d1,d4 !
move_array_ab_a_elements:
ld [a0],d5
inc 4,a0
cmp d5,a0
blu,a move_array_element_ab+4
st d5,[a6]
#ifdef SHARE_CHAR_INT
cmp d5,d2
bgeu,a move_array_element_ab+4
st d5,[a6]
#endif
mov d5,a1
mov 1,d6
ld [a1],d5
add d6,a6,d6
st d6,[a1]
move_array_element_ab:
st d5,[a6] !
deccc d4
bcc move_array_ab_a_elements
inc 4,a6
mov d0,d4
move_array_ab_b_elements:
ld [a0],%o0
inc 4,a0
st %o0,[a6]
deccc d4
bcc move_array_ab_b_elements
inc 4,a6
st_move_array_lp_ab:
deccc d3
bcc,a move_array_ab_lp1+4
mov d1,d4 !
end_array_ab:
mov %o5,d6
mov %o3,d5
ba end_array
mov %o2,d4
move_array_lp1:
ld [a0],d0 !
inc 4,a0
cmp d0,a0
blu move_array_element
inc 4,a6
#ifdef SHARE_CHAR_INT
cmp d0,d2
bgeu,a move_array_element+4
st d0,[a6-4]
#endif
ld [d0],%o0
mov d0,a1
st %o0,[a6-4]
add a6,-4+1,d0
st d0,[a1]
deccc d1
bcc,a move_array_lp1+4
ld [a0],d0
b,a end_array
move_array_element:
st d0,[a6-4] !
st_move_array_lp:
deccc d1
bcc,a move_array_lp1+4
ld [a0],d0
end_array:
b,a skip_zero_bits
move_lazy_node:
mov d0,a1
ldsh [d0-2],d1
tst d1
be move_lazy_node_0
deccc d1
ble move_lazy_node_1
cmp d1,256
bgeu,a move_closure_with_unboxed_arguments
inc d1
copy_lazy_node_arguments:
ld [a0],a1
cmp a1,a0
bcs copy_lazy_node_arguments_
inc 4,a0
#ifdef SHARE_CHAR_INT
cmp a1,d2
bcc copy_lazy_node_arguments__
inc 4,%g6
#endif
ld [a1],%o0
st %o0,[%g6-4]
add %g6,1-4,d0
deccc d1
bpos copy_lazy_node_arguments
st d0,[a1]
b,a skip_zero_bits
copy_lazy_node_arguments_:
inc 4,%g6
copy_lazy_node_arguments__:
deccc d1
bpos copy_lazy_node_arguments
st a1,[%g6-4]
b,a skip_zero_bits
move_lazy_node_1:
ld [a0],a1
cmp a1,a0
bcs move_lazy_node_1_
inc 4,a0
#ifdef SHARE_CHAR_INT
cmp a1,d2
bcc move_lazy_node_1_
#endif
add %g6,1,d0
ld [a1],d1
st d0,[a1]
mov d1,a1
move_lazy_node_1_:
st a1,[%g6]
ba skip_zero_bits
inc 8,%g6
move_lazy_node_0:
ba skip_zero_bits
inc 8,a6
move_closure_with_unboxed_arguments:
! inc d1
srl d1,8,d0
beq move_closure_with_unboxed_arguments_1
and d1,255,d1
subcc d1,d0,d1
beq copy_non_pointers_of_closure
nop
move_pointers_in_closure:
ld [a0],a1
cmp a1,a0
bcs move_pointers_in_closure_
inc 4,a0
# ifdef SHARE_CHAR_INT
cmp a1,d2
bcc move_pointers_in_closure_
# endif
add a6,1,%o1
ld [a1],%o0
st %o1,[a1]
mov %o0,a1
move_pointers_in_closure_:
deccc d1
inc 4,a6
bne move_pointers_in_closure
st a1,[a6-4]
copy_non_pointers_of_closure:
deccc d0
ld [a0],d1
inc 4,a0
inc 4,a6
bne copy_non_pointers_of_closure
st d1,[a6-4]
b,a skip_zero_bits
move_closure_with_unboxed_arguments_1:
ld [a0],d0
inc 8,a6
b skip_zero_bits
st d0,[a6-8]
end_compact_heap:
#ifdef FINALIZERS
ldg (finalizer_list,a0)
restore_finalizer_descriptors:
set __Nil-8,%o0
cmp %o0,a0
beq end_restore_finalizer_descriptors
nop
set e____system__kFinalizer+2,%o0
st %o0,[a0]
ba restore_finalizer_descriptors
ld [a0+4],a0
end_restore_finalizer_descriptors:
#endif