#define COMPACT_MARK_WITH_STACK
/ mark used nodes and pointers in argument parts and link backward pointers
movl heap_size_33,d0
shl $5,d0
movl d0,heap_size_32_33
#ifdef COMPACT_MARK_WITH_STACK
lea -8000(sp),a3
#endif
movl caf_list,d0
#ifdef COMPACT_MARK_WITH_STACK
movl a3,end_stack
#endif
test d0,d0
je end_mark_cafs
mark_cafs_lp:
pushl -4(d0)
#ifdef COMPACT_MARK_WITH_STACK
lea 4(d0),a3
movl (d0),d0
lea (a3,d0,4),a0
#else
lea 4(d0),a2
movl (d0),d0
lea (a2,d0,4),a0
#endif
movl a0,end_vector
#ifdef COMPACT_MARK_WITH_STACK
call rmark_stack_nodes
#else
call mark_stack_nodes
#endif
popl d0
test d0,d0
jne mark_cafs_lp
end_mark_cafs:
#ifdef COMPACT_MARK_WITH_STACK
movl stack_p,a3
#else
movl stack_p,a2
#endif
movl stack_top,a0
movl a0,end_vector
#ifdef COMPACT_MARK_WITH_STACK
call rmark_stack_nodes
#else
call mark_stack_nodes
#endif
#ifdef MEASURE_GC
call add_mark_compact_garbage_collect_time
#endif
jmp compact_heap
#ifdef COMPACT_MARK_WITH_STACK
# include "icompact_rmark.s"
# include "icompact_rmarkr.s"
#else
# include "icompact_mark.s"
#endif
/ compact the heap
compact_heap:
#ifdef FINALIZERS
movl $finalizer_list,a0
movl $free_finalizer_list,a1
movl (a0),a2
determine_free_finalizers_after_compact1:
cmpl $__Nil-8,a2
je end_finalizers_after_compact1
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_compact1
movl (a2),d0
movl a2,a3
jmp finalizer_find_descriptor
finalizer_find_descriptor_lp:
andl $-4,d0
movl d0,a3
movl (d0),d0
finalizer_find_descriptor:
test $1,d0
jne finalizer_find_descriptor_lp
movl $e____system__kFinalizerGCTemp+2,(a3)
cmpl a0,a2
ja finalizer_no_reverse
movl (a2),d0
leal 1(a0),a3
movl a3,(a2)
movl d0,(a0)
finalizer_no_reverse:
lea 4(a2),a0
movl 4(a2),a2
jmp determine_free_finalizers_after_compact1
finalizer_not_used_after_compact1:
movl $e____system__kFinalizerGCTemp+2,(a2)
movl a2,(a1)
lea 4(a2),a1
movl 4(a2),a2
movl a2,(a0)
jmp determine_free_finalizers_after_compact1
end_finalizers_after_compact1:
movl a2,(a1)
movl finalizer_list,a0
cmpl $__Nil-8,a0
je finalizer_list_empty
testl $3,a0
jne finalizer_list_already_reversed
movl (a0),d0
movl $finalizer_list+1,(a0)
movl d0,finalizer_list
finalizer_list_already_reversed:
finalizer_list_empty:
# ifdef COMPACT_MARK_WITH_STACK
movl $free_finalizer_list,a3
cmpl $__Nil-8,(a3)
# else
movl $free_finalizer_list,a2
cmpl $__Nil-8,(a2)
# endif
je free_finalizer_list_empty
movl $free_finalizer_list+4,end_vector
# ifdef COMPACT_MARK_WITH_STACK
call rmark_stack_nodes
# else
call mark_stack_nodes
# endif
free_finalizer_list_empty:
#endif
movl heap_size_33,d0
movl d0,d1
shl $5,d1
#ifdef SHARE_CHAR_INT
addl heap_p3,d1
#endif
movl d1,end_heap_p3
addl $3,d0
shr $2,d0
movl heap_vector,a0
lea 4(a0),d1
negl d1
movl d1,neg_heap_vector_plus_4
movl heap_p3,a4
xorl a3,a3
jmp skip_zeros
/ d0,a0,a2: free
find_non_zero_long:
movl vector_counter,d0
movl vector_p,a0
skip_zeros:
subl $1,d0
jc end_copy
movl (a0),a3
addl $4,a0
testl a3,a3
je skip_zeros
/ a2: free
end_skip_zeros:
movl neg_heap_vector_plus_4,a2
movl d0,vector_counter
addl a0,a2
movl a0,vector_p
shl $5,a2
addl heap_p3,a2
#ifdef NO_BIT_INSTRUCTIONS
bsf_and_copy_nodes:
movl a3,d0
movl a3,a0
andl $0xff,d0
jne found_bit1
andl $0xff00,a0
jne found_bit2
movl a3,d0
movl a3,a0
andl $0xff0000,d0
jne found_bit3
shrl $24,a0
movzbl first_one_bit_table(,a0,1),d1
addl $24,d1
jmp copy_nodes
found_bit3:
shrl $16,d0
movzbl first_one_bit_table(,d0,1),d1
addl $16,d1
jmp copy_nodes
found_bit2:
shrl $8,a0
movzbl first_one_bit_table(,a0,1),d1
addl $8,d1
jmp copy_nodes
found_bit1:
movzbl first_one_bit_table(,d0,1),d1
#else
bsf a3,d1
#endif
copy_nodes:
movl (a2,d1,4),d0
#ifdef NO_BIT_INSTRUCTIONS
andl bit_clear_table(,d1,4),a3
#else
btr d1,a3
#endif
leal 4(a2,d1,4),a0
dec d0
test $2,d0
je begin_update_list_2
movl -10(d0),d1
subl $2,d0
test $1,d1
je end_list_2
find_descriptor_2:
andl $-4,d1
movl (d1),d1
test $1,d1
jne find_descriptor_2
end_list_2:
movl d1,a1
movzwl -2(d1),d1
cmpl $256,d1
jb no_record_arguments
movzwl -2+2(a1),a1
subl $2,a1
jae copy_record_arguments_aa
subl $256+3,d1
copy_record_arguments_all_b:
pushl d1
movl heap_vector,d1
update_up_list_1r:
movl d0,a1
addl neg_heap_p3,d0
#ifdef NO_BIT_INSTRUCTIONS
push a0
movl d0,a0
shrl $7,d0
andl $31*4,a0
movl bit_set_table(,a0,1),a0
movl (d1,d0,4),d0
andl a0,d0
pop a0
je copy_argument_part_1r
#else
shrl $2,d0
bt d0,(d1)
jnc copy_argument_part_1r
#endif
movl (a1),d0
movl a4,(a1)
subl $3,d0
jmp update_up_list_1r
copy_argument_part_1r:
movl (a1),d0
movl a4,(a1)
movl d0,(a4)
addl $4,a4
movl neg_heap_p3,d0
addl a0,d0
shr $2,d0
mov d0,d1
andl $31,d1
cmp $1,d1
jae bit_in_this_word
movl vector_counter,d0
movl vector_p,a1
dec d0
movl (a1),a3
addl $4,a1
movl neg_heap_vector_plus_4,a2
addl a1,a2
shl $5,a2
addl heap_p3,a2
movl a1,vector_p
movl d0,vector_counter
bit_in_this_word:
#ifdef NO_BIT_INSTRUCTIONS
andl bit_clear_table(,d1,4),a3
#else
btr d1,a3
#endif
popl d1
copy_b_record_argument_part_arguments:
movl (a0),d0
addl $4,a0
movl d0,(a4)
addl $4,a4
subl $1,d1
jnc copy_b_record_argument_part_arguments
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
copy_record_arguments_aa:
subl $256+2,d1
subl a1,d1
pushl d1
pushl a1
update_up_list_2r:
movl d0,a1
movl (a1),d0
movl $3,d1
andl d0,d1
subl $3,d1
jne copy_argument_part_2r
movl a4,(a1)
subl $3,d0
jmp update_up_list_2r
copy_argument_part_2r:
movl a4,(a1)
cmpl a0,d0
jb copy_record_argument_2
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,d0
jae copy_record_argument_2
#endif
movl d0,a1
movl (a1),d0
lea 1(a4),d1
movl d1,(a1)
copy_record_argument_2:
movl d0,(a4)
addl $4,a4
popl d1
subl $1,d1
jc no_pointers_in_record
copy_record_pointers:
movl (a0),a1
addl $4,a0
cmpl a0,a1
jb copy_record_pointers_2
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jae copy_record_pointers_2
#endif
movl (a1),d0
inc a4
movl a4,(a1)
dec a4
movl d0,a1
copy_record_pointers_2:
movl a1,(a4)
addl $4,a4
subl $1,d1
jnc copy_record_pointers
no_pointers_in_record:
popl d1
subl $1,d1
jc no_non_pointers_in_record
copy_non_pointers_in_record:
movl (a0),d0
addl $4,a0
movl d0,(a4)
addl $4,a4
subl $1,d1
jnc copy_non_pointers_in_record
no_non_pointers_in_record:
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
no_record_arguments:
subl $3,d1
update_up_list_2:
movl d0,a1
movl (d0),d0
inc d0
movl a4,(a1)
testb $3,d0b
jne copy_argument_part_2
subl $4,d0
jmp update_up_list_2
copy_argument_part_2:
dec d0
cmpl a0,d0
jc copy_arguments_1
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,d0
jnc copy_arguments_1
#endif
movl d0,a1
movl (d0),d0
inc a4
movl a4,(a1)
dec a4
copy_arguments_1:
movl d0,(a4)
addl $4,a4
copy_argument_part_arguments:
movl (a0),a1
addl $4,a0
cmpl a0,a1
jc copy_arguments_2
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jnc copy_arguments_2
#endif
movl (a1),d0
inc a4
movl a4,(a1)
dec a4
movl d0,a1
copy_arguments_2:
movl a1,(a4)
addl $4,a4
subl $1,d1
jnc copy_argument_part_arguments
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
update_list_2_:
dec d0
update_list_2:
movl a4,(a1)
begin_update_list_2:
movl d0,a1
movl (d0),d0
update_list__2:
test $1,d0
jz end_update_list_2
test $2,d0
jz update_list_2_
lea -3(d0),a1
movl -3(d0),d0
jmp update_list__2
end_update_list_2:
movl a4,(a1)
movl d0,(a4)
addl $4,a4
testb $2,d0b
je move_lazy_node
movzwl -2(d0),d1
testl d1,d1
je move_hnf_0
cmp $256,d1
jae move_record
subl $2,d1
jc move_hnf_1
je move_hnf_2
move_hnf_3:
movl (a0),a1
addl $4,a0
cmpl a0,a1
jc move_hnf_3_1
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jnc move_hnf_3_1
#endif
lea 1(a4),d0
movl (a1),d1
movl d0,(a1)
movl d1,a1
move_hnf_3_1:
movl a1,(a4)
movl (a0),a1
addl $4,a0
cmpl a0,a1
jc move_hnf_3_2
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jnc move_hnf_3_2
#endif
lea 4+2+1(a4),d0
movl (a1),d1
movl d0,(a1)
movl d1,a1
move_hnf_3_2:
movl a1,4(a4)
addl $8,a4
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_hnf_2:
movl (a0),a1
addl $4,a0
cmpl a0,a1
jc move_hnf_2_1
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jnc move_hnf_2_1
#endif
lea 1(a4),d0
movl (a1),d1
movl d0,(a1)
movl d1,a1
move_hnf_2_1:
movl a1,(a4)
movl (a0),a1
addl $4,a0
cmpl a0,a1
jc move_hnf_2_2
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jnc move_hnf_2_2
#endif
lea 4+1(a4),d0
movl (a1),d1
movl d0,(a1)
movl d1,a1
move_hnf_2_2:
movl a1,4(a4)
addl $8,a4
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_hnf_1:
movl (a0),a1
addl $4,a0
cmpl a0,a1
jc move_hnf_1_
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jnc move_hnf_1_
#endif
lea 1(a4),d0
movl (a1),d1
movl d0,(a1)
movl d1,a1
move_hnf_1_:
movl a1,(a4)
addl $4,a4
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_record:
subl $258,d1
jb move_record_1
je move_record_2
move_record_3:
movzwl -2+2(d0),d1
subl $1,d1
ja move_hnf_3
movl (a0),a1
lea 4(a0),a0
jb move_record_3_1b
move_record_3_1a:
cmpl a0,a1
jb move_record_3_1b
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jae move_record_3_1b
#endif
lea 1(a4),d0
movl (a1),d1
movl d0,(a1)
movl d1,a1
move_record_3_1b:
movl a1,(a4)
addl $4,a4
movl (a0),a1
addl $4,a0
cmpl a0,a1
jb move_record_3_2
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jae move_record_3_2
#endif
movl neg_heap_p3,d0
#ifdef NO_BIT_INSTRUCTIONS
pushl a2
#endif
addl a1,d0
#ifdef NO_BIT_INSTRUCTIONS
movl heap_vector,d1
addl $4,d0
movl d0,a2
andl $31*4,a2
shrl $7,d0
movl bit_set_table(a2),a2
testl (d1,d0,4),a2
je not_linked_record_argument_part_3_b
#else
shr $2,d0
inc d0
movl heap_vector,d1
bts d0,(d1)
jnc not_linked_record_argument_part_3_b
#endif
movl neg_heap_p3,d0
addl a4,d0
#ifdef NO_BIT_INSTRUCTIONS
movl d0,a2
andl $31*4,a2
shrl $7,d0
movl bit_set_table(a2),a2
orl a2,(d1,d0,4)
popl a2
#else
shr $2,d0
bts d0,(d1)
#endif
jmp linked_record_argument_part_3_b
not_linked_record_argument_part_3_b:
#ifdef NO_BIT_INSTRUCTIONS
orl a2,(d1,d0,4)
#endif
movl neg_heap_p3,d0
addl a4,d0
#ifdef NO_BIT_INSTRUCTIONS
movl d0,a2
andl $31*4,a2
shrl $7,d0
movl bit_clear_table(a2),a2
andl a2,(d1,d0,4)
popl a2
#else
shr $2,d0
btr d0,(d1)
#endif
linked_record_argument_part_3_b:
movl (a1),d1
lea 2+1(a4),d0
movl d0,(a1)
movl d1,a1
move_record_3_2:
movl a1,(a4)
addl $4,a4
movl neg_heap_p3,d1
addl a0,d1
shr $2,d1
dec d1
andl $31,d1
cmp $2,d1
jb bit_in_next_word
#ifdef NO_BIT_INSTRUCTIONS
andl bit_clear_table(,d1,4),a3
#else
btr d1,a3
#endif
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
bit_in_next_word:
movl vector_counter,d0
movl vector_p,a0
dec d0
movl (a0),a3
addl $4,a0
#ifdef NO_BIT_INSTRUCTIONS
andl bit_clear_table(,d1,4),a3
#else
btr d1,a3
#endif
testl a3,a3
je skip_zeros
jmp end_skip_zeros
move_record_2:
cmpw $1,-2+2(d0)
ja move_hnf_2
jb move_real_or_file
move_record_2_ab:
movl (a0),a1
addl $4,a0
cmpl a0,a1
jb move_record_2_1
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jae move_record_2_1
#endif
lea 1(a4),d0
movl (a1),d1
movl d0,(a1)
movl d1,a1
move_record_2_1:
movl a1,(a4)
movl (a0),d1
addl $4,a0
movl d1,4(a4)
addl $8,a4
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_record_1:
movzwl -2+2(d0),d1
test d1,d1
jne move_hnf_1
jmp move_int_bool_or_char
move_real_or_file:
movl (a0),d0
addl $4,a0
movl d0,(a4)
addl $4,a4
move_int_bool_or_char:
movl (a0),d0
addl $4,a0
movl d0,(a4)
addl $4,a4
copy_normal_hnf_0:
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_hnf_0:
cmpl $INT+2,d0
jb move_real_file_string_or_array
cmpl $CHAR+2,d0
jbe move_int_bool_or_char
#ifdef DLL
move_normal_hnf_0:
#endif
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_real_file_string_or_array:
cmpl $__STRING__+2,d0
ja move_real_or_file
jne move_array
movl (a0),d0
addl $3,d0
shr $2,d0
cp_s_arg_lp3:
movl (a0),d1
addl $4,a0
movl d1,(a4)
addl $4,a4
subl $1,d0
jnc cp_s_arg_lp3
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_array:
#ifdef DLL
cmpl $__ARRAY__+2,d0
jb move_normal_hnf_0
#endif
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_end_array_bit
#else
bsf a3,d1
jne end_array_bit
#endif
pushl a0
movl vector_counter,d0
movl vector_p,a0
skip_zeros_a:
subl $1,d0
movl (a0),a3
addl $4,a0
testl a3,a3
je skip_zeros_a
movl neg_heap_vector_plus_4,a2
addl a0,a2
movl d0,vector_counter
shl $5,a2
movl a0,vector_p
addl heap_p3,a2
popl a0
#ifdef NO_BIT_INSTRUCTIONS
bsf_and_end_array_bit:
movl a3,d0
movl a3,a1
andl $0xff,d0
jne a_found_bit1
andl $0xff00,a1
jne a_found_bit2
movl a3,d0
movl a3,a1
andl $0xff0000,d0
jne a_found_bit3
shrl $24,a1
movzbl first_one_bit_table(,a1,1),d1
addl $24,d1
jmp end_array_bit
a_found_bit3:
shrl $16,d0
movzbl first_one_bit_table(,d0,1),d1
addl $16,d1
jmp end_array_bit
a_found_bit2:
shrl $8,a1
movzbl first_one_bit_table(,a1,1),d1
addl $8,d1
jmp end_array_bit
a_found_bit1:
movzbl first_one_bit_table(,d0,1),d1
#else
bsf a3,d1
#endif
end_array_bit:
#ifdef NO_BIT_INSTRUCTIONS
andl bit_clear_table(,d1,4),a3
#else
btr d1,a3
#endif
leal (a2,d1,4),d1
cmpl d1,a0
jne move_a_array
move_b_array:
movl (a0),a1
movl a1,(a4)
movl 4(a0),d1
addl $4,a0
movzwl -2(d1),d0
addl $4,a4
test d0,d0
je move_strict_basic_array
subl $256,d0
imull d0,a1
movl a1,d0
jmp cp_s_arg_lp3
move_strict_basic_array:
movl a1,d0
cmpl $INT+2,d1
je cp_s_arg_lp3
cmpl $BOOL+2,d1
je move_bool_array
addl d0,d0
jmp cp_s_arg_lp3
move_bool_array:
addl $3,d0
shr $2,d0
jmp cp_s_arg_lp3
move_a_array:
movl d1,a1
subl a0,d1
shr $2,d1
pushl a3
subl $1,d1
jb end_array
movl (a0),a3
movl -4(a1),d0
movl a3,-4(a1)
movl d0,(a4)
movl (a1),d0
movl 4(a0),a3
addl $8,a0
movl a3,(a1)
movl d0,4(a4)
addl $8,a4
test d0,d0
je st_move_array_lp
movzwl -2+2(d0),a3
movzwl -2(d0),d0
subl $256,d0
cmpl a3,d0
je st_move_array_lp
move_array_ab:
pushl a0
movl -8(a4),a1
movl a3,d1
imull d0,a1
shl $2,a1
subl d1,d0
addl a0,a1
call reorder
popl a0
subl $1,d1
subl $1,d0
pushl d1
pushl d0
pushl -8(a4)
jmp st_move_array_lp_ab
move_array_ab_lp1:
movl 8(sp),d0
move_array_ab_a_elements:
movl (a0),d1
addl $4,a0
cmpl a0,d1
jb move_array_element_ab
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,d1
jnc move_array_element_ab
#endif
movl d1,a1
movl (a1),d1
inc a4
movl a4,(a1)
dec a4
move_array_element_ab:
movl d1,(a4)
addl $4,a4
subl $1,d0
jnc move_array_ab_a_elements
movl 4(sp),d0
move_array_ab_b_elements:
movl (a0),d1
addl $4,a0
movl d1,(a4)
addl $4,a4
subl $1,d0
jnc move_array_ab_b_elements
st_move_array_lp_ab:
subl $1,(sp)
jnc move_array_ab_lp1
addl $12,sp
jmp end_array
move_array_lp1:
movl (a0),d0
addl $4,a0
addl $4,a4
cmpl a0,d0
jb move_array_element
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,d0
jnc move_array_element
#endif
movl (d0),a3
movl d0,a1
movl a3,-4(a4)
leal -4+1(a4),d0
movl d0,(a1)
subl $1,d1
jnc move_array_lp1
jmp end_array
move_array_element:
movl d0,-4(a4)
st_move_array_lp:
subl $1,d1
jnc move_array_lp1
end_array:
popl a3
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_lazy_node:
movl d0,a1
movl -4(a1),d1
test d1,d1
je move_lazy_node_0
subl $1,d1
jle move_lazy_node_1
cmpl $256,d1
jge move_closure_with_unboxed_arguments
move_lazy_node_arguments:
movl (a0),a1
addl $4,a0
cmpl a0,a1
jc move_lazy_node_arguments_
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jnc move_lazy_node_arguments_
#endif
movl (a1),d0
movl d0,(a4)
lea 1(a4),d0
addl $4,a4
movl d0,(a1)
subl $1,d1
jnc move_lazy_node_arguments
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_lazy_node_arguments_:
movl a1,(a4)
addl $4,a4
subl $1,d1
jnc move_lazy_node_arguments
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_lazy_node_1:
movl (a0),a1
addl $4,a0
cmpl a0,a1
jc move_lazy_node_1_
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jnc move_lazy_node_1_
#endif
lea 1(a4),d0
movl (a1),d1
movl d0,(a1)
movl d1,a1
move_lazy_node_1_:
movl a1,(a4)
addl $8,a4
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_lazy_node_0:
addl $8,a4
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_closure_with_unboxed_arguments:
je move_closure_with_unboxed_arguments_1
addl $1,d1
movl d1,d0
andl $255,d1
shrl $8,d0
subl d0,d1
je move_non_pointers_of_closure
pushl d0
move_closure_with_unboxed_arguments_lp:
movl (a0),a1
addl $4,a0
cmpl a0,a1
jc move_closure_with_unboxed_arguments_
#ifdef SHARE_CHAR_INT
cmpl end_heap_p3,a1
jnc move_closure_with_unboxed_arguments_
#endif
movl (a1),d0
movl d0,(a4)
lea 1(a4),d0
addl $4,a4
movl d0,(a1)
subl $1,d1
jne move_closure_with_unboxed_arguments_lp
popl d0
jmp move_non_pointers_of_closure
move_closure_with_unboxed_arguments_:
movl a1,(a4)
addl $4,a4
subl $1,d1
jne move_closure_with_unboxed_arguments_lp
popl d0
move_non_pointers_of_closure:
movl (a0),d1
addl $4,a0
movl d1,(a4)
addl $4,a4
subl $1,d0
jne move_non_pointers_of_closure
#ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
#else
bsf a3,d1
jne copy_nodes
#endif
jmp find_non_zero_long
move_closure_with_unboxed_arguments_1:
movl (a0),d0
movl d0,(a4)
addl $8,a4
# ifdef NO_BIT_INSTRUCTIONS
test a3,a3
jne bsf_and_copy_nodes
# else
bsf a3,d1
jne copy_nodes
# endif
jmp find_non_zero_long
end_copy:
#ifdef FINALIZERS
movl finalizer_list,a0
restore_finalizer_descriptors:
cmpl $__Nil-8,a0
je end_restore_finalizer_descriptors
movl $e____system__kFinalizer+2,(a0)
movl 4(a0),a0
jmp restore_finalizer_descriptors
end_restore_finalizer_descriptors:
#endif