diff options
Diffstat (limited to 'thread/acopy.asm')
-rw-r--r-- | thread/acopy.asm | 2788 |
1 files changed, 1394 insertions, 1394 deletions
diff --git a/thread/acopy.asm b/thread/acopy.asm index b0213d0..cddf663 100644 --- a/thread/acopy.asm +++ b/thread/acopy.asm @@ -1,1394 +1,1394 @@ -
-COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP = 1
-
- push rsi
-
- if THREAD
- mov rdi,heap_p2_offset[r9]
-
- mov rax,heap_size_257_offset[r9]
- else
- mov rdi,heap_p2
-
- mov rax,heap_size_257
- endif
- shl rax,7
- if THREAD
- mov semi_space_size_offset[r9],rax
- else
- mov semi_space_size,rax
- endif
- lea rsi,[rdi+rax]
-
- if THREAD
- mov qword ptr (heap2_begin_and_end_offset+8)[r9],rsi
- else
- mov qword ptr (heap2_begin_and_end+8),rsi
- endif
-
- mov rax,qword ptr caf_list
- test rax,rax
- je end_copy_cafs
-
-copy_cafs_lp:
- push (-8)[rax]
-
- lea rbp,8[rax]
- mov rbx,qword ptr [rax]
- sub rbx,1
- call copy_lp2
-
- pop rax
- test rax,rax
- jne copy_cafs_lp
-
-end_copy_cafs:
- mov rbx,qword ptr [rsp]
- if THREAD
- mov rbp,stack_p_offset[r9]
- else
- mov rbp,stack_p
- endif
- sub rbx,rbp
- shr rbx,3
-
- sub rbx,1
- jb end_copy0
- call copy_lp2
-end_copy0:
- if THREAD
- mov rbp,heap_p2_offset[r9]
- else
- mov rbp,heap_p2
- endif
-
- jmp copy_lp1
-;
-; Copy all referenced nodes to the other semi space
-;
-
-in_hnf_1_2:
- dec rbx
-copy_lp2_lp1:
- call copy_lp2
-copy_lp1:
- cmp rbp,rdi
- jae end_copy1
-
- mov rax,[rbp]
- add rbp,8
- test al,2
- je not_in_hnf_1
-in_hnf_1:
- movzx rbx,word ptr (-2)[rax]
-
- test rbx,rbx
- je copy_array_21
-
- cmp rbx,2
- jbe in_hnf_1_2
-
- cmp rbx,256
- jae copy_record_21
-
- mov rax,8[rbp]
-
- test al,1
- jne node_without_arguments_part
-
- push rbx
- xor rbx,rbx
-
- call copy_lp2
-
- pop rbx
- add rbp,8
-
- sub rbx,2
- jmp copy_lp2_lp1
-
-node_without_arguments_part:
- dec rax
- xor rbx,rbx
-
- mov 8[rbp],rax
- call copy_lp2
-
- add rbp,8
- jmp copy_lp1
-
-copy_record_21:
- sub rbx,258
- ja copy_record_arguments_3
-
- movzx rbx,word ptr (-2+2)[rax]
- if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
- jb in_hnf_1_2
-
- sub rbx,1
- ja copy_lp2_lp1
- jmp copy_node_arity1
- else
- jb copy_record_arguments_1
-
- sub rbx,1
- ja copy_lp2_lp1
- je copy_node_arity1
- add rbp,16
- jmp copy_lp1
-
-copy_record_arguments_1:
- dec rbx
- jmp copy_lp2_lp1
- je copy_lp2_lp1
- add rbp,8
- jmp copy_lp1
- endif
-
-copy_record_arguments_3:
- test byte ptr 8[rbp],1
- jne record_node_without_arguments_part
-
- movzx rdx,word ptr (-2+2)[rax]
- if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
- sub rdx,1
- else
- test rdx,rdx
- je copy_record_arguments_3b
- sub rdx,1
- je copy_record_arguments_3abb
- endif
-
- lea rcx,(3*8)[rbp+rbx*8]
- push rcx
- push rdx
-
- sub rbx,rbx
- call copy_lp2
-
- add rbp,8
- pop rbx
- dec rbx
- call copy_lp2
-
- pop rbp
- jmp copy_lp1
-
- ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
-copy_record_arguments_3abb:
- push rbx
- sub rbx,rbx
-
- call copy_lp2
-
- pop rbx
-
- lea rbp,(2*8)[rbp+rbx*8]
- jmp copy_lp1
-
-copy_record_arguments_3b:
- lea rbp,(3*8)[rbp+rbx*8]
- jmp copy_lp1
- endif
-
-record_node_without_arguments_part:
- and qword ptr 8[rbp],-2
-
- ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
- cmp word ptr (-2+2)[rax],0
- je record_node_without_arguments_part_3b
- endif
-
- sub rbx,rbx
- call copy_lp2
-
- add rbp,8
- jmp copy_lp1
-
- ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
-record_node_without_arguments_part_3b:
- add rbp,16
- jmp copy_lp1
- endif
-
-not_in_hnf_1:
- movsxd rbx,dword ptr (-4)[rax]
- cmp rbx,257
- jge copy_unboxed_closure_arguments
- sub rbx,1
- jg copy_lp2_lp1
-
-copy_node_arity1:
- xor rbx,rbx
- call copy_lp2
-
- add rbp,8
- jmp copy_lp1
-
-copy_unboxed_closure_arguments:
- je copy_unboxed_closure_arguments1
-
- xor rax,rax
- mov al,bh
- and rbx,255
- sub rbx,rax
-
- sub rbx,1
- jl copy_unboxed_closure_arguments_without_pointers
-
- push rax
- call copy_lp2
- pop rax
-
-copy_unboxed_closure_arguments_without_pointers:
- lea rbp,[rbp+rax*8]
- jmp copy_lp1
-
-copy_unboxed_closure_arguments1:
- add rbp,16
- jmp copy_lp1
-
-copy_array_21:
- mov rbx,qword ptr 8[rbp]
- add rbp,16
- test rbx,rbx
- je copy_array_21_a
-
- movzx rax,word ptr (-2)[rbx]
- movzx rbx,word ptr (-2+2)[rbx]
- sub rax,256
- test rbx,rbx
- je copy_array_21_b
-
- cmp rbx,rax
- je copy_array_21_r_a
-
-copy_array_21_ab:
- cmp qword ptr (-16)[rbp],0
- je copy_lp1
-
- sub rax,rbx
- shl rax,3
- sub rbx,1
-
- push rbx
- push rax
- mov rbx,qword ptr (-16)[rbp]
- sub rbx,1
- push rbx
-
-copy_array_21_lp_ab:
- mov rbx,qword ptr 16[rsp]
- call copy_lp2
-
- add rbp,qword ptr 8[rsp]
- sub qword ptr [rsp],1
- jnc copy_array_21_lp_ab
-
- add rsp,24
- jmp copy_lp1
-
-copy_array_21_b:
- mov rbx,qword ptr (-16)[rbp]
- imul rbx,rax
- lea rbp,[rbp+rbx*8]
- jmp copy_lp1
-
-copy_array_21_r_a:
- mov rbx,qword ptr (-16)[rbp]
- imul rbx,rax
- sub rbx,1
- jc copy_lp1
- jmp copy_lp2_lp1
-
-copy_array_21_a:
- mov rbx,qword ptr (-16)[rbp]
- sub rbx,1
- jc copy_lp1
- jmp copy_lp2_lp1
-
-;
-; Copy nodes to the other semi-space
-;
-
-copy_lp2:
- mov rdx,qword ptr [rbp]
-
-; selectors:
-continue_after_selector_2:
- mov rcx,qword ptr [rdx]
- test cl,2
- je not_in_hnf_2
-
-in_hnf_2:
- movzx rax,word ptr (-2)[rcx]
- test rax,rax
- je copy_arity_0_node2
-
- cmp rax,256
- jae copy_record_2
-
- sub rax,2
- mov [rbp],rdi
-
- lea rbp,8[rbp ]
- ja copy_hnf_node2_3
-
- mov [rdi],rcx
- jb copy_hnf_node2_1
-
- inc rdi
- mov rcx,8[rdx]
-
- mov [rdx],rdi
- mov rax,16[rdx]
-
- sub rbx,1
- mov (8-1)[rdi],rcx
-
- mov (16-1)[rdi],rax
- lea rdi,(24-1)[rdi]
-
- jae copy_lp2
- ret
-
-copy_hnf_node2_1:
- inc rdi
- mov rax,8[rdx]
-
- sub rbx,1
- mov [rdx],rdi
-
- mov (8-1)[rdi],rax
- lea rdi,(16-1)[rdi]
-
- jae copy_lp2
- ret
-
-copy_hnf_node2_3:
- mov [rdi],rcx
- inc rdi
-
- mov [rdx],rdi
- mov rcx,8[rdx]
-
- mov (8-1)[rdi],rcx
- mov rcx,16[rdx]
-
- add rdi,24-1
- mov rdx,[rcx]
-
- test dl,1
- jne arguments_already_copied_2
-
- mov (-8)[rdi],rdi
- add rcx,8
-
- mov [rdi],rdx
- inc rdi
-
- mov (-8)[rcx],rdi
- add rdi,8-1
-
-cp_hnf_arg_lp2:
- mov rdx,[rcx]
- add rcx,8
-
- mov [rdi],rdx
- add rdi,8
-
- dec rax
- jne cp_hnf_arg_lp2
-
- sub rbx,1
- jae copy_lp2
- ret
-
-arguments_already_copied_2:
- mov (-8)[rdi],rdx
-
- sub rbx,1
- jae copy_lp2
- ret
-
-copy_arity_0_node2:
- cmp rcx,offset __STRING__+2
- jbe copy_string_or_array_2
-
- cmp rcx,offset CHAR+2
- ja copy_normal_hnf_0_2
-
-copy_int_bool_or_char_2:
- mov rax,8[rdx]
- je copy_char_2
-
- cmp rcx,offset dINT+2
- jne no_small_int_or_char_2
-
-copy_int_2:
- cmp rax,33
- jae no_small_int_or_char_2
-
- shl rax,4
- add rbp,8
-
- add rax,offset small_integers
- sub rbx,1
-
- mov (-8)[rbp],rax
- jae copy_lp2
- ret
-
-copy_char_2:
- and rax,255
-
- shl rax,4
- add rbp,8
-
- add rax,offset static_characters
- sub rbx,1
-
- mov (-8)[rbp],rax
- jae copy_lp2
- ret
-
-no_small_int_or_char_2:
- if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
-copy_record_node2_1_b:
- endif
- mov (-16)[rsi],rcx
- add rbp,8
-
- mov (-8)[rsi],rax
- sub rsi,15
-
- mov [rdx],rsi
- dec rsi
-
- mov (-8)[rbp],rsi
-
- sub rbx,1
- jae copy_lp2
- ret
-
-copy_normal_hnf_0_2:
- ifdef NEW_DESCRIPTORS
- sub rcx,2-(-8)
- else
- sub rcx,2-(-12)
- endif
- sub rbx,1
-
- mov [rbp],rcx
- lea rbp,8[rbp]
- jae copy_lp2
- ret
-
-already_copied_2:
- dec rcx
- sub rbx,1
-
- mov [rbp],rcx
- lea rbp,8[rbp]
-
- jae copy_lp2
- ret
-
-copy_record_2:
- sub rax,258
- ja copy_record_node2_3
-
- if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
- jb copy_record_node2_1
-
- cmp word ptr (-2+2)[rcx],0
- je copy_record_node2_bb
-
- mov qword ptr [rbp],rdi
- mov qword ptr [rdi],rcx
-
- lea rcx,1[rdi]
- mov rax,qword ptr 8[rdx]
-
- mov qword ptr [rdx],rcx
-
- mov qword ptr 8[rdi],rax
- mov rax,qword ptr 16[rdx]
-
- add rbp,8
- mov qword ptr 16[rdi],rax
-
- add rdi,24
- sub rbx,1
- jae copy_lp2
- ret
-
-copy_record_node2_1:
- mov rax,qword ptr 8[rdx]
-
- cmp word ptr (-2+2)[rcx],0
- je copy_record_node2_1_b
-
- mov qword ptr [rbp],rdi
- mov qword ptr [rdi],rcx
-
- lea rcx,1[rdi]
- mov qword ptr 8[rdi],rax
-
- mov qword ptr [rdx],rcx
- add rbp,8
-
- add rdi,16
- sub rbx,1
- jae copy_lp2
- ret
-
-copy_record_node2_bb:
- mov (-24)[rsi],rcx
- sub rsi,24-1
-
- mov [rdx],rsi
- dec rsi
-
- mov rax,8[rdx]
- mov rcx,16[rdx]
-
- mov [rbp],rsi
- add rbp,8
-
- mov 8[rsi],rax
- sub rbx,1
-
- mov 16[rsi],rcx
-
- jae copy_lp2
- ret
- else
- mov qword ptr [rbp],rdi
- mov qword ptr [rdi],rcx
-
- lea rcx,1[rdi]
- mov rax,qword ptr 8[rdx]
-
- mov qword ptr [rdx],rcx
- jb copy_record_node2_1
-
- mov qword ptr 8[rdi],rax
- mov rax,qword ptr 16[rdx]
-
- add rbp,8
- mov qword ptr 16[rdi],rax
-
- add rdi,24
- sub rbx,1
- jae copy_lp2
- ret
-
-copy_record_node2_1:
- add rbp,8
- mov qword ptr 8[rdi],rax
-
- add rdi,16
- sub rbx,1
- jae copy_lp2
- ret
- endif
-
-copy_record_node2_3:
- if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
- cmp word ptr (-2+2)[rcx],1
- jbe copy_record_node2_3_ab_or_b
- endif
-
- push rax
- lea rax,1[rdi]
-
- mov qword ptr [rdx],rax
- mov rax,qword ptr 16[rdx]
-
- mov qword ptr [rdi],rcx
- mov rdx,qword ptr 8[rdx]
-
- if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
- mov qword ptr 8[rdi],rdx
- mov qword ptr [rbp],rdi
- add rbp,8
-
- mov rcx,rax
- test byte ptr [rax],1
- jne record_arguments_already_copied_2
- else
- mov rcx,rax
- if THREAD
- sub rax,qword ptr heap_p1_offset[r9]
- else
- sub rax,qword ptr heap_p1
- endif
-
- shr rax,4
- mov qword ptr 8[rdi],rdx
-
- mov rdx,rax
- and rax,31
-
- shr rdx,3
- mov qword ptr [rbp],rdi
-
- and rdx,-4
- mov eax,dword ptr (bit_set_table)[rax*4]
-
- if THREAD
- add rdx,qword ptr heap_copied_vector_offset[r9]
- else
- add rdx,qword ptr heap_copied_vector
- endif
- add rbp,8
-
- test eax,[rdx]
- jne record_arguments_already_copied_2
-
- or [rdx],eax
- endif
- lea rdx,24[rdi]
-
- pop rax
- mov qword ptr 16[rdi],rdx
-
- add rdi,25
- mov rdx,qword ptr [rcx]
-
- mov qword ptr [rcx],rdi
- add rcx,8
-
- mov qword ptr (-1)[rdi],rdx
- add rdi,7
-
-cp_record_arg_lp2:
- mov rdx,qword ptr [rcx]
- add rcx,8
-
- mov qword ptr [rdi],rdx
- add rdi,8
-
- sub rax,1
- jne cp_record_arg_lp2
-
- sub rbx,1
- jae copy_lp2
- ret
-
-record_arguments_already_copied_2:
- mov rdx,qword ptr [rcx]
- pop rax
-
- mov qword ptr 16[rdi],rdx
- add rdi,24
-
- sub rbx,1
- jae copy_lp2
- ret
-
- if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
-copy_record_node2_3_ab_or_b:
- jb copy_record_node2_3_b
-
- push rax
- lea rax,1[rdi]
-
- mov qword ptr [rdx],rax
- mov rax,qword ptr 16[rdx]
-
- mov qword ptr [rdi],rcx
- mov rdx,qword ptr 8[rdx]
-
- mov rcx,rax
- if THREAD
- sub rax,qword ptr heap_p1_offset[r9]
- else
- sub rax,qword ptr heap_p1
- endif
-
- shr rax,4
- mov qword ptr 8[rdi],rdx
-
- mov rdx,rax
- and rax,31
-
- shr rdx,3
- mov qword ptr [rbp],rdi
-
- and rdx,-4
- mov eax,dword ptr (bit_set_table)[rax*4]
-
- if THREAD
- add rdx,qword ptr heap_copied_vector_offset[r9]
- else
- add rdx,qword ptr heap_copied_vector
- endif
- add rbp,8
-
- test eax,[rdx]
- jne record_arguments_already_copied_2
-
- or [rdx],eax
- pop rax
-
- sub rsi,8
-
- shl rax,3
- sub rsi,rax
-
- push rsi
- add rsi,1
-
- mov qword ptr 16[rdi],rsi
- add rdi,24
-
- mov rdx,qword ptr [rcx]
- jmp cp_record_arg_lp3_c
-
-copy_record_node2_3_b:
- push rax
- lea rax,(-24+1)[rsi]
-
- mov qword ptr [rdx],rax
- mov rax,qword ptr 16[rdx]
-
- mov qword ptr (-24)[rsi],rcx
- mov rdx,qword ptr 8[rdx]
-
- mov rcx,rax
- if THREAD
- sub rax,qword ptr heap_p1_offset[r9]
- else
- sub rax,qword ptr heap_p1
- endif
-
- shr rax,4
- mov qword ptr (-16)[rsi],rdx
-
- mov rdx,rax
- and rax,31
- sub rsi,24
-
- shr rdx,3
- mov qword ptr [rbp],rsi
-
- and rdx,-4
- mov eax,dword ptr (bit_set_table)[rax*4]
-
- if THREAD
- add rdx,qword ptr heap_copied_vector_offset[r9]
- else
- add rdx,qword ptr heap_copied_vector
- endif
- add rbp,8
-
- test eax,[rdx]
- jne record_arguments_already_copied_3_b
-
- or [rdx],eax
- pop rax
-
- mov rdx,rsi
- sub rsi,8
-
- shl rax,3
- sub rsi,rax
-
- mov qword ptr 16[rdx],rsi
-
- mov rdx,qword ptr [rcx]
-
- push rsi
- add rsi,1
-
-cp_record_arg_lp3_c:
- mov qword ptr [rcx],rsi
- add rcx,8
- mov qword ptr (-1) [rsi],rdx
- add rsi,7
-
-cp_record_arg_lp3:
- mov rdx,qword ptr [rcx]
- add rcx,8
-
- mov qword ptr [rsi],rdx
- add rsi,8
-
- sub rax,8
- jne cp_record_arg_lp3
-
- pop rsi
-
- sub rbx,1
- jae copy_lp2
- ret
-
-record_arguments_already_copied_3_b:
- mov rdx,qword ptr [rcx]
- pop rax
-
- sub rdx,1
- mov qword ptr 16[rsi],rdx
-
- sub rbx,1
- jae copy_lp2
- ret
- endif
-
-not_in_hnf_2:
- test cl,1
- jne already_copied_2
-
- movsxd rax,dword ptr (-4)[rcx]
- test rax,rax
- jle copy_arity_0_node2_
-
-copy_node2_1_:
- and rax,255
- sub rax,2
- jl copy_arity_1_node2
-copy_node2_3:
- mov [rbp],rdi
- add rbp,8
- mov [rdi],rcx
- inc rdi
- mov [rdx],rdi
- mov rcx,8[rdx]
- add rdx,16
- mov (8-1)[rdi],rcx
- add rdi,16-1
-
-cp_arg_lp2:
- mov rcx,[rdx]
- add rdx,8
- mov [rdi],rcx
- add rdi,8
- sub rax,1
- jae cp_arg_lp2
-
- sub rbx,1
- jae copy_lp2
- ret
-
-copy_arity_1_node2:
-copy_arity_1_node2_:
- mov [rbp],rdi
- inc rdi
-
- add rbp,8
- mov [rdx],rdi
-
- mov rax,8[rdx]
- mov (-1)[rdi],rcx
-
- mov (8-1)[rdi],rax
- add rdi,24-1
-
- sub rbx,1
- jae copy_lp2
- ret
-
-copy_indirection_2:
- mov rax,rdx
- mov rdx,8[rdx]
-
- mov rcx,[rdx]
- test cl,2
- jne in_hnf_2
-
- test cl,1
- jne already_copied_2
-
- cmp dword ptr (-4)[rcx],-2
- je skip_indirections_2
-
- mov eax,(-4)[rcx]
- test rax,rax
- jle copy_arity_0_node2_
- jmp copy_node2_1_
-
-skip_indirections_2:
- mov rdx,8[rdx]
-
- mov rcx,[rdx]
- test cl,2
- jne update_indirection_list_2
- test cl,1
- jne update_indirection_list_2
-
- cmp dword ptr (-4)[rcx],-2
- je skip_indirections_2
-
-update_indirection_list_2:
- lea rcx,8[rax]
- mov rax,8[rax]
- mov [rcx],rdx
- cmp rdx,rax
- jne update_indirection_list_2
-
- jmp continue_after_selector_2
-
-copy_selector_2:
- cmp rax,-2
- je copy_indirection_2
- jl copy_record_selector_2
-
- mov rax,8[rdx]
- ifdef NEW_DESCRIPTORS
- mov d2,[rax]
- test d2b,2
- je copy_arity_1_node2_
-
- mov d3d,dword ptr (-8)[rcx]
-
- cmp word ptr (-2)[d2],2
- jbe copy_selector_2_
-
- mov d2,16[rax]
-
- test byte ptr [d2],1
- jne copy_arity_1_node2_
-
- movzx d3,word ptr 4[d3]
- mov qword ptr [rdx],offset __indirection
-
- cmp d3,16
- jl copy_selector_2_1
- je copy_selector_2_2
-
- mov rcx,qword ptr (-24)[d2+d3]
- mov qword ptr 8[rdx],rcx
- mov rdx,rcx
- jmp continue_after_selector_2
-
-copy_selector_2_1:
- mov rcx,qword ptr 8[rax]
- mov qword ptr 8[rdx],rcx
- mov rdx,rcx
- jmp continue_after_selector_2
-
-copy_selector_2_2:
- mov rcx,qword ptr [d2]
- mov qword ptr 8[rdx],rcx
- mov rdx,rcx
- jmp continue_after_selector_2
-
-copy_selector_2_:
- movzx d3,word ptr 4[d3]
- mov qword ptr [rdx],offset __indirection
-
- mov rcx,qword ptr [rax+d3]
- mov qword ptr 8[rdx],rcx
- mov rdx,rcx
- jmp continue_after_selector_2
- else
- mov rax,[rax]
- test al,2
- je copy_arity_1_node2_
-
- cmp word ptr (-2)[rax],2
- jbe copy_selector_2_
-
- if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
-copy_selector_2__:
- endif
- mov rax,8[rdx]
- mov rax,16[rax]
- test byte ptr [rax],1
- jne copy_arity_1_node2_
-
-copy_selector_2_:
- mov eax,(-8)[rcx]
-
- mov rcx,8[rdx]
- push rdx
- push rbp
- mov eax,4[rax]
- call near ptr rax
- pop rbp
- pop rdx
-
- mov qword ptr [rdx],offset __indirection
- mov 8[rdx],rcx
-
- mov rdx,rcx
- jmp continue_after_selector_2
- endif
-
-copy_record_selector_2:
- cmp rax,-3
- mov rax,qword ptr 8[rdx]
- mov d2,qword ptr [rax]
- je copy_strict_record_selector_2
-
- test d2b,2
- je copy_arity_1_node2_
-
- mov d3d,dword ptr (-8)[rcx]
-
- cmp word ptr (-2)[d2],258
- ifdef NEW_DESCRIPTORS
- jbe copy_record_selector_2_
- else
- jbe copy_selector_2_
- endif
-
- if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
- cmp word ptr (-2+2)[d2],2
- jae copy_selector_2__
- endif
-
- mov d4,qword ptr 16[rax]
-
- lea d2,(-24)[d4]
- if THREAD
- sub d4,qword ptr heap_p1_offset[r9]
- else
- sub d4,qword ptr heap_p1
- endif
-
- mov d5,d4
- and d4,31*16
-
- shr d5,7
-
- shr d4,2
- and d5,-4
-
- if THREAD
- add d5,qword ptr heap_copied_vector_offset[r9]
- else
- add d5,qword ptr heap_copied_vector
- endif
-
- mov d4d,dword ptr (bit_set_table)[d4]
-
- and d4d,dword ptr [d5]
-
- ifdef NEW_DESCRIPTORS
- if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
- je copy_record_selector_2_
- jmp copy_arity_1_node2_
-copy_selector_2__:
- mov d4,qword ptr 16[rax]
- lea d2,(-24)[d4]
- test byte ptr [d4],1
- jne copy_arity_1_node2_
- else
- jne copy_arity_1_node2_
- endif
-copy_record_selector_2_:
- movzx d3,word ptr 4[d3]
- mov qword ptr [rdx],offset __indirection
-
- cmp d3,16
- jle copy_record_selector_3
- mov rax,d2
-copy_record_selector_3:
- mov rcx,qword ptr [rax+d3]
- mov qword ptr 8[rdx],rcx
- mov rdx,rcx
- jmp continue_after_selector_2
- else
- jne copy_arity_1_node2_
- jmp copy_selector_2_
- endif
-
-copy_strict_record_selector_2:
- test d2b,2
- je copy_arity_1_node2_
-
- mov d3d,dword ptr (-8)[rcx]
-
- cmp word ptr (-2)[d2],258
- jbe copy_strict_record_selector_2_
-
- if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP
- cmp word ptr (-2+2)[d2],2
- jb copy_strict_record_selector_2_b
-
- mov d4,qword ptr 16[rax]
- lea d2,(-24)[d4]
- test byte ptr [d4],1
- jne copy_arity_1_node2_
-
- jmp copy_strict_record_selector_2_
-
-copy_strict_record_selector_2_b:
- endif
-
- mov d4,qword ptr 16[rax]
-
- lea d2,(-24)[d4]
- if THREAD
- sub d4,qword ptr heap_p1_offset[r9]
- else
- sub d4,qword ptr heap_p1
- endif
-
- mov d5,d4
- and d4,31*16
-
- shr d5,7
-
- shr d4,2
- and d5,-4
-
- if THREAD
- add d5,qword ptr heap_copied_vector_offset[r9]
- else
- add d5,qword ptr heap_copied_vector
- endif
-
- mov d4d,dword ptr (bit_set_table)[d4]
-
- and d4d,[d5]
-
- jne copy_arity_1_node2_
-
-copy_strict_record_selector_2_:
- ifdef NEW_DESCRIPTORS
- movzx rcx,word ptr 4[d3]
- cmp rcx,16
- jle copy_strict_record_selector_3
- mov rcx,qword ptr [d2+rcx]
- jmp copy_strict_record_selector_4
-copy_strict_record_selector_3:
- mov rcx,qword ptr [rax+rcx]
-copy_strict_record_selector_4:
- mov qword ptr 8[rdx],rcx
-
- movzx rcx,word ptr 6[d3]
- test rcx,rcx
- je copy_strict_record_selector_6
- cmp rcx,16
- jle copy_strict_record_selector_5
- mov rax,d2
-copy_strict_record_selector_5:
- mov rcx,qword ptr [rax+rcx]
- mov qword ptr 16[rdx],rcx
-copy_strict_record_selector_6:
-
- mov rcx,qword ptr (-8)[d3]
- mov qword ptr [rdx],rcx
- jmp in_hnf_2
- else
- mov rcx,rdx
- mov rdx,qword ptr 8[rdx]
-
- push rbp
- mov eax,4[d3]
- call near ptr rax
- pop rbp
-
- mov rdx,rcx
- mov rcx,qword ptr [rcx]
- test cl,2
- jne in_hnf_2
- hlt
- endif
-
-copy_arity_0_node2_:
- jl copy_selector_2
-
- mov (-24)[rsi],rcx
- sub rsi,24
- mov [rbp],rsi
- lea rax,1[rsi]
-
- add rbp,8
- mov [rdx],rax
-
- sub rbx,1
- jae copy_lp2
- ret
-
-copy_string_or_array_2:
- mov rcx,rdx
- jne copy_array_2
-
- if THREAD
- sub rdx,heap_p1_offset[r9]
- cmp rdx,semi_space_size_offset[r9]
- else
- sub rdx,heap_p1
- cmp rdx,semi_space_size
- endif
- jae copy_string_or_array_constant
-
- mov rdx,8[rcx]
- add rbp,8
-
- add rdx,7
- push rbx
-
- mov rax,rdx
- and rdx,-8
-
- shr rax,3
- sub rsi,rdx
-
- mov rbx,[rcx]
- add rcx,8
-
- mov (-16)[rsi],rbx
- sub rsi,16
-
- mov (-8)[rbp],rsi
- lea rdx,1[rsi]
-
- mov (-8)[rcx],rdx
- lea rdx,8[rsi]
-
-cp_s_arg_lp2:
- mov rbx,[rcx]
- add rcx,8
-
- mov [rdx],rbx
- add rdx,8
-
- sub rax,1
- jge cp_s_arg_lp2
-
- pop rbx
- sub rbx,1
- jae copy_lp2
- ret
-
-copy_array_2:
- if THREAD
- sub rdx,heap_p1_offset[r9]
- cmp rdx,semi_space_size_offset[r9]
- else
- sub rdx,heap_p1
- cmp rdx,semi_space_size
- endif
- jae copy_string_or_array_constant
-
- push rbx
-
- mov rax,qword ptr 16[rcx]
- test rax,rax
- je copy_array_a2
-
- movzx rbx,word ptr (-2)[rax]
-
- test rbx,rbx
- je copy_strict_basic_array_2
-
- sub rbx,256
- imul rbx,qword ptr 8[rcx]
- jmp copy_array_a3
-
-copy_array_a2:
- mov rbx,qword ptr 8[rcx]
-copy_array_a3:
- mov rdx,rdi
- lea rdi,24[rdi+rbx*8]
-
- mov qword ptr [rbp],rdx
- mov rax,qword ptr [rcx]
-
- add rbp,8
- mov qword ptr [rdx],rax
-
- lea rax,1[rdx]
- add rdx,8
-
- mov qword ptr [rcx],rax
- add rcx,8
-
- lea rax,1[rbx]
- jmp cp_s_arg_lp2
-
-copy_strict_basic_array_2:
- mov rbx,qword ptr 8[rcx]
-
- cmp rax,offset dINT+2
- jle copy_int_or_real_array_2
-
- cmp rax,offset BOOL+2
- je copy_bool_array_2
-
-copy_int32_or_real32_array_2:
- add rbx,1
- shr rbx,1
-
-copy_int_or_real_array_2:
- shl rbx,3
- lea rdx,(-24)[rsi]
-
- sub rdx,rbx
- mov rax,qword ptr [rcx]
-
- shr rbx,3
- mov qword ptr [rbp],rdx
-
- add rbp,8
- mov rsi,rdx
-
- mov qword ptr [rdx],rax
- lea rax,1[rdx]
-
- add rdx,8
- mov qword ptr [rcx],rax
-
- add rcx,8
- lea rax,1[rbx]
- jmp cp_s_arg_lp2
-
-copy_bool_array_2:
- add rbx,7
- shr rbx,3
- jmp copy_int_or_real_array_2
-
-copy_string_or_array_constant:
- mov qword ptr [rbp],rcx
- add rbp,8
-
- sub rbx,1
- jae copy_lp2
- ret
-
-end_copy1:
- if THREAD
- mov heap_end_after_gc_offset[r9],rsi
- else
- mov heap_end_after_gc,rsi
- endif
-
- mov rcx,offset finalizer_list
- mov rdx,offset free_finalizer_list
- mov rbp,qword ptr finalizer_list
-
-determine_free_finalizers_after_copy:
- mov rax,qword ptr [rbp]
- test al,1
- je finalizer_not_used_after_copy
-
- mov rbp,qword ptr 8[rbp]
- sub rax,1
- mov qword ptr [rcx],rax
- lea rcx,8[rax]
- jmp determine_free_finalizers_after_copy
-
-finalizer_not_used_after_copy:
- if THREAD
- lea rax,__Nil-8
- cmp rbp,rax
- else
- lea r9,__Nil-8
- cmp rbp,r9
- endif
- je end_finalizers_after_copy
-
- mov qword ptr [rdx],rbp
- lea rdx,8[rbp]
- mov rbp,qword ptr 8[rbp]
- jmp determine_free_finalizers_after_copy
-
-end_finalizers_after_copy:
- mov qword ptr [rcx],rbp
- mov qword ptr [rdx],rbp
+ +COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP = 1 + + push rsi + + if THREAD + mov rdi,heap_p2_offset[r9] + + mov rax,heap_size_257_offset[r9] + else + mov rdi,heap_p2 + + mov rax,heap_size_257 + endif + shl rax,7 + if THREAD + mov semi_space_size_offset[r9],rax + else + mov semi_space_size,rax + endif + lea rsi,[rdi+rax] + + if THREAD + mov qword ptr (heap2_begin_and_end_offset+8)[r9],rsi + else + mov qword ptr (heap2_begin_and_end+8),rsi + endif + + mov rax,qword ptr caf_list + test rax,rax + je end_copy_cafs + +copy_cafs_lp: + push (-8)[rax] + + lea rbp,8[rax] + mov rbx,qword ptr [rax] + sub rbx,1 + call copy_lp2 + + pop rax + test rax,rax + jne copy_cafs_lp + +end_copy_cafs: + mov rbx,qword ptr [rsp] + if THREAD + mov rbp,stack_p_offset[r9] + else + mov rbp,stack_p + endif + sub rbx,rbp + shr rbx,3 + + sub rbx,1 + jb end_copy0 + call copy_lp2 +end_copy0: + if THREAD + mov rbp,heap_p2_offset[r9] + else + mov rbp,heap_p2 + endif + + jmp copy_lp1 +; +; Copy all referenced nodes to the other semi space +; + +in_hnf_1_2: + dec rbx +copy_lp2_lp1: + call copy_lp2 +copy_lp1: + cmp rbp,rdi + jae end_copy1 + + mov rax,[rbp] + add rbp,8 + test al,2 + je not_in_hnf_1 +in_hnf_1: + movzx rbx,word ptr (-2)[rax] + + test rbx,rbx + je copy_array_21 + + cmp rbx,2 + jbe in_hnf_1_2 + + cmp rbx,256 + jae copy_record_21 + + mov rax,8[rbp] + + test al,1 + jne node_without_arguments_part + + push rbx + xor rbx,rbx + + call copy_lp2 + + pop rbx + add rbp,8 + + sub rbx,2 + jmp copy_lp2_lp1 + +node_without_arguments_part: + dec rax + xor rbx,rbx + + mov 8[rbp],rax + call copy_lp2 + + add rbp,8 + jmp copy_lp1 + +copy_record_21: + sub rbx,258 + ja copy_record_arguments_3 + + movzx rbx,word ptr (-2+2)[rax] + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + jb in_hnf_1_2 + + sub rbx,1 + ja copy_lp2_lp1 + jmp copy_node_arity1 + else + jb copy_record_arguments_1 + + sub rbx,1 + ja copy_lp2_lp1 + je copy_node_arity1 + add rbp,16 + jmp copy_lp1 + +copy_record_arguments_1: + dec rbx + jmp copy_lp2_lp1 + je copy_lp2_lp1 + add rbp,8 + jmp copy_lp1 + endif + +copy_record_arguments_3: + test byte ptr 8[rbp],1 + jne record_node_without_arguments_part + + movzx rdx,word ptr (-2+2)[rax] + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + sub rdx,1 + else + test rdx,rdx + je copy_record_arguments_3b + sub rdx,1 + je copy_record_arguments_3abb + endif + + lea rcx,(3*8)[rbp+rbx*8] + push rcx + push rdx + + sub rbx,rbx + call copy_lp2 + + add rbp,8 + pop rbx + dec rbx + call copy_lp2 + + pop rbp + jmp copy_lp1 + + ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP +copy_record_arguments_3abb: + push rbx + sub rbx,rbx + + call copy_lp2 + + pop rbx + + lea rbp,(2*8)[rbp+rbx*8] + jmp copy_lp1 + +copy_record_arguments_3b: + lea rbp,(3*8)[rbp+rbx*8] + jmp copy_lp1 + endif + +record_node_without_arguments_part: + and qword ptr 8[rbp],-2 + + ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + cmp word ptr (-2+2)[rax],0 + je record_node_without_arguments_part_3b + endif + + sub rbx,rbx + call copy_lp2 + + add rbp,8 + jmp copy_lp1 + + ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP +record_node_without_arguments_part_3b: + add rbp,16 + jmp copy_lp1 + endif + +not_in_hnf_1: + movsxd rbx,dword ptr (-4)[rax] + cmp rbx,257 + jge copy_unboxed_closure_arguments + sub rbx,1 + jg copy_lp2_lp1 + +copy_node_arity1: + xor rbx,rbx + call copy_lp2 + + add rbp,8 + jmp copy_lp1 + +copy_unboxed_closure_arguments: + je copy_unboxed_closure_arguments1 + + xor rax,rax + mov al,bh + and rbx,255 + sub rbx,rax + + sub rbx,1 + jl copy_unboxed_closure_arguments_without_pointers + + push rax + call copy_lp2 + pop rax + +copy_unboxed_closure_arguments_without_pointers: + lea rbp,[rbp+rax*8] + jmp copy_lp1 + +copy_unboxed_closure_arguments1: + add rbp,16 + jmp copy_lp1 + +copy_array_21: + mov rbx,qword ptr 8[rbp] + add rbp,16 + test rbx,rbx + je copy_array_21_a + + movzx rax,word ptr (-2)[rbx] + movzx rbx,word ptr (-2+2)[rbx] + sub rax,256 + test rbx,rbx + je copy_array_21_b + + cmp rbx,rax + je copy_array_21_r_a + +copy_array_21_ab: + cmp qword ptr (-16)[rbp],0 + je copy_lp1 + + sub rax,rbx + shl rax,3 + sub rbx,1 + + push rbx + push rax + mov rbx,qword ptr (-16)[rbp] + sub rbx,1 + push rbx + +copy_array_21_lp_ab: + mov rbx,qword ptr 16[rsp] + call copy_lp2 + + add rbp,qword ptr 8[rsp] + sub qword ptr [rsp],1 + jnc copy_array_21_lp_ab + + add rsp,24 + jmp copy_lp1 + +copy_array_21_b: + mov rbx,qword ptr (-16)[rbp] + imul rbx,rax + lea rbp,[rbp+rbx*8] + jmp copy_lp1 + +copy_array_21_r_a: + mov rbx,qword ptr (-16)[rbp] + imul rbx,rax + sub rbx,1 + jc copy_lp1 + jmp copy_lp2_lp1 + +copy_array_21_a: + mov rbx,qword ptr (-16)[rbp] + sub rbx,1 + jc copy_lp1 + jmp copy_lp2_lp1 + +; +; Copy nodes to the other semi-space +; + +copy_lp2: + mov rdx,qword ptr [rbp] + +; selectors: +continue_after_selector_2: + mov rcx,qword ptr [rdx] + test cl,2 + je not_in_hnf_2 + +in_hnf_2: + movzx rax,word ptr (-2)[rcx] + test rax,rax + je copy_arity_0_node2 + + cmp rax,256 + jae copy_record_2 + + sub rax,2 + mov [rbp],rdi + + lea rbp,8[rbp ] + ja copy_hnf_node2_3 + + mov [rdi],rcx + jb copy_hnf_node2_1 + + inc rdi + mov rcx,8[rdx] + + mov [rdx],rdi + mov rax,16[rdx] + + sub rbx,1 + mov (8-1)[rdi],rcx + + mov (16-1)[rdi],rax + lea rdi,(24-1)[rdi] + + jae copy_lp2 + ret + +copy_hnf_node2_1: + inc rdi + mov rax,8[rdx] + + sub rbx,1 + mov [rdx],rdi + + mov (8-1)[rdi],rax + lea rdi,(16-1)[rdi] + + jae copy_lp2 + ret + +copy_hnf_node2_3: + mov [rdi],rcx + inc rdi + + mov [rdx],rdi + mov rcx,8[rdx] + + mov (8-1)[rdi],rcx + mov rcx,16[rdx] + + add rdi,24-1 + mov rdx,[rcx] + + test dl,1 + jne arguments_already_copied_2 + + mov (-8)[rdi],rdi + add rcx,8 + + mov [rdi],rdx + inc rdi + + mov (-8)[rcx],rdi + add rdi,8-1 + +cp_hnf_arg_lp2: + mov rdx,[rcx] + add rcx,8 + + mov [rdi],rdx + add rdi,8 + + dec rax + jne cp_hnf_arg_lp2 + + sub rbx,1 + jae copy_lp2 + ret + +arguments_already_copied_2: + mov (-8)[rdi],rdx + + sub rbx,1 + jae copy_lp2 + ret + +copy_arity_0_node2: + cmp rcx,offset __STRING__+2 + jbe copy_string_or_array_2 + + cmp rcx,offset CHAR+2 + ja copy_normal_hnf_0_2 + +copy_int_bool_or_char_2: + mov rax,8[rdx] + je copy_char_2 + + cmp rcx,offset dINT+2 + jne no_small_int_or_char_2 + +copy_int_2: + cmp rax,33 + jae no_small_int_or_char_2 + + shl rax,4 + add rbp,8 + + add rax,offset small_integers + sub rbx,1 + + mov (-8)[rbp],rax + jae copy_lp2 + ret + +copy_char_2: + and rax,255 + + shl rax,4 + add rbp,8 + + add rax,offset static_characters + sub rbx,1 + + mov (-8)[rbp],rax + jae copy_lp2 + ret + +no_small_int_or_char_2: + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP +copy_record_node2_1_b: + endif + mov (-16)[rsi],rcx + add rbp,8 + + mov (-8)[rsi],rax + sub rsi,15 + + mov [rdx],rsi + dec rsi + + mov (-8)[rbp],rsi + + sub rbx,1 + jae copy_lp2 + ret + +copy_normal_hnf_0_2: + ifdef NEW_DESCRIPTORS + sub rcx,2-(-8) + else + sub rcx,2-(-12) + endif + sub rbx,1 + + mov [rbp],rcx + lea rbp,8[rbp] + jae copy_lp2 + ret + +already_copied_2: + dec rcx + sub rbx,1 + + mov [rbp],rcx + lea rbp,8[rbp] + + jae copy_lp2 + ret + +copy_record_2: + sub rax,258 + ja copy_record_node2_3 + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + jb copy_record_node2_1 + + cmp word ptr (-2+2)[rcx],0 + je copy_record_node2_bb + + mov qword ptr [rbp],rdi + mov qword ptr [rdi],rcx + + lea rcx,1[rdi] + mov rax,qword ptr 8[rdx] + + mov qword ptr [rdx],rcx + + mov qword ptr 8[rdi],rax + mov rax,qword ptr 16[rdx] + + add rbp,8 + mov qword ptr 16[rdi],rax + + add rdi,24 + sub rbx,1 + jae copy_lp2 + ret + +copy_record_node2_1: + mov rax,qword ptr 8[rdx] + + cmp word ptr (-2+2)[rcx],0 + je copy_record_node2_1_b + + mov qword ptr [rbp],rdi + mov qword ptr [rdi],rcx + + lea rcx,1[rdi] + mov qword ptr 8[rdi],rax + + mov qword ptr [rdx],rcx + add rbp,8 + + add rdi,16 + sub rbx,1 + jae copy_lp2 + ret + +copy_record_node2_bb: + mov (-24)[rsi],rcx + sub rsi,24-1 + + mov [rdx],rsi + dec rsi + + mov rax,8[rdx] + mov rcx,16[rdx] + + mov [rbp],rsi + add rbp,8 + + mov 8[rsi],rax + sub rbx,1 + + mov 16[rsi],rcx + + jae copy_lp2 + ret + else + mov qword ptr [rbp],rdi + mov qword ptr [rdi],rcx + + lea rcx,1[rdi] + mov rax,qword ptr 8[rdx] + + mov qword ptr [rdx],rcx + jb copy_record_node2_1 + + mov qword ptr 8[rdi],rax + mov rax,qword ptr 16[rdx] + + add rbp,8 + mov qword ptr 16[rdi],rax + + add rdi,24 + sub rbx,1 + jae copy_lp2 + ret + +copy_record_node2_1: + add rbp,8 + mov qword ptr 8[rdi],rax + + add rdi,16 + sub rbx,1 + jae copy_lp2 + ret + endif + +copy_record_node2_3: + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + cmp word ptr (-2+2)[rcx],1 + jbe copy_record_node2_3_ab_or_b + endif + + push rax + lea rax,1[rdi] + + mov qword ptr [rdx],rax + mov rax,qword ptr 16[rdx] + + mov qword ptr [rdi],rcx + mov rdx,qword ptr 8[rdx] + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + mov qword ptr 8[rdi],rdx + mov qword ptr [rbp],rdi + add rbp,8 + + mov rcx,rax + test byte ptr [rax],1 + jne record_arguments_already_copied_2 + else + mov rcx,rax + if THREAD + sub rax,qword ptr heap_p1_offset[r9] + else + sub rax,qword ptr heap_p1 + endif + + shr rax,4 + mov qword ptr 8[rdi],rdx + + mov rdx,rax + and rax,31 + + shr rdx,3 + mov qword ptr [rbp],rdi + + and rdx,-4 + mov eax,dword ptr (bit_set_table)[rax*4] + + if THREAD + add rdx,qword ptr heap_copied_vector_offset[r9] + else + add rdx,qword ptr heap_copied_vector + endif + add rbp,8 + + test eax,[rdx] + jne record_arguments_already_copied_2 + + or [rdx],eax + endif + lea rdx,24[rdi] + + pop rax + mov qword ptr 16[rdi],rdx + + add rdi,25 + mov rdx,qword ptr [rcx] + + mov qword ptr [rcx],rdi + add rcx,8 + + mov qword ptr (-1)[rdi],rdx + add rdi,7 + +cp_record_arg_lp2: + mov rdx,qword ptr [rcx] + add rcx,8 + + mov qword ptr [rdi],rdx + add rdi,8 + + sub rax,1 + jne cp_record_arg_lp2 + + sub rbx,1 + jae copy_lp2 + ret + +record_arguments_already_copied_2: + mov rdx,qword ptr [rcx] + pop rax + + mov qword ptr 16[rdi],rdx + add rdi,24 + + sub rbx,1 + jae copy_lp2 + ret + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP +copy_record_node2_3_ab_or_b: + jb copy_record_node2_3_b + + push rax + lea rax,1[rdi] + + mov qword ptr [rdx],rax + mov rax,qword ptr 16[rdx] + + mov qword ptr [rdi],rcx + mov rdx,qword ptr 8[rdx] + + mov rcx,rax + if THREAD + sub rax,qword ptr heap_p1_offset[r9] + else + sub rax,qword ptr heap_p1 + endif + + shr rax,4 + mov qword ptr 8[rdi],rdx + + mov rdx,rax + and rax,31 + + shr rdx,3 + mov qword ptr [rbp],rdi + + and rdx,-4 + mov eax,dword ptr (bit_set_table)[rax*4] + + if THREAD + add rdx,qword ptr heap_copied_vector_offset[r9] + else + add rdx,qword ptr heap_copied_vector + endif + add rbp,8 + + test eax,[rdx] + jne record_arguments_already_copied_2 + + or [rdx],eax + pop rax + + sub rsi,8 + + shl rax,3 + sub rsi,rax + + push rsi + add rsi,1 + + mov qword ptr 16[rdi],rsi + add rdi,24 + + mov rdx,qword ptr [rcx] + jmp cp_record_arg_lp3_c + +copy_record_node2_3_b: + push rax + lea rax,(-24+1)[rsi] + + mov qword ptr [rdx],rax + mov rax,qword ptr 16[rdx] + + mov qword ptr (-24)[rsi],rcx + mov rdx,qword ptr 8[rdx] + + mov rcx,rax + if THREAD + sub rax,qword ptr heap_p1_offset[r9] + else + sub rax,qword ptr heap_p1 + endif + + shr rax,4 + mov qword ptr (-16)[rsi],rdx + + mov rdx,rax + and rax,31 + sub rsi,24 + + shr rdx,3 + mov qword ptr [rbp],rsi + + and rdx,-4 + mov eax,dword ptr (bit_set_table)[rax*4] + + if THREAD + add rdx,qword ptr heap_copied_vector_offset[r9] + else + add rdx,qword ptr heap_copied_vector + endif + add rbp,8 + + test eax,[rdx] + jne record_arguments_already_copied_3_b + + or [rdx],eax + pop rax + + mov rdx,rsi + sub rsi,8 + + shl rax,3 + sub rsi,rax + + mov qword ptr 16[rdx],rsi + + mov rdx,qword ptr [rcx] + + push rsi + add rsi,1 + +cp_record_arg_lp3_c: + mov qword ptr [rcx],rsi + add rcx,8 + mov qword ptr (-1) [rsi],rdx + add rsi,7 + +cp_record_arg_lp3: + mov rdx,qword ptr [rcx] + add rcx,8 + + mov qword ptr [rsi],rdx + add rsi,8 + + sub rax,8 + jne cp_record_arg_lp3 + + pop rsi + + sub rbx,1 + jae copy_lp2 + ret + +record_arguments_already_copied_3_b: + mov rdx,qword ptr [rcx] + pop rax + + sub rdx,1 + mov qword ptr 16[rsi],rdx + + sub rbx,1 + jae copy_lp2 + ret + endif + +not_in_hnf_2: + test cl,1 + jne already_copied_2 + + movsxd rax,dword ptr (-4)[rcx] + test rax,rax + jle copy_arity_0_node2_ + +copy_node2_1_: + and rax,255 + sub rax,2 + jl copy_arity_1_node2 +copy_node2_3: + mov [rbp],rdi + add rbp,8 + mov [rdi],rcx + inc rdi + mov [rdx],rdi + mov rcx,8[rdx] + add rdx,16 + mov (8-1)[rdi],rcx + add rdi,16-1 + +cp_arg_lp2: + mov rcx,[rdx] + add rdx,8 + mov [rdi],rcx + add rdi,8 + sub rax,1 + jae cp_arg_lp2 + + sub rbx,1 + jae copy_lp2 + ret + +copy_arity_1_node2: +copy_arity_1_node2_: + mov [rbp],rdi + inc rdi + + add rbp,8 + mov [rdx],rdi + + mov rax,8[rdx] + mov (-1)[rdi],rcx + + mov (8-1)[rdi],rax + add rdi,24-1 + + sub rbx,1 + jae copy_lp2 + ret + +copy_indirection_2: + mov rax,rdx + mov rdx,8[rdx] + + mov rcx,[rdx] + test cl,2 + jne in_hnf_2 + + test cl,1 + jne already_copied_2 + + cmp dword ptr (-4)[rcx],-2 + je skip_indirections_2 + + mov eax,(-4)[rcx] + test rax,rax + jle copy_arity_0_node2_ + jmp copy_node2_1_ + +skip_indirections_2: + mov rdx,8[rdx] + + mov rcx,[rdx] + test cl,2 + jne update_indirection_list_2 + test cl,1 + jne update_indirection_list_2 + + cmp dword ptr (-4)[rcx],-2 + je skip_indirections_2 + +update_indirection_list_2: + lea rcx,8[rax] + mov rax,8[rax] + mov [rcx],rdx + cmp rdx,rax + jne update_indirection_list_2 + + jmp continue_after_selector_2 + +copy_selector_2: + cmp rax,-2 + je copy_indirection_2 + jl copy_record_selector_2 + + mov rax,8[rdx] + ifdef NEW_DESCRIPTORS + mov d2,[rax] + test d2b,2 + je copy_arity_1_node2_ + + mov d3d,dword ptr (-8)[rcx] + + cmp word ptr (-2)[d2],2 + jbe copy_selector_2_ + + mov d2,16[rax] + + test byte ptr [d2],1 + jne copy_arity_1_node2_ + + movzx d3,word ptr 4[d3] + mov qword ptr [rdx],offset __indirection + + cmp d3,16 + jl copy_selector_2_1 + je copy_selector_2_2 + + mov rcx,qword ptr (-24)[d2+d3] + mov qword ptr 8[rdx],rcx + mov rdx,rcx + jmp continue_after_selector_2 + +copy_selector_2_1: + mov rcx,qword ptr 8[rax] + mov qword ptr 8[rdx],rcx + mov rdx,rcx + jmp continue_after_selector_2 + +copy_selector_2_2: + mov rcx,qword ptr [d2] + mov qword ptr 8[rdx],rcx + mov rdx,rcx + jmp continue_after_selector_2 + +copy_selector_2_: + movzx d3,word ptr 4[d3] + mov qword ptr [rdx],offset __indirection + + mov rcx,qword ptr [rax+d3] + mov qword ptr 8[rdx],rcx + mov rdx,rcx + jmp continue_after_selector_2 + else + mov rax,[rax] + test al,2 + je copy_arity_1_node2_ + + cmp word ptr (-2)[rax],2 + jbe copy_selector_2_ + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP +copy_selector_2__: + endif + mov rax,8[rdx] + mov rax,16[rax] + test byte ptr [rax],1 + jne copy_arity_1_node2_ + +copy_selector_2_: + mov eax,(-8)[rcx] + + mov rcx,8[rdx] + push rdx + push rbp + mov eax,4[rax] + call near ptr rax + pop rbp + pop rdx + + mov qword ptr [rdx],offset __indirection + mov 8[rdx],rcx + + mov rdx,rcx + jmp continue_after_selector_2 + endif + +copy_record_selector_2: + cmp rax,-3 + mov rax,qword ptr 8[rdx] + mov d2,qword ptr [rax] + je copy_strict_record_selector_2 + + test d2b,2 + je copy_arity_1_node2_ + + mov d3d,dword ptr (-8)[rcx] + + cmp word ptr (-2)[d2],258 + ifdef NEW_DESCRIPTORS + jbe copy_record_selector_2_ + else + jbe copy_selector_2_ + endif + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + cmp word ptr (-2+2)[d2],2 + jae copy_selector_2__ + endif + + mov d4,qword ptr 16[rax] + + lea d2,(-24)[d4] + if THREAD + sub d4,qword ptr heap_p1_offset[r9] + else + sub d4,qword ptr heap_p1 + endif + + mov d5,d4 + and d4,31*16 + + shr d5,7 + + shr d4,2 + and d5,-4 + + if THREAD + add d5,qword ptr heap_copied_vector_offset[r9] + else + add d5,qword ptr heap_copied_vector + endif + + mov d4d,dword ptr (bit_set_table)[d4] + + and d4d,dword ptr [d5] + + ifdef NEW_DESCRIPTORS + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + je copy_record_selector_2_ + jmp copy_arity_1_node2_ +copy_selector_2__: + mov d4,qword ptr 16[rax] + lea d2,(-24)[d4] + test byte ptr [d4],1 + jne copy_arity_1_node2_ + else + jne copy_arity_1_node2_ + endif +copy_record_selector_2_: + movzx d3,word ptr 4[d3] + mov qword ptr [rdx],offset __indirection + + cmp d3,16 + jle copy_record_selector_3 + mov rax,d2 +copy_record_selector_3: + mov rcx,qword ptr [rax+d3] + mov qword ptr 8[rdx],rcx + mov rdx,rcx + jmp continue_after_selector_2 + else + jne copy_arity_1_node2_ + jmp copy_selector_2_ + endif + +copy_strict_record_selector_2: + test d2b,2 + je copy_arity_1_node2_ + + mov d3d,dword ptr (-8)[rcx] + + cmp word ptr (-2)[d2],258 + jbe copy_strict_record_selector_2_ + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + cmp word ptr (-2+2)[d2],2 + jb copy_strict_record_selector_2_b + + mov d4,qword ptr 16[rax] + lea d2,(-24)[d4] + test byte ptr [d4],1 + jne copy_arity_1_node2_ + + jmp copy_strict_record_selector_2_ + +copy_strict_record_selector_2_b: + endif + + mov d4,qword ptr 16[rax] + + lea d2,(-24)[d4] + if THREAD + sub d4,qword ptr heap_p1_offset[r9] + else + sub d4,qword ptr heap_p1 + endif + + mov d5,d4 + and d4,31*16 + + shr d5,7 + + shr d4,2 + and d5,-4 + + if THREAD + add d5,qword ptr heap_copied_vector_offset[r9] + else + add d5,qword ptr heap_copied_vector + endif + + mov d4d,dword ptr (bit_set_table)[d4] + + and d4d,[d5] + + jne copy_arity_1_node2_ + +copy_strict_record_selector_2_: + ifdef NEW_DESCRIPTORS + movzx rcx,word ptr 4[d3] + cmp rcx,16 + jle copy_strict_record_selector_3 + mov rcx,qword ptr [d2+rcx] + jmp copy_strict_record_selector_4 +copy_strict_record_selector_3: + mov rcx,qword ptr [rax+rcx] +copy_strict_record_selector_4: + mov qword ptr 8[rdx],rcx + + movzx rcx,word ptr 6[d3] + test rcx,rcx + je copy_strict_record_selector_6 + cmp rcx,16 + jle copy_strict_record_selector_5 + mov rax,d2 +copy_strict_record_selector_5: + mov rcx,qword ptr [rax+rcx] + mov qword ptr 16[rdx],rcx +copy_strict_record_selector_6: + + mov rcx,qword ptr (-8)[d3] + mov qword ptr [rdx],rcx + jmp in_hnf_2 + else + mov rcx,rdx + mov rdx,qword ptr 8[rdx] + + push rbp + mov eax,4[d3] + call near ptr rax + pop rbp + + mov rdx,rcx + mov rcx,qword ptr [rcx] + test cl,2 + jne in_hnf_2 + hlt + endif + +copy_arity_0_node2_: + jl copy_selector_2 + + mov (-24)[rsi],rcx + sub rsi,24 + mov [rbp],rsi + lea rax,1[rsi] + + add rbp,8 + mov [rdx],rax + + sub rbx,1 + jae copy_lp2 + ret + +copy_string_or_array_2: + mov rcx,rdx + jne copy_array_2 + + if THREAD + sub rdx,heap_p1_offset[r9] + cmp rdx,semi_space_size_offset[r9] + else + sub rdx,heap_p1 + cmp rdx,semi_space_size + endif + jae copy_string_or_array_constant + + mov rdx,8[rcx] + add rbp,8 + + add rdx,7 + push rbx + + mov rax,rdx + and rdx,-8 + + shr rax,3 + sub rsi,rdx + + mov rbx,[rcx] + add rcx,8 + + mov (-16)[rsi],rbx + sub rsi,16 + + mov (-8)[rbp],rsi + lea rdx,1[rsi] + + mov (-8)[rcx],rdx + lea rdx,8[rsi] + +cp_s_arg_lp2: + mov rbx,[rcx] + add rcx,8 + + mov [rdx],rbx + add rdx,8 + + sub rax,1 + jge cp_s_arg_lp2 + + pop rbx + sub rbx,1 + jae copy_lp2 + ret + +copy_array_2: + if THREAD + sub rdx,heap_p1_offset[r9] + cmp rdx,semi_space_size_offset[r9] + else + sub rdx,heap_p1 + cmp rdx,semi_space_size + endif + jae copy_string_or_array_constant + + push rbx + + mov rax,qword ptr 16[rcx] + test rax,rax + je copy_array_a2 + + movzx rbx,word ptr (-2)[rax] + + test rbx,rbx + je copy_strict_basic_array_2 + + sub rbx,256 + imul rbx,qword ptr 8[rcx] + jmp copy_array_a3 + +copy_array_a2: + mov rbx,qword ptr 8[rcx] +copy_array_a3: + mov rdx,rdi + lea rdi,24[rdi+rbx*8] + + mov qword ptr [rbp],rdx + mov rax,qword ptr [rcx] + + add rbp,8 + mov qword ptr [rdx],rax + + lea rax,1[rdx] + add rdx,8 + + mov qword ptr [rcx],rax + add rcx,8 + + lea rax,1[rbx] + jmp cp_s_arg_lp2 + +copy_strict_basic_array_2: + mov rbx,qword ptr 8[rcx] + + cmp rax,offset dINT+2 + jle copy_int_or_real_array_2 + + cmp rax,offset BOOL+2 + je copy_bool_array_2 + +copy_int32_or_real32_array_2: + add rbx,1 + shr rbx,1 + +copy_int_or_real_array_2: + shl rbx,3 + lea rdx,(-24)[rsi] + + sub rdx,rbx + mov rax,qword ptr [rcx] + + shr rbx,3 + mov qword ptr [rbp],rdx + + add rbp,8 + mov rsi,rdx + + mov qword ptr [rdx],rax + lea rax,1[rdx] + + add rdx,8 + mov qword ptr [rcx],rax + + add rcx,8 + lea rax,1[rbx] + jmp cp_s_arg_lp2 + +copy_bool_array_2: + add rbx,7 + shr rbx,3 + jmp copy_int_or_real_array_2 + +copy_string_or_array_constant: + mov qword ptr [rbp],rcx + add rbp,8 + + sub rbx,1 + jae copy_lp2 + ret + +end_copy1: + if THREAD + mov heap_end_after_gc_offset[r9],rsi + else + mov heap_end_after_gc,rsi + endif + + mov rcx,offset finalizer_list + mov rdx,offset free_finalizer_list + mov rbp,qword ptr finalizer_list + +determine_free_finalizers_after_copy: + mov rax,qword ptr [rbp] + test al,1 + je finalizer_not_used_after_copy + + mov rbp,qword ptr 8[rbp] + sub rax,1 + mov qword ptr [rcx],rax + lea rcx,8[rax] + jmp determine_free_finalizers_after_copy + +finalizer_not_used_after_copy: + if THREAD + lea rax,__Nil-8 + cmp rbp,rax + else + lea r9,__Nil-8 + cmp rbp,r9 + endif + je end_finalizers_after_copy + + mov qword ptr [rdx],rbp + lea rdx,8[rbp] + mov rbp,qword ptr 8[rbp] + jmp determine_free_finalizers_after_copy + +end_finalizers_after_copy: + mov qword ptr [rcx],rbp + mov qword ptr [rdx],rbp |