diff options
Diffstat (limited to 'thread/amark.asm')
-rw-r--r-- | thread/amark.asm | 4312 |
1 files changed, 2156 insertions, 2156 deletions
diff --git a/thread/amark.asm b/thread/amark.asm index 76bf18f..9aaf418 100644 --- a/thread/amark.asm +++ b/thread/amark.asm @@ -1,2156 +1,2156 @@ -
- if THREAD
- mov rax,qword ptr heap_size_65_offset[r9]
- else
- mov rax,qword ptr heap_size_65
- endif
- xor rbx,rbx
-
- if THREAD
- mov qword ptr n_marked_words_offset[r9],rbx
- else
- mov qword ptr n_marked_words,rbx
- endif
- shl rax,6
-
- if THREAD
- mov qword ptr lazy_array_list_offset[r9],rbx
- else
- mov qword ptr lazy_array_list,rbx
- endif
- mov r11,rax
-
- lea rsi,(-4000)[rsp]
-
- mov rax,qword ptr caf_list
-
- if THREAD
- mov qword ptr end_stack_offset[r9],rsi
-
- mov r10,neg_heap_p3_offset[r9]
- mov r13,qword ptr end_stack_offset[r9]
- else
- mov qword ptr end_stack,rsi
-
- mov r10,neg_heap_p3
- mov r13,qword ptr end_stack
- endif
- mov r14,0
-
- test rax,rax
- je _end_mark_cafs
-
-_mark_cafs_lp:
- mov rbx,qword ptr [rax]
- mov rbp,qword ptr (-8)[rax]
-
- push rbp
- lea rbp,8[rax]
- lea r12,8[rax+rbx*8]
-
- call _mark_stack_nodes
-
- pop rax
- test rax,rax
- jne _mark_cafs_lp
-
-_end_mark_cafs:
- if THREAD
- mov rsi,qword ptr stack_top_offset[r9]
- mov rbp,qword ptr stack_p_offset[r9]
- else
- mov rsi,qword ptr stack_top
- mov rbp,qword ptr stack_p
- endif
-
- mov r12,rsi
- call _mark_stack_nodes
-
-continue_mark_after_pmark:
- if THREAD
- mov qword ptr n_marked_words_offset[r9],r14
-
- mov rcx,qword ptr lazy_array_list_offset[r9]
- else
- mov qword ptr n_marked_words,r14
-
- mov rcx,qword ptr lazy_array_list
- endif
-
- test rcx,rcx
- je end_restore_arrays
-
-restore_arrays:
- mov rbx ,qword ptr [rcx]
- if THREAD
- lea rbp,__ARRAY__+2
- mov qword ptr [rcx],rbp
- else
- lea r9,__ARRAY__+2
- mov qword ptr [rcx],r9
- endif
-
- cmp rbx,1
- je restore_array_size_1
-
- lea rdx,[rcx+rbx*8]
- mov rax,qword ptr 16[rdx]
- test rax,rax
- je restore_lazy_array
-
- mov rbp,rax
- push rdx
-
- xor rdx,rdx
- mov rax,rbx
- movzx rbx,word ptr (-2+2)[rbp]
-
- div rbx
- mov rbx,rax
-
- pop rdx
- mov rax,rbp
-
-restore_lazy_array:
- mov rdi,qword ptr 16[rcx]
- mov rbp,qword ptr 8[rcx]
- mov qword ptr 8[rcx],rbx
- mov rsi,qword ptr 8[rdx]
- mov qword ptr 16[rcx],rax
- mov qword ptr 8[rdx],rbp
- mov qword ptr 16[rdx],rdi
-
- test rax,rax
- je no_reorder_array
-
- movzx rdx,word ptr (-2)[rax]
- sub rdx,256
- movzx rbp,word ptr (-2+2)[rax]
- cmp rbp,rdx
- je no_reorder_array
-
- add rcx,24
- imul rbx,rdx
- mov rax,rdx
- lea rdx,[rcx+rbx*8]
- mov rbx,rbp
- sub rax,rbp
-
- call reorder
-
-no_reorder_array:
- mov rcx,rsi
- test rcx,rcx
- jne restore_arrays
-
- jmp end_restore_arrays
-
-restore_array_size_1:
- mov rbp,qword ptr 8[rcx]
- mov rdx,qword ptr 16[rcx]
- mov qword ptr 8[rcx],rbx
- mov rax,qword ptr 24[rcx]
- mov qword ptr 24[rcx],rbp
- mov qword ptr 16[rcx],rax
-
- mov rcx,rdx
- test rcx,rcx
- jne restore_arrays
-
-end_restore_arrays:
- if THREAD
- mov rdi,qword ptr heap_vector_offset[r9]
- else
- mov rdi,qword ptr heap_vector
- endif
- lea rcx,finalizer_list
- lea rdx,free_finalizer_list
-
- mov rbp,qword ptr [rcx]
-determine_free_finalizers_after_mark:
- if THREAD
- lea rax,__Nil-8
- cmp rbp,rax
- else
- lea r9,__Nil-8
- cmp rbp,r9
- endif
- je end_finalizers_after_mark
-
- lea rax,[r10+rbp]
- mov rbx,rax
- and rax,31*8
- shr rbx,8
- mov esi,dword ptr (bit_set_table2)[rax]
- test esi,dword ptr [rdi+rbx*4]
- je finalizer_not_used_after_mark
-
- lea rcx,8[rbp]
- mov rbp,qword ptr 8[rbp]
- jmp determine_free_finalizers_after_mark
-
-finalizer_not_used_after_mark:
- mov qword ptr [rdx],rbp
- lea rdx,8[rbp]
-
- mov rbp,qword ptr 8[rbp]
- mov qword ptr [rcx],rbp
- jmp determine_free_finalizers_after_mark
-
-end_finalizers_after_mark:
- mov qword ptr [rdx],rbp
-
- call add_garbage_collect_time
-
- if THREAD
- mov rax,qword ptr bit_vector_size_offset[r9]
-
- mov rdi,qword ptr n_allocated_words_offset[r9]
- add rdi,qword ptr n_marked_words_offset[r9]
- else
- mov rax,qword ptr bit_vector_size
-
- mov rdi,qword ptr n_allocated_words
- add rdi,qword ptr n_marked_words
- endif
- shl rdi,3
-
- mov rsi,rax
- shl rsi,3
-
- push rdx
- push rax
-
- mov rax,rdi
- mul qword ptr heap_size_multiple
- shrd rax,rdx,8
- shr rdx,8
-
- mov rbx,rax
- test rdx,rdx
-
- pop rax
- pop rdx
-
- je not_largest_heap
-
- if THREAD
- mov rbx,qword ptr heap_size_65_offset[r9]
- else
- mov rbx,qword ptr heap_size_65
- endif
- shl rbx,6
-
-not_largest_heap:
- cmp rbx,rsi
- jbe no_larger_heap
-
- if THREAD
- mov rsi,qword ptr heap_size_65_offset[r9]
- else
- mov rsi,qword ptr heap_size_65
- endif
- shl rsi,6
- cmp rbx,rsi
- jbe not_larger_than_heap
- mov rbx,rsi
-not_larger_than_heap:
- mov rax,rbx
- shr rax,3
- if THREAD
- mov qword ptr bit_vector_size_offset[r9],rax
- else
- mov qword ptr bit_vector_size,rax
- endif
-no_larger_heap:
-
- mov rbp,rax
-
- if THREAD
- mov rdi,qword ptr heap_vector_offset[r9]
- else
- mov rdi,qword ptr heap_vector
- endif
- shr rbp,5
-
- test al,31
- je no_extra_word
-
- mov dword ptr [rdi+rbp*4],0
-
-no_extra_word:
- if THREAD
- sub rax,qword ptr n_marked_words_offset[r9]
- else
- sub rax,qword ptr n_marked_words
- endif
- shl rax,3
- if THREAD
- mov qword ptr n_last_heap_free_bytes_offset[r9],rax
-
- mov rax,qword ptr n_marked_words_offset[r9]
- else
- mov qword ptr n_last_heap_free_bytes,rax
-
- mov rax,qword ptr n_marked_words
- endif
- shl rax,3
- add qword ptr total_gc_bytes,rax
-
- test qword ptr flags,2
- je _no_heap_use_message2
-
- mov r12,rsp
- and rsp,-16
- if THREAD
- mov rbx,r9
- endif
- ifdef LINUX
- mov r13,rsi
- mov r14,rdi
-
- lea rdi,marked_gc_string_1
- else
- sub rsp,32
-
- lea rcx,marked_gc_string_1
- endif
- call ew_print_string
- if THREAD
- mov r9,rbx
- endif
-
- ifdef LINUX
- if THREAD
- mov rdi,qword ptr n_marked_words_offset[r9]
- else
- mov rdi,qword ptr n_marked_words
- endif
- shl rdi,3
- else
- if THREAD
- mov rcx,qword ptr n_marked_words_offset[r9]
- else
- mov rcx,qword ptr n_marked_words
- endif
- shl rcx,3
- endif
- call ew_print_int
- if THREAD
- mov r9,rbx
- endif
-
- ifdef LINUX
- lea rdi,heap_use_after_gc_string_2
- else
- lea rcx,heap_use_after_gc_string_2
- endif
- call ew_print_string
-
- ifdef LINUX
- mov rsi,r13
- mov rdi,r14
- endif
- mov rsp,r12
- if THREAD
- mov r9,rbx
- endif
-
-_no_heap_use_message2:
- call call_finalizers
-
- if THREAD
- mov rsi,qword ptr n_allocated_words_offset[r9]
- else
- mov rsi,qword ptr n_allocated_words
- endif
- xor rbx,rbx
-
- mov rcx,rdi
- if THREAD
- mov qword ptr n_free_words_after_mark_offset[r9],rbx
- else
- mov qword ptr n_free_words_after_mark,rbx
- endif
-
-_scan_bits:
- cmp ebx,dword ptr [rcx]
- je _zero_bits
- mov dword ptr [rcx],ebx
- add rcx,4
- sub rbp,1
- jne _scan_bits
-
- jmp _end_scan
-
-_zero_bits:
- lea rdx,4[rcx]
- add rcx,4
- sub rbp,1
- jne _skip_zero_bits_lp1
- jmp _end_bits
-
-_skip_zero_bits_lp:
- test rax,rax
- jne _end_zero_bits
-_skip_zero_bits_lp1:
- mov eax,dword ptr [rcx]
- add rcx,4
- sub rbp,1
- jne _skip_zero_bits_lp
-
- test rax,rax
- je _end_bits
- mov rax,rcx
- mov dword ptr (-4)[rcx],ebx
- sub rax,rdx
- jmp _end_bits2
-
-_end_zero_bits:
- mov rax,rcx
- sub rax,rdx
- shl rax,3
- if THREAD
- add qword ptr n_free_words_after_mark_offset[r9],rax
- else
- add qword ptr n_free_words_after_mark,rax
- endif
- mov dword ptr (-4)[rcx],ebx
-
- cmp rax,rsi
- jb _scan_bits
-
-_found_free_memory:
- if THREAD
- mov qword ptr bit_counter_offset[r9],rbp
- mov qword ptr bit_vector_p_offset[r9],rcx
- else
- mov qword ptr bit_counter,rbp
- mov qword ptr bit_vector_p,rcx
- endif
-
- lea rbx,(-4)[rdx]
- sub rbx,rdi
- shl rbx,6
- if THREAD
- mov rdi,qword ptr heap_p3_offset[r9]
- else
- mov rdi,qword ptr heap_p3
- endif
- add rdi,rbx
-
- mov r15,rax
- lea rbx,[rdi+rax*8]
-
- sub r15,rsi
- if THREAD
- mov rsi,qword ptr stack_top_offset[r9]
-
- mov qword ptr heap_end_after_gc_offset[r9],rbx
- else
- mov rsi,qword ptr stack_top
-
- mov qword ptr heap_end_after_gc,rbx
- endif
-
- jmp restore_registers_after_gc_and_return
-
-_end_bits:
- mov rax,rcx
- sub rax,rdx
- add rax,4
-_end_bits2:
- shl rax,3
- if THREAD
- add qword ptr n_free_words_after_mark_offset[r9],rax
- else
- add qword ptr n_free_words_after_mark,rax
- endif
- cmp rax,rsi
- jae _found_free_memory
-
-_end_scan:
- if THREAD
- mov qword ptr bit_counter_offset[r9],rbp
- else
- mov qword ptr bit_counter,rbp
- endif
- jmp compact_gc
-
-; %rbp : pointer to stack element
-; %rdi : heap_vector
-; %rax ,%rbx ,%rcx ,%rdx ,%rsi : free
-
-_mark_stack_nodes:
- cmp rbp,r12
- je _end_mark_nodes
-_mark_stack_nodes_:
- mov rcx,qword ptr [rbp]
-
- add rbp,8
- lea rdx,[r10+rcx]
-
- cmp rdx,r11
- jnc _mark_stack_nodes
-
- mov rbx,rdx
- and rdx,31*8
- shr rbx,8
- mov esi,dword ptr (bit_set_table2)[rdx]
-
- test esi,dword ptr [rdi+rbx*4]
- jne _mark_stack_nodes
-
- push rbp
- push 0
- jmp _mark_arguments
-
-_mark_hnf_2:
- cmp rsi,20000000h
- jbe fits_in_word_6
- or dword ptr 4[rdi+rbx*4],1
-fits_in_word_6:
- add r14,3
-
-_mark_record_2_c:
- mov rbx,qword ptr 8[rcx]
- push rbx
-
- cmp rsp,r13
- jb __mark_using_reversal
-
-_mark_node2:
-_shared_argument_part:
- mov rcx,qword ptr [rcx]
-
-_mark_node:
- lea rdx,[r10+rcx]
- cmp rdx,r11
- jnc _mark_next_node
-
- mov rbx,rdx
- and rdx,31*8
- shr rbx,8
- mov esi,dword ptr (bit_set_table2)[rdx]
-
- test esi,dword ptr [rdi+rbx*4]
- jne _mark_next_node
-
-_mark_arguments:
- mov rax,qword ptr [rcx]
- test rax,2
- je _mark_lazy_node
-
- movzx rbp,word ptr (-2)[rax]
-
- test rbp,rbp
- je _mark_hnf_0
-
- or dword ptr [rdi+rbx*4],esi
- add rcx,8
-
- cmp rbp,256
- jae _mark_record
-
- sub rbp,2
- je _mark_hnf_2
- jb _mark_hnf_1
-
-_mark_hnf_3:
- mov rdx,qword ptr 8[rcx]
-
- cmp rsi,20000000h
- jbe fits_in_word_1
- or dword ptr 4[rdi+rbx*4],1
-fits_in_word_1:
-
- add r14,3
- lea rax,[r10+rdx]
- mov rbx,rax
-
- and rax,31*8
- shr rbx,8
-
- mov esi,dword ptr (bit_set_table2)[rax]
-
- test esi,dword ptr [rdi+rbx*4]
- jne _shared_argument_part
-
-_no_shared_argument_part:
- or dword ptr [rdi+rbx*4],esi
- add rbp,1
-
- add r14,rbp
- lea rax,[rax+rbp*8]
- lea rdx,(-8)[rdx+rbp*8]
-
- cmp rax,32*8
- jbe fits_in_word_2
- or dword ptr 4[rdi+rbx*4],1
-fits_in_word_2:
-
- mov rbx,qword ptr [rdx]
- sub rbp,2
- push rbx
-
-_push_hnf_args:
- mov rbx,qword ptr (-8)[rdx]
- sub rdx,8
- push rbx
- sub rbp,1
- jge _push_hnf_args
-
- cmp rsp,r13
- jae _mark_node2
-
- jmp __mark_using_reversal
-
-_mark_hnf_1:
- cmp rsi,40000000h
- jbe fits_in_word_4
- or dword ptr 4[rdi+rbx*4],1
-fits_in_word_4:
- add r14,2
- mov rcx,qword ptr [rcx]
- jmp _mark_node
-
-_mark_lazy_node_1:
- add rcx,8
- or dword ptr [rdi+rbx*4],esi
- cmp rsi,20000000h
- jbe fits_in_word_3
- or dword ptr 4[rdi+rbx*4],1
-fits_in_word_3:
- add r14,3
-
- cmp rbp,1
- je _mark_node2
-
-_mark_selector_node_1:
- add rbp,2
- mov rdx,qword ptr [rcx]
- je _mark_indirection_node
-
- lea rsi,[r10+rdx]
- mov rbx,rsi
-
- shr rbx,8
- and rsi,31*8
-
- add rbp,1
-
- mov esi,dword ptr (bit_set_table2)[rsi]
- jle _mark_record_selector_node_1
-
- test esi,dword ptr [rdi+rbx*4]
- jne _mark_node3
-
- mov rbp,qword ptr [rdx]
- test rbp,2
- je _mark_node3
-
- cmp word ptr (-2)[rbp],2
- jbe _small_tuple_or_record
-
-_large_tuple_or_record:
- mov rbp,qword ptr 16[rdx]
- if THREAD
- mov r15,rbp
- else
- mov r9,rbp
- endif
-
- add rbp,r10
- mov rbx,rbp
- and rbp,31*8
- shr rbx,8
- mov ebp,dword ptr (bit_set_table2)[rbp]
- test ebp,dword ptr [rdi+rbx*4]
- jne _mark_node3
-
- ifdef NEW_DESCRIPTORS
- mov eax,(-8)[rax]
- lea rbp,__indirection
- mov qword ptr (-8)[rcx],rbp
- movzx eax,word ptr 4[rax]
- mov rbp,rcx
-
- cmp rax,16
- jl _mark_tuple_selector_node_1
- if THREAD
- mov rdx,r15
- else
- mov rdx,r9
- endif
- je _mark_tuple_selector_node_2
- if THREAD
- mov rcx,qword ptr (-24)[r15+rax]
- else
- mov rcx,qword ptr (-24)[r9+rax]
- endif
- mov qword ptr [rbp],rcx
- jmp _mark_node
-
-_mark_tuple_selector_node_2:
- if THREAD
- mov rcx,qword ptr [r15]
- else
- mov rcx,qword ptr [r9]
- endif
- mov qword ptr [rbp],rcx
- jmp _mark_node
- endif
-
-_small_tuple_or_record:
- ifdef NEW_DESCRIPTORS
- mov eax,(-8)[rax]
- lea rbp,__indirection
- mov qword ptr (-8)[rcx],rbp
- movzx eax,word ptr 4[rax]
- mov rbp,rcx
-_mark_tuple_selector_node_1:
- mov rcx,qword ptr [rdx+rax]
- mov qword ptr [rbp],rcx
- else
- mov eax,(-8)[rax]
- push rcx
- mov rcx,rdx
- mov eax,4[rax]
- call near ptr rax
- pop rdx
-
- if THREAD
- lea rbp,__indirection
- mov qword ptr (-8)[rdx],rbp
- else
- lea r9,__indirection
- mov qword ptr (-8)[rdx],r9
- endif
- mov qword ptr [rdx],rcx
- endif
- jmp _mark_node
-
-_mark_record_selector_node_1:
- je _mark_strict_record_selector_node_1
-
- test esi,dword ptr [rdi+rbx*4]
- jne _mark_node3
-
- mov rbp,qword ptr [rdx]
- test rbp,2
- je _mark_node3
-
- cmp word ptr (-2)[rbp],258
- jbe _small_tuple_or_record
- ifdef NEW_DESCRIPTORS
- mov rbp,qword ptr 16[rdx]
- if THREAD
- mov r15,rbp
- else
- mov r9,rbp
- endif
- add rbp,r10
- mov rbx,rbp
- and rbp,31*8
- shr rbx,8
- mov ebp,dword ptr (bit_set_table2)[rbp]
- test ebp,dword ptr [rdi+rbx*4]
- jne _mark_node3
-
- mov eax,(-8)[rax]
- lea rbp,__indirection
- mov qword ptr (-8)[rcx],rbp
- movzx eax,word ptr 4[rax]
- mov rbp,rcx
-
- cmp rax,16
- jle _mark_record_selector_node_2
- if THREAD
- mov rdx,r15
- else
- mov rdx,r9
- endif
- sub rax,24
-_mark_record_selector_node_2:
- mov rcx,qword ptr [rdx+rax]
- mov qword ptr [rbp],rcx
- jmp _mark_node
- else
- jmp _large_tuple_or_record
- endif
-
-_mark_strict_record_selector_node_1:
- test esi,dword ptr [rdi+rbx*4]
- jne _mark_node3
-
- mov rbp,qword ptr [rdx]
- test rbp,2
- je _mark_node3
-
- cmp word ptr (-2)[rbp],258
- jbe _select_from_small_record
-
- mov rbp,qword ptr 16[rdx]
- if THREAD
- mov r15,rbp
- else
- mov r9,rbp
- endif
-
- add rbp,r10
- mov rbx,rbp
- and rbp,31*8
- shr rbx,8
- mov ebp,dword ptr (bit_set_table2)[rbp]
- test ebp,dword ptr [rdi+rbx*4]
- jne _mark_node3
-
-_select_from_small_record:
- mov eax,dword ptr (-8)[rax]
- sub rcx,8
-
- ifdef NEW_DESCRIPTORS
- movzx ebx,word ptr 4[rax]
- cmp rbx,16
- jle _mark_strict_record_selector_node_2
- if THREAD
- mov rbx,qword ptr (-24)[r15+rbx]
- else
- mov rbx,qword ptr (-24)[r9+rbx]
- endif
- jmp _mark_strict_record_selector_node_3
-_mark_strict_record_selector_node_2:
- mov rbx,qword ptr [rdx+rbx]
-_mark_strict_record_selector_node_3:
- mov qword ptr 8[rcx],rbx
-
- movzx ebx,word ptr 6[rax]
- test rbx,rbx
- je _mark_strict_record_selector_node_5
- cmp rbx,16
- jle _mark_strict_record_selector_node_4
- if THREAD
- mov rdx,r15
- else
- mov rdx,r9
- endif
- sub rbx,24
-_mark_strict_record_selector_node_4:
- mov rbx,qword ptr [rdx+rbx]
- mov qword ptr 16[rcx],rbx
-_mark_strict_record_selector_node_5:
-
- mov rax,qword ptr (-8)[rax]
- mov qword ptr [rcx],rax
- else
- mov eax,4[rax]
- call near ptr rax
- endif
- jmp _mark_next_node
-
-_mark_indirection_node:
-_mark_node3:
- mov rcx,rdx
- jmp _mark_node
-
-_mark_next_node:
- pop rcx
- test rcx,rcx
- jne _mark_node
-
- pop rbp
- cmp rbp,r12
- jne _mark_stack_nodes_
-
-_end_mark_nodes:
- ret
-
-_mark_lazy_node:
- movsxd rbp,dword ptr (-4)[rax]
- test rbp,rbp
- je _mark_node2_bb
-
- cmp rbp,1
- jle _mark_lazy_node_1
-
- cmp rbp,256
- jge _mark_closure_with_unboxed_arguments
- inc rbp
- or dword ptr [rdi+rbx*4],esi
-
- add r14,rbp
- lea rdx,[rdx+rbp*8]
- lea rcx,[rcx+rbp*8]
-
- cmp rdx,32*8
- jbe fits_in_word_7
- or dword ptr 4[rdi+rbx*4],1
-fits_in_word_7:
- sub rbp,3
-_push_lazy_args:
- mov rbx,qword ptr (-8)[rcx]
- sub rcx,8
- push rbx
- sub rbp,1
- jge _push_lazy_args
-
- sub rcx,8
-
- cmp rsp,r13
- jae _mark_node2
-
- jmp __mark_using_reversal
-
-_mark_closure_with_unboxed_arguments:
- mov rax,rbp
- and rbp,255
- sub rbp,1
- je _mark_node2_bb
-
- shr rax,8
- add rbp,2
-
- or dword ptr [rdi+rbx*4],esi
- add r14,rbp
- lea rdx,[rdx+rbp*8]
-
- sub rbp,rax
-
- cmp rdx,32*8
- jbe fits_in_word_7_
- or dword ptr 4[rdi+rbx*4],1
-fits_in_word_7_:
- sub rbp,2
- jl _mark_next_node
-
- lea rcx,16[rcx+rbp*8]
- jne _push_lazy_args
-
-_mark_closure_with_one_boxed_argument:
- mov rcx,qword ptr (-8)[rcx]
- jmp _mark_node
-
-_mark_hnf_0:
- if THREAD
- lea rbp,__STRING__+2
- cmp rax,rbp
- else
- lea r9,__STRING__+2
- cmp rax,r9
- endif
- jbe _mark_string_or_array
-
- or dword ptr [rdi+rbx*4],esi
-
- if THREAD
- lea rbp,CHAR+2
- cmp rax,rbp
- else
- lea r9,CHAR+2
- cmp rax,r9
- endif
- ja _mark_normal_hnf_0
-
-_mark_real_int_bool_or_char:
- add r14,2
-
- cmp rsi,40000000h
- jbe _mark_next_node
-
- or dword ptr 4[rdi+rbx*4],1
- jmp _mark_next_node
-
-_mark_normal_hnf_0:
- inc r14
- jmp _mark_next_node
-
-_mark_node2_bb:
- or dword ptr [rdi+rbx*4],esi
- add r14,3
-
- cmp rsi,20000000h
- jbe _mark_next_node
-
- or dword ptr 4[rdi+rbx*4],1
- jmp _mark_next_node
-
-_mark_record:
- sub rbp,258
- je _mark_record_2
- jl _mark_record_1
-
-_mark_record_3:
- add r14,3
-
- cmp rsi,20000000h
- jbe fits_in_word_13
- or dword ptr 4[rdi+rbx*4],1
-fits_in_word_13:
- mov rdx,qword ptr 8[rcx]
-
- movzx rbx,word ptr (-2+2)[rax]
- lea rsi,[r10+rdx]
-
- mov rax,rsi
- and rsi,31*8
-
- shr rax,8
- sub rbx,1
-
- mov edx,dword ptr (bit_set_table2)[rsi]
- jb _mark_record_3_bb
-
- test edx,dword ptr [rdi+rax*4]
- jne _mark_node2
-
- add rbp,1
- or dword ptr [rdi+rax*4],edx
- add r14,rbp
- lea rsi,[rsi+rbp*8]
-
- cmp rsi,32*8
- jbe _push_record_arguments
- or dword ptr 4[rdi+rax*4],1
-_push_record_arguments:
- mov rdx,qword ptr 8[rcx]
- mov rbp,rbx
- shl rbx,3
- add rdx,rbx
- sub rbp,1
- jge _push_hnf_args
-
- jmp _mark_node2
-
-_mark_record_3_bb:
- test edx,dword ptr [rdi+rax*4]
- jne _mark_next_node
-
- add rbp,1
- or dword ptr [rdi+rax*4],edx
- add r14,rbp
- lea rsi,[rsi+rbp*8]
-
- cmp rsi,32*8
- jbe _mark_next_node
-
- or dword ptr 4[rdi+rax*4],1
- jmp _mark_next_node
-
-_mark_record_2:
- cmp rsi,20000000h
- jbe fits_in_word_12
- or dword ptr 4[rdi+rbx*4],1
-fits_in_word_12:
- add r14,3
-
- cmp word ptr (-2+2)[rax],1
- ja _mark_record_2_c
- je _mark_node2
- jmp _mark_next_node
-
-_mark_record_1:
- cmp word ptr (-2+2)[rax],0
- jne _mark_hnf_1
-
- jmp _mark_real_int_bool_or_char
-
-_mark_string_or_array:
- je _mark_string_
-
-_mark_array:
- mov rbp,qword ptr 16[rcx]
- test rbp,rbp
- je _mark_lazy_array
-
- movzx rax,word ptr (-2)[rbp]
-
- test rax,rax
- je _mark_strict_basic_array
-
- movzx rbp,word ptr (-2+2)[rbp]
- test rbp,rbp
- je _mark_b_record_array
-
- cmp rsp,r13
- jb _mark_array_using_reversal
-
- sub rax,256
- cmp rax,rbp
- je _mark_a_record_array
-
-_mark_ab_record_array:
- or dword ptr [rdi+rbx*4],esi
- mov rbp,qword ptr 8[rcx]
-
- imul rax,rbp
- add rax,3
-
- add r14,rax
- lea rax,(-8)[rcx+rax*8]
-
- add rax,r10
- shr rax,8
-
- cmp rbx,rax
- jae _end_set_ab_array_bits
-
- inc rbx
- mov rbp,1
- cmp rbx,rax
- jae _last_ab_array_bits
-
-_mark_ab_array_lp:
- or dword ptr [rdi+rbx*4],ebp
- inc rbx
- cmp rbx,rax
- jb _mark_ab_array_lp
-
-_last_ab_array_bits:
- or dword ptr [rdi+rbx*4],ebp
-
-_end_set_ab_array_bits:
- mov rax,qword ptr 8[rcx]
- mov rdx,qword ptr 16[rcx]
- movzx rbx,word ptr (-2+2)[rdx]
- movzx rdx,word ptr (-2)[rdx]
- shl rbx,3
- lea rdx,(-2048)[rdx*8]
- push rbx
- push rdx
- lea rbp,24[rcx]
- push r12
- jmp _mark_ab_array_begin
-
-_mark_ab_array:
- mov rbx,qword ptr 16[rsp]
- push rax
- push rbp
- lea r12,[rbp+rbx]
-
- call _mark_stack_nodes
-
- mov rbx,qword ptr (8+16)[rsp]
- pop rbp
- pop rax
- add rbp,rbx
-_mark_ab_array_begin:
- sub rax,1
- jnc _mark_ab_array
-
- pop r12
- add rsp,16
- jmp _mark_next_node
-
-_mark_a_record_array:
- or dword ptr [rdi+rbx*4],esi
- mov rbp,qword ptr 8[rcx]
-
- imul rax,rbp
- push rax
-
- add rax,3
-
- add r14,rax
- lea rax,(-8)[rcx+rax*8]
-
- add rax,r10
- shr rax,8
-
- cmp rbx,rax
- jae _end_set_a_array_bits
-
- inc rbx
- mov rbp,1
- cmp rbx,rax
- jae _last_a_array_bits
-
-_mark_a_array_lp:
- or dword ptr [rdi+rbx*4],ebp
- inc rbx
- cmp rbx,rax
- jb _mark_a_array_lp
-
-_last_a_array_bits:
- or dword ptr [rdi+rbx*4],ebp
-
-_end_set_a_array_bits:
- pop rax
- lea rbp,24[rcx]
-
- push r12
- lea r12,24[rcx+rax*8]
-
- call _mark_stack_nodes
-
- pop r12
- jmp _mark_next_node
-
-_mark_lazy_array:
- cmp rsp,r13
- jb _mark_array_using_reversal
-
- or dword ptr [rdi+rbx*4],esi
- mov rax,qword ptr 8[rcx]
-
- add rax,3
-
- add r14,rax
- lea rax,(-8)[rcx+rax*8]
-
- add rax,r10
- shr rax,8
-
- cmp rbx,rax
- jae _end_set_lazy_array_bits
-
- inc rbx
- mov rbp,1
- cmp rbx,rax
- jae _last_lazy_array_bits
-
-_mark_lazy_array_lp:
- or dword ptr [rdi+rbx*4],ebp
- inc rbx
- cmp rbx,rax
- jb _mark_lazy_array_lp
-
-_last_lazy_array_bits:
- or dword ptr [rdi+rbx*4],ebp
-
-_end_set_lazy_array_bits:
- mov rax,qword ptr 8[rcx]
- lea rbp,24[rcx]
-
- push r12
- lea r12,24[rcx+rax*8]
-
- call _mark_stack_nodes
-
- pop r12
- jmp _mark_next_node
-
-_mark_array_using_reversal:
- push 0
- mov rsi,1
- jmp __mark_node
-
-_mark_strict_basic_array:
- mov rax,qword ptr 8[rcx]
- cmp rbp,offset dINT+2
- jle _mark_strict_int_or_real_array
- cmp rbp,offset BOOL+2
- je _mark_strict_bool_array
-_mark_strict_int32_or_real32_array:
- add rax,6+1
- shr rax,1
- jmp _mark_basic_array_
-_mark_strict_int_or_real_array:
- add rax,3
- jmp _mark_basic_array_
-_mark_strict_bool_array:
- add rax,24+7
- shr rax,3
- jmp _mark_basic_array_
-
-_mark_b_record_array:
- mov rbp,qword ptr 8[rcx]
- sub rax,256
- imul rax,rbp
- add rax,3
- jmp _mark_basic_array_
-
-_mark_string_:
- mov rax,qword ptr 8[rcx]
- add rax,16+7
- shr rax,3
-
-_mark_basic_array_:
- or dword ptr [rdi+rbx*4],esi
-
- add r14,rax
- lea rax,(-8)[rcx+rax*8]
-
- add rax,r10
- shr rax,8
-
- cmp rbx,rax
- jae _mark_next_node
-
- inc rbx
- mov rbp,1
- cmp rbx,rax
- jae _last_string_bits
-
-_mark_string_lp:
- or dword ptr [rdi+rbx*4],ebp
- inc rbx
- cmp rbx,rax
- jb _mark_string_lp
-
-_last_string_bits:
- or dword ptr [rdi+rbx*4],ebp
- jmp _mark_next_node
-
-__end_mark_using_reversal:
- pop rdx
- test rdx,rdx
- je _mark_next_node
- mov qword ptr [rdx],rcx
- jmp _mark_next_node
-
-__mark_using_reversal:
- push rcx
- mov rsi,1
- mov rcx,qword ptr [rcx]
- jmp __mark_node
-
-__mark_arguments:
- mov rax,qword ptr [rcx]
- test al,2
- je __mark_lazy_node
-
- movzx rbp,word ptr (-2)[rax]
- test rbp,rbp
- je __mark_hnf_0
-
- add rcx,8
-
- cmp rbp,256
- jae __mark__record
-
- sub rbp,2
- je __mark_hnf_2
- jb __mark_hnf_1
-
-__mark_hnf_3:
- mov edx,dword ptr (bit_set_table2)[rdx]
- add r14,3
-
- or dword ptr [rdi+rbx*4],edx
-
- cmp rdx,20000000h
-
- mov rax,qword ptr 8[rcx]
-
- jbe fits__in__word__1
- or dword ptr 4[rdi+rbx*4],1
-fits__in__word__1:
- add rax,r10
-
- mov rbx,rax
- and rax,31*8
-
- shr rbx,8
-
- mov edx,dword ptr (bit_set_table2)[rax]
- test edx,dword ptr [rdi+rbx*4]
- jne __shared_argument_part
-
-__no_shared_argument_part:
- or dword ptr [rdi+rbx*4],edx
- mov rdx,qword ptr 8[rcx]
-
- add rbp,1
- mov qword ptr 8[rcx],rsi
-
- add r14,rbp
- add rcx,8
-
- shl rbp,3
- or qword ptr [rdx],1
-
- add rax,rbp
- add rdx,rbp
-
- cmp rax,32*8
- jbe fits__in__word__2
- or dword ptr 4[rdi+rbx*4],1
-fits__in__word__2:
-
- mov rbp ,qword ptr (-8)[rdx]
- mov qword ptr (-8)[rdx],rcx
- lea rsi,(-8)[rdx]
- mov rcx,rbp
- jmp __mark_node
-
-__mark_hnf_1:
- mov edx,dword ptr (bit_set_table2)[rdx]
- add r14,2
- or dword ptr [rdi+rbx*4],edx
- cmp rdx,40000000h
- jbe __shared_argument_part
- or dword ptr 4[rdi+rbx*4],1
-__shared_argument_part:
- mov rbp,qword ptr [rcx]
- mov qword ptr [rcx],rsi
- lea rsi,2[rcx]
- mov rcx,rbp
- jmp __mark_node
-
-__mark_no_selector_2:
- pop rbx
-__mark_no_selector_1:
- mov edx,dword ptr (bit_set_table2)[rdx]
- add r14,3
- or dword ptr [rdi+rbx*4],edx
- cmp rdx,20000000h
- jbe __shared_argument_part
-
- or dword ptr 4[rdi+rbx*4],1
- jmp __shared_argument_part
-
-__mark_lazy_node_1:
- je __mark_no_selector_1
-
-__mark_selector_node_1:
- add rbp,2
- je __mark_indirection_node
-
- add rbp,1
-
- push rbx
- mov rbp,qword ptr [rcx]
- push rax
- lea rax,[r10+rbp]
-
- jle __mark_record_selector_node_1
-
- mov rbx,rax
- and rax,31*8
- shr rbx,8
- mov eax,dword ptr (bit_set_table2)[rax]
- test eax,dword ptr [rdi+rbx*4]
- pop rax
- jne __mark_no_selector_2
-
- mov rbx,qword ptr [rbp]
- test bl,2
- je __mark_no_selector_2
-
- cmp word ptr (-2)[rbx],2
- jbe __small_tuple_or_record
-
-__large_tuple_or_record:
- mov r8,qword ptr 16[rbp]
- if THREAD
- mov r15,r8
- else
- mov r9,r8
- endif
-
- add r8,r10
- mov rbx,r8
- and r8,31*8
- shr rbx,8
- mov r8d,dword ptr (bit_set_table2)[r8]
- test r8d,dword ptr [rdi+rbx*4]
- jne __mark_no_selector_2
-
- ifdef NEW_DESCRIPTORS
- mov eax,dword ptr (-8)[rax]
- lea rdx,__indirection
- pop rbx
-
- mov qword ptr (-8)[rcx],rdx
- movzx eax,word ptr 4[rax]
- mov r8,rcx
-
- cmp rax,16
- jl __mark_tuple_selector_node_1
- je __mark_tuple_selector_node_2
- if THREAD
- mov rcx,qword ptr (-24)[r15+rax]
- else
- mov rcx,qword ptr (-24)[r9+rax]
- endif
- mov qword ptr [r8],rcx
- jmp __mark_node
-
-__mark_tuple_selector_node_2:
- if THREAD
- mov rcx,qword ptr [r15]
- else
- mov rcx,qword ptr [r9]
- endif
- mov qword ptr [r8],rcx
- jmp __mark_node
- endif
-
-__small_tuple_or_record:
- ifdef NEW_DESCRIPTORS
- mov eax,dword ptr (-8)[rax]
- lea rdx,__indirection
- pop rbx
-
- mov qword ptr (-8)[rcx],rdx
- movzx eax,word ptr 4[rax]
- mov r8,rcx
-__mark_tuple_selector_node_1:
- mov rcx,qword ptr [rbp+rax]
- mov qword ptr [r8],rcx
- jmp __mark_node
- else
- mov eax,(-8)[rax]
- pop rbx
-
- push rcx
- mov rcx,qword ptr [rcx]
- mov eax,4[rax]
- call near ptr rax
- pop rdx
-
- mov qword ptr (-8)[rdx],offset __indirection
- mov qword ptr [rdx],rcx
- endif
- jmp __mark_node
-
-__mark_record_selector_node_1:
- je __mark_strict_record_selector_node_1
-
- mov rbx,rax
- and rax,31*8
- shr rbx,8
- mov eax,dword ptr (bit_set_table2)[rax]
- test eax,dword ptr [rdi+rbx*4]
- pop rax
- jne __mark_no_selector_2
-
- mov rbx,qword ptr [rbp]
- test bl,2
- je __mark_no_selector_2
-
- cmp word ptr (-2)[rbx],258
- ifdef NEW_DESCRIPTORS
- jbe __small_record
-
- mov r8,qword ptr 16[rbp]
- if THREAD
- mov r15,r8
- else
- mov r9,r8
- endif
-
- add r8,r10
- mov rbx,r8
- and r8,31*8
- shr rbx,8
- mov r8d,dword ptr (bit_set_table2)[r8]
- test r8d,dword ptr [rdi+rbx*4]
- jne __mark_no_selector_2
-
-__small_record:
- mov eax,(-8)[rax]
- lea rdx,__indirection
- pop rbx
-
- mov qword ptr (-8)[rcx],rdx
- movzx eax,word ptr 4[rax]
- mov r8,rcx
-
- cmp rax,16
- jle __mark_record_selector_node_2
- if THREAD
- mov rbp,r15
- else
- mov rbp,r9
- endif
- sub rax,24
-__mark_record_selector_node_2:
- mov rcx,qword ptr [rbp+rax]
- mov qword ptr [r8],rcx
- jmp __mark_node
- else
- jbe __small_tuple_or_record
- jmp __large_tuple_or_record
- endif
-
-__mark_strict_record_selector_node_1:
- mov rbx,rax
- and rax,31*8
- shr rbx,8
- mov eax,dword ptr (bit_set_table2)[rax]
- test eax,dword ptr [rdi+rbx *4]
- pop rax
- jne __mark_no_selector_2
-
- mov rbx,qword ptr [rbp]
- test bl,2
- je __mark_no_selector_2
-
- cmp word ptr (-2)[rbx],258
- jle __select_from_small_record
-
- mov r8,qword ptr 16[rbp]
- if THREAD
- mov r15,r8
- else
- mov r9,r8
- endif
-
- add r8,r10
- mov rbx,r8
- and r8,31*8
- shr rbx,8
- mov r8d,dword ptr (bit_set_table2)[r8]
- test r8d,dword ptr [rdi+rbx*4]
- jne __mark_no_selector_2
-
-__select_from_small_record:
- ifdef NEW_DESCRIPTORS
- mov eax,(-8)[rax]
- sub rcx,8
-
- movzx ebx,word ptr 4[rax]
- cmp rbx,16
- jle __mark_strict_record_selector_node_2
- if THREAD
- mov rbx,qword ptr (-24)[r15+rbx]
- else
- mov rbx,qword ptr (-24)[r9+rbx]
- endif
- jmp __mark_strict_record_selector_node_3
-__mark_strict_record_selector_node_2:
- mov rbx,qword ptr [rbp+rbx]
-__mark_strict_record_selector_node_3:
- mov qword ptr 8[rcx],rbx
-
- movzx ebx,word ptr 6[rax]
- test rbx,rbx
- je __mark_strict_record_selector_node_5
- cmp rbx,16
- jle __mark_strict_record_selector_node_4
- if THREAD
- mov rbp,r15
- else
- mov rbp,r9
- endif
- sub rbx,24
-__mark_strict_record_selector_node_4:
- mov rbx,qword ptr [rbp+rbx]
- mov qword ptr 16[rcx],rbx
-__mark_strict_record_selector_node_5:
- pop rbx
-
- mov rax,qword ptr (-8)[rax]
- mov qword ptr [rcx],rax
- else
- mov eax,(-8)[rax]
- pop rbx
- mov rdx,qword ptr [rcx]
- sub rcx,8
- mov eax,4[rax]
- call near ptr rax
- endif
- jmp __mark_node
-
-__mark_indirection_node:
- mov rcx,qword ptr [rcx]
- jmp __mark_node
-
-__mark_hnf_2:
- mov edx,dword ptr (bit_set_table2)[rdx]
- add r14,3
- or dword ptr [rdi+rbx*4],edx
- cmp rdx,20000000h
- jbe fits__in__word__6
- or dword ptr 4[rdi+rbx*4],1
-fits__in__word__6:
-
-__mark_record_2_c:
- mov rax,qword ptr [rcx]
- mov rbp,qword ptr 8[rcx]
- or rax,2
- mov qword ptr 8[rcx],rsi
- mov qword ptr [rcx],rax
- lea rsi,8[rcx]
- mov rcx,rbp
-
-__mark_node:
- lea rdx,[r10+rcx]
- cmp rdx,r11
- jae __mark_next_node
-
- mov rbx,rdx
- and rdx,31*8
- shr rbx,8
- mov ebp,dword ptr (bit_set_table2)[rdx]
- test ebp,dword ptr [rdi+rbx*4]
- je __mark_arguments
-
-__mark_next_node:
- test rsi,3
- jne __mark_parent
-
- mov rbp,qword ptr (-8)[rsi]
- mov rdx,qword ptr [rsi]
- mov qword ptr [rsi],rcx
- mov qword ptr (-8)[rsi],rdx
- sub rsi,8
-
- mov rcx,rbp
- and rbp,3
- and rcx,-4
- or rsi,rbp
- jmp __mark_node
-
-__mark_parent:
- mov rbx,rsi
- and rsi,-4
- je __end_mark_using_reversal
-
- and rbx,3
- mov rbp,qword ptr [rsi]
- mov qword ptr [rsi],rcx
-
- sub rbx,1
- je __argument_part_parent
-
- lea rcx,(-8)[rsi]
- mov rsi,rbp
- jmp __mark_next_node
-
-__argument_part_parent:
- and rbp,-4
- mov rdx,rsi
- mov rcx,qword ptr (-8)[rbp]
- mov rbx,qword ptr [rbp]
- mov qword ptr (-8)[rbp],rbx
- mov qword ptr [rbp],rdx
- lea rsi,(2-8)[rbp]
- jmp __mark_node
-
-__mark_lazy_node:
- movsxd rbp,dword ptr(-4)[rax]
- test rbp,rbp
- je __mark_node2_bb
-
- add rcx,8
- cmp rbp,1
- jle __mark_lazy_node_1
- cmp rbp,256
- jge __mark_closure_with_unboxed_arguments
-
- add rbp,1
- mov rax,rdx
- mov edx,dword ptr (bit_set_table2)[rdx]
- add r14,rbp
-
- lea rax,[rax+rbp*8]
- sub rbp,2
-
- or dword ptr [rdi+rbx*4],edx
-
- cmp rax,32*8
- jbe fits__in__word__7
- or dword ptr 4[rdi+rbx*4],1
-fits__in__word__7:
-__mark_closure_with_unboxed_arguments__2:
- lea rdx,[rcx+rbp*8]
- mov rax,qword ptr [rcx]
- or rax,2
- mov qword ptr [rcx],rax
- mov rcx,qword ptr [rdx]
- mov qword ptr [rdx],rsi
- mov rsi,rdx
- jmp __mark_node
-
-__mark_closure_with_unboxed_arguments:
- mov rax,rbp
- and rbp,255
-
- sub rbp,1
- je __mark_closure_1_with_unboxed_argument
- add rbp,2
-
- shr rax,8
- add r14,rbp
-
- push rcx
- lea rcx,[rdx+rbp*8]
-
- mov edx,dword ptr (bit_set_table2)[rdx]
- sub rbp,rax
-
- or dword ptr [rdi+rbx*4],edx
- cmp rcx,32*8
- jbe fits__in_word_7_
- or dword ptr 4[rdi+rbx*4],1
-fits__in_word_7_:
- pop rcx
- sub rbp,2
- jg __mark_closure_with_unboxed_arguments__2
- je __shared_argument_part
- sub rcx,8
- jmp __mark_next_node
-
-__mark_closure_1_with_unboxed_argument:
- sub rcx,8
- jmp __mark_node2_bb
-
-__mark_hnf_0:
- cmp rax,offset dINT+2
- jne __no_int_3
-
- mov rbp,qword ptr 8[rcx]
- cmp rbp,33
- jb ____small_int
-
-__mark_real_bool_or_small_string:
- mov edx,dword ptr (bit_set_table2)[rdx]
- add r14,2
- or dword ptr [rdi+rbx*4],edx
- cmp rdx,40000000h
- jbe __mark_next_node
- or dword ptr 4[rdi+rbx*4],1
- jmp __mark_next_node
-
-____small_int:
- shl rbp,4
- lea rcx,(small_integers)[rbp]
- jmp __mark_next_node
-
-__no_int_3:
- cmp rax,offset __STRING__+2
- jbe __mark_string_or_array
-
- cmp rax,offset CHAR+2
- jne __no_char_3
-
- movzx rbp,byte ptr 8[rcx]
- shl rbp,4
- lea rcx,(static_characters)[rbp]
- jmp __mark_next_node
-
-__no_char_3:
- jb __mark_real_bool_or_small_string
-
- ifdef NEW_DESCRIPTORS
- lea rcx,((-8)-2)[rax]
- else
- lea rcx,((-12)-2)[rax]
- endif
- jmp __mark_next_node
-
-__mark_node2_bb:
- mov edx,dword ptr (bit_set_table2)[rdx]
- add r14,3
-
- or dword ptr [rdi+rbx*4],edx
-
- cmp rdx,20000000h
- jbe __mark_next_node
-
- or dword ptr 4[rdi+rbx*4],1
- jmp __mark_next_node
-
-__mark__record:
- sub rbp,258
- je __mark_record_2
- jl __mark_record_1
-
-__mark_record_3:
- mov edx,dword ptr (bit_set_table2)[rdx]
- add r14,3
- or dword ptr [rdi+rbx*4],edx
- cmp rdx,20000000h
- jbe fits__in__word__13
- or dword ptr 4[rdi+rbx*4],1
-fits__in__word__13:
- movzx rbx,word ptr (-2+2)[rax]
-
- mov rdx,qword ptr 8[rcx]
- add rdx,r10
- mov rax,rdx
- and rdx,31*8
- shr rax,8
-
- push rsi
-
- mov esi,dword ptr (bit_set_table2)[rdx]
- test esi,dword ptr [rdi+rax*4]
- jne __shared_record_argument_part
-
- add rbp,1
- or dword ptr [rdi+rax *4],esi
-
- lea rdx,[rdx+rbp*8]
- add r14,rbp
-
- pop rsi
-
- cmp rdx,32*8
- jbe fits__in__word__14
- or dword ptr 4[rdi+rax*4],1
-fits__in__word__14:
- sub rbx,1
- mov rdx,qword ptr 8[rcx]
- jl __mark_record_3_bb
- je __shared_argument_part
-
- mov qword ptr 8[rcx],rsi
- add rcx,8
-
- sub rbx,1
- je __mark_record_3_aab
-
- lea rsi,[rdx+rbx*8]
- mov rax,qword ptr [rdx]
- or rax,1
- mov rbp,qword ptr [rsi]
- mov qword ptr [rdx],rax
- mov qword ptr [rsi],rcx
- mov rcx,rbp
- jmp __mark_node
-
-__mark_record_3_bb:
- sub rcx,8
- jmp __mark_next_node
-
-__mark_record_3_aab:
- mov rbp,qword ptr [rdx]
- mov qword ptr [rdx],rcx
- lea rsi,1[rdx]
- mov rcx,rbp
- jmp __mark_node
-
-__shared_record_argument_part:
- mov rdx,qword ptr 8[rcx]
-
- pop rsi
-
- test rbx,rbx
- jne __shared_argument_part
- sub rcx,8
- jmp __mark_next_node
-
-__mark_record_2:
- mov edx,dword ptr (bit_set_table2)[rdx]
- add r14,3
- or dword ptr [rdi+rbx*4],edx
- cmp rdx,20000000h
- jbe fits__in__word_12
- or dword ptr 4[rdi+rbx*4],1
-fits__in__word_12:
- cmp word ptr (-2+2)[rax],1
- ja __mark_record_2_c
- je __shared_argument_part
- sub rcx,8
- jmp __mark_next_node
-
-__mark_record_1:
- cmp word ptr (-2+2)[rax],0
- jne __mark_hnf_1
- sub rcx,8
- jmp __mark_real_bool_or_small_string
-
-__mark_string_or_array:
- je __mark_string_
-
-__mark_array:
- mov rbp,qword ptr 16[rcx]
- test rbp,rbp
- je __mark_lazy_array
-
- movzx rax,word ptr (-2)[rbp]
- test rax,rax
- je __mark_strict_basic_array
-
- movzx rbp,word ptr (-2+2)[rbp]
- test rbp,rbp
- je __mark_b_record_array
-
- sub rax,256
- cmp rax,rbp
- je __mark_a_record_array
-
-__mark__ab__record__array:
- push rdx
- push rbx
- mov rbx,rbp
-
- mov rbp,qword ptr 8[rcx]
- add rcx,16
- push rcx
-
- shl rbp,3
- mov rdx,rax
- imul rdx,rbp
-
- sub rax,rbx
- add rcx,8
- add rdx,rcx
-
- call reorder
-
- pop rcx
-
- xchg rax,rbx
- mov rbp,qword ptr (-8)[rcx]
- imul rax,rbp
- imul rbx,rbp
- add r14,rbx
- add rbx,rax
-
- shl rbx,3
- lea rbp,[r10+rcx]
- add rbp,rbx
-
- pop rbx
- pop rdx
-
- mov edx,dword ptr (bit_set_table2)[rdx]
- or dword ptr [rdi+rbx*4],edx
-
- lea rdx,[rcx+rax*8]
- jmp __mark_r_array
-
-__mark_a_record_array:
- imul rax,qword ptr 8[rcx]
- add rcx,16
- jmp __mark_lr_array
-
-__mark_lazy_array:
- mov rax,qword ptr 8[rcx]
- add rcx,16
-
-__mark_lr_array:
- mov edx,dword ptr (bit_set_table2)[rdx]
- mov rbp,r10
- or dword ptr [rdi+rbx*4],edx
- lea rdx,[rcx+rax*8]
- add rbp,rdx
-__mark_r_array:
- shr rbp,8
-
- cmp rbx,rbp
- jae __skip_mark_lazy_array_bits
-
- inc rbx
-
-__mark_lazy_array_bits:
- or dword ptr [rdi+rbx*4],1
- inc rbx
- cmp rbx,rbp
- jbe __mark_lazy_array_bits
-
-__skip_mark_lazy_array_bits:
- add r14,3
- add r14,rax
-
- cmp rax,1
- jbe __mark_array_length_0_1
-
- mov rbp,qword ptr [rdx]
- mov rbx,qword ptr [rcx]
- mov qword ptr [rdx],rbx
- mov qword ptr [rcx],rbp
-
- mov rbp,qword ptr (-8)[rdx]
- sub rdx,8
- if THREAD
- mov rbx,qword ptr lazy_array_list_offset[r9]
- else
- mov rbx,qword ptr lazy_array_list
- endif
- add rbp,2
- mov qword ptr [rdx],rbx
- mov qword ptr (-8)[rcx],rbp
- mov qword ptr (-16)[rcx],rax
- sub rcx,16
- if THREAD
- mov qword ptr lazy_array_list_offset[r9],rcx
- else
- mov qword ptr lazy_array_list,rcx
- endif
-
- mov rcx,qword ptr (-8)[rdx]
- mov qword ptr (-8)[rdx],rsi
- lea rsi,(-8)[rdx]
- jmp __mark_node
-
-__mark_array_length_0_1:
- lea rcx,(-16)[rcx]
- jb __mark_next_node
-
- mov rbx,qword ptr 24[rcx]
- mov rbp,qword ptr 16[rcx]
- if THREAD
- mov rdx,qword ptr lazy_array_list_offset[r9]
- else
- mov rdx,qword ptr lazy_array_list
- endif
- mov qword ptr 24[rcx],rbp
- mov qword ptr 16[rcx],rdx
- mov qword ptr [rcx],rax
- if THREAD
- mov qword ptr lazy_array_list_offset[r9],rcx
- else
- mov qword ptr lazy_array_list,rcx
- endif
- mov qword ptr 8[rcx],rbx
- add rcx,8
-
- mov rbp,qword ptr [rcx]
- mov qword ptr [rcx],rsi
- lea rsi,2[rcx]
- mov rcx,rbp
- jmp __mark_node
-
-__mark_b_record_array:
- mov rbp,qword ptr 8[rcx]
- sub rax,256
- imul rax,rbp
- add rax,3
- jmp __mark_basic_array
-
-__mark_strict_basic_array:
- mov rax,qword ptr 8[rcx]
- cmp rbp,offset dINT+2
- jle __mark__strict__int__or__real__array
- cmp rbp,offset BOOL+2
- je __mark__strict__bool__array
-__mark__strict__int32__or__real32__array:
- add rax,6+1
- shr rax,1
- jmp __mark_basic_array
-__mark__strict__int__or__real__array:
- add rax,3
- jmp __mark_basic_array
-__mark__strict__bool__array:
- add rax,24+7
- shr rax,3
- jmp __mark_basic_array
-
-__mark_string_:
- mov rax,qword ptr 8[rcx]
- add rax,16+7
- shr rax,3
-
-__mark_basic_array:
- mov edx,dword ptr (bit_set_table2)[rdx]
- add r14,rax
-
- or dword ptr [rdi+rbx*4],edx
- lea rax,(-8)[rcx+rax*8]
-
- add rax,r10
- shr rax,8
-
- cmp rbx,rax
- jae __mark_next_node
-
- inc rbx
- mov rbp,1
-
- cmp rbx,rax
- jae __last__string__bits
-
-__mark_string_lp:
- or dword ptr [rdi+rbx*4],ebp
- inc rbx
- cmp rbx,rax
- jb __mark_string_lp
-
-__last__string__bits:
- or dword ptr [rdi+rbx*4],ebp
- jmp __mark_next_node
+ + if THREAD + mov rax,qword ptr heap_size_65_offset[r9] + else + mov rax,qword ptr heap_size_65 + endif + xor rbx,rbx + + if THREAD + mov qword ptr n_marked_words_offset[r9],rbx + else + mov qword ptr n_marked_words,rbx + endif + shl rax,6 + + if THREAD + mov qword ptr lazy_array_list_offset[r9],rbx + else + mov qword ptr lazy_array_list,rbx + endif + mov r11,rax + + lea rsi,(-4000)[rsp] + + mov rax,qword ptr caf_list + + if THREAD + mov qword ptr end_stack_offset[r9],rsi + + mov r10,neg_heap_p3_offset[r9] + mov r13,qword ptr end_stack_offset[r9] + else + mov qword ptr end_stack,rsi + + mov r10,neg_heap_p3 + mov r13,qword ptr end_stack + endif + mov r14,0 + + test rax,rax + je _end_mark_cafs + +_mark_cafs_lp: + mov rbx,qword ptr [rax] + mov rbp,qword ptr (-8)[rax] + + push rbp + lea rbp,8[rax] + lea r12,8[rax+rbx*8] + + call _mark_stack_nodes + + pop rax + test rax,rax + jne _mark_cafs_lp + +_end_mark_cafs: + if THREAD + mov rsi,qword ptr stack_top_offset[r9] + mov rbp,qword ptr stack_p_offset[r9] + else + mov rsi,qword ptr stack_top + mov rbp,qword ptr stack_p + endif + + mov r12,rsi + call _mark_stack_nodes + +continue_mark_after_pmark: + if THREAD + mov qword ptr n_marked_words_offset[r9],r14 + + mov rcx,qword ptr lazy_array_list_offset[r9] + else + mov qword ptr n_marked_words,r14 + + mov rcx,qword ptr lazy_array_list + endif + + test rcx,rcx + je end_restore_arrays + +restore_arrays: + mov rbx ,qword ptr [rcx] + if THREAD + lea rbp,__ARRAY__+2 + mov qword ptr [rcx],rbp + else + lea r9,__ARRAY__+2 + mov qword ptr [rcx],r9 + endif + + cmp rbx,1 + je restore_array_size_1 + + lea rdx,[rcx+rbx*8] + mov rax,qword ptr 16[rdx] + test rax,rax + je restore_lazy_array + + mov rbp,rax + push rdx + + xor rdx,rdx + mov rax,rbx + movzx rbx,word ptr (-2+2)[rbp] + + div rbx + mov rbx,rax + + pop rdx + mov rax,rbp + +restore_lazy_array: + mov rdi,qword ptr 16[rcx] + mov rbp,qword ptr 8[rcx] + mov qword ptr 8[rcx],rbx + mov rsi,qword ptr 8[rdx] + mov qword ptr 16[rcx],rax + mov qword ptr 8[rdx],rbp + mov qword ptr 16[rdx],rdi + + test rax,rax + je no_reorder_array + + movzx rdx,word ptr (-2)[rax] + sub rdx,256 + movzx rbp,word ptr (-2+2)[rax] + cmp rbp,rdx + je no_reorder_array + + add rcx,24 + imul rbx,rdx + mov rax,rdx + lea rdx,[rcx+rbx*8] + mov rbx,rbp + sub rax,rbp + + call reorder + +no_reorder_array: + mov rcx,rsi + test rcx,rcx + jne restore_arrays + + jmp end_restore_arrays + +restore_array_size_1: + mov rbp,qword ptr 8[rcx] + mov rdx,qword ptr 16[rcx] + mov qword ptr 8[rcx],rbx + mov rax,qword ptr 24[rcx] + mov qword ptr 24[rcx],rbp + mov qword ptr 16[rcx],rax + + mov rcx,rdx + test rcx,rcx + jne restore_arrays + +end_restore_arrays: + if THREAD + mov rdi,qword ptr heap_vector_offset[r9] + else + mov rdi,qword ptr heap_vector + endif + lea rcx,finalizer_list + lea rdx,free_finalizer_list + + mov rbp,qword ptr [rcx] +determine_free_finalizers_after_mark: + if THREAD + lea rax,__Nil-8 + cmp rbp,rax + else + lea r9,__Nil-8 + cmp rbp,r9 + endif + je end_finalizers_after_mark + + lea rax,[r10+rbp] + mov rbx,rax + and rax,31*8 + shr rbx,8 + mov esi,dword ptr (bit_set_table2)[rax] + test esi,dword ptr [rdi+rbx*4] + je finalizer_not_used_after_mark + + lea rcx,8[rbp] + mov rbp,qword ptr 8[rbp] + jmp determine_free_finalizers_after_mark + +finalizer_not_used_after_mark: + mov qword ptr [rdx],rbp + lea rdx,8[rbp] + + mov rbp,qword ptr 8[rbp] + mov qword ptr [rcx],rbp + jmp determine_free_finalizers_after_mark + +end_finalizers_after_mark: + mov qword ptr [rdx],rbp + + call add_garbage_collect_time + + if THREAD + mov rax,qword ptr bit_vector_size_offset[r9] + + mov rdi,qword ptr n_allocated_words_offset[r9] + add rdi,qword ptr n_marked_words_offset[r9] + else + mov rax,qword ptr bit_vector_size + + mov rdi,qword ptr n_allocated_words + add rdi,qword ptr n_marked_words + endif + shl rdi,3 + + mov rsi,rax + shl rsi,3 + + push rdx + push rax + + mov rax,rdi + mul qword ptr heap_size_multiple + shrd rax,rdx,8 + shr rdx,8 + + mov rbx,rax + test rdx,rdx + + pop rax + pop rdx + + je not_largest_heap + + if THREAD + mov rbx,qword ptr heap_size_65_offset[r9] + else + mov rbx,qword ptr heap_size_65 + endif + shl rbx,6 + +not_largest_heap: + cmp rbx,rsi + jbe no_larger_heap + + if THREAD + mov rsi,qword ptr heap_size_65_offset[r9] + else + mov rsi,qword ptr heap_size_65 + endif + shl rsi,6 + cmp rbx,rsi + jbe not_larger_than_heap + mov rbx,rsi +not_larger_than_heap: + mov rax,rbx + shr rax,3 + if THREAD + mov qword ptr bit_vector_size_offset[r9],rax + else + mov qword ptr bit_vector_size,rax + endif +no_larger_heap: + + mov rbp,rax + + if THREAD + mov rdi,qword ptr heap_vector_offset[r9] + else + mov rdi,qword ptr heap_vector + endif + shr rbp,5 + + test al,31 + je no_extra_word + + mov dword ptr [rdi+rbp*4],0 + +no_extra_word: + if THREAD + sub rax,qword ptr n_marked_words_offset[r9] + else + sub rax,qword ptr n_marked_words + endif + shl rax,3 + if THREAD + mov qword ptr n_last_heap_free_bytes_offset[r9],rax + + mov rax,qword ptr n_marked_words_offset[r9] + else + mov qword ptr n_last_heap_free_bytes,rax + + mov rax,qword ptr n_marked_words + endif + shl rax,3 + add qword ptr total_gc_bytes,rax + + test qword ptr flags,2 + je _no_heap_use_message2 + + mov r12,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + + lea rdi,marked_gc_string_1 + else + sub rsp,32 + + lea rcx,marked_gc_string_1 + endif + call ew_print_string + if THREAD + mov r9,rbx + endif + + ifdef LINUX + if THREAD + mov rdi,qword ptr n_marked_words_offset[r9] + else + mov rdi,qword ptr n_marked_words + endif + shl rdi,3 + else + if THREAD + mov rcx,qword ptr n_marked_words_offset[r9] + else + mov rcx,qword ptr n_marked_words + endif + shl rcx,3 + endif + call ew_print_int + if THREAD + mov r9,rbx + endif + + ifdef LINUX + lea rdi,heap_use_after_gc_string_2 + else + lea rcx,heap_use_after_gc_string_2 + endif + call ew_print_string + + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,r12 + if THREAD + mov r9,rbx + endif + +_no_heap_use_message2: + call call_finalizers + + if THREAD + mov rsi,qword ptr n_allocated_words_offset[r9] + else + mov rsi,qword ptr n_allocated_words + endif + xor rbx,rbx + + mov rcx,rdi + if THREAD + mov qword ptr n_free_words_after_mark_offset[r9],rbx + else + mov qword ptr n_free_words_after_mark,rbx + endif + +_scan_bits: + cmp ebx,dword ptr [rcx] + je _zero_bits + mov dword ptr [rcx],ebx + add rcx,4 + sub rbp,1 + jne _scan_bits + + jmp _end_scan + +_zero_bits: + lea rdx,4[rcx] + add rcx,4 + sub rbp,1 + jne _skip_zero_bits_lp1 + jmp _end_bits + +_skip_zero_bits_lp: + test rax,rax + jne _end_zero_bits +_skip_zero_bits_lp1: + mov eax,dword ptr [rcx] + add rcx,4 + sub rbp,1 + jne _skip_zero_bits_lp + + test rax,rax + je _end_bits + mov rax,rcx + mov dword ptr (-4)[rcx],ebx + sub rax,rdx + jmp _end_bits2 + +_end_zero_bits: + mov rax,rcx + sub rax,rdx + shl rax,3 + if THREAD + add qword ptr n_free_words_after_mark_offset[r9],rax + else + add qword ptr n_free_words_after_mark,rax + endif + mov dword ptr (-4)[rcx],ebx + + cmp rax,rsi + jb _scan_bits + +_found_free_memory: + if THREAD + mov qword ptr bit_counter_offset[r9],rbp + mov qword ptr bit_vector_p_offset[r9],rcx + else + mov qword ptr bit_counter,rbp + mov qword ptr bit_vector_p,rcx + endif + + lea rbx,(-4)[rdx] + sub rbx,rdi + shl rbx,6 + if THREAD + mov rdi,qword ptr heap_p3_offset[r9] + else + mov rdi,qword ptr heap_p3 + endif + add rdi,rbx + + mov r15,rax + lea rbx,[rdi+rax*8] + + sub r15,rsi + if THREAD + mov rsi,qword ptr stack_top_offset[r9] + + mov qword ptr heap_end_after_gc_offset[r9],rbx + else + mov rsi,qword ptr stack_top + + mov qword ptr heap_end_after_gc,rbx + endif + + jmp restore_registers_after_gc_and_return + +_end_bits: + mov rax,rcx + sub rax,rdx + add rax,4 +_end_bits2: + shl rax,3 + if THREAD + add qword ptr n_free_words_after_mark_offset[r9],rax + else + add qword ptr n_free_words_after_mark,rax + endif + cmp rax,rsi + jae _found_free_memory + +_end_scan: + if THREAD + mov qword ptr bit_counter_offset[r9],rbp + else + mov qword ptr bit_counter,rbp + endif + jmp compact_gc + +; %rbp : pointer to stack element +; %rdi : heap_vector +; %rax ,%rbx ,%rcx ,%rdx ,%rsi : free + +_mark_stack_nodes: + cmp rbp,r12 + je _end_mark_nodes +_mark_stack_nodes_: + mov rcx,qword ptr [rbp] + + add rbp,8 + lea rdx,[r10+rcx] + + cmp rdx,r11 + jnc _mark_stack_nodes + + mov rbx,rdx + and rdx,31*8 + shr rbx,8 + mov esi,dword ptr (bit_set_table2)[rdx] + + test esi,dword ptr [rdi+rbx*4] + jne _mark_stack_nodes + + push rbp + push 0 + jmp _mark_arguments + +_mark_hnf_2: + cmp rsi,20000000h + jbe fits_in_word_6 + or dword ptr 4[rdi+rbx*4],1 +fits_in_word_6: + add r14,3 + +_mark_record_2_c: + mov rbx,qword ptr 8[rcx] + push rbx + + cmp rsp,r13 + jb __mark_using_reversal + +_mark_node2: +_shared_argument_part: + mov rcx,qword ptr [rcx] + +_mark_node: + lea rdx,[r10+rcx] + cmp rdx,r11 + jnc _mark_next_node + + mov rbx,rdx + and rdx,31*8 + shr rbx,8 + mov esi,dword ptr (bit_set_table2)[rdx] + + test esi,dword ptr [rdi+rbx*4] + jne _mark_next_node + +_mark_arguments: + mov rax,qword ptr [rcx] + test rax,2 + je _mark_lazy_node + + movzx rbp,word ptr (-2)[rax] + + test rbp,rbp + je _mark_hnf_0 + + or dword ptr [rdi+rbx*4],esi + add rcx,8 + + cmp rbp,256 + jae _mark_record + + sub rbp,2 + je _mark_hnf_2 + jb _mark_hnf_1 + +_mark_hnf_3: + mov rdx,qword ptr 8[rcx] + + cmp rsi,20000000h + jbe fits_in_word_1 + or dword ptr 4[rdi+rbx*4],1 +fits_in_word_1: + + add r14,3 + lea rax,[r10+rdx] + mov rbx,rax + + and rax,31*8 + shr rbx,8 + + mov esi,dword ptr (bit_set_table2)[rax] + + test esi,dword ptr [rdi+rbx*4] + jne _shared_argument_part + +_no_shared_argument_part: + or dword ptr [rdi+rbx*4],esi + add rbp,1 + + add r14,rbp + lea rax,[rax+rbp*8] + lea rdx,(-8)[rdx+rbp*8] + + cmp rax,32*8 + jbe fits_in_word_2 + or dword ptr 4[rdi+rbx*4],1 +fits_in_word_2: + + mov rbx,qword ptr [rdx] + sub rbp,2 + push rbx + +_push_hnf_args: + mov rbx,qword ptr (-8)[rdx] + sub rdx,8 + push rbx + sub rbp,1 + jge _push_hnf_args + + cmp rsp,r13 + jae _mark_node2 + + jmp __mark_using_reversal + +_mark_hnf_1: + cmp rsi,40000000h + jbe fits_in_word_4 + or dword ptr 4[rdi+rbx*4],1 +fits_in_word_4: + add r14,2 + mov rcx,qword ptr [rcx] + jmp _mark_node + +_mark_lazy_node_1: + add rcx,8 + or dword ptr [rdi+rbx*4],esi + cmp rsi,20000000h + jbe fits_in_word_3 + or dword ptr 4[rdi+rbx*4],1 +fits_in_word_3: + add r14,3 + + cmp rbp,1 + je _mark_node2 + +_mark_selector_node_1: + add rbp,2 + mov rdx,qword ptr [rcx] + je _mark_indirection_node + + lea rsi,[r10+rdx] + mov rbx,rsi + + shr rbx,8 + and rsi,31*8 + + add rbp,1 + + mov esi,dword ptr (bit_set_table2)[rsi] + jle _mark_record_selector_node_1 + + test esi,dword ptr [rdi+rbx*4] + jne _mark_node3 + + mov rbp,qword ptr [rdx] + test rbp,2 + je _mark_node3 + + cmp word ptr (-2)[rbp],2 + jbe _small_tuple_or_record + +_large_tuple_or_record: + mov rbp,qword ptr 16[rdx] + if THREAD + mov r15,rbp + else + mov r9,rbp + endif + + add rbp,r10 + mov rbx,rbp + and rbp,31*8 + shr rbx,8 + mov ebp,dword ptr (bit_set_table2)[rbp] + test ebp,dword ptr [rdi+rbx*4] + jne _mark_node3 + + ifdef NEW_DESCRIPTORS + mov eax,(-8)[rax] + lea rbp,__indirection + mov qword ptr (-8)[rcx],rbp + movzx eax,word ptr 4[rax] + mov rbp,rcx + + cmp rax,16 + jl _mark_tuple_selector_node_1 + if THREAD + mov rdx,r15 + else + mov rdx,r9 + endif + je _mark_tuple_selector_node_2 + if THREAD + mov rcx,qword ptr (-24)[r15+rax] + else + mov rcx,qword ptr (-24)[r9+rax] + endif + mov qword ptr [rbp],rcx + jmp _mark_node + +_mark_tuple_selector_node_2: + if THREAD + mov rcx,qword ptr [r15] + else + mov rcx,qword ptr [r9] + endif + mov qword ptr [rbp],rcx + jmp _mark_node + endif + +_small_tuple_or_record: + ifdef NEW_DESCRIPTORS + mov eax,(-8)[rax] + lea rbp,__indirection + mov qword ptr (-8)[rcx],rbp + movzx eax,word ptr 4[rax] + mov rbp,rcx +_mark_tuple_selector_node_1: + mov rcx,qword ptr [rdx+rax] + mov qword ptr [rbp],rcx + else + mov eax,(-8)[rax] + push rcx + mov rcx,rdx + mov eax,4[rax] + call near ptr rax + pop rdx + + if THREAD + lea rbp,__indirection + mov qword ptr (-8)[rdx],rbp + else + lea r9,__indirection + mov qword ptr (-8)[rdx],r9 + endif + mov qword ptr [rdx],rcx + endif + jmp _mark_node + +_mark_record_selector_node_1: + je _mark_strict_record_selector_node_1 + + test esi,dword ptr [rdi+rbx*4] + jne _mark_node3 + + mov rbp,qword ptr [rdx] + test rbp,2 + je _mark_node3 + + cmp word ptr (-2)[rbp],258 + jbe _small_tuple_or_record + ifdef NEW_DESCRIPTORS + mov rbp,qword ptr 16[rdx] + if THREAD + mov r15,rbp + else + mov r9,rbp + endif + add rbp,r10 + mov rbx,rbp + and rbp,31*8 + shr rbx,8 + mov ebp,dword ptr (bit_set_table2)[rbp] + test ebp,dword ptr [rdi+rbx*4] + jne _mark_node3 + + mov eax,(-8)[rax] + lea rbp,__indirection + mov qword ptr (-8)[rcx],rbp + movzx eax,word ptr 4[rax] + mov rbp,rcx + + cmp rax,16 + jle _mark_record_selector_node_2 + if THREAD + mov rdx,r15 + else + mov rdx,r9 + endif + sub rax,24 +_mark_record_selector_node_2: + mov rcx,qword ptr [rdx+rax] + mov qword ptr [rbp],rcx + jmp _mark_node + else + jmp _large_tuple_or_record + endif + +_mark_strict_record_selector_node_1: + test esi,dword ptr [rdi+rbx*4] + jne _mark_node3 + + mov rbp,qword ptr [rdx] + test rbp,2 + je _mark_node3 + + cmp word ptr (-2)[rbp],258 + jbe _select_from_small_record + + mov rbp,qword ptr 16[rdx] + if THREAD + mov r15,rbp + else + mov r9,rbp + endif + + add rbp,r10 + mov rbx,rbp + and rbp,31*8 + shr rbx,8 + mov ebp,dword ptr (bit_set_table2)[rbp] + test ebp,dword ptr [rdi+rbx*4] + jne _mark_node3 + +_select_from_small_record: + mov eax,dword ptr (-8)[rax] + sub rcx,8 + + ifdef NEW_DESCRIPTORS + movzx ebx,word ptr 4[rax] + cmp rbx,16 + jle _mark_strict_record_selector_node_2 + if THREAD + mov rbx,qword ptr (-24)[r15+rbx] + else + mov rbx,qword ptr (-24)[r9+rbx] + endif + jmp _mark_strict_record_selector_node_3 +_mark_strict_record_selector_node_2: + mov rbx,qword ptr [rdx+rbx] +_mark_strict_record_selector_node_3: + mov qword ptr 8[rcx],rbx + + movzx ebx,word ptr 6[rax] + test rbx,rbx + je _mark_strict_record_selector_node_5 + cmp rbx,16 + jle _mark_strict_record_selector_node_4 + if THREAD + mov rdx,r15 + else + mov rdx,r9 + endif + sub rbx,24 +_mark_strict_record_selector_node_4: + mov rbx,qword ptr [rdx+rbx] + mov qword ptr 16[rcx],rbx +_mark_strict_record_selector_node_5: + + mov rax,qword ptr (-8)[rax] + mov qword ptr [rcx],rax + else + mov eax,4[rax] + call near ptr rax + endif + jmp _mark_next_node + +_mark_indirection_node: +_mark_node3: + mov rcx,rdx + jmp _mark_node + +_mark_next_node: + pop rcx + test rcx,rcx + jne _mark_node + + pop rbp + cmp rbp,r12 + jne _mark_stack_nodes_ + +_end_mark_nodes: + ret + +_mark_lazy_node: + movsxd rbp,dword ptr (-4)[rax] + test rbp,rbp + je _mark_node2_bb + + cmp rbp,1 + jle _mark_lazy_node_1 + + cmp rbp,256 + jge _mark_closure_with_unboxed_arguments + inc rbp + or dword ptr [rdi+rbx*4],esi + + add r14,rbp + lea rdx,[rdx+rbp*8] + lea rcx,[rcx+rbp*8] + + cmp rdx,32*8 + jbe fits_in_word_7 + or dword ptr 4[rdi+rbx*4],1 +fits_in_word_7: + sub rbp,3 +_push_lazy_args: + mov rbx,qword ptr (-8)[rcx] + sub rcx,8 + push rbx + sub rbp,1 + jge _push_lazy_args + + sub rcx,8 + + cmp rsp,r13 + jae _mark_node2 + + jmp __mark_using_reversal + +_mark_closure_with_unboxed_arguments: + mov rax,rbp + and rbp,255 + sub rbp,1 + je _mark_node2_bb + + shr rax,8 + add rbp,2 + + or dword ptr [rdi+rbx*4],esi + add r14,rbp + lea rdx,[rdx+rbp*8] + + sub rbp,rax + + cmp rdx,32*8 + jbe fits_in_word_7_ + or dword ptr 4[rdi+rbx*4],1 +fits_in_word_7_: + sub rbp,2 + jl _mark_next_node + + lea rcx,16[rcx+rbp*8] + jne _push_lazy_args + +_mark_closure_with_one_boxed_argument: + mov rcx,qword ptr (-8)[rcx] + jmp _mark_node + +_mark_hnf_0: + if THREAD + lea rbp,__STRING__+2 + cmp rax,rbp + else + lea r9,__STRING__+2 + cmp rax,r9 + endif + jbe _mark_string_or_array + + or dword ptr [rdi+rbx*4],esi + + if THREAD + lea rbp,CHAR+2 + cmp rax,rbp + else + lea r9,CHAR+2 + cmp rax,r9 + endif + ja _mark_normal_hnf_0 + +_mark_real_int_bool_or_char: + add r14,2 + + cmp rsi,40000000h + jbe _mark_next_node + + or dword ptr 4[rdi+rbx*4],1 + jmp _mark_next_node + +_mark_normal_hnf_0: + inc r14 + jmp _mark_next_node + +_mark_node2_bb: + or dword ptr [rdi+rbx*4],esi + add r14,3 + + cmp rsi,20000000h + jbe _mark_next_node + + or dword ptr 4[rdi+rbx*4],1 + jmp _mark_next_node + +_mark_record: + sub rbp,258 + je _mark_record_2 + jl _mark_record_1 + +_mark_record_3: + add r14,3 + + cmp rsi,20000000h + jbe fits_in_word_13 + or dword ptr 4[rdi+rbx*4],1 +fits_in_word_13: + mov rdx,qword ptr 8[rcx] + + movzx rbx,word ptr (-2+2)[rax] + lea rsi,[r10+rdx] + + mov rax,rsi + and rsi,31*8 + + shr rax,8 + sub rbx,1 + + mov edx,dword ptr (bit_set_table2)[rsi] + jb _mark_record_3_bb + + test edx,dword ptr [rdi+rax*4] + jne _mark_node2 + + add rbp,1 + or dword ptr [rdi+rax*4],edx + add r14,rbp + lea rsi,[rsi+rbp*8] + + cmp rsi,32*8 + jbe _push_record_arguments + or dword ptr 4[rdi+rax*4],1 +_push_record_arguments: + mov rdx,qword ptr 8[rcx] + mov rbp,rbx + shl rbx,3 + add rdx,rbx + sub rbp,1 + jge _push_hnf_args + + jmp _mark_node2 + +_mark_record_3_bb: + test edx,dword ptr [rdi+rax*4] + jne _mark_next_node + + add rbp,1 + or dword ptr [rdi+rax*4],edx + add r14,rbp + lea rsi,[rsi+rbp*8] + + cmp rsi,32*8 + jbe _mark_next_node + + or dword ptr 4[rdi+rax*4],1 + jmp _mark_next_node + +_mark_record_2: + cmp rsi,20000000h + jbe fits_in_word_12 + or dword ptr 4[rdi+rbx*4],1 +fits_in_word_12: + add r14,3 + + cmp word ptr (-2+2)[rax],1 + ja _mark_record_2_c + je _mark_node2 + jmp _mark_next_node + +_mark_record_1: + cmp word ptr (-2+2)[rax],0 + jne _mark_hnf_1 + + jmp _mark_real_int_bool_or_char + +_mark_string_or_array: + je _mark_string_ + +_mark_array: + mov rbp,qword ptr 16[rcx] + test rbp,rbp + je _mark_lazy_array + + movzx rax,word ptr (-2)[rbp] + + test rax,rax + je _mark_strict_basic_array + + movzx rbp,word ptr (-2+2)[rbp] + test rbp,rbp + je _mark_b_record_array + + cmp rsp,r13 + jb _mark_array_using_reversal + + sub rax,256 + cmp rax,rbp + je _mark_a_record_array + +_mark_ab_record_array: + or dword ptr [rdi+rbx*4],esi + mov rbp,qword ptr 8[rcx] + + imul rax,rbp + add rax,3 + + add r14,rax + lea rax,(-8)[rcx+rax*8] + + add rax,r10 + shr rax,8 + + cmp rbx,rax + jae _end_set_ab_array_bits + + inc rbx + mov rbp,1 + cmp rbx,rax + jae _last_ab_array_bits + +_mark_ab_array_lp: + or dword ptr [rdi+rbx*4],ebp + inc rbx + cmp rbx,rax + jb _mark_ab_array_lp + +_last_ab_array_bits: + or dword ptr [rdi+rbx*4],ebp + +_end_set_ab_array_bits: + mov rax,qword ptr 8[rcx] + mov rdx,qword ptr 16[rcx] + movzx rbx,word ptr (-2+2)[rdx] + movzx rdx,word ptr (-2)[rdx] + shl rbx,3 + lea rdx,(-2048)[rdx*8] + push rbx + push rdx + lea rbp,24[rcx] + push r12 + jmp _mark_ab_array_begin + +_mark_ab_array: + mov rbx,qword ptr 16[rsp] + push rax + push rbp + lea r12,[rbp+rbx] + + call _mark_stack_nodes + + mov rbx,qword ptr (8+16)[rsp] + pop rbp + pop rax + add rbp,rbx +_mark_ab_array_begin: + sub rax,1 + jnc _mark_ab_array + + pop r12 + add rsp,16 + jmp _mark_next_node + +_mark_a_record_array: + or dword ptr [rdi+rbx*4],esi + mov rbp,qword ptr 8[rcx] + + imul rax,rbp + push rax + + add rax,3 + + add r14,rax + lea rax,(-8)[rcx+rax*8] + + add rax,r10 + shr rax,8 + + cmp rbx,rax + jae _end_set_a_array_bits + + inc rbx + mov rbp,1 + cmp rbx,rax + jae _last_a_array_bits + +_mark_a_array_lp: + or dword ptr [rdi+rbx*4],ebp + inc rbx + cmp rbx,rax + jb _mark_a_array_lp + +_last_a_array_bits: + or dword ptr [rdi+rbx*4],ebp + +_end_set_a_array_bits: + pop rax + lea rbp,24[rcx] + + push r12 + lea r12,24[rcx+rax*8] + + call _mark_stack_nodes + + pop r12 + jmp _mark_next_node + +_mark_lazy_array: + cmp rsp,r13 + jb _mark_array_using_reversal + + or dword ptr [rdi+rbx*4],esi + mov rax,qword ptr 8[rcx] + + add rax,3 + + add r14,rax + lea rax,(-8)[rcx+rax*8] + + add rax,r10 + shr rax,8 + + cmp rbx,rax + jae _end_set_lazy_array_bits + + inc rbx + mov rbp,1 + cmp rbx,rax + jae _last_lazy_array_bits + +_mark_lazy_array_lp: + or dword ptr [rdi+rbx*4],ebp + inc rbx + cmp rbx,rax + jb _mark_lazy_array_lp + +_last_lazy_array_bits: + or dword ptr [rdi+rbx*4],ebp + +_end_set_lazy_array_bits: + mov rax,qword ptr 8[rcx] + lea rbp,24[rcx] + + push r12 + lea r12,24[rcx+rax*8] + + call _mark_stack_nodes + + pop r12 + jmp _mark_next_node + +_mark_array_using_reversal: + push 0 + mov rsi,1 + jmp __mark_node + +_mark_strict_basic_array: + mov rax,qword ptr 8[rcx] + cmp rbp,offset dINT+2 + jle _mark_strict_int_or_real_array + cmp rbp,offset BOOL+2 + je _mark_strict_bool_array +_mark_strict_int32_or_real32_array: + add rax,6+1 + shr rax,1 + jmp _mark_basic_array_ +_mark_strict_int_or_real_array: + add rax,3 + jmp _mark_basic_array_ +_mark_strict_bool_array: + add rax,24+7 + shr rax,3 + jmp _mark_basic_array_ + +_mark_b_record_array: + mov rbp,qword ptr 8[rcx] + sub rax,256 + imul rax,rbp + add rax,3 + jmp _mark_basic_array_ + +_mark_string_: + mov rax,qword ptr 8[rcx] + add rax,16+7 + shr rax,3 + +_mark_basic_array_: + or dword ptr [rdi+rbx*4],esi + + add r14,rax + lea rax,(-8)[rcx+rax*8] + + add rax,r10 + shr rax,8 + + cmp rbx,rax + jae _mark_next_node + + inc rbx + mov rbp,1 + cmp rbx,rax + jae _last_string_bits + +_mark_string_lp: + or dword ptr [rdi+rbx*4],ebp + inc rbx + cmp rbx,rax + jb _mark_string_lp + +_last_string_bits: + or dword ptr [rdi+rbx*4],ebp + jmp _mark_next_node + +__end_mark_using_reversal: + pop rdx + test rdx,rdx + je _mark_next_node + mov qword ptr [rdx],rcx + jmp _mark_next_node + +__mark_using_reversal: + push rcx + mov rsi,1 + mov rcx,qword ptr [rcx] + jmp __mark_node + +__mark_arguments: + mov rax,qword ptr [rcx] + test al,2 + je __mark_lazy_node + + movzx rbp,word ptr (-2)[rax] + test rbp,rbp + je __mark_hnf_0 + + add rcx,8 + + cmp rbp,256 + jae __mark__record + + sub rbp,2 + je __mark_hnf_2 + jb __mark_hnf_1 + +__mark_hnf_3: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,3 + + or dword ptr [rdi+rbx*4],edx + + cmp rdx,20000000h + + mov rax,qword ptr 8[rcx] + + jbe fits__in__word__1 + or dword ptr 4[rdi+rbx*4],1 +fits__in__word__1: + add rax,r10 + + mov rbx,rax + and rax,31*8 + + shr rbx,8 + + mov edx,dword ptr (bit_set_table2)[rax] + test edx,dword ptr [rdi+rbx*4] + jne __shared_argument_part + +__no_shared_argument_part: + or dword ptr [rdi+rbx*4],edx + mov rdx,qword ptr 8[rcx] + + add rbp,1 + mov qword ptr 8[rcx],rsi + + add r14,rbp + add rcx,8 + + shl rbp,3 + or qword ptr [rdx],1 + + add rax,rbp + add rdx,rbp + + cmp rax,32*8 + jbe fits__in__word__2 + or dword ptr 4[rdi+rbx*4],1 +fits__in__word__2: + + mov rbp ,qword ptr (-8)[rdx] + mov qword ptr (-8)[rdx],rcx + lea rsi,(-8)[rdx] + mov rcx,rbp + jmp __mark_node + +__mark_hnf_1: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,2 + or dword ptr [rdi+rbx*4],edx + cmp rdx,40000000h + jbe __shared_argument_part + or dword ptr 4[rdi+rbx*4],1 +__shared_argument_part: + mov rbp,qword ptr [rcx] + mov qword ptr [rcx],rsi + lea rsi,2[rcx] + mov rcx,rbp + jmp __mark_node + +__mark_no_selector_2: + pop rbx +__mark_no_selector_1: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,3 + or dword ptr [rdi+rbx*4],edx + cmp rdx,20000000h + jbe __shared_argument_part + + or dword ptr 4[rdi+rbx*4],1 + jmp __shared_argument_part + +__mark_lazy_node_1: + je __mark_no_selector_1 + +__mark_selector_node_1: + add rbp,2 + je __mark_indirection_node + + add rbp,1 + + push rbx + mov rbp,qword ptr [rcx] + push rax + lea rax,[r10+rbp] + + jle __mark_record_selector_node_1 + + mov rbx,rax + and rax,31*8 + shr rbx,8 + mov eax,dword ptr (bit_set_table2)[rax] + test eax,dword ptr [rdi+rbx*4] + pop rax + jne __mark_no_selector_2 + + mov rbx,qword ptr [rbp] + test bl,2 + je __mark_no_selector_2 + + cmp word ptr (-2)[rbx],2 + jbe __small_tuple_or_record + +__large_tuple_or_record: + mov r8,qword ptr 16[rbp] + if THREAD + mov r15,r8 + else + mov r9,r8 + endif + + add r8,r10 + mov rbx,r8 + and r8,31*8 + shr rbx,8 + mov r8d,dword ptr (bit_set_table2)[r8] + test r8d,dword ptr [rdi+rbx*4] + jne __mark_no_selector_2 + + ifdef NEW_DESCRIPTORS + mov eax,dword ptr (-8)[rax] + lea rdx,__indirection + pop rbx + + mov qword ptr (-8)[rcx],rdx + movzx eax,word ptr 4[rax] + mov r8,rcx + + cmp rax,16 + jl __mark_tuple_selector_node_1 + je __mark_tuple_selector_node_2 + if THREAD + mov rcx,qword ptr (-24)[r15+rax] + else + mov rcx,qword ptr (-24)[r9+rax] + endif + mov qword ptr [r8],rcx + jmp __mark_node + +__mark_tuple_selector_node_2: + if THREAD + mov rcx,qword ptr [r15] + else + mov rcx,qword ptr [r9] + endif + mov qword ptr [r8],rcx + jmp __mark_node + endif + +__small_tuple_or_record: + ifdef NEW_DESCRIPTORS + mov eax,dword ptr (-8)[rax] + lea rdx,__indirection + pop rbx + + mov qword ptr (-8)[rcx],rdx + movzx eax,word ptr 4[rax] + mov r8,rcx +__mark_tuple_selector_node_1: + mov rcx,qword ptr [rbp+rax] + mov qword ptr [r8],rcx + jmp __mark_node + else + mov eax,(-8)[rax] + pop rbx + + push rcx + mov rcx,qword ptr [rcx] + mov eax,4[rax] + call near ptr rax + pop rdx + + mov qword ptr (-8)[rdx],offset __indirection + mov qword ptr [rdx],rcx + endif + jmp __mark_node + +__mark_record_selector_node_1: + je __mark_strict_record_selector_node_1 + + mov rbx,rax + and rax,31*8 + shr rbx,8 + mov eax,dword ptr (bit_set_table2)[rax] + test eax,dword ptr [rdi+rbx*4] + pop rax + jne __mark_no_selector_2 + + mov rbx,qword ptr [rbp] + test bl,2 + je __mark_no_selector_2 + + cmp word ptr (-2)[rbx],258 + ifdef NEW_DESCRIPTORS + jbe __small_record + + mov r8,qword ptr 16[rbp] + if THREAD + mov r15,r8 + else + mov r9,r8 + endif + + add r8,r10 + mov rbx,r8 + and r8,31*8 + shr rbx,8 + mov r8d,dword ptr (bit_set_table2)[r8] + test r8d,dword ptr [rdi+rbx*4] + jne __mark_no_selector_2 + +__small_record: + mov eax,(-8)[rax] + lea rdx,__indirection + pop rbx + + mov qword ptr (-8)[rcx],rdx + movzx eax,word ptr 4[rax] + mov r8,rcx + + cmp rax,16 + jle __mark_record_selector_node_2 + if THREAD + mov rbp,r15 + else + mov rbp,r9 + endif + sub rax,24 +__mark_record_selector_node_2: + mov rcx,qword ptr [rbp+rax] + mov qword ptr [r8],rcx + jmp __mark_node + else + jbe __small_tuple_or_record + jmp __large_tuple_or_record + endif + +__mark_strict_record_selector_node_1: + mov rbx,rax + and rax,31*8 + shr rbx,8 + mov eax,dword ptr (bit_set_table2)[rax] + test eax,dword ptr [rdi+rbx *4] + pop rax + jne __mark_no_selector_2 + + mov rbx,qword ptr [rbp] + test bl,2 + je __mark_no_selector_2 + + cmp word ptr (-2)[rbx],258 + jle __select_from_small_record + + mov r8,qword ptr 16[rbp] + if THREAD + mov r15,r8 + else + mov r9,r8 + endif + + add r8,r10 + mov rbx,r8 + and r8,31*8 + shr rbx,8 + mov r8d,dword ptr (bit_set_table2)[r8] + test r8d,dword ptr [rdi+rbx*4] + jne __mark_no_selector_2 + +__select_from_small_record: + ifdef NEW_DESCRIPTORS + mov eax,(-8)[rax] + sub rcx,8 + + movzx ebx,word ptr 4[rax] + cmp rbx,16 + jle __mark_strict_record_selector_node_2 + if THREAD + mov rbx,qword ptr (-24)[r15+rbx] + else + mov rbx,qword ptr (-24)[r9+rbx] + endif + jmp __mark_strict_record_selector_node_3 +__mark_strict_record_selector_node_2: + mov rbx,qword ptr [rbp+rbx] +__mark_strict_record_selector_node_3: + mov qword ptr 8[rcx],rbx + + movzx ebx,word ptr 6[rax] + test rbx,rbx + je __mark_strict_record_selector_node_5 + cmp rbx,16 + jle __mark_strict_record_selector_node_4 + if THREAD + mov rbp,r15 + else + mov rbp,r9 + endif + sub rbx,24 +__mark_strict_record_selector_node_4: + mov rbx,qword ptr [rbp+rbx] + mov qword ptr 16[rcx],rbx +__mark_strict_record_selector_node_5: + pop rbx + + mov rax,qword ptr (-8)[rax] + mov qword ptr [rcx],rax + else + mov eax,(-8)[rax] + pop rbx + mov rdx,qword ptr [rcx] + sub rcx,8 + mov eax,4[rax] + call near ptr rax + endif + jmp __mark_node + +__mark_indirection_node: + mov rcx,qword ptr [rcx] + jmp __mark_node + +__mark_hnf_2: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,3 + or dword ptr [rdi+rbx*4],edx + cmp rdx,20000000h + jbe fits__in__word__6 + or dword ptr 4[rdi+rbx*4],1 +fits__in__word__6: + +__mark_record_2_c: + mov rax,qword ptr [rcx] + mov rbp,qword ptr 8[rcx] + or rax,2 + mov qword ptr 8[rcx],rsi + mov qword ptr [rcx],rax + lea rsi,8[rcx] + mov rcx,rbp + +__mark_node: + lea rdx,[r10+rcx] + cmp rdx,r11 + jae __mark_next_node + + mov rbx,rdx + and rdx,31*8 + shr rbx,8 + mov ebp,dword ptr (bit_set_table2)[rdx] + test ebp,dword ptr [rdi+rbx*4] + je __mark_arguments + +__mark_next_node: + test rsi,3 + jne __mark_parent + + mov rbp,qword ptr (-8)[rsi] + mov rdx,qword ptr [rsi] + mov qword ptr [rsi],rcx + mov qword ptr (-8)[rsi],rdx + sub rsi,8 + + mov rcx,rbp + and rbp,3 + and rcx,-4 + or rsi,rbp + jmp __mark_node + +__mark_parent: + mov rbx,rsi + and rsi,-4 + je __end_mark_using_reversal + + and rbx,3 + mov rbp,qword ptr [rsi] + mov qword ptr [rsi],rcx + + sub rbx,1 + je __argument_part_parent + + lea rcx,(-8)[rsi] + mov rsi,rbp + jmp __mark_next_node + +__argument_part_parent: + and rbp,-4 + mov rdx,rsi + mov rcx,qword ptr (-8)[rbp] + mov rbx,qword ptr [rbp] + mov qword ptr (-8)[rbp],rbx + mov qword ptr [rbp],rdx + lea rsi,(2-8)[rbp] + jmp __mark_node + +__mark_lazy_node: + movsxd rbp,dword ptr(-4)[rax] + test rbp,rbp + je __mark_node2_bb + + add rcx,8 + cmp rbp,1 + jle __mark_lazy_node_1 + cmp rbp,256 + jge __mark_closure_with_unboxed_arguments + + add rbp,1 + mov rax,rdx + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,rbp + + lea rax,[rax+rbp*8] + sub rbp,2 + + or dword ptr [rdi+rbx*4],edx + + cmp rax,32*8 + jbe fits__in__word__7 + or dword ptr 4[rdi+rbx*4],1 +fits__in__word__7: +__mark_closure_with_unboxed_arguments__2: + lea rdx,[rcx+rbp*8] + mov rax,qword ptr [rcx] + or rax,2 + mov qword ptr [rcx],rax + mov rcx,qword ptr [rdx] + mov qword ptr [rdx],rsi + mov rsi,rdx + jmp __mark_node + +__mark_closure_with_unboxed_arguments: + mov rax,rbp + and rbp,255 + + sub rbp,1 + je __mark_closure_1_with_unboxed_argument + add rbp,2 + + shr rax,8 + add r14,rbp + + push rcx + lea rcx,[rdx+rbp*8] + + mov edx,dword ptr (bit_set_table2)[rdx] + sub rbp,rax + + or dword ptr [rdi+rbx*4],edx + cmp rcx,32*8 + jbe fits__in_word_7_ + or dword ptr 4[rdi+rbx*4],1 +fits__in_word_7_: + pop rcx + sub rbp,2 + jg __mark_closure_with_unboxed_arguments__2 + je __shared_argument_part + sub rcx,8 + jmp __mark_next_node + +__mark_closure_1_with_unboxed_argument: + sub rcx,8 + jmp __mark_node2_bb + +__mark_hnf_0: + cmp rax,offset dINT+2 + jne __no_int_3 + + mov rbp,qword ptr 8[rcx] + cmp rbp,33 + jb ____small_int + +__mark_real_bool_or_small_string: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,2 + or dword ptr [rdi+rbx*4],edx + cmp rdx,40000000h + jbe __mark_next_node + or dword ptr 4[rdi+rbx*4],1 + jmp __mark_next_node + +____small_int: + shl rbp,4 + lea rcx,(small_integers)[rbp] + jmp __mark_next_node + +__no_int_3: + cmp rax,offset __STRING__+2 + jbe __mark_string_or_array + + cmp rax,offset CHAR+2 + jne __no_char_3 + + movzx rbp,byte ptr 8[rcx] + shl rbp,4 + lea rcx,(static_characters)[rbp] + jmp __mark_next_node + +__no_char_3: + jb __mark_real_bool_or_small_string + + ifdef NEW_DESCRIPTORS + lea rcx,((-8)-2)[rax] + else + lea rcx,((-12)-2)[rax] + endif + jmp __mark_next_node + +__mark_node2_bb: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,3 + + or dword ptr [rdi+rbx*4],edx + + cmp rdx,20000000h + jbe __mark_next_node + + or dword ptr 4[rdi+rbx*4],1 + jmp __mark_next_node + +__mark__record: + sub rbp,258 + je __mark_record_2 + jl __mark_record_1 + +__mark_record_3: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,3 + or dword ptr [rdi+rbx*4],edx + cmp rdx,20000000h + jbe fits__in__word__13 + or dword ptr 4[rdi+rbx*4],1 +fits__in__word__13: + movzx rbx,word ptr (-2+2)[rax] + + mov rdx,qword ptr 8[rcx] + add rdx,r10 + mov rax,rdx + and rdx,31*8 + shr rax,8 + + push rsi + + mov esi,dword ptr (bit_set_table2)[rdx] + test esi,dword ptr [rdi+rax*4] + jne __shared_record_argument_part + + add rbp,1 + or dword ptr [rdi+rax *4],esi + + lea rdx,[rdx+rbp*8] + add r14,rbp + + pop rsi + + cmp rdx,32*8 + jbe fits__in__word__14 + or dword ptr 4[rdi+rax*4],1 +fits__in__word__14: + sub rbx,1 + mov rdx,qword ptr 8[rcx] + jl __mark_record_3_bb + je __shared_argument_part + + mov qword ptr 8[rcx],rsi + add rcx,8 + + sub rbx,1 + je __mark_record_3_aab + + lea rsi,[rdx+rbx*8] + mov rax,qword ptr [rdx] + or rax,1 + mov rbp,qword ptr [rsi] + mov qword ptr [rdx],rax + mov qword ptr [rsi],rcx + mov rcx,rbp + jmp __mark_node + +__mark_record_3_bb: + sub rcx,8 + jmp __mark_next_node + +__mark_record_3_aab: + mov rbp,qword ptr [rdx] + mov qword ptr [rdx],rcx + lea rsi,1[rdx] + mov rcx,rbp + jmp __mark_node + +__shared_record_argument_part: + mov rdx,qword ptr 8[rcx] + + pop rsi + + test rbx,rbx + jne __shared_argument_part + sub rcx,8 + jmp __mark_next_node + +__mark_record_2: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,3 + or dword ptr [rdi+rbx*4],edx + cmp rdx,20000000h + jbe fits__in__word_12 + or dword ptr 4[rdi+rbx*4],1 +fits__in__word_12: + cmp word ptr (-2+2)[rax],1 + ja __mark_record_2_c + je __shared_argument_part + sub rcx,8 + jmp __mark_next_node + +__mark_record_1: + cmp word ptr (-2+2)[rax],0 + jne __mark_hnf_1 + sub rcx,8 + jmp __mark_real_bool_or_small_string + +__mark_string_or_array: + je __mark_string_ + +__mark_array: + mov rbp,qword ptr 16[rcx] + test rbp,rbp + je __mark_lazy_array + + movzx rax,word ptr (-2)[rbp] + test rax,rax + je __mark_strict_basic_array + + movzx rbp,word ptr (-2+2)[rbp] + test rbp,rbp + je __mark_b_record_array + + sub rax,256 + cmp rax,rbp + je __mark_a_record_array + +__mark__ab__record__array: + push rdx + push rbx + mov rbx,rbp + + mov rbp,qword ptr 8[rcx] + add rcx,16 + push rcx + + shl rbp,3 + mov rdx,rax + imul rdx,rbp + + sub rax,rbx + add rcx,8 + add rdx,rcx + + call reorder + + pop rcx + + xchg rax,rbx + mov rbp,qword ptr (-8)[rcx] + imul rax,rbp + imul rbx,rbp + add r14,rbx + add rbx,rax + + shl rbx,3 + lea rbp,[r10+rcx] + add rbp,rbx + + pop rbx + pop rdx + + mov edx,dword ptr (bit_set_table2)[rdx] + or dword ptr [rdi+rbx*4],edx + + lea rdx,[rcx+rax*8] + jmp __mark_r_array + +__mark_a_record_array: + imul rax,qword ptr 8[rcx] + add rcx,16 + jmp __mark_lr_array + +__mark_lazy_array: + mov rax,qword ptr 8[rcx] + add rcx,16 + +__mark_lr_array: + mov edx,dword ptr (bit_set_table2)[rdx] + mov rbp,r10 + or dword ptr [rdi+rbx*4],edx + lea rdx,[rcx+rax*8] + add rbp,rdx +__mark_r_array: + shr rbp,8 + + cmp rbx,rbp + jae __skip_mark_lazy_array_bits + + inc rbx + +__mark_lazy_array_bits: + or dword ptr [rdi+rbx*4],1 + inc rbx + cmp rbx,rbp + jbe __mark_lazy_array_bits + +__skip_mark_lazy_array_bits: + add r14,3 + add r14,rax + + cmp rax,1 + jbe __mark_array_length_0_1 + + mov rbp,qword ptr [rdx] + mov rbx,qword ptr [rcx] + mov qword ptr [rdx],rbx + mov qword ptr [rcx],rbp + + mov rbp,qword ptr (-8)[rdx] + sub rdx,8 + if THREAD + mov rbx,qword ptr lazy_array_list_offset[r9] + else + mov rbx,qword ptr lazy_array_list + endif + add rbp,2 + mov qword ptr [rdx],rbx + mov qword ptr (-8)[rcx],rbp + mov qword ptr (-16)[rcx],rax + sub rcx,16 + if THREAD + mov qword ptr lazy_array_list_offset[r9],rcx + else + mov qword ptr lazy_array_list,rcx + endif + + mov rcx,qword ptr (-8)[rdx] + mov qword ptr (-8)[rdx],rsi + lea rsi,(-8)[rdx] + jmp __mark_node + +__mark_array_length_0_1: + lea rcx,(-16)[rcx] + jb __mark_next_node + + mov rbx,qword ptr 24[rcx] + mov rbp,qword ptr 16[rcx] + if THREAD + mov rdx,qword ptr lazy_array_list_offset[r9] + else + mov rdx,qword ptr lazy_array_list + endif + mov qword ptr 24[rcx],rbp + mov qword ptr 16[rcx],rdx + mov qword ptr [rcx],rax + if THREAD + mov qword ptr lazy_array_list_offset[r9],rcx + else + mov qword ptr lazy_array_list,rcx + endif + mov qword ptr 8[rcx],rbx + add rcx,8 + + mov rbp,qword ptr [rcx] + mov qword ptr [rcx],rsi + lea rsi,2[rcx] + mov rcx,rbp + jmp __mark_node + +__mark_b_record_array: + mov rbp,qword ptr 8[rcx] + sub rax,256 + imul rax,rbp + add rax,3 + jmp __mark_basic_array + +__mark_strict_basic_array: + mov rax,qword ptr 8[rcx] + cmp rbp,offset dINT+2 + jle __mark__strict__int__or__real__array + cmp rbp,offset BOOL+2 + je __mark__strict__bool__array +__mark__strict__int32__or__real32__array: + add rax,6+1 + shr rax,1 + jmp __mark_basic_array +__mark__strict__int__or__real__array: + add rax,3 + jmp __mark_basic_array +__mark__strict__bool__array: + add rax,24+7 + shr rax,3 + jmp __mark_basic_array + +__mark_string_: + mov rax,qword ptr 8[rcx] + add rax,16+7 + shr rax,3 + +__mark_basic_array: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,rax + + or dword ptr [rdi+rbx*4],edx + lea rax,(-8)[rcx+rax*8] + + add rax,r10 + shr rax,8 + + cmp rbx,rax + jae __mark_next_node + + inc rbx + mov rbp,1 + + cmp rbx,rax + jae __last__string__bits + +__mark_string_lp: + or dword ptr [rdi+rbx*4],ebp + inc rbx + cmp rbx,rax + jb __mark_string_lp + +__last__string__bits: + or dword ptr [rdi+rbx*4],ebp + jmp __mark_next_node |