#define COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP push a3 mov heap_p2,a4 mov heap_size_129,d0 shl $6,d0 mov d0,semi_space_size lea (a4,d0),a3 #ifdef WRITE_HEAP movl a3,heap2_begin_and_end+4 #endif movl caf_list,d0 test d0,d0 je end_copy_cafs copy_cafs_lp: pushl -4(d0) lea 4(d0),a2 movl (d0),d1 subl $1,d1 call copy_lp2 popl d0 test d0,d0 jne copy_cafs_lp end_copy_cafs: movl (sp),d1 mov stack_p,a2 sub a2,d1 shr $2,d1 sub $1,d1 jb end_copy0 call copy_lp2 end_copy0: mov heap_p2,a2 jmp copy_lp1 / / Copy all referenced nodes to the other semi space / in_hnf_1_2: dec d1 copy_lp2_lp1: call copy_lp2 copy_lp1: cmp a4,a2 jae end_copy1 mov (a2),d0 add $4,a2 testb $2,d0b je not_in_hnf_1 in_hnf_1: movzwl -2(d0),d1 test d1,d1 je copy_array_21 cmp $2,d1 jbe in_hnf_1_2 cmp $256,d1 jae copy_record_21 mov 4(a2),d0 testb $1,d0b jne node_without_arguments_part push d1 xorl d1,d1 call copy_lp2 pop d1 add $4,a2 sub $2,d1 jmp copy_lp2_lp1 node_without_arguments_part: dec d0 xorl d1,d1 mov d0,4(a2) call copy_lp2 add $4,a2 jmp copy_lp1 copy_record_21: subl $258,d1 ja copy_record_arguments_3 movzwl -2+2(d0),d1 jb copy_record_arguments_1 subl $1,d1 ja copy_lp2_lp1 #ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP jmp copy_node_arity1 #else je copy_node_arity1 addl $8,a2 jmp copy_lp1 #endif copy_record_arguments_1: #ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP dec d1 jmp copy_lp2_lp1 #else dec d1 je copy_lp2_lp1 addl $4,a2 jmp copy_lp1 #endif copy_record_arguments_3: testb $1,4(a2) jne record_node_without_arguments_part movzwl -2+2(d0),a1 #ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP subl $1,a1 #else test a1,a1 je copy_record_arguments_3b subl $1,a1 je copy_record_arguments_3abb #endif lea 3*4(a2,d1,4),a0 pushl a0 pushl a1 sub d1,d1 call copy_lp2 addl $4,a2 popl d1 dec d1 call copy_lp2 popl a2 jmp copy_lp1 #ifndef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP copy_record_arguments_3abb: pushl d1 sub d1,d1 call copy_lp2 popl d1 lea 2*4(a2,d1,4),a2 jmp copy_lp1 copy_record_arguments_3b: lea 3*4(a2,d1,4),a2 jmp copy_lp1 #endif record_node_without_arguments_part: andl $-2,4(a2) #ifndef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP cmpw $0,-2+2(d0) je record_node_without_arguments_part_3b #endif sub d1,d1 call copy_lp2 addl $4,a2 jmp copy_lp1 #ifndef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP record_node_without_arguments_part_3b: addl $8,a2 jmp copy_lp1 #endif not_in_hnf_1: mov -4(d0),d1 cmpl $257,d1 jge copy_unboxed_closure_arguments sub $1,d1 jg copy_lp2_lp1 copy_node_arity1: xorl d1,d1 call copy_lp2 add $4,a2 jmp copy_lp1 copy_unboxed_closure_arguments: je copy_unboxed_closure_arguments1 xorl d0,d0 movb d1hb,d0lb andl $255,d1 sub d0,d1 subl $1,d1 jl copy_unboxed_closure_arguments_without_pointers pushl d0 call copy_lp2 popl d0 copy_unboxed_closure_arguments_without_pointers: lea (a2,d0,4),a2 jmp copy_lp1 copy_unboxed_closure_arguments1: addl $8,a2 jmp copy_lp1 copy_array_21: movl 4(a2),d1 addl $8,a2 test d1,d1 je copy_array_21_a movzwl -2(d1),d0 movzwl -2+2(d1),d1 subl $256,d0 test d1,d1 je copy_array_21_b cmpl d0,d1 je copy_array_21_r_a copy_array_21_ab: cmpl $0,-8(a2) je copy_lp1 subl d1,d0 shl $2,d0 subl $1,d1 pushl d1 pushl d0 movl -8(a2),d1 subl $1,d1 pushl d1 copy_array_21_lp_ab: movl 8(sp),d1 call copy_lp2 addl 4(sp),a2 subl $1,(sp) jnc copy_array_21_lp_ab addl $12,sp jmp copy_lp1 copy_array_21_b: movl -8(a2),d1 imull d0,d1 lea (a2,d1,4),a2 jmp copy_lp1 copy_array_21_r_a: movl -8(a2),d1 imull d0,d1 subl $1,d1 jc copy_lp1 jmp copy_lp2_lp1 copy_array_21_a: movl -8(a2),d1 subl $1,d1 jc copy_lp1 jmp copy_lp2_lp1 / / Copy nodes to the other semi-space / copy_lp2: movl (a2),a1 / selectors: continue_after_selector_2: movl (a1),a0 testb $2,a0b je not_in_hnf_2 in_hnf_2: movzwl -2(a0),d0 test d0,d0 je copy_arity_0_node2 cmp $256,d0 jae copy_record_2 sub $2,d0 mov a4,(a2) lea 4(a2),a2 ja copy_hnf_node2_3 mov a0,(a4) jb copy_hnf_node2_1 inc a4 mov 4(a1),a0 mov a4,(a1) mov 8(a1),d0 sub $1,d1 mov a0,4-1(a4) mov d0,8-1(a4) lea 12-1(a4),a4 jae copy_lp2 ret copy_hnf_node2_1: inc a4 mov 4(a1),d0 sub $1,d1 mov a4,(a1) mov d0,4-1(a4) lea 8-1(a4),a4 jae copy_lp2 ret copy_hnf_node2_3: mov a0,(a4) inc a4 mov a4,(a1) mov 4(a1),a0 mov a0,4-1(a4) mov 8(a1),a0 add $12-1,a4 mov (a0),a1 testb $1,a1b jne arguments_already_copied_2 mov a4,-4(a4) add $4,a0 mov a1,(a4) inc a4 mov a4,-4(a0) add $4-1,a4 cp_hnf_arg_lp2: mov (a0),a1 add $4,a0 mov a1,(a4) add $4,a4 dec d0 jne cp_hnf_arg_lp2 sub $1,d1 jae copy_lp2 ret arguments_already_copied_2: mov a1,-4(a4) sub $1,d1 jae copy_lp2 ret copy_arity_0_node2: cmp $INT+2,a0 jb copy_real_file_or_string_2 cmp $CHAR+2,a0 ja copy_normal_hnf_0_2 copy_int_bool_or_char_2: #ifdef SHARE_CHAR_INT mov 4(a1),d0 je copy_char_2 cmp $INT+2,a0 jne no_small_int_or_char_2 copy_int_2: cmp $33,d0 jae no_small_int_or_char_2 shl $3,d0 add $4,a2 add $small_integers,d0 sub $1,d1 mov d0,-4(a2) jae copy_lp2 ret copy_char_2: andl $255,d0 shl $3,d0 add $4,a2 add $static_characters,d0 sub $1,d1 mov d0,-4(a2) jae copy_lp2 ret no_small_int_or_char_2: #else no_small_int_or_char_2: mov 4(a1),d0 #endif #ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP copy_record_node2_1_b: #endif mov a0,-8(a3) add $4,a2 mov d0,-4(a3) sub $7,a3 mov a3,(a1) dec a3 mov a3,-4(a2) sub $1,d1 jae copy_lp2 ret copy_normal_hnf_0_2: #ifdef SHARE_CHAR_INT sub $2-ZERO_ARITY_DESCRIPTOR_OFFSET,a0 sub $1,d1 mov a0,(a2) lea 4(a2),a2 #else mov a0,-4(a3) sub $3,a3 mov a3,(a1) dec a3 mov a3,(a2) add $4,a2 sub $1,d1 #endif jae copy_lp2 ret copy_real_file_or_string_2: cmpl $__STRING__+2,a0 jbe copy_string_or_array_2 copy_real_or_file_2: mov a0,-12(a3) sub $12-1,a3 mov a3,(a1) dec a3 mov 4(a1),d0 mov 8(a1),a0 mov a3,(a2) add $4,a2 mov d0,4(a3) sub $1,d1 mov a0,8(a3) jae copy_lp2 ret already_copied_2: dec a0 sub $1,d1 mov a0,(a2) lea 4(a2),a2 jae copy_lp2 ret copy_record_2: subl $258,d0 ja copy_record_node2_3 #ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP jb copy_record_node2_1 cmpw $0,-2+2(a0) je copy_real_or_file_2 movl a4,(a2) movl a0,(a4) lea 1(a4),a0 movl 4(a1),d0 movl a0,(a1) movl d0,4(a4) movl 8(a1),d0 addl $4,a2 movl d0,8(a4) addl $12,a4 sub $1,d1 jae copy_lp2 ret copy_record_node2_1: movl 4(a1),d0 cmpw $0,-2+2(a0) je copy_record_node2_1_b movl a4,(a2) movl a0,(a4) lea 1(a4),a0 movl d0,4(a4) movl a0,(a1) addl $4,a2 addl $8,a4 sub $1,d1 jae copy_lp2 ret #else movl a4,(a2) movl a0,(a4) lea 1(a4),a0 movl 4(a1),d0 movl a0,(a1) jb copy_record_node2_1 movl d0,4(a4) movl 8(a1),d0 addl $4,a2 movl d0,8(a4) addl $12,a4 sub $1,d1 jae copy_lp2 ret copy_record_node2_1: addl $4,a2 movl d0,4(a4) addl $8,a4 sub $1,d1 jae copy_lp2 ret #endif copy_record_node2_3: #ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP cmpw $1,-2+2(a0) jbe copy_record_node2_3_ab_or_b #endif pushl d0 lea 1(a4),d0 movl d0,(a1) movl 8(a1),d0 movl a0,(a4) movl 4(a1),a1 #ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP movl a1,4(a4) movl a4,(a2) addl $4,a2 movl d0,a0 testl $1,(d0) jne record_arguments_already_copied_2 #else movl d0,a0 subl heap_p1,d0 shr $3,d0 movl a1,4(a4) mov d0,a1 and $31,d0 shr $3,a1 movl a4,(a2) andl $-4,a1 mov bit_set_table(,d0,4),d0 addl heap_copied_vector,a1 addl $4,a2 test (a1),d0 jne record_arguments_already_copied_2 or d0,(a1) #endif lea 12(a4),a1 popl d0 movl a1,8(a4) addl $13,a4 movl (a0),a1 movl a4,(a0) addl $4,a0 movl a1,-1(a4) addl $3,a4 cp_record_arg_lp2: movl (a0),a1 addl $4,a0 movl a1,(a4) addl $4,a4 subl $1,d0 jne cp_record_arg_lp2 subl $1,d1 jae copy_lp2 ret record_arguments_already_copied_2: movl (a0),a1 popl d0 movl a1,8(a4) addl $12,a4 subl $1,d1 jae copy_lp2 ret #ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP copy_record_node2_3_ab_or_b: jb copy_record_node2_3_b copy_record_node2_3_ab: pushl d0 lea 1(a4),d0 movl d0,(a1) movl 8(a1),d0 movl a0,(a4) movl 4(a1),a1 movl d0,a0 subl heap_p1,d0 shr $3,d0 movl a1,4(a4) mov d0,a1 and $31,d0 shr $3,a1 movl a4,(a2) andl $-4,a1 mov bit_set_table(,d0,4),d0 addl heap_copied_vector,a1 addl $4,a2 test (a1),d0 jne record_arguments_already_copied_2 or d0,(a1) popl d0 subl $4,a3 shl $2,d0 subl d0,a3 pushl a3 addl $1,a3 movl a3,8(a4) addl $12,a4 movl (a0),a1 jmp cp_record_arg_lp3_c copy_record_node2_3_b: pushl d0 lea -12+1(a3),d0 movl d0,(a1) movl 8(a1),d0 movl a0,-12(a3) movl 4(a1),a1 movl d0,a0 subl heap_p1,d0 shr $3,d0 movl a1,-8(a3) mov d0,a1 and $31,d0 subl $12,a3 shr $3,a1 movl a3,(a2) andl $-4,a1 mov bit_set_table(,d0,4),d0 addl heap_copied_vector,a1 addl $4,a2 test (a1),d0 jne record_arguments_already_copied_3_b or d0,(a1) popl d0 movl a3,a1 subl $4,a3 shl $2,d0 subl d0,a3 movl a3,8(a1) movl (a0),a1 pushl a3 addl $1,a3 cp_record_arg_lp3_c: movl a3,(a0) addl $4,a0 movl a1,-1(a3) addl $3,a3 cp_record_arg_lp3: movl (a0),a1 addl $4,a0 movl a1,(a3) addl $4,a3 subl $4,d0 jne cp_record_arg_lp3 popl a3 subl $1,d1 jae copy_lp2 ret record_arguments_already_copied_3_b: movl (a0),a1 popl d0 subl $1,a1 movl a1,8(a3) subl $1,d1 jae copy_lp2 ret #endif not_in_hnf_2: testb $1,a0b jne already_copied_2 mov -4(a0),d0 test d0,d0 jle copy_arity_0_node2_ copy_node2_1_: andl $255,d0 sub $2,d0 jl copy_arity_1_node2 copy_node2_3: mov a4,(a2) add $4,a2 mov a0,(a4) inc a4 mov a4,(a1) mov 4(a1),a0 add $8,a1 mov a0,4-1(a4) add $8-1,a4 cp_arg_lp2: mov (a1),a0 add $4,a1 mov a0,(a4) add $4,a4 sub $1,d0 jae cp_arg_lp2 sub $1,d1 jae copy_lp2 ret #ifdef NEW_DESCRIPTORS copy_arity_1_node2__: pop d1 #endif copy_arity_1_node2: copy_arity_1_node2_: mov a4,(a2) inc a4 add $4,a2 mov a4,(a1) mov 4(a1),d0 mov a0,-1(a4) mov d0,4-1(a4) add $12-1,a4 sub $1,d1 jae copy_lp2 ret copy_indirection_2: mov a1,d0 mov 4(a1),a1 mov (a1),a0 testb $2,a0b jne in_hnf_2 testb $1,a0b jne already_copied_2 cmpl $-2,-4(a0) je skip_indirections_2 mov -4(a0),d0 test d0,d0 jle copy_arity_0_node2_ jmp copy_node2_1_ skip_indirections_2: mov 4(a1),a1 mov (a1),a0 testb $2,a0b jne update_indirection_list_2 testb $1,a0b jne update_indirection_list_2 cmpl $-2,-4(a0) je skip_indirections_2 update_indirection_list_2: lea 4(d0),a0 mov 4(d0),d0 mov a1,(a0) cmp d0,a1 jne update_indirection_list_2 jmp continue_after_selector_2 copy_selector_2: cmpl $-2,d0 je copy_indirection_2 jl copy_record_selector_2 mov 4(a1),d0 #ifdef NEW_DESCRIPTORS push d1 mov (d0),d1 testb $2,d1b je copy_arity_1_node2__ cmpw $2,-2(d1) jbe copy_selector_2_ movl 8(d0),d1 testb $1,(d1) jne copy_arity_1_node2__ movl -8(a0),a0 movzwl 4(a0),a0 movl $__indirection,(a1) cmpl $8,a0 jl copy_selector_2_1 je copy_selector_2_2 movl -12(d1,a0),a0 pop d1 movl a0,4(a1) movl a0,a1 jmp continue_after_selector_2 copy_selector_2_1: movl 4(d0),a0 pop d1 movl a0,4(a1) movl a0,a1 jmp continue_after_selector_2 copy_selector_2_2: movl (d1),a0 pop d1 movl a0,4(a1) movl a0,a1 jmp continue_after_selector_2 copy_selector_2_: movl -8(a0),a0 pop d1 movzwl 4(a0),a0 movl $__indirection,(a1) movl (d0,a0),a0 movl a0,4(a1) movl a0,a1 jmp continue_after_selector_2 #else mov (d0),d0 testb $2,d0b je copy_arity_1_node2_ cmpw $2,-2(d0) jbe copy_selector_2_ #ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP copy_selector_2__: #endif mov 4(a1),d0 mov 8(d0),d0 testb $1,(d0) jne copy_arity_1_node2_ copy_selector_2_: mov -8(a0),d0 mov 4(a1),a0 push a1 push a2 call *4(d0) pop a2 pop a1 movl $__indirection,(a1) mov a0,4(a1) mov a0,a1 jmp continue_after_selector_2 #endif copy_record_selector_2: cmpl $-3,d0 movl 4(a1),d0 movl (d0),d0 je copy_strict_record_selector_2 testb $2,d0b je copy_arity_1_node2_ cmpw $258,-2(d0) #ifdef NEW_DESCRIPTORS jbe copy_record_selector_2_ #else jbe copy_selector_2_ #endif #ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP cmpw $2,-2+2(d0) jae copy_selector_2__ #endif movl 4(a1),d0 pushl a1 movl 8(d0),d0 subl heap_p1,d0 mov d0,a1 and $31*8,d0 shr $6,a1 shr $1,d0 andl $-4,a1 addl heap_copied_vector,a1 mov bit_set_table(d0),d0 andl (a1),d0 popl a1 #ifdef NEW_DESCRIPTORS # ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP je copy_record_selector_2_ jmp copy_arity_1_node2_ copy_selector_2__: mov 4(a1),d0 mov 8(d0),d0 testb $1,(d0) jne copy_arity_1_node2_ # else jne copy_arity_1_node2_ # endif copy_record_selector_2_: movl -8(a0),d0 movl 4(a1),a0 movl $__indirection,(a1) movzwl 4(d0),d0 cmpl $8,d0 jle copy_record_selector_3 movl 8(a0),a0 subl $12,d0 copy_record_selector_3: movl (a0,d0),a0 movl a0,4(a1) movl a0,a1 jmp continue_after_selector_2 #else jne copy_arity_1_node2_ jmp copy_selector_2_ #endif copy_strict_record_selector_2: testb $2,d0b je copy_arity_1_node2_ cmpw $258,-2(d0) jbe copy_strict_record_selector_2_ # ifdef COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP cmpw $2,-2+2(d0) jb copy_strict_record_selector_2_b movl 4(a1),d0 movl 8(d0),d0 testb $1,(d0) jne copy_arity_1_node2_ jmp copy_strict_record_selector_2_ copy_strict_record_selector_2_b: # endif movl 4(a1),d0 pushl a1 movl 8(d0),d0 subl heap_p1,d0 mov d0,a1 and $31*8,d0 shr $6,a1 shr $1,d0 andl $-4,a1 addl heap_copied_vector,a1 mov bit_set_table(d0),d0 and (a1),d0 popl a1 jne copy_arity_1_node2_ copy_strict_record_selector_2_: movl -8(a0),d0 #ifdef NEW_DESCRIPTORS push d1 movl 4(a1),a0 movzwl 4(d0),d1 cmpl $8,d1 jle copy_strict_record_selector_3 addl 8(a0),d1 movl -12(d1),d1 jmp copy_strict_record_selector_4 copy_strict_record_selector_3: movl (a0,d1),d1 copy_strict_record_selector_4: movl d1,4(a1) movzwl 6(d0),d1 testl d1,d1 je copy_strict_record_selector_6 cmpl $8,d1 jle copy_strict_record_selector_5 movl 8(a0),a0 subl $12,d1 copy_strict_record_selector_5: movl (a0,d1),d1 movl d1,8(a1) copy_strict_record_selector_6: movl -4(d0),a0 movl a0,(a1) pop d1 testb $2,a0b jne in_hnf_2 hlt #else movl a1,a0 movl 4(a1),a1 push a2 call *4(d0) pop a2 movl a0,a1 movl (a0),a0 testb $2,a0b jne in_hnf_2 hlt #endif copy_arity_0_node2_: jl copy_selector_2 mov a0,-12(a3) sub $12,a3 mov a3,(a2) lea 1(a3),d0 add $4,a2 mov d0,(a1) sub $1,d1 jae copy_lp2 ret copy_string_or_array_2: #ifdef DLL je copy_string_2 cmpl $__ARRAY__+2,a0 jb copy_normal_hnf_0_2 movl a1,a0 jmp copy_array_2 copy_string_2: movl a1,a0 #else movl a1,a0 jne copy_array_2 #endif sub heap_p1,a1 cmp semi_space_size,a1 jae copy_string_or_array_constant mov 4(a0),a1 add $4,a2 add $3,a1 push d1 mov a1,d0 and $-4,a1 shr $2,d0 sub a1,a3 mov (a0),d1 add $4,a0 mov d1,-8(a3) sub $8,a3 mov a3,-4(a2) lea 1(a3),a1 mov a1,-4(a0) lea 4(a3),a1 cp_s_arg_lp2: mov (a0),d1 add $4,a0 mov d1,(a1) add $4,a1 subl $1,d0 jge cp_s_arg_lp2 pop d1 sub $1,d1 jae copy_lp2 ret copy_array_2: sub heap_p1,a1 cmp semi_space_size,a1 jae copy_string_or_array_constant push d1 movl 8(a0),d0 test d0,d0 je copy_array_a2 movzwl -2(d0),d1 test d1,d1 je copy_strict_basic_array_2 subl $256,d1 imull 4(a0),d1 jmp copy_array_a3 copy_array_a2: movl 4(a0),d1 copy_array_a3: movl a4,a1 lea 12(a4,d1,4),a4 movl a1,(a2) movl (a0),d0 addl $4,a2 movl d0,(a1) lea 1(a1),d0 addl $4,a1 movl d0,(a0) addl $4,a0 lea 1(d1),d0 jmp cp_s_arg_lp2 copy_strict_basic_array_2: movl 4(a0),d1 cmpl $INT+2,d0 je copy_int_array_2 cmpl $BOOL+2,d0 je copy_bool_array_2 addl d1,d1 copy_int_array_2: shl $2,d1 lea -12(a3),a1 subl d1,a1 movl (a0),d0 shr $2,d1 movl a1,(a2) addl $4,a2 movl a1,a3 movl d0,(a1) lea 1(a1),d0 addl $4,a1 movl d0,(a0) addl $4,a0 lea 1(d1),d0 jmp cp_s_arg_lp2 copy_bool_array_2: add $3,d1 shr $2,d1 jmp copy_int_array_2 copy_string_or_array_constant: movl a0,(a2) add $4,a2 sub $1,d1 jae copy_lp2 ret end_copy1: mov a3,heap_end_after_gc #ifdef FINALIZERS movl $finalizer_list,a0 movl $free_finalizer_list,a1 movl finalizer_list,a2 determine_free_finalizers_after_copy: movl (a2),d0 testb $1,d0b je finalizer_not_used_after_copy movl 4(a2),a2 subl $1,d0 movl d0,(a0) lea 4(d0),a0 jmp determine_free_finalizers_after_copy finalizer_not_used_after_copy: cmpl $__Nil-4,a2 je end_finalizers_after_copy movl a2,(a1) lea 4(a2),a1 movl 4(a2),a2 jmp determine_free_finalizers_after_copy end_finalizers_after_copy: movl a2,(a0) movl a2,(a1) #endif lea -32(a3),a2 movl a2,end_heap