summaryrefslogtreecommitdiff
path: root/thread/amark.asm
diff options
context:
space:
mode:
Diffstat (limited to 'thread/amark.asm')
-rw-r--r--thread/amark.asm4312
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