#define d0 %eax
#define d1 %ebx
#define a0 %ecx
#define a1 %edx
#define a2 %ebp
#define a3 %esi
#define a4 %edi
#define sp %esp
#undef COUNT_GARBAGE_COLLECTIONS
#undef MARK_USING_REVERSAL
#undef COMPARE_HEAP_AFTER_MARK
#undef DEBUG_MARK_COLLECT
#ifdef COMPARE_HEAP_AFTER_MARK
.data
heap_copy: .long 0
.text
pushl d0
pushl d1
pushl a0
pushl a1
pushl a2
pushl a3
pushl a4
movl heap_size_33,d0
shl $5,d0
pushl d0
call @allocate_memory
addl $4,sp
movl d0,heap_copy
testl d0,d0
je no_copy
movl heap_p3,a0
movl heap_size_33,d1
shl $3,d1
jmp start_copy
copy_heap_lp:
movl (a0),a2
addl $4,a0
movl a2,(d0)
addl $4,d0
start_copy:
subl $1,d1
jge copy_heap_lp
no_copy:
popl a4
popl a3
popl a2
popl a1
popl a0
popl d1
popl a0
#endif
movl heap_size_33,d0
xorl d1,d1
movl d1,n_marked_words
shl $5,d0
movl d0,heap_size_32_33
movl d1,lazy_array_list
lea -2000(sp),a3
movl caf_list,d0
movl a3,end_stack
test d0,d0
je _end_mark_cafs
_mark_cafs_lp:
movl (d0),d1
movl -4(d0),a2
pushl a2
lea 4(d0),a2
lea 4(d0,d1,4),d0
movl d0,end_vector
call _mark_stack_nodes
popl d0
test d0,d0
jne _mark_cafs_lp
_end_mark_cafs:
movl stack_top,a3
movl stack_p,a2
movl a3,end_vector
call _mark_stack_nodes
movl lazy_array_list,a0
test a0,a0
je end_restore_arrays
restore_arrays:
movl (a0),d1
movl $__ARRAY__+2,(a0)
cmpl $1,d1
je restore_array_size_1
lea (a0,d1,4),a1
movl 8(a1),d0
test d0,d0
je restore_lazy_array
movl d0,a2
push a1
xorl a1,a1
movl d1,d0
movzwl -2+2(a2),d1
div d1
movl d0,d1
pop a1
movl a2,d0
restore_lazy_array:
movl 8(a0),a4
movl 4(a0),a2
movl d1,4(a0)
movl 4(a1),a3
movl d0,8(a0)
movl a2,4(a1)
movl a4,8(a1)
test d0,d0
je no_reorder_array
movzwl -2(d0),a1
subl $256,a1
movzwl -2+2(d0),a2
cmpl a1,a2
je no_reorder_array
addl $12,a0
imull a1,d1
movl a1,d0
lea (a0,d1,4),a1
movl a2,d1
subl a2,d0
call reorder
no_reorder_array:
movl a3,a0
testl a0,a0
jne restore_arrays
jmp end_restore_arrays
restore_array_size_1:
movl 4(a0),a2
movl 8(a0),a1
movl d1,4(a0)
movl 12(a0),d0
movl a2,12(a0)
movl d0,8(a0)
movl a1,a0
testl a0,a0
jne restore_arrays
end_restore_arrays:
#ifdef FINALIZERS
movl heap_vector,a4
movl $finalizer_list,a0
movl $free_finalizer_list,a1
movl (a0),a2
determine_free_finalizers_after_mark:
cmpl $__Nil-4,a2
je end_finalizers_after_mark
movl neg_heap_p3,d0
addl a2,d0
movl d0,d1
andl $31*4,d0
shrl $7,d1
movl bit_set_table(d0),a3
testl (a4,d1,4),a3
je finalizer_not_used_after_mark
lea 4(a2),a0
movl 4(a2),a2
jmp determine_free_finalizers_after_mark
finalizer_not_used_after_mark:
movl a2,(a1)
lea 4(a2),a1
movl 4(a2),a2
movl a2,(a0)
jmp determine_free_finalizers_after_mark
end_finalizers_after_mark:
movl a2,(a1)
#endif
call add_garbage_collect_time
#ifdef COMPARE_HEAP_AFTER_MARK
pushl d0
pushl d1
pushl a0
pushl a1
pushl a2
pushl a3
pushl a4
movl heap_copy,d0
testl d0,d0
je no_compare
movl heap_p3,a0
movl heap_size_33,d1
shl $3,d1
jmp start_compare
compare_heap_lp:
movl (a0),a2
cmpl a2,(d0)
je no_change
nop
no_change:
addl $4,a0
addl $4,d0
start_compare:
subl $1,d1
jge compare_heap_lp
pushl heap_copy
call @free_memory
addl $4,sp
no_compare:
popl a4
popl a3
popl a2
popl a1
popl a0
popl d1
popl a0
#endif
#ifdef ADJUST_HEAP_SIZE
movl bit_vector_size,d0
#else
movl heap_size_33,d0
shl $3,d0
#endif
#ifdef ADJUST_HEAP_SIZE
movl n_allocated_words,a4
addl n_marked_words,a4
shl $2,a4
movl d0,a3
shl $2,a3
push a1
push d0
movl a4,d0
mull @heap_size_multiple
shrd $8,a1,d0
shrl $8,a1
movl d0,d1
testl a1,a1
pop d0
pop a1
je not_largest_heap
movl heap_size_33,d1
shl $5,d1
not_largest_heap:
cmpl a3,d1
jbe no_larger_heap
movl heap_size_33,a3
shl $5,a3
cmpl a3,d1
jbe not_larger_then_heap
movl a3,d1
not_larger_then_heap:
movl d1,d0
shr $2,d0
movl d0,bit_vector_size
no_larger_heap:
#endif
movl d0,a2
movl heap_vector,a4
shrl $5,a2
testb $31,d0b
je no_extra_word
movl $0,(a4,a2,4)
no_extra_word:
subl n_marked_words,d0
shl $2,d0
movl d0,n_last_heap_free_bytes
#ifdef COUNT_GARBAGE_COLLECTIONS
addl $1,n_garbage_collections
#endif
#ifdef MEASURE_GC
movl n_marked_words,d0
shl $2,d0
addl d0,total_gc_bytes_lo
jnc no_total_gc_bytes_carry2
incl total_gc_bytes_hi
no_total_gc_bytes_carry2:
#endif
testl $2,@flags
je _no_heap_use_message2
pushl $marked_gc_string_1
call @ew_print_string
addl $4,sp
movl n_marked_words,d0
shll $2,d0
pushl d0
call @ew_print_int
addl $4,sp
pushl $heap_use_after_gc_string_2
call @ew_print_string
addl $4,sp
_no_heap_use_message2:
#ifdef FINALIZERS
call call_finalizers
#endif
movl n_allocated_words,a3
xorl d1,d1
movl a4,a0
movl d1,n_free_words_after_mark
_scan_bits:
cmpl (a0),d1
je _zero_bits
movl d1,(a0)
addl $4,a0
subl $1,a2
jne _scan_bits
jmp _end_scan
_zero_bits:
lea 4(a0),a1
addl $4,a0
subl $1,a2
jne _skip_zero_bits_lp1
jmp _end_bits
_skip_zero_bits_lp:
test d0,d0
jne _end_zero_bits
_skip_zero_bits_lp1:
movl (a0),d0
addl $4,a0
subl $1,a2
jne _skip_zero_bits_lp
test d0,d0
je _end_bits
movl a0,d0
movl d1,-4(a0)
subl a1,d0
jmp _end_bits2
_end_zero_bits:
movl a0,d0
subl a1,d0
shl $3,d0
addl d0,n_free_words_after_mark
movl d1,-4(a0)
cmpl a3,d0
jb _scan_bits
_found_free_memory:
movl a2,bit_counter
movl a0,bit_vector_p
lea -4(a1),d1
subl a4,d1
shl $5,d1
movl heap_p3,a4
addl d1,a4
movl stack_top,a3
lea (a4,d0,4),d1
movl d1,heap_end_after_gc
subl $32,d1
movl d1,end_heap
pop d1
pop d0
ret
_end_bits:
movl a0,d0
subl a1,d0
addl $4,d0
_end_bits2:
shl $3,d0
addl d0,n_free_words_after_mark
cmpl a3,d0
jae _found_free_memory
_end_scan:
movl a2,bit_counter
jmp compact_gc
/ a2: pointer to stack element
/ a4: heap_vector
/ d0,d1,a0,a1,a3: free
_mark_stack_nodes:
cmpl end_vector,a2
je _end_mark_nodes
_mark_stack_nodes_:
movl (a2),a0
movl neg_heap_p3,a1
addl $4,a2
addl a0,a1
#ifdef SHARE_CHAR_INT
cmpl heap_size_32_33,a1
jnc _mark_stack_nodes
#endif
movl a1,d1
andl $31*4,a1
shrl $7,d1
movl bit_set_table(a1),a3
testl (a4,d1,4),a3
jne _mark_stack_nodes
pushl a2
#ifdef MARK_USING_REVERSAL
movl $1,a3
jmp __mark_node
__end_mark_using_reversal:
popl a2
movl a0,-4(a2)
jmp _mark_stack_nodes
#else
pushl $0
jmp _mark_arguments
_mark_hnf_2:
cmpl $0x20000000,a3
jbe fits_in_word_6
orl $1,4(a4,d1,4)
fits_in_word_6:
addl $3,n_marked_words
_mark_record_2_c:
movl 4(a0),d1
push d1
cmpl end_stack,sp
jb __mark_using_reversal
_mark_node2:
_shared_argument_part:
movl (a0),a0
_mark_node:
movl neg_heap_p3,a1
# ifdef SHARE_CHAR_INT
movl heap_size_32_33,d1
# endif
addl a0,a1
# ifdef SHARE_CHAR_INT
cmpl d1,a1
jnc _mark_next_node
# endif
movl a1,d1
andl $31*4,a1
shrl $7,d1
movl bit_set_table(a1),a3
testl (a4,d1,4),a3
jne _mark_next_node
_mark_arguments:
movl (a0),d0
test $2,d0
je _mark_lazy_node
movzwl -2(d0),a2
test a2,a2
je _mark_hnf_0
orl a3,(a4,d1,4)
addl $4,a0
cmpl $256,a2
jae _mark_record
subl $2,a2
je _mark_hnf_2
jb _mark_hnf_1
_mark_hnf_3:
movl 4(a0),a1
cmpl $0x20000000,a3
jbe fits_in_word_1
orl $1,4(a4,d1,4)
fits_in_word_1:
movl neg_heap_p3,d0
movl n_marked_words,a3
addl a1,d0
addl $3,a3
movl d0,d1
andl $31*4,d0
shrl $7,d1
movl a3,n_marked_words
movl bit_set_table(d0),a3
testl (a4,d1,4),a3
jne _shared_argument_part
_no_shared_argument_part:
orl a3,(a4,d1,4)
addl $1,a2
addl a2,n_marked_words
lea (d0,a2,4),d0
lea -4(a1,a2,4),a1
cmpl $32*4,d0
jbe fits_in_word_2
orl $1,4(a4,d1,4)
fits_in_word_2:
movl (a1),d1
subl $2,a2
pushl d1
_push_hnf_args:
movl -4(a1),d1
subl $4,a1
pushl d1
subl $1,a2
jge _push_hnf_args
cmpl end_stack,sp
jae _mark_node2
jmp __mark_using_reversal
_mark_hnf_1:
cmpl $0x40000000,a3
jbe fits_in_word_4
orl $1,4(a4,d1,4)
fits_in_word_4:
addl $2,n_marked_words
movl (a0),a0
jmp _mark_node
_mark_lazy_node_1:
addl $4,a0
orl a3,(a4,d1,4)
cmpl $0x20000000,a3
jbe fits_in_word_3
orl $1,4(a4,d1,4)
fits_in_word_3:
addl $3,n_marked_words
cmpl $1,a2
je _mark_node2
_mark_selector_node_1:
cmpl $-2,a2
movl (a0),a1
je _mark_indirection_node
movl neg_heap_p3,a3
addl a1,a3
movl a3,d1
shrl $7,d1
andl $31*4,a3
cmpl $-3,a2
movl bit_set_table(a3),a3
jle _mark_record_selector_node_1
testl (a4,d1,4),a3
jne _mark_node3
movl (a1),a2
testl $2,a2
je _mark_node3
cmpw $2,-2(a2)
jbe _small_tuple_or_record
_large_tuple_or_record:
movl 8(a1),a2
addl neg_heap_p3,a2
movl a2,d1
andl $31*4,a2
shrl $7,d1
movl bit_set_table(a2),a2
testl (a4,d1,4),a2
jne _mark_node3
#ifdef NEW_DESCRIPTORS
movl -8(d0),d0
movl $__indirection,-4(a0)
movl a0,a2
movzwl 4(d0),d0
cmpl $8,d0
jl _mark_tuple_selector_node_1
movl 8(a1),a1
je _mark_tuple_selector_node_2
movl -12(a1,d0),a0
movl a0,(a2)
jmp _mark_node
_mark_tuple_selector_node_2:
movl (a1),a0
movl a0,(a2)
jmp _mark_node
#endif
_small_tuple_or_record:
#ifdef NEW_DESCRIPTORS
movl -8(d0),d0
movl $__indirection,-4(a0)
movl a0,a2
movzwl 4(d0),d0
_mark_tuple_selector_node_1:
movl (a1,d0),a0
movl a0,(a2)
#else
movl -8(d0),d0
pushl a0
movl a1,a0
call *4(d0)
popl a1
movl $__indirection,-4(a1)
movl a0,(a1)
#endif
jmp _mark_node
_mark_record_selector_node_1:
je _mark_strict_record_selector_node_1
testl (a4,d1,4),a3
jne _mark_node3
movl (a1),a2
testl $2,a2
je _mark_node3
cmpw $258,-2(a2)
#ifdef NEW_DESCRIPTORS
jbe _small_tuple_or_record
movl 8(a1),a2
addl neg_heap_p3,a2
movl a2,d1
andl $31*4,a2
shrl $7,d1
movl bit_set_table(a2),a2
testl (a4,d1,4),a2
jne _mark_node3
movl -8(d0),d0
movl $__indirection,-4(a0)
movl a0,a2
movzwl 4(d0),d0
cmpl $8,d0
jle _mark_record_selector_node_2
movl 8(a1),a1
subl $12,d0
_mark_record_selector_node_2:
movl (a1,d0),a0
movl a0,(a2)
jmp _mark_node
#else
jbe _small_tuple_or_record
jmp _large_tuple_or_record
#endif
_mark_strict_record_selector_node_1:
testl (a4,d1,4),a3
jne _mark_node3
movl (a1),a2
testl $2,a2
je _mark_node3
cmpw $258,-2(a2)
jbe _select_from_small_record
movl 8(a1),a2
addl neg_heap_p3,a2
movl a2,d1
andl $31*4,a2
shrl $7,d1
movl bit_set_table(a2),a2
testl (a4,d1,4),a2
jne _mark_node3
_select_from_small_record:
movl -8(d0),d0
#ifdef NEW_DESCRIPTORS
subl $4,a0
movzwl 4(d0),d1
cmpl $8,d1
jle _mark_strict_record_selector_node_2
addl 8(a1),d1
movl -12(d1),d1
jmp _mark_strict_record_selector_node_3
_mark_strict_record_selector_node_2:
movl (a1,d1),d1
_mark_strict_record_selector_node_3:
movl d1,4(a0)
movzwl 6(d0),d1
testl d1,d1
je _mark_strict_record_selector_node_5
cmpl $8,d1
jle _mark_strict_record_selector_node_4
movl 8(a1),a1
subl $12,d1
_mark_strict_record_selector_node_4:
movl (a1,d1),d1
movl d1,8(a0)
_mark_strict_record_selector_node_5:
movl -4(d0),d0
movl d0,(a0)
#else
subl $4,a0
call *4(d0)
#endif
jmp _mark_next_node
_mark_indirection_node:
_mark_node3:
movl a1,a0
jmp _mark_node
_mark_next_node:
popl a0
test a0,a0
jne _mark_node
popl a2
cmpl end_vector,a2
jne _mark_stack_nodes_
_end_mark_nodes:
ret
_mark_lazy_node:
movl -4(d0),a2
test a2,a2
je _mark_real_or_file
cmpl $1,a2
jle _mark_lazy_node_1
cmpl $256,a2
jge _mark_closure_with_unboxed_arguments
incl a2
orl a3,(a4,d1,4)
addl a2,n_marked_words
lea (a1,a2,4),a1
lea (a0,a2,4),a0
cmpl $32*4,a1
jbe fits_in_word_7
orl $1,4(a4,d1,4)
fits_in_word_7:
subl $3,a2
_push_lazy_args:
movl -4(a0),d1
subl $4,a0
push d1
subl $1,a2
jge _push_lazy_args
subl $4,a0
cmpl end_stack,sp
jae _mark_node2
jmp __mark_using_reversal
_mark_closure_with_unboxed_arguments:
movl a2,d0
andl $255,a2
subl $1,a2
je _mark_real_or_file
shrl $8,d0
addl $2,a2
orl a3,(a4,d1,4)
addl a2,n_marked_words
lea (a1,a2,4),a1
subl d0,a2
cmpl $32*4,a1
jbe fits_in_word_7_
orl $1,4(a4,d1,4)
fits_in_word_7_:
subl $2,a2
jl _mark_next_node
lea 8(a0,a2,4),a0
jne _push_lazy_args
_mark_closure_with_one_boxed_argument:
movl -4(a0),a0
jmp _mark_node
_mark_hnf_0:
cmpl $INT+2,d0
jb _mark_real_file_or_string
orl a3,(a4,d1,4)
cmpl $CHAR+2,d0
ja _mark_normal_hnf_0
_mark_bool:
addl $2,n_marked_words
cmpl $0x40000000,a3
jbe _mark_next_node
orl $1,4(a4,d1,4)
jmp _mark_next_node
_mark_normal_hnf_0:
incl n_marked_words
jmp _mark_next_node
_mark_real_file_or_string:
cmpl $__STRING__+2,d0
jbe _mark_string_or_array
_mark_real_or_file:
orl a3,(a4,d1,4)
addl $3,n_marked_words
cmpl $0x20000000,a3
jbe _mark_next_node
orl $1,4(a4,d1,4)
jmp _mark_next_node
_mark_record:
subl $258,a2
je _mark_record_2
jl _mark_record_1
_mark_record_3:
addl $3,n_marked_words
cmpl $0x20000000,a3
jbe fits_in_word_13
orl $1,4(a4,d1,4)
fits_in_word_13:
movl 4(a0),a1
movl neg_heap_p3,a3
movzwl -2+2(d0),d1
addl a1,a3
movl a3,d0
andl $31*4,a3
shrl $7,d0
subl $1,d1
movl bit_set_table(a3),a1
jb _mark_record_3_bb
testl (a4,d0,4),a1
jne _mark_node2
addl $1,a2
orl a1,(a4,d0,4)
addl a2,n_marked_words
lea (a3,a2,4),a3
cmpl $32*4,a3
jbe _push_record_arguments
orl $1,4(a4,d0,4)
_push_record_arguments:
movl 4(a0),a1
movl d1,a2
shl $2,d1
addl d1,a1
subl $1,a2
jge _push_hnf_args
jmp _mark_node2
_mark_record_3_bb:
testl (a4,d0,4),a1
jne _mark_next_node
addl $1,a2
orl a1,(a4,d0,4)
addl a2,n_marked_words
lea (a3,a2,4),a3
cmpl $32*4,a3
jbe _mark_next_node
orl $1,4(a4,d0,4)
jmp _mark_next_node
_mark_record_2:
cmpl $0x20000000,a3
jbe fits_in_word_12
orl $1,4(a4,d1,4)
fits_in_word_12:
addl $3,n_marked_words
cmpw $1,-2+2(d0)
ja _mark_record_2_c
je _mark_node2
jmp _mark_next_node
_mark_record_1:
cmpw $0,-2+2(d0)
jne _mark_hnf_1
jmp _mark_bool
_mark_string_or_array:
je _mark_string_
_mark_array:
movl 8(a0),a2
test a2,a2
je _mark_lazy_array
movzwl -2(a2),d0
testl d0,d0
je _mark_strict_basic_array
movzwl -2+2(a2),a2
testl a2,a2
je _mark_b_record_array
cmpl end_stack,sp
jb _mark_array_using_reversal
subl $256,d0
cmpl a2,d0
je _mark_a_record_array
_mark_ab_record_array:
orl a3,(a4,d1,4)
movl 4(a0),a2
imull a2,d0
addl $3,d0
addl d0,n_marked_words
lea -4(a0,d0,4),d0
addl neg_heap_p3,d0
shrl $7,d0
cmpl d0,d1
jae _end_set_ab_array_bits
incl d1
movl $1,a2
cmpl d0,d1
jae _last_ab_array_bits
_mark_ab_array_lp:
orl a2,(a4,d1,4)
incl d1
cmpl d0,d1
jb _mark_ab_array_lp
_last_ab_array_bits:
orl a2,(a4,d1,4)
_end_set_ab_array_bits:
movl 4(a0),d0
movl 8(a0),a1
movzwl -2+2(a1),d1
movzwl -2(a1),a1
shll $2,d1
lea -1024(,a1,4),a1
pushl d1
pushl a1
lea 12(a0),a2
pushl end_vector
jmp _mark_ab_array_begin
_mark_ab_array:
movl 8(sp),d1
pushl d0
pushl a2
lea (a2,d1),d0
movl d0,end_vector
call _mark_stack_nodes
movl 4+8(sp),d1
popl a2
popl d0
addl d1,a2
_mark_ab_array_begin:
subl $1,d0
jnc _mark_ab_array
popl end_vector
addl $8,sp
jmp _mark_next_node
_mark_a_record_array:
orl a3,(a4,d1,4)
movl 4(a0),a2
imull a2,d0
pushl d0
addl $3,d0
addl d0,n_marked_words
lea -4(a0,d0,4),d0
addl neg_heap_p3,d0
shrl $7,d0
cmpl d0,d1
jae _end_set_a_array_bits
incl d1
movl $1,a2
cmpl d0,d1
jae _last_a_array_bits
_mark_a_array_lp:
orl a2,(a4,d1,4)
incl d1
cmpl d0,d1
jb _mark_a_array_lp
_last_a_array_bits:
orl a2,(a4,d1,4)
_end_set_a_array_bits:
popl d0
lea 12(a0),a2
pushl end_vector
lea 12(a0,d0,4),d0
movl d0,end_vector
call _mark_stack_nodes
popl end_vector
jmp _mark_next_node
_mark_lazy_array:
cmpl end_stack,sp
jb _mark_array_using_reversal
orl a3,(a4,d1,4)
movl 4(a0),d0
addl $3,d0
addl d0,n_marked_words
lea -4(a0,d0,4),d0
addl neg_heap_p3,d0
shrl $7,d0
cmpl d0,d1
jae _end_set_lazy_array_bits
incl d1
movl $1,a2
cmpl d0,d1
jae _last_lazy_array_bits
_mark_lazy_array_lp:
orl a2,(a4,d1,4)
incl d1
cmpl d0,d1
jb _mark_lazy_array_lp
_last_lazy_array_bits:
orl a2,(a4,d1,4)
_end_set_lazy_array_bits:
movl 4(a0),d0
lea 12(a0),a2
pushl end_vector
lea 12(a0,d0,4),d0
movl d0,end_vector
call _mark_stack_nodes
popl end_vector
jmp _mark_next_node
_mark_array_using_reversal:
pushl $0
movl $1,a3
jmp __mark_node
_mark_strict_basic_array:
movl 4(a0),d0
cmpl $INT+2,a2
je _mark_strict_int_array
cmpl $BOOL+2,a2
je _mark_strict_bool_array
_mark_strict_real_array:
addl d0,d0
_mark_strict_int_array:
addl $3,d0
jmp _mark_basic_array_
_mark_strict_bool_array:
addl $12+3,d0
shrl $2,d0
jmp _mark_basic_array_
_mark_b_record_array:
movl 4(a0),a2
subl $256,d0
imull a2,d0
addl $3,d0
jmp _mark_basic_array_
_mark_string_:
movl 4(a0),d0
addl $8+3,d0
shrl $2,d0
_mark_basic_array_:
orl a3,(a4,d1,4)
addl d0,n_marked_words
lea -4(a0,d0,4),d0
addl neg_heap_p3,d0
shrl $7,d0
cmpl d0,d1
jae _mark_next_node
incl d1
movl $1,a2
cmpl d0,d1
jae _last_string_bits
_mark_string_lp:
orl a2,(a4,d1,4)
incl d1
cmpl d0,d1
jb _mark_string_lp
_last_string_bits:
orl a2,(a4,d1,4)
jmp _mark_next_node
__end_mark_using_reversal:
popl a1
test a1,a1
je _mark_next_node
movl a0,(a1)
jmp _mark_next_node
#endif
__mark_using_reversal:
pushl a0
movl $1,a3
movl (a0),a0
jmp __mark_node
__mark_arguments:
movl (a0),d0
testb $2,d0b
je __mark_lazy_node
movzwl -2(d0),a2
testl a2,a2
je __mark_hnf_0
addl $4,a0
cmpl $256,a2
jae __mark__record
subl $2,a2
je __mark_hnf_2
jb __mark_hnf_1
__mark_hnf_3:
movl bit_set_table(a1),a1
addl $3,n_marked_words
orl a1,(a4,d1,4)
cmpl $0x20000000,a1
movl neg_heap_p3,d0
jbe fits__in__word__1
orl $1,4(a4,d1,4)
fits__in__word__1:
addl 4(a0),d0
movl d0,d1
andl $31*4,d0
shrl $7,d1
movl bit_set_table(d0),a1
testl (a4,d1,4),a1
jne __shared_argument_part
__no_shared_argument_part:
orl a1,(a4,d1,4)
movl 4(a0),a1
addl $1,a2
movl a3,4(a0)
addl a2,n_marked_words
addl $4,a0
shl $2,a2
orl $1,(a1)
addl a2,d0
addl a2,a1
cmpl $32*4,d0
jbe fits__in__word__2
orl $1,4(a4,d1,4)
fits__in__word__2:
movl -4(a1),a2
movl a0,-4(a1)
lea -4(a1),a3
movl a2,a0
jmp __mark_node
__mark_hnf_1:
movl bit_set_table(a1),a1
addl $2,n_marked_words
orl a1,(a4,d1,4)
cmpl $0x40000000,a1
jbe __shared_argument_part
orl $1,4(a4,d1,4)
__shared_argument_part:
movl (a0),a2
movl a3,(a0)
lea 2(a0),a3
movl a2,a0
jmp __mark_node
__mark_no_selector_2:
popl d1
__mark_no_selector_1:
movl bit_set_table(a1),a1
addl $3,n_marked_words
orl a1,(a4,d1,4)
cmpl $0x20000000,a1
jbe __shared_argument_part
orl $1,4(a4,d1,4)
jmp __shared_argument_part
__mark_lazy_node_1:
#ifdef COMPARE_HEAP_AFTER_MARK
jmp __mark_no_selector_1
#endif
je __mark_no_selector_1
__mark_selector_node_1:
cmpl $-2,a2
je __mark_indirection_node
cmpl $-3,a2
pushl d1
movl (a0),a2
pushl d0
movl neg_heap_p3,d0
jle __mark_record_selector_node_1
addl a2,d0
movl d0,d1
andl $31*4,d0
shrl $7,d1
movl bit_set_table(d0),d0
testl (a4,d1,4),d0
popl d0
jne __mark_no_selector_2
movl (a2),d1
testb $2,d1b
je __mark_no_selector_2
cmpw $2,-2(d1)
jbe __small_tuple_or_record
__large_tuple_or_record:
movl 8(a2),a2
movl neg_heap_p3,d1
addl d1,a2
movl a2,d1
andl $31*4,a2
shrl $7,d1
movl bit_set_table(a2),a2
testl (a4,d1,4),a2
jne __mark_no_selector_2
#ifdef NEW_DESCRIPTORS
movl -8(d0),d0
movl (a0),a1
movl $__indirection,-4(a0)
movl a0,a2
popl d1
movzwl 4(d0),d0
cmpl $8,d0
jl __mark_tuple_selector_node_1
movl 8(a1),a1
je __mark_tuple_selector_node_2
subl $12,d0
movl (a1,d0),a0
movl a0,(a2)
jmp __mark_node
__mark_tuple_selector_node_2:
movl (a1),a0
movl a0,(a2)
jmp __mark_node
#endif
__small_tuple_or_record:
#ifdef NEW_DESCRIPTORS
movl -8(d0),d0
movl (a0),a1
movl $__indirection,-4(a0)
movl a0,a2
popl d1
movzwl 4(d0),d0
__mark_tuple_selector_node_1:
movl (a1,d0),a0
movl a0,(a2)
#else
movl -8(d0),d0
popl d1
pushl a0
movl (a0),a0
call *4(d0)
popl a1
movl $__indirection,-4(a1)
movl a0,(a1)
#endif
jmp __mark_node
__mark_record_selector_node_1:
je __mark_strict_record_selector_node_1
addl a2,d0
movl d0,d1
andl $31*4,d0
shrl $7,d1
movl bit_set_table(d0),d0
testl (a4,d1,4),d0
popl d0
jne __mark_no_selector_2
movl (a2),d1
testb $2,d1b
je __mark_no_selector_2
cmpw $258,-2(d1)
#ifdef NEW_DESCRIPTORS
jbe __small_record
movl 8(a2),a2
movl neg_heap_p3,d1
addl d1,a2
movl a2,d1
andl $31*4,a2
shrl $7,d1
movl bit_set_table(a2),a2
testl (a4,d1,4),a2
jne __mark_no_selector_2
__small_record:
movl -8(d0),d0
movl (a0),a1
movl $__indirection,-4(a0)
movl a0,a2
popl d1
movzwl 4(d0),d0
cmpl $8,d0
jle __mark_record_selector_node_2
movl 8(a1),a1
subl $12,d0
__mark_record_selector_node_2:
movl (a1,d0),a0
movl a0,(a2)
jmp __mark_node
#else
jbe __small_tuple_or_record
jmp __large_tuple_or_record
#endif
__mark_strict_record_selector_node_1:
addl a2,d0
movl d0,d1
andl $31*4,d0
shrl $7,d1
movl bit_set_table(d0),d0
testl (a4,d1,4),d0
popl d0
jne __mark_no_selector_2
movl (a2),d1
testb $2,d1b
je __mark_no_selector_2
cmpw $258,-2(d1)
jle __select_from_small_record
movl 8(a2),a2
movl neg_heap_p3,d1
addl d1,a2
movl a2,d1
andl $31*4,a2
shrl $7,d1
movl bit_set_table(a2),a2
testl (a4,d1,4),a2
jne __mark_no_selector_2
__select_from_small_record:
#ifdef NEW_DESCRIPTORS
movl -8(d0),d0
movl (a0),a1
popl d1
subl $4,a0
movzwl 4(d0),d1
cmpl $8,d1
jle __mark_strict_record_selector_node_2
addl 8(a1),d1
movl -12(d1),d1
jmp __mark_strict_record_selector_node_3
__mark_strict_record_selector_node_2:
movl (a1,d1),d1
__mark_strict_record_selector_node_3:
movl d1,4(a0)
movzwl 6(d0),d1
testl d1,d1
je __mark_strict_record_selector_node_5
cmpl $8,d1
jle __mark_strict_record_selector_node_4
movl 8(a1),a1
subl $12,d1
__mark_strict_record_selector_node_4:
movl (a1,d1),d1
movl d1,8(a0)
__mark_strict_record_selector_node_5:
movl -4(d0),d0
movl d0,(a0)
#else
movl -8(d0),d0
popl d1
movl (a0),a1
subl $4,a0
call *4(d0)
#endif
jmp __mark_node
__mark_indirection_node:
movl (a0),a0
jmp __mark_node
__mark_hnf_2:
movl bit_set_table(a1),a1
addl $3,n_marked_words
orl a1,(a4,d1,4)
cmpl $0x20000000,a1
jbe fits__in__word__6
orl $1,4(a4,d1,4)
fits__in__word__6:
__mark_record_2_c:
movl (a0),d0
movl 4(a0),a2
orl $2,d0
movl a3,4(a0)
movl d0,(a0)
lea 4(a0),a3
movl a2,a0
__mark_node:
#ifdef DEBUG_MARK_COLLECT
testl $3,a0
je no_error_in_gc1
call error_in_gc
no_error_in_gc1:
#endif
movl neg_heap_p3,a1
#ifdef SHARE_CHAR_INT
movl heap_size_32_33,d1
#endif
addl a0,a1
#ifdef SHARE_CHAR_INT
cmpl d1,a1
jae __mark_next_node
#endif
movl a1,d1
andl $31*4,a1
shrl $7,d1
movl bit_set_table(a1),a2
testl (a4,d1,4),a2
je __mark_arguments
__mark_next_node:
testl $3,a3
jne __mark_parent
movl -4(a3),a2
movl K6_0(a3),a1
movl a0,K6_0(a3)
movl a1,-4(a3)
subl $4,a3
movl a2,a0
andl $3,a2
andl $-4,a0
orl a2,a3
jmp __mark_node
__mark_parent:
movl a3,d1
andl $-4,a3
je __end_mark_using_reversal
andl $3,d1
movl K6_0(a3),a2
movl a0,K6_0(a3)
subl $1,d1
je __argument_part_parent
#ifdef DEBUG_MARK_COLLECT
cmpl $1,d1
je no_error_in_gc2
call error_in_gc
no_error_in_gc2:
#endif
lea -4(a3),a0
movl a2,a3
jmp __mark_next_node
__argument_part_parent:
andl $-4,a2
movl a3,a1
movl -4(a2),a0
movl (a2),d1
movl d1,-4(a2)
movl a1,(a2)
lea 2-4(a2),a3
jmp __mark_node
__mark_lazy_node:
movl -4(d0),a2
testl a2,a2
je __mark_real_or_file
addl $4,a0
cmpl $1,a2
jle __mark_lazy_node_1
cmpl $256,a2
jge __mark_closure_with_unboxed_arguments
addl $1,a2
movl a1,d0
movl bit_set_table(a1),a1
addl a2,n_marked_words
lea (d0,a2,4),d0
subl $2,a2
orl a1,(a4,d1,4)
cmpl $32*4,d0
jbe fits__in__word__7
orl $1,4(a4,d1,4)
fits__in__word__7:
__mark_closure_with_unboxed_arguments__2:
lea (a0,a2,4),a1
movl (a0),d0
orl $2,d0
movl d0,(a0)
movl (a1),a0
movl a3,(a1)
movl a1,a3
jmp __mark_node
__mark_closure_with_unboxed_arguments:
movl a2,d0
andl $255,a2
subl $1,a2
je __mark_closure_1_with_unboxed_argument
addl $2,a2
shrl $8,d0
addl a2,n_marked_words
pushl a0
lea (a1,a2,4),a0
movl bit_set_table(a1),a1
subl d0,a2
orl a1,(a4,d1,4)
cmpl $32*4,a0
jbe fits__in_word_7_
orl $1,4(a4,d1,4)
fits__in_word_7_:
popl a0
subl $2,a2
jg __mark_closure_with_unboxed_arguments__2
je __shared_argument_part
subl $4,a0
jmp __mark_next_node
__mark_closure_1_with_unboxed_argument:
subl $4,a0
jmp __mark_real_or_file
__mark_hnf_0:
cmpl $INT+2,d0
jne __no_int_3
movl 4(a0),a2
cmpl $33,a2
#ifdef COMPARE_HEAP_AFTER_MARK
jmp __mark_bool_or_small_string
#endif
jb ____small_int
__mark_bool_or_small_string:
movl bit_set_table(a1),a1
addl $2,n_marked_words
orl a1,(a4,d1,4)
cmpl $0x40000000,a1
jbe __mark_next_node
orl $1,4(a4,d1,4)
jmp __mark_next_node
____small_int:
lea small_integers(,a2,8),a0
jmp __mark_next_node
__no_int_3:
jb __mark_real_file_or_string
cmpl $CHAR+2,d0
jne __no_char_3
#ifdef COMPARE_HEAP_AFTER_MARK
jmp __mark_bool_or_small_string
#endif
movzbl 4(a0),a2
lea static_characters(,a2,8),a0
jmp __mark_next_node
__no_char_3:
jb __mark_bool_or_small_string
#ifdef COMPARE_HEAP_AFTER_MARK
movl bit_set_table(a1),a1
incl n_marked_words
orl a1,(a4,d1,4)
jmp __mark_next_node
#endif
lea ZERO_ARITY_DESCRIPTOR_OFFSET-2(d0),a0
jmp __mark_next_node
__mark_real_file_or_string:
cmpl $__STRING__+2,d0
jbe __mark_string_or_array
__mark_real_or_file:
movl bit_set_table(a1),a1
addl $3,n_marked_words
orl a1,(a4,d1,4)
cmpl $0x20000000,a1
jbe __mark_next_node
orl $1,4(a4,d1,4)
jmp __mark_next_node
__mark__record:
subl $258,a2
je __mark_record_2
jl __mark_record_1
__mark_record_3:
movl bit_set_table(a1),a1
addl $3,n_marked_words
orl a1,(a4,d1,4)
cmpl $0x20000000,a1
jbe fits__in__word__13
orl $1,4(a4,d1,4)
fits__in__word__13:
movzwl -2+2(d0),d1
movl neg_heap_p3,d0
movl 4(a0),a1
addl d0,a1
movl a1,d0
andl $31*4,a1
shrl $7,d0
pushl a3
movl bit_set_table(a1),a3
testl (a4,d0,4),a3
jne __shared_record_argument_part
addl $1,a2
orl a3,(a4,d0,4)
lea (a1,a2,4),a1
addl a2,n_marked_words
popl a3
cmpl $32*4,a1
jbe fits__in__word__14
orl $1,4(a4,d0,4)
fits__in__word__14:
subl $1,d1
movl 4(a0),a1
jl __mark_record_3_bb
je __shared_argument_part
movl a3,4(a0)
addl $4,a0
subl $1,d1
je __mark_record_3_aab
lea (a1,d1,4),a3
movl (a1),d0
orl $1,d0
movl K6_0(a3),a2
movl d0,(a1)
movl a0,K6_0(a3)
movl a2,a0
jmp __mark_node
__mark_record_3_bb:
subl $4,a0
jmp __mark_next_node
__mark_record_3_aab:
movl (a1),a2
movl a0,(a1)
lea 1(a1),a3
movl a2,a0
jmp __mark_node
__shared_record_argument_part:
movl 4(a0),a1
popl a3
test d1,d1
jne __shared_argument_part
subl $4,a0
jmp __mark_next_node
__mark_record_2:
movl bit_set_table(a1),a1
addl $3,n_marked_words
orl a1,(a4,d1,4)
cmpl $0x20000000,a1
jbe fits__in__word_12
orl $1,4(a4,d1,4)
fits__in__word_12:
cmpw $1,-2+2(d0)
ja __mark_record_2_c
je __shared_argument_part
subl $4,a0
jmp __mark_next_node
__mark_record_1:
cmpw $0,-2+2(d0)
jne __mark_hnf_1
subl $4,a0
jmp __mark_bool_or_small_string
__mark_string_or_array:
je __mark_string_
__mark_array:
movl 8(a0),a2
test a2,a2
je __mark_lazy_array
movzwl -2(a2),d0
test d0,d0
je __mark_strict_basic_array
movzwl -2+2(a2),a2
test a2,a2
je __mark_b_record_array
subl $256,d0
cmpl a2,d0
je __mark_a_record_array
__mark__ab__record__array:
pushl a1
pushl d1
movl a2,d1
movl 4(a0),a2
addl $8,a0
pushl a0
shl $2,a2
movl d0,a1
imull a2,a1
subl d1,d0
addl $4,a0
addl a0,a1
call reorder
popl a0
xchg d1,d0
movl -4(a0),a2
imull a2,d0
imull a2,d1
addl d1,n_marked_words
addl d0,d1
movl neg_heap_p3,a2
shl $2,d1
addl a0,a2
addl d1,a2
popl d1
popl a1
movl bit_set_table(a1),a1
orl a1,(a4,d1,4)
lea (a0,d0,4),a1
jmp __mark_r_array
__mark_a_record_array:
imull 4(a0),d0
addl $8,a0
jmp __mark_lr_array
__mark_lazy_array:
movl 4(a0),d0
addl $8,a0
__mark_lr_array:
movl bit_set_table(a1),a1
movl neg_heap_p3,a2
orl a1,(a4,d1,4)
lea (a0,d0,4),a1
addl a1,a2
__mark_r_array:
shrl $7,a2
cmpl a2,d1
jae __skip_mark_lazy_array_bits
inc d1
__mark_lazy_array_bits:
orl $1,(a4,d1,4)
inc d1
cmpl a2,d1
jbe __mark_lazy_array_bits
__skip_mark_lazy_array_bits:
movl n_marked_words,a2
addl $3,a2
addl d0,a2
cmpl $1,d0
movl a2,n_marked_words
jbe __mark_array_length_0_1
movl (a1),a2
movl (a0),d1
movl d1,(a1)
movl a2,(a0)
movl -4(a1),a2
subl $4,a1
movl lazy_array_list,d1
addl $2,a2
movl d1,(a1)
movl a2,-4(a0)
movl d0,-8(a0)
subl $8,a0
movl a0,lazy_array_list
movl -4(a1),a0
movl a3,-4(a1)
lea -4(a1),a3
jmp __mark_node
__mark_array_length_0_1:
lea -8(a0),a0
jb __mark_next_node
movl 12(a0),d1
movl 8(a0),a2
movl lazy_array_list,a1
movl a2,12(a0)
movl a1,8(a0)
movl d0,(a0)
movl a0,lazy_array_list
movl d1,4(a0)
addl $4,a0
movl (a0),a2
movl a3,(a0)
lea 2(a0),a3
movl a2,a0
jmp __mark_node
__mark_b_record_array:
movl 4(a0),a2
subl $256,d0
imull a2,d0
addl $3,d0
jmp __mark_basic_array
__mark_strict_basic_array:
movl 4(a0),d0
cmpl $INT+2,a2
je __mark__strict__int__array
cmpl $BOOL+2,a2
je __mark__strict__bool__array
__mark__strict__real__array:
addl d0,d0
__mark__strict__int__array:
addl $3,d0
jmp __mark_basic_array
__mark__strict__bool__array:
addl $12+3,d0
shrl $2,d0
jmp __mark_basic_array
__mark_string_:
movl 4(a0),d0
addl $8+3,d0
shr $2,d0
__mark_basic_array:
movl bit_set_table(a1),a1
addl d0,n_marked_words
#ifdef DEBUG_MARK_COLLECT
cmpl $100000,d0
jc no_error_in_gc4
call error_in_gc
no_error_in_gc4:
#endif
orl a1,(a4,d1,4)
lea -4(a0,d0,4),d0
addl neg_heap_p3,d0
shrl $7,d0
cmpl d0,d1
jae __mark_next_node
incl d1
movl $1,a2
cmpl d0,d1
jae __last__string__bits
__mark_string_lp:
orl a2,(a4,d1,4)
incl d1
cmpl d0,d1
jb __mark_string_lp
__last__string__bits:
orl a2,(a4,d1,4)
jmp __mark_next_node
#ifdef DEBUG_MARK_COLLECT
error_in_gc:
pushl d0
pushl d1
pushl a0
pushl a1
pushl $error_in_gc_string
call @ew_print_string
addl $4,sp
popl a1
popl a0
popl d1
popl d0
ret
error_in_gc_string:
.ascii "Error in marking gc"
.byte 0
#endif