diff options
Diffstat (limited to 'amark_prefetch.asm')
-rw-r--r-- | amark_prefetch.asm | 1748 |
1 files changed, 1748 insertions, 0 deletions
diff --git a/amark_prefetch.asm b/amark_prefetch.asm new file mode 100644 index 0000000..b0e38c4 --- /dev/null +++ b/amark_prefetch.asm @@ -0,0 +1,1748 @@ + +_TEXT ends + _DATA segment +n_queue_items: + dq 0 +queue_first: + dq 0 +queue: + dq 0,0,0,0,0,0,0,0 + dq 0,0,0,0,0,0,0,0 +_DATA ends + _TEXT segment + +pmark: + mov rax,qword ptr heap_size_65 + xor rbx,rbx + + mov qword ptr n_marked_words,rbx + shl rax,6 + + mov qword ptr heap_size_64_65,rax + mov qword ptr lazy_array_list,rbx + + lea rsi,(-4000)[rsp] + + mov rax,qword ptr caf_list + + mov qword ptr end_stack,rsi + + mov r15,0 + mov r8,0 + + mov r10,neg_heap_p3 + mov r11,heap_size_64_65 + mov r13,qword ptr end_stack + mov r14,0 + + test rax,rax + je end_pmark_cafs + +pmark_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 pmark_stack_nodes + + pop rax + test rax,rax + jne pmark_cafs_lp + +end_pmark_cafs: + mov rsi,qword ptr stack_top + mov rbp,qword ptr stack_p + + mov r12,rsi + call pmark_stack_nodes + jmp continue_mark_after_pmark + +; %rbp : pointer to stack element +; %rdi : heap_vector +; %rax ,%rbx ,%rcx ,%rdx ,%rsi : free + +pmark_stack_nodes: + cmp rbp,r12 + je end_pmark_nodes +pmark_stack_nodes_: + mov rcx,qword ptr [rbp] + + add rbp,8 + lea rdx,[r10+rcx] + + cmp rdx,r11 + jnc pmark_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 pmark_stack_nodes + + push rbp + + push 0 + + jmp pmark_node_ + +pmark_hnf_2: + cmp rsi,20000000h + jbe pmark_fits_in_word_6 + or dword ptr 4[rdi+rbx*4],1 +pmark_fits_in_word_6: + add r14,3 + +pmark_record_2_c: + mov rbx,qword ptr 8[rcx] + push rbx + + cmp rsp,r13 + jb pmarkr_using_reversal + +pmark_node2: +pmark_shared_argument_part: + mov rcx,qword ptr [rcx] + +pmark_node: + lea rdx,[r10+rcx] + cmp rdx,r11 + jnc pmark_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 pmark_next_node + +pmark_node_: + + prefetch [rcx] + + mov qword ptr (queue)[r8],rcx + lea rdx,[r8+r15*8] + add r8,8 + + and r8,15*8 + and rdx,15*8 + + cmp r15,-4 + je pmark_last_item_in_queue + +pmark_add_items: + mov rcx,qword ptr [rsp] + test rcx,rcx + jne pmark_add_stacked_item + +pmark_add_items2: + mov rbp,qword ptr 8[rsp] + cmp rbp,r12 + je pmark_last_item_in_queue + + mov rcx,qword ptr [rbp] + add rbp,8 + mov qword ptr 8[rsp],rbp + + lea rbp,[r10+rcx] + cmp rbp,r11 + jnc pmark_add_items2 + mov rax,rbp + and rbp,31*8 + shr rax,8 + mov esi,dword ptr (bit_set_table2)[rbp] + test esi,dword ptr [rdi+rax*4] + jne pmark_add_items2 + + prefetch [rcx] + + mov qword ptr (queue)[r8],rcx + add r8,8 + and r8,15*8 + + sub r15,1 + + cmp r15,-4 + jne pmark_add_items2 + jmp pmark_last_item_in_queue + +pmark_add_stacked_item: + add rsp ,8 + + lea rbp,[r10+rcx] + cmp rbp,r11 + jnc pmark_add_items + mov rax,rbp + and rbp,31*8 + shr rax,8 + mov esi,dword ptr (bit_set_table2)[rbp] + test esi,dword ptr [rdi+rax*4] + jne pmark_add_items + + prefetch [rcx] + + mov qword ptr (queue)[r8],rcx + add r8,8 + and r8,15*8 + + sub r15,1 + + cmp r15,-4 + jne pmark_add_items + +pmark_last_item_in_queue: + mov rcx,qword ptr (queue)[rdx] + + lea rdx,[r10+rcx] + + 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 pmark_next_node + +pmark_arguments: + mov rax,qword ptr [rcx] + test rax,2 + je pmark_lazy_node + + movzx rbp,word ptr (-2)[rax] + + test rbp,rbp + je pmark_hnf_0 + + or dword ptr [rdi+rbx*4],esi + add rcx,8 + + cmp rbp,256 + jae pmark_record + + sub rbp,2 + je pmark_hnf_2 + jb pmark_hnf_1 + +pmark_hnf_3: + mov rdx,qword ptr 8[rcx] + + cmp rsi,20000000h + jbe pmark_fits_in_word_1 + or dword ptr 4[rdi+rbx*4],1 +pmark_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 pmark_shared_argument_part + +pmark_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 pmark_fits_in_word_2 + or dword ptr 4[rdi+rbx*4],1 +pmark_fits_in_word_2: + + mov rbx,qword ptr [rdx] + sub rbp,2 + push rbx + +pmark_push_hnf_args: + mov rbx,qword ptr (-8)[rdx] + sub rdx,8 + push rbx + sub rbp,1 + jge pmark_push_hnf_args + + cmp rsp,r13 + jae pmark_node2 + + jmp pmarkr_using_reversal + +pmark_hnf_1: + cmp rsi,40000000h + jbe pmark_fits_in_word_4 + or dword ptr 4[rdi+rbx*4],1 +pmark_fits_in_word_4: + add r14,2 + mov rcx,qword ptr [rcx] + jmp pmark_node + +pmark_lazy_node_1: + add rcx,8 + or dword ptr [rdi+rbx*4],esi + cmp rsi,20000000h + jbe pmark_fits_in_word_3 + or dword ptr 4[rdi+rbx*4],1 +pmark_fits_in_word_3: + add r14,3 + + cmp rbp,1 + je pmark_node2 + +pmark_selector_node_1: + add rbp,2 + mov rdx,qword ptr [rcx] + je pmark_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 pmark_record_selector_node_1 + + test esi,dword ptr [rdi+rbx*4] + jne pmark_node3 + + mov rbp,qword ptr [rdx] + test rbp,2 + je pmark_node3 + + cmp word ptr (-2)[rbp],2 + jbe pmark_small_tuple_or_record + +pmark_large_tuple_or_record: + mov rbp,qword ptr 16[rdx] + mov r9,rbp + + 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 pmark_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 pmark_tuple_selector_node_1 + mov rdx,r9 + je pmark_tuple_selector_node_2 + mov rcx,qword ptr (-24)[r9+rax] + mov qword ptr [rbp],rcx + jmp pmark_node + +pmark_tuple_selector_node_2: + mov rcx,qword ptr [r9] + mov qword ptr [rbp],rcx + jmp pmark_node + endif + +pmark_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 +pmark_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 + + lea r9,__indirection + mov qword ptr (-8)[rdx],r9 + mov qword ptr [rdx],rcx + endif + jmp pmark_node + +pmark_record_selector_node_1: + je pmark_strict_record_selector_node_1 + + test esi,dword ptr [rdi+rbx*4] + jne pmark_node3 + + mov rbp,qword ptr [rdx] + test rbp,2 + je pmark_node3 + + cmp word ptr (-2)[rbp],258 + jbe pmark_small_tuple_or_record + ifdef NEW_DESCRIPTORS + mov rbp,qword ptr 16[rdx] + mov r9,rbp + + 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 pmark_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 pmark_record_selector_node_2 + mov rdx,r9 + sub rax,24 +pmark_record_selector_node_2: + mov rcx,qword ptr [rdx+rax] + mov qword ptr [rbp],rcx + jmp pmark_node + else + jmp pmark_large_tuple_or_record + endif + +pmark_strict_record_selector_node_1: + test esi,dword ptr [rdi+rbx*4] + jne pmark_node3 + + mov rbp,qword ptr [rdx] + test rbp,2 + je pmark_node3 + + cmp word ptr (-2)[rbp],258 + jbe pmark_select_from_small_record + + mov rbp,qword ptr 16[rdx] + 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 pmark_node3 + +pmark_select_from_small_record: + mov eax,(-8)[rax] + sub rcx,8 + + ifdef NEW_DESCRIPTORS + movzx ebx,word ptr 4[rax] + cmp rbx,16 + jle pmark_strict_record_selector_node_2 + mov rbx,qword ptr (-24)[r9+rbx] + jmp pmark_strict_record_selector_node_3 +pmark_strict_record_selector_node_2: + mov rbx,qword ptr [rdx+rbx] +pmark_strict_record_selector_node_3: + mov qword ptr 8[rcx],rbx + + movzx ebx,word ptr 6[rax] + test rbx,rbx + je pmark_strict_record_selector_node_5 + cmp rbx,16 + jle pmark_strict_record_selector_node_4 + mov rdx,r9 + sub rbx,24 +pmark_strict_record_selector_node_4: + mov rbx,qword ptr [rdx+rbx] + mov qword ptr 16[rcx],rbx +pmark_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 pmark_next_node + +pmark_indirection_node: +pmark_node3: + mov rcx,rdx + jmp pmark_node + +pmark_next_node: + pop rcx + test rcx,rcx + jne pmark_node + + pop rbp + cmp rbp,r12 + jne pmark_stack_nodes_ + +end_pmark_nodes: + test r15,r15 + je end_pmark_nodes_ + + push rbp + + push 0 + + lea rdx,[r8+r15*8] + add r15,1 + + and rdx,15*8 + + jmp pmark_last_item_in_queue + +end_pmark_nodes_: + ret + +pmark_lazy_node: + movsxd rbp,dword ptr (-4)[rax] + test rbp,rbp + je pmark_real_or_file + + cmp rbp,1 + jle pmark_lazy_node_1 + + cmp rbp,256 + jge pmark_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 pmark_fits_in_word_7 + or dword ptr 4[rdi+rbx*4],1 +pmark_fits_in_word_7: + sub rbp,3 +pmark_push_lazy_args: + mov rbx,qword ptr (-8)[rcx] + sub rcx,8 + push rbx + sub rbp,1 + jge pmark_push_lazy_args + + sub rcx,8 + + cmp rsp,r13 + jae pmark_node2 + + jmp pmarkr_using_reversal + +pmark_closure_with_unboxed_arguments: + mov rax,rbp + and rbp,255 + sub rbp,1 + je pmark_real_or_file + + 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 pmark_fits_in_word_7_ + or dword ptr 4[rdi+rbx*4],1 +pmark_fits_in_word_7_: + sub rbp,2 + jl pmark_next_node + + lea rcx,16[rcx+rbp*8] + jne pmark_push_lazy_args + +pmark_closure_with_one_boxed_argument: + mov rcx,qword ptr (-8)[rcx] + jmp pmark_node + +pmark_hnf_0: + lea r9,dINT+2 + cmp rax,r9 + jb pmark_real_file_or_string + + or dword ptr [rdi+rbx*4],esi + + lea r9,CHAR+2 + cmp rax,r9 + ja pmark_normal_hnf_0 + +pmark_bool: + add r14,2 + + cmp rsi,40000000h + jbe pmark_next_node + + or dword ptr 4[rdi+rbx*4],1 + jmp pmark_next_node + +pmark_normal_hnf_0: + inc r14 + jmp pmark_next_node + +pmark_real_file_or_string: + lea r9,__STRING__+2 + cmp rax,r9 + jbe pmark_string_or_array + +pmark_real_or_file: + or dword ptr [rdi+rbx*4],esi + add r14,3 + + cmp rsi,20000000h + jbe pmark_next_node + + or dword ptr 4[rdi+rbx*4],1 + jmp pmark_next_node + +pmark_record: + sub rbp,258 + je pmark_record_2 + jl pmark_record_1 + +pmark_record_3: + add r14,3 + + cmp rsi,20000000h + jbe pmark_fits_in_word_13 + or dword ptr 4[rdi+rbx*4],1 +pmark_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 pmark_record_3_bb + + test edx,dword ptr [rdi+rax*4] + jne pmark_node2 + + add rbp,1 + or dword ptr [rdi+rax*4],edx + add r14,rbp + lea rsi,[rsi+rbp*8] + + cmp rsi,32*8 + jbe pmark_push_record_arguments + or dword ptr 4[rdi+rax*4],1 +pmark_push_record_arguments: + mov rdx,qword ptr 8[rcx] + mov rbp,rbx + shl rbx,3 + add rdx,rbx + sub rbp,1 + jge pmark_push_hnf_args + + jmp pmark_node2 + +pmark_record_3_bb: + test edx,dword ptr [rdi+rax*4] + jne pmark_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 pmark_next_node + + or dword ptr 4[rdi+rax*4],1 + jmp pmark_next_node + +pmark_record_2: + cmp rsi,20000000h + jbe pmark_fits_in_word_12 + or dword ptr 4[rdi+rbx*4],1 +pmark_fits_in_word_12: + add r14,3 + + cmp word ptr (-2+2)[rax],1 + ja pmark_record_2_c + je pmark_node2 + jmp pmark_next_node + +pmark_record_1: + cmp word ptr (-2+2)[rax],0 + jne pmark_hnf_1 + + jmp pmark_bool + +pmark_string_or_array: + je pmark_string_ + +pmark_array: + mov rbp,qword ptr 16[rcx] + test rbp,rbp + je pmark_lazy_array + + movzx rax,word ptr (-2)[rbp] + + test rax,rax + je pmark_strict_basic_array + + movzx rbp,word ptr (-2+2)[rbp] + test rbp,rbp + je pmark_b_record_array + + cmp rsp,r13 + jb pmark_array_using_reversal + + sub rax,256 + cmp rax,rbp + je pmark_a_record_array + +pmark_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 pmark_end_set_ab_array_bits + + inc rbx + mov rbp,1 + cmp rbx,rax + jae pmark_last_ab_array_bits + +pmark_ab_array_lp: + or dword ptr [rdi+rbx*4],ebp + inc rbx + cmp rbx,rax + jb pmark_ab_array_lp + +pmark_last_ab_array_bits: + or dword ptr [rdi+rbx*4],ebp + +pmark_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 pmark_ab_array_begin + +pmark_ab_array: + mov rbx,qword ptr 16[rsp] + push rax + push rbp + lea r12,[rbp+rbx] + + call pmark_stack_nodes + + mov rbx,qword ptr (8+16)[rsp] + pop rbp + pop rax + add rbp,rbx +pmark_ab_array_begin: + sub rax,1 + jnc pmark_ab_array + + pop r12 + add rsp,16 + jmp pmark_next_node + +pmark_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 pmark_end_set_a_array_bits + + inc rbx + mov rbp,1 + cmp rbx,rax + jae pmark_last_a_array_bits + +pmark_a_array_lp: + or dword ptr [rdi+rbx*4],ebp + inc rbx + cmp rbx,rax + jb pmark_a_array_lp + +pmark_last_a_array_bits: + or dword ptr [rdi+rbx*4],ebp + +pmark_end_set_a_array_bits: + pop rax + lea rbp,24[rcx] + + push r12 + lea r12,24[rcx+rax*8] + + call pmark_stack_nodes + + pop r12 + jmp pmark_next_node + +pmark_lazy_array: + cmp rsp,r13 + jb pmark_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 pmark_end_set_lazy_array_bits + + inc rbx + mov rbp,1 + cmp rbx,rax + jae pmark_last_lazy_array_bits + +pmark_lazy_array_lp: + or dword ptr [rdi+rbx*4],ebp + inc rbx + cmp rbx,rax + jb pmark_lazy_array_lp + +pmark_last_lazy_array_bits: + or dword ptr [rdi+rbx*4],ebp + +pmark_end_set_lazy_array_bits: + mov rax,qword ptr 8[rcx] + lea rbp,24[rcx] + + push r12 + lea r12,24[rcx+rax*8] + + call pmark_stack_nodes + + pop r12 + jmp pmark_next_node + +pmark_array_using_reversal: + push 0 + mov rsi,1 + jmp pmarkr_node + +pmark_strict_basic_array: + mov rax,qword ptr 8[rcx] + cmp rbp,offset BOOL+2 + je pmark_strict_bool_array +pmark_strict_real_array: +pmark_strict_int_array: + add rax,3 + jmp pmark_basic_array_ +pmark_strict_bool_array: + add rax,24+7 + shr rax,3 + jmp pmark_basic_array_ + +pmark_b_record_array: + mov rbp,qword ptr 8[rcx] + sub rax,256 + imul rax,rbp + add rax,3 + jmp pmark_basic_array_ + +pmark_string_: + mov rax,qword ptr 8[rcx] + add rax,16+7 + shr rax,3 + +pmark_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 pmark_next_node + + inc rbx + mov rbp,1 + cmp rbx,rax + jae pmark_last_string_bits + +pmark_string_lp: + or dword ptr [rdi+rbx*4],ebp + inc rbx + cmp rbx,rax + jb pmark_string_lp + +pmark_last_string_bits: + or dword ptr [rdi+rbx*4],ebp + jmp pmark_next_node + +end_pmarkr_using_reversal: + pop rdx + test rdx,rdx + je pmark_next_node + mov qword ptr [rdx],rcx + jmp pmark_next_node + + +pmarkr_using_reversal: + push rcx + mov rsi,1 + mov rcx,qword ptr [rcx] + jmp pmarkr_node + +pmarkr_arguments: + mov rax,qword ptr [rcx] + test al,2 + je pmarkr_lazy_node + + movzx rbp,word ptr (-2)[rax] + test rbp,rbp + je pmarkr_hnf_0 + + add rcx,8 + + cmp rbp,256 + jae pmarkr_record + + sub rbp,2 + je pmarkr_hnf_2 + jb pmarkr_hnf_1 + +pmarkr_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 pmarkr_fits_in_word_1 + or dword ptr 4[rdi+rbx*4],1 +pmarkr_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 pmarkr_shared_argument_part + +pmarkr_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 pmarkr_fits_in_word_2 + or dword ptr 4[rdi+rbx*4],1 +pmarkr_fits_in_word_2: + + mov rbp ,qword ptr (-8)[rdx] + mov qword ptr (-8)[rdx],rcx + lea rsi,(-8)[rdx] + mov rcx,rbp + jmp pmarkr_node + +pmarkr_hnf_1: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,2 + or dword ptr [rdi+rbx*4],edx + cmp rdx,40000000h + jbe pmarkr_shared_argument_part + or dword ptr 4[rdi+rbx*4],1 +pmarkr_shared_argument_part: + mov rbp,qword ptr [rcx] + mov qword ptr [rcx],rsi + lea rsi,2[rcx] + mov rcx,rbp + jmp pmarkr_node + +pmarkr_no_selector_2: + pop rbx +pmarkr_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 pmarkr_shared_argument_part + + or dword ptr 4[rdi+rbx*4],1 + jmp pmarkr_shared_argument_part + +pmarkr_lazy_node_1: + je pmarkr_no_selector_1 + +pmarkr_selector_node_1: + add rbp,2 + je pmarkr_indirection_node + + add rbp,1 + + push rbx + mov rbp,qword ptr [rcx] + push rax + lea rax,[r10+rbp] + + jle pmarkr_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 pmarkr_no_selector_2 + + mov rbx,qword ptr [rbp] + test bl,2 + je pmarkr_no_selector_2 + + cmp word ptr (-2)[rbx],2 + jbe pmarkr_small_tuple_or_record + +pmarkr_large_tuple_or_record: + mov r8,qword ptr 16[rbp] + mov r9,r8 + + 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 pmarkr_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 pmarkr_tuple_selector_node_1 + mov rdx,r9 + je pmarkr_tuple_selector_node_2 + mov rcx,qword ptr (-24)[r9+rax] + mov qword ptr [r8],rcx + jmp pmarkr_node + +pmarkr_tuple_selector_node_2: + mov rcx,qword ptr [r9] + mov qword ptr [r8],rcx + jmp pmarkr_node + endif + +pmarkr_small_tuple_or_record: + ifdef NEW_DESCRIPTORS + mov eax,(-8)[rax] + lea rdx,__indirection + pop rbx + + mov qword ptr (-8)[rcx],rdx + movzx eax,word ptr 4[rax] + mov r8,rcx +pmarkr_tuple_selector_node_1: + mov rcx,qword ptr [rbp+rax] + mov qword ptr [r8],rcx + jmp pmarkr_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 pmarkr_node + +pmarkr_record_selector_node_1: + je pmarkr_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 pmarkr_no_selector_2 + + mov rbx,qword ptr [rbp] + test bl,2 + je pmarkr_no_selector_2 + + cmp word ptr (-2)[rbx],258 + ifdef NEW_DESCRIPTORS + jbe pmarkr_small_record + + mov r8,qword ptr 16[rbp] + mov r9,r8 + + 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 pmarkr_no_selector_2 + +pmarkr_small_record: + 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 + jle pmarkr_record_selector_node_2 + mov rdx,r9 + sub rax,24 +pmarkr_record_selector_node_2: + mov rcx,qword ptr [rbp+rax] + mov qword ptr [r8],rcx + jmp pmarkr_node + else + jbe pmarkr_small_tuple_or_record + jmp pmarkr_large_tuple_or_record + endif + +pmarkr_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 pmarkr_no_selector_2 + + mov rbx,qword ptr [rbp] + test bl,2 + je pmarkr_no_selector_2 + + cmp word ptr (-2)[rbx],258 + jle pmarkr_select_from_small_record + + mov r8,qword ptr 16[rbp] + mov r9,r8 + + 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 pmarkr_no_selector_2 + +pmarkr_select_from_small_record: + ifdef NEW_DESCRIPTORS + mov eax,(-8)[rax] + sub rcx,8 + + movzx ebx,word ptr 4[rax] + cmp rbx,16 + jle pmarkr_strict_record_selector_node_2 + mov rbx,qword ptr (-24)[r9+rbx] + jmp pmarkr_strict_record_selector_node_3 +pmarkr_strict_record_selector_node_2: + mov rbx,qword ptr [rdx+rbx] +pmarkr_strict_record_selector_node_3: + mov qword ptr 8[rcx],rbx + + movzx ebx,word ptr 6[rax] + test rbx,rbx + je pmarkr_strict_record_selector_node_5 + cmp rbx,16 + jle pmarkr_strict_record_selector_node_4 + mov rbp,r9 + sub rbx,24 +pmarkr_strict_record_selector_node_4: + mov rbx,qword ptr [rbp+rbx] + mov qword ptr 16[rcx],rbx +pmarkr_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 pmarkr_node + +pmarkr_indirection_node: + mov rcx,qword ptr [rcx] + jmp pmarkr_node + +pmarkr_hnf_2: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,3 + or dword ptr [rdi+rbx*4],edx + cmp rdx,20000000h + jbe pmarkr_fits_in_word_6 + or dword ptr 4[rdi+rbx*4],1 +pmarkr_fits_in_word_6: + +pmarkr_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 + +pmarkr_node: + lea rdx,[r10+rcx] + + cmp rdx,r11 + jae pmarkr_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 pmarkr_arguments + +pmarkr_next_node: + test rsi,3 + jne pmarkr_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 pmarkr_node + +pmarkr_parent: + mov rbx,rsi + and rsi,-4 + je end_pmarkr_using_reversal + + and rbx,3 + mov rbp,qword ptr [rsi] + mov qword ptr [rsi],rcx + + sub rbx,1 + je pmarkr_argument_part_parent + + lea rcx,(-8)[rsi] + mov rsi,rbp + jmp pmarkr_next_node + +pmarkr_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 pmarkr_node + +pmarkr_lazy_node: + movsxd rbp,dword ptr (-4)[rax] + test rbp,rbp + je pmarkr_real_or_file + + add rcx,8 + cmp rbp,1 + jle pmarkr_lazy_node_1 + cmp rbp,256 + jge pmarkr_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 pmarkr_fits_in_word_7 + or dword ptr 4[rdi+rbx*4],1 +pmarkr_fits_in_word_7: +pmarkr_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 pmarkr_node + +pmarkr_closure_with_unboxed_arguments: + mov rax,rbp + and rbp,255 + + sub rbp,1 + je pmarkr_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 pmarkr_fits_in_word_7_ + or dword ptr 4[rdi+rbx*4],1 +pmarkr_fits_in_word_7_: + pop rcx + sub rbp,2 + jg pmarkr_closure_with_unboxed_arguments_2 + je pmarkr_shared_argument_part + sub rcx,8 + jmp pmarkr_next_node + +pmarkr_closure_1_with_unboxed_argument: + sub rcx,8 + jmp pmarkr_real_or_file + +pmarkr_hnf_0: + cmp rax,offset dINT+2 + jne pmarkr_no_int_3 + + mov rbp,qword ptr 8[rcx] + cmp rbp,33 + + jb pmarkr_small_int + +pmarkr_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 pmarkr_next_node + or dword ptr 4[rdi+rbx*4],1 + jmp pmarkr_next_node + +pmarkr_small_int: + shl rbp,4 + lea rcx,(small_integers)[rbp] + jmp pmarkr_next_node + +pmarkr_no_int_3: + jb pmarkr_real_file_or_string + + cmp rax,offset CHAR+2 + jne pmarkr_no_char_3 + + movzx rbp,byte ptr 8[rcx] + shl rbp,4 + lea rcx,(static_characters)[rbp] + jmp pmarkr_next_node + +pmarkr_no_char_3: + jb pmarkr_bool_or_small_string + + ifdef NEW_DESCRIPTORS + lea rcx,((-8)-2)[rax] + else + lea rcx,((-12)-2)[rax] + endif + jmp pmarkr_next_node + +pmarkr_real_file_or_string: + lea r9,__STRING__+2 + cmp rax,r9 + jbe pmarkr_string_or_array + +pmarkr_real_or_file: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,3 + + or dword ptr [rdi+rbx*4],edx + + cmp rdx,20000000h + jbe pmarkr_next_node + + or dword ptr 4[rdi+rbx*4],1 + jmp pmarkr_next_node + +pmarkr_record: + sub rbp,258 + je pmarkr_record_2 + jl pmarkr_record_1 + +pmarkr_record_3: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,3 + or dword ptr [rdi+rbx*4],edx + cmp rdx,20000000h + jbe pmarkr_fits_in_word_13 + or dword ptr 4[rdi+rbx*4],1 +pmarkr_fits_in_word_13: + movzx rbx,word ptr (-2+2)[rax] + + mov rdx,qword ptr 8[rcx] + lea rdx,[r10+rdx] + 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 pmarkr_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 pmarkr_fits_in_word_14 + or dword ptr 4[rdi+rax*4],1 +pmarkr_fits_in_word_14: + sub rbx,1 + mov rdx,qword ptr 8[rcx] + jl pmarkr_record_3_bb + je pmarkr_shared_argument_part + + mov qword ptr 8[rcx],rsi + add rcx,8 + + sub rbx,1 + je pmarkr_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 pmarkr_node + +pmarkr_record_3_bb: + sub rcx,8 + jmp pmarkr_next_node + +pmarkr_record_3_aab: + mov rbp,qword ptr [rdx] + mov qword ptr [rdx],rcx + lea rsi,1[rdx] + mov rcx,rbp + jmp pmarkr_node + +pmarkr_shared_record_argument_part: + mov rdx,qword ptr 8[rcx] + + pop rsi + + test rbx,rbx + jne pmarkr_shared_argument_part + sub rcx,8 + jmp pmarkr_next_node + +pmarkr_record_2: + mov edx,dword ptr (bit_set_table2)[rdx] + add r14,3 + or dword ptr [rdi+rbx*4],edx + cmp rdx,20000000h + jbe pmarkr_fits_in_word_12 + or dword ptr 4[rdi+rbx*4],1 +pmarkr_fits_in_word_12: + cmp word ptr (-2+2)[rax],1 + ja pmarkr_record_2_c + je pmarkr_shared_argument_part + sub rcx,8 + jmp pmarkr_next_node + +pmarkr_record_1: + cmp word ptr (-2+2)[rax],0 + jne pmarkr_hnf_1 + sub rcx,8 + jmp pmarkr_bool_or_small_string + +pmarkr_string_or_array: + je pmarkr_string_ + +pmarkr_array: + mov rbp,qword ptr 16[rcx] + test rbp,rbp + je pmarkr_lazy_array + + movzx rax,word ptr (-2)[rbp] + test rax,rax + je pmarkr_strict_basic_array + + movzx rbp,word ptr (-2+2)[rbp] + test rbp,rbp + je pmarkr_b_record_array + + sub rax,256 + cmp rax,rbp + je pmarkr_a_record_array + +pmarkr_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 pmarkr_r_array + +pmarkr_a_record_array: + imul rax,qword ptr 8[rcx] + add rcx,16 + jmp pmarkr_lr_array + +pmarkr_lazy_array: + mov rax,qword ptr 8[rcx] + add rcx,16 + +pmarkr_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 +pmarkr_r_array: + shr rbp,8 + + cmp rbx,rbp + jae pmarkr_skip_mark_lazy_array_bits + + inc rbx + +pmarkr_lazy_array_bits: + or dword ptr [rdi+rbx*4],1 + inc rbx + cmp rbx,rbp + jbe pmarkr_lazy_array_bits + +pmarkr_skip_mark_lazy_array_bits: + add r14,3 + add r14,rax + + cmp rax,1 + jbe pmarkr_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 + mov rbx,qword ptr lazy_array_list + add rbp,2 + mov qword ptr [rdx],rbx + mov qword ptr (-8)[rcx],rbp + mov qword ptr (-16)[rcx],rax + sub rcx,16 + mov qword ptr lazy_array_list,rcx + + mov rcx,qword ptr (-8)[rdx] + mov qword ptr (-8)[rdx],rsi + lea rsi,(-8)[rdx] + jmp pmarkr_node + +pmarkr_array_length_0_1: + lea rcx,(-16)[rcx] + jb pmarkr_next_node + + mov rbx,qword ptr 24[rcx] + mov rbp,qword ptr 16[rcx] + mov rdx,qword ptr lazy_array_list + mov qword ptr 24[rcx],rbp + mov qword ptr 16[rcx],rdx + mov qword ptr [rcx],rax + mov qword ptr lazy_array_list,rcx + 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 pmarkr_node + +pmarkr_b_record_array: + mov rbp,qword ptr 8[rcx] + sub rax,256 + imul rax,rbp + add rax,3 + jmp pmarkr_basic_array + +pmarkr_strict_basic_array: + mov rax,qword ptr 8[rcx] + cmp rbp,offset BOOL+2 + je pmarkr_strict_bool_array +pmarkr_strict_real_array: +pmarkr_strict_int_array: + add rax,3 + jmp pmarkr_basic_array +pmarkr_strict_bool_array: + add rax,24+7 + shr rax,3 + jmp pmarkr_basic_array + +pmarkr_string_: + mov rax,qword ptr 8[rcx] + add rax,16+7 + shr rax,3 + +pmarkr_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 pmarkr_next_node + + inc rbx + mov rbp,1 + + cmp rbx,rax + jae pmarkr_last_string_bits + +pmarkr_string_lp: + or dword ptr [rdi+rbx*4],ebp + inc rbx + cmp rbx,rax + jb pmarkr_string_lp + +pmarkr_last_string_bits: + or dword ptr [rdi+rbx*4],ebp + jmp pmarkr_next_node |