diff options
author | John van Groningen | 2012-03-14 11:29:58 +0000 |
---|---|---|
committer | John van Groningen | 2012-03-14 11:29:58 +0000 |
commit | 063e166a9ed908e9c649c4a7355b8ea65190dd1f (patch) | |
tree | 648e89e7cc9913d8ac1e21f62ca80220db71584f /thread_macho64/acompact_rmark_prefetch.s | |
parent | fix newlines (diff) |
add thread safe version for Mac OS X (64 bit Intel)
Diffstat (limited to 'thread_macho64/acompact_rmark_prefetch.s')
-rw-r--r-- | thread_macho64/acompact_rmark_prefetch.s | 1162 |
1 files changed, 1162 insertions, 0 deletions
diff --git a/thread_macho64/acompact_rmark_prefetch.s b/thread_macho64/acompact_rmark_prefetch.s new file mode 100644 index 0000000..d6846a2 --- /dev/null +++ b/thread_macho64/acompact_rmark_prefetch.s @@ -0,0 +1,1162 @@ + +rmarkp_stack_nodes1: + mov rbx,qword ptr [rcx] + lea rax,1[rsi] + mov qword ptr [rsi],rbx + mov qword ptr [rcx],rax + +rmarkp_next_stack_node: + add rsi,8 + cmp rsi,qword ptr end_vector_offset[r9] + je end_rmarkp_nodes + +rmarkp_stack_nodes: + mov rcx,qword ptr [rsi] + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + + cmp rax,qword ptr heap_size_64_65_offset[r9] + att_jnc rmarkp_next_stack_node + + mov rbx,rax + and rax,31*8 + shr rbx,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + mov ebp,dword ptr [rdi+rbx*4] + test rbp,rax + att_jne rmarkp_stack_nodes1 + + or rbp,rax + mov dword ptr [rdi+rbx*4],ebp + + mov rax,qword ptr [rcx] + call rmarkp_stack_node + + add rsi,8 + cmp rsi,qword ptr end_vector_offset[r9] + att_jne rmarkp_stack_nodes + ret + +rmarkp_stack_node: + sub rsp,16 + mov qword ptr [rsi],rax + lea rbp,1[rsi] + mov qword ptr 8[rsp],rsi + mov rbx,-1 + mov qword ptr [rsp],0 + mov qword ptr [rcx],rbp + jmp rmarkp_no_reverse + +rmarkp_node_d1: + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + + cmp rax,qword ptr heap_size_64_65_offset[r9] + jnc rmarkp_next_node + + jmp rmarkp_node_ + +rmarkp_hnf_2: + lea rbx,8[rcx] + mov rax,qword ptr 8[rcx] + sub rsp,16 + + mov rsi,rcx + mov rcx,qword ptr [rcx] + + mov qword ptr 8[rsp],rbx + mov qword ptr [rsp],rax + + cmp rsp,qword ptr end_stack_offset[r9] + att_jb rmark_using_reversal + +rmarkp_node: + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + + cmp rax,qword ptr heap_size_64_65_offset[r9] + att_jnc rmarkp_next_node + + mov rbx,rsi + +rmarkp_node_: + + + + mov rdx,rax + and rax,31*8 + shr rdx,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + test eax,dword ptr [rdi+rdx*4] + jne rmarkp_reverse_and_mark_next_node + + mov rbp,qword ptr rmarkp_queue_first_offset[r9] + mov rdx,qword ptr rmarkp_n_queue_items_16_offset[r9] + + prefetch [rcx] + mov qword ptr rmarkp_queue_offset[r9+rbp],rcx + mov qword ptr rmarkp_queue_offset+8[r9+rbp],rsi + mov qword ptr rmarkp_queue_offset+16[r9+rbp],rbx + lea rbx,[rbp+rdx] + add rbp,32 + + and rbp,7*32 + and rbx,7*32 + + mov qword ptr rmarkp_queue_first_offset[r9],rbp + + cmp rdx,-4*32 + je rmarkp_last_item_in_queue + +rmarkp_add_items: + mov rcx,[rsp] + cmp rcx,1 + jbe rmarkp_add_stacked_item + + mov rsi,8[rsp] + add rsp,16 + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + cmp rax,qword ptr heap_size_64_65_offset[r9] + att_jnc rmarkp_add_items + + mov rdx,rax + and rax,31*8 + shr rdx,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + mov ebp,dword ptr [rdi+rdx*4] + test rbp,rax + je rmarkp_add_item + + cmp rcx,rsi + att_ja rmarkp_add_items + + mov rax,[rcx] + mov [rsi],rax + add rsi,1 + mov [rcx],rsi + att_jmp rmarkp_add_items + +rmarkp_add_stacked_item: + att_je rmarkp_last_item_in_queue +rmarkp_add_items2: + mov rsi,8[rsp] + add rsi,8 + cmp rsi,qword ptr end_vector_offset[r9] + att_je rmarkp_last_item_in_queue + + mov rcx,[rsi] + mov 8[rsp],rsi + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + cmp rax,qword ptr heap_size_64_65_offset[r9] + att_jnc rmarkp_add_items2 + + mov rdx,rax + and rax,31*8 + shr rdx,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + mov ebp,dword ptr [rdi+rdx*4] + test rbp,rax + je rmarkp_add_item2 + + mov rax,[rcx] + mov [rsi],rax + add rsi,1 + mov [rcx],rsi + att_jmp rmarkp_add_items2 + +rmarkp_add_item2: + prefetch [rcx] + mov rbp,qword ptr rmarkp_queue_first_offset[r9] + mov rdx,qword ptr rmarkp_n_queue_items_16_offset[r9] + + mov qword ptr rmarkp_queue_offset[r9+rbp],rcx + mov qword ptr rmarkp_queue_offset+8[r9+rbp],rsi + mov qword ptr rmarkp_queue_offset+16[r9+rbp],-1 + add rbp,32 + and rbp,7*32 + + sub rdx,32 + + mov qword ptr rmarkp_queue_first_offset[r9],rbp + mov qword ptr rmarkp_n_queue_items_16_offset[r9],rdx + + cmp rdx,-4*32 + att_jne rmarkp_add_items2 + att_jmp rmarkp_last_item_in_queue + +rmarkp_add_items3: + mov rsi,8[rsp] + add rsi,8 + cmp rsi,24[rsp] + att_je rmarkp_last_item_in_queue + + mov rcx,[rsi] + mov 8[rsp],rsi + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + cmp rax,qword ptr heap_size_64_65_offset[r9] + att_jnc rmarkp_add_items3 + + mov rdx,rax + and rax,31*8 + shr rdx,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + mov ebp,[rdi+rdx*4] + test rbp,rax + je rmarkp_add_item3 + + cmp rcx,rsi + att_ja rmarkp_add_items3 + + mov rax,[rcx] + mov [rsi],rax + add rsi,1 + mov [rcx],rsi + att_jmp rmarkp_add_items3 + +rmarkp_add_item3: + prefetch [rcx] + mov rbp,qword ptr rmarkp_queue_first_offset[r9] + mov rdx,qword ptr rmarkp_n_queue_items_16_offset[r9] + + mov qword ptr rmarkp_queue_offset+8[r9+rbp],rsi + mov qword ptr rmarkp_queue_offset+16[r9+rbp],rsi + add rbp,32 + and rbp,7*32 + + sub rdx,32 + + mov qword ptr rmarkp_queue_first_offset[r9],rbp + mov qword ptr rmarkp_n_queue_items_16_offset[r9],rdx + + cmp rdx,-4*32 + att_jne rmarkp_add_items3 + att_jmp rmarkp_last_item_in_queue + +rmarkp_add_item: + prefetch [rcx] + mov rbp,qword ptr rmarkp_queue_first_offset[r9] + mov rdx,qword ptr rmarkp_n_queue_items_16_offset[r9] + + mov qword ptr rmarkp_queue_offset[r9+rbp],rcx + mov qword ptr rmarkp_queue_offset+8[r9+rbp],rsi + mov qword ptr rmarkp_queue_offset+16[r9+rbp],rsi + add rbp,32 + and rbp,7*32 + + sub rdx,32 + + mov qword ptr rmarkp_queue_first_offset[r9],rbp + mov qword ptr rmarkp_n_queue_items_16_offset[r9],rdx + + cmp rdx,-4*32 + att_jne rmarkp_add_items + +rmarkp_last_item_in_queue: + mov rcx,qword ptr rmarkp_queue_offset[r9+rbx] + + mov rax,qword ptr neg_heap_p3_offset[r9] + + mov rsi,qword ptr rmarkp_queue_offset+8[r9+rbx] + mov rbx,qword ptr rmarkp_queue_offset+16[r9+rbx] + + add rax,rcx + +rmarkp_node_no_prefetch: + + + + mov rdx,rax + and rax,31*8 + shr rdx,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + mov ebp,dword ptr [rdi+rdx*4] + test rbp,rax + att_jne rmarkp_reverse_and_mark_next_node + + or rbp,rax + mov dword ptr [rdi+rdx*4],ebp + + mov rax,qword ptr [rcx] +rmarkp_arguments: + cmp rcx,rbx + att_ja rmarkp_no_reverse + + lea rbp,1[rsi] + mov qword ptr [rsi],rax + mov qword ptr [rcx],rbp + +rmarkp_no_reverse: + test al,2 + je rmarkp_lazy_node + + movzx rbp,word ptr (-2)[rax] + test rbp,rbp + je rmarkp_hnf_0 + + add rcx,8 + + cmp rbp,256 + jae rmarkp_record + + sub rbp,2 + att_je rmarkp_hnf_2 + jc rmarkp_hnf_1 + +rmarkp_hnf_3: + mov rdx,qword ptr 8[rcx] +rmarkp_hnf_3_: + cmp rsp,qword ptr end_stack_offset[r9] + att_jb rmark_using_reversal_ + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rdx + + mov rbx,rax + and rax,31*8 + shr rbx,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + test eax,[rdi+rbx*4] + jne rmarkp_shared_argument_part + + or dword ptr [rdi+rbx*4],eax + +rmarkp_no_shared_argument_part: + sub rsp,16 + mov qword ptr 8[rsp],rcx + lea rsi,8[rcx] + mov rcx,qword ptr [rcx] + lea rdx,[rdx+rbp*8] + mov qword ptr [rsp],rcx + +rmarkp_push_hnf_args: + mov rbx,qword ptr [rdx] + sub rsp,16 + mov qword ptr 8[rsp],rdx + sub rdx,8 + mov qword ptr [rsp],rbx + + sub rbp,1 + att_jg rmarkp_push_hnf_args + + mov rcx,qword ptr [rdx] + + cmp rdx,rsi + ja rmarkp_no_reverse_argument_pointer + + lea rbp,3[rsi] + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rbp + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + + cmp rax,qword ptr heap_size_64_65_offset[r9] + att_jnc rmarkp_next_node + + mov rbx,rdx + att_jmp rmarkp_node_ + +rmarkp_no_reverse_argument_pointer: + mov rsi,rdx + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + cmp rax,qword ptr heap_size_64_65_offset[r9] + att_jnc rmarkp_next_node + mov rbx,rsi + att_jmp rmarkp_node_no_prefetch + +rmarkp_shared_argument_part: + cmp rdx,rcx + att_ja rmarkp_hnf_1 + + mov rbx,qword ptr [rdx] + lea rax,(8+2+1)[rcx] + mov qword ptr [rdx],rax + mov qword ptr 8[rcx],rbx + att_jmp rmarkp_hnf_1 + +rmarkp_record: + sub rbp,258 + je rmarkp_record_2 + jb rmarkp_record_1 + +rmarkp_record_3: + movzx rbp,word ptr (-2+2)[rax] + mov rdx,qword ptr (16-8)[rcx] + sub rbp,1 + jb rmarkp_record_3_bb + je rmarkp_record_3_ab + sub rbp,1 + je rmarkp_record_3_aab + att_jmp rmarkp_hnf_3_ + +rmarkp_record_3_bb: + sub rcx,8 + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + or dword ptr [rdi+rbp*4],eax + + cmp rdx,rcx + att_ja rmarkp_next_node + + add eax,eax + jne rmarkp_bit_in_same_word1 + inc rbp + mov rax,1 +rmarkp_bit_in_same_word1: + test eax,dword ptr [rdi+rbp*4] + je rmarkp_not_yet_linked_bb + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + + add rax,16 + + mov rbp,rax + and rax,31*8 + shr rbp,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + or dword ptr [rdi+rbp*4],eax + + mov rbp,qword ptr [rdx] + lea rax,(16+2+1)[rcx] + mov qword ptr 16[rcx],rbp + mov qword ptr [rdx],rax + att_jmp rmarkp_next_node + +rmarkp_not_yet_linked_bb: + or dword ptr [rdi+rbp*4],eax + mov rbp,qword ptr [rdx] + lea rax,(16+2+1)[rcx] + mov qword ptr 16[rcx],rbp + mov qword ptr [rdx],rax + att_jmp rmarkp_next_node + +rmarkp_record_3_ab: + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + or dword ptr [rdi+rbp*4],eax + + cmp rdx,rcx + att_ja rmarkp_hnf_1 + + add eax,eax + jne rmarkp_bit_in_same_word2 + inc rbp + mov rax,1 +rmarkp_bit_in_same_word2: + test eax,dword ptr [rdi+rbp*4] + je rmarkp_not_yet_linked_ab + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + add rax,8 + + mov rbp,rax + and rax,31*8 + shr rbp,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + or dword ptr [rdi+rbp*4],eax + + mov rbp,qword ptr [rdx] + lea rax,(8+2+1)[rcx] + mov qword ptr 8[rcx],rbp + mov qword ptr [rdx],rax + att_jmp rmarkp_hnf_1 + +rmarkp_not_yet_linked_ab: + or dword ptr [rdi+rbp*4],eax + mov rbp,qword ptr [rdx] + lea rax,(8+2+1)[rcx] + mov qword ptr 8[rcx],rbp + mov qword ptr [rdx],rax + att_jmp rmarkp_hnf_1 + +rmarkp_record_3_aab: + cmp rsp,qword ptr end_stack_offset[r9] + att_jb rmark_using_reversal_ + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + test eax,dword ptr [rdi+rbp*4] + att_jne rmarkp_shared_argument_part + or dword ptr [rdi+rbp*4],eax + + sub rsp,16 + mov qword ptr 8[rsp],rcx + lea rsi,8[rcx] + mov rcx,qword ptr [rcx] + mov qword ptr [rsp],rcx + + mov rcx,qword ptr [rdx] + + cmp rdx,rsi + att_ja rmarkp_no_reverse_argument_pointer + + lea rbp,3[rsi] + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rbp + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + + cmp rax,qword ptr heap_size_64_65_offset[r9] + att_jnc rmarkp_next_node + + mov rbx,rdx + att_jmp rmarkp_node_ + +rmarkp_record_2: + cmp word ptr (-2+2)[rax],1 + att_ja rmarkp_hnf_2 + att_je rmarkp_hnf_1 + att_jmp rmarkp_next_node + +rmarkp_record_1: + cmp word ptr (-2+2)[rax],0 + att_jne rmarkp_hnf_1 + att_jmp rmarkp_next_node + +rmarkp_lazy_node_1: +/* selectors: */ + jne rmarkp_selector_node_1 + +rmarkp_hnf_1: + mov rsi,rcx + mov rcx,qword ptr [rcx] + att_jmp rmarkp_node + +/* selectors */ +rmarkp_indirection_node: + mov rdx,qword ptr neg_heap_p3_offset[r9] + sub rcx,8 + add rdx,rcx + + mov rbp,rdx + and rbp,31*8 + shr rdx,8 + lea r11,bit_clear_table2[rip] + mov ebp,dword ptr [r11+rbp] + and dword ptr [rdi+rdx*4],ebp + + mov rdx,rcx + cmp rcx,rbx + mov rcx,qword ptr 8[rcx] + mov qword ptr [rsi],rcx + att_ja rmarkp_node_d1 + mov qword ptr [rdx],rax + att_jmp rmarkp_node_d1 + +rmarkp_selector_node_1: + add rbp,3 + att_je rmarkp_indirection_node + + mov rdx,qword ptr [rcx] + mov r12,rbx + + mov rbx,qword ptr neg_heap_p3_offset[r9] + add rbx,rdx + shr rbx,3 + + add rbp,1 + jle rmarkp_record_selector_node_1 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + lea r11,bit_set_table[rip] + mov ebp,dword ptr [r11+rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + att_jne rmarkp_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + att_je rmarkp_hnf_1 + + cmp word ptr (-2)[rbx],2 + jbe rmarkp_small_tuple_or_record + +rmarkp_large_tuple_or_record: + mov r10,qword ptr 16[rdx] + + mov rbx,qword ptr neg_heap_p3_offset[r9] + add rbx,r10 + shr rbx,3 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + lea r11,bit_set_table[rip] + mov ebp,dword ptr [r11+rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + att_jne rmarkp_hnf_1 + + mov rbx,qword ptr neg_heap_p3_offset[r9] + lea rbx,(-8)[rcx+rbx] + + movsxd r11,dword ptr(-8)[rax] + add rax,r11 + + mov r11,rbx + and r11,31*8 + shr rbx,8 + lea r13,bit_clear_table2[rip] + mov r11d,dword ptr [r13+r11] + and dword ptr [rdi+rbx*4],r11d + + movzx eax,word ptr (4-8)[rax] + mov rbx,r12 + + lea r11,__indirection[rip] + mov qword ptr (-8)[rcx],r11 + + cmp rax,16 + jl rmarkp_tuple_or_record_selector_node_2 + + mov rdx,rcx + je rmarkp_tuple_selector_node_2 + + mov rcx,qword ptr (-24)[r10+rax] + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rcx + att_jmp rmarkp_node_d1 + +rmarkp_tuple_selector_node_2: + mov rcx,qword ptr [r10] + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rcx + att_jmp rmarkp_node_d1 + +rmarkp_record_selector_node_1: + je rmarkp_strict_record_selector_node_1 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + lea r11,bit_set_table[rip] + mov ebp,dword ptr [r11+rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + att_jne rmarkp_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + att_je rmarkp_hnf_1 + + cmp word ptr (-2)[rbx],258 + att_jbe rmarkp_small_tuple_or_record + + mov r10,qword ptr 16[rdx] + + mov rbx,qword ptr neg_heap_p3_offset[r9] + add rbx,r10 + shr rbx,3 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + lea r11,bit_set_table[rip] + mov ebp,dword ptr [r11+rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + att_jne rmarkp_hnf_1 + +rmarkp_small_tuple_or_record: + mov rbx,qword ptr neg_heap_p3_offset[r9] + lea rbx,(-8)[rcx+rbx] + + movsxd r11,dword ptr(-8)[rax] + add rax,r11 + + mov r11,rbx + and r11,31*8 + shr rbx,8 + lea r13,bit_clear_table2[rip] + mov r11d,dword ptr [r13+r11] + and dword ptr [rdi+rbx*4],r11d + + movzx eax,word ptr (4-8)[rax] + mov rbx,r12 + + lea r11,__indirection[rip] + mov qword ptr (-8)[rcx],r11 + + cmp rax,16 + att_jle rmarkp_tuple_or_record_selector_node_2 + mov rdx,r10 + sub rax,24 +rmarkp_tuple_or_record_selector_node_2: + mov rbp,rcx + mov rcx,qword ptr [rdx+rax] + mov qword ptr [rsi],rcx + mov qword ptr [rbp],rcx + mov rdx,rbp + att_jmp rmarkp_node_d1 + +rmarkp_strict_record_selector_node_1: + mov rbp,rbx + shr rbx,5 + and rbp,31 + lea r11,bit_set_table[rip] + mov ebp,dword ptr [r11+rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + att_jne rmarkp_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + att_je rmarkp_hnf_1 + + cmp word ptr (-2)[rbx],258 + jbe rmarkp_select_from_small_record + + mov r10,qword ptr 16[rdx] + + mov rbx,qword ptr neg_heap_p3_offset[r9] + add rbx,r10 + mov rbp,rbx + + shr rbx,8 + and rbp,31*8 + lea r11,bit_set_table2[rip] + mov ebp,dword ptr [r11+rbp] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + att_jne rmarkp_hnf_1 + +rmarkp_select_from_small_record: + movsxd rbx,dword ptr(-8)[rax] + add rbx,rax + sub rcx,8 + + cmp rcx,r12 + ja rmarkp_selector_pointer_not_reversed + + movzx eax,word ptr (4-8)[rbx] + cmp rax,16 + jle rmarkp_strict_record_selector_node_2 + mov rax,qword ptr (-24)[r10+rax] + jmp rmarkp_strict_record_selector_node_3 +rmarkp_strict_record_selector_node_2: + mov rax,qword ptr [rdx+rax] +rmarkp_strict_record_selector_node_3: + mov qword ptr 8[rcx],rax + + movzx eax,word ptr (6-8)[rbx] + test rax,rax + je rmarkp_strict_record_selector_node_5 + cmp rax,16 + jle rmarkp_strict_record_selector_node_4 + mov rdx,r10 + sub rax,24 +rmarkp_strict_record_selector_node_4: + mov rax,qword ptr [rdx+rax] + mov qword ptr 16[rcx],rax +rmarkp_strict_record_selector_node_5: + + mov rax,qword ptr ((-8)-8)[rbx] + add rsi,1 + mov qword ptr [rcx],rsi + mov qword ptr (-1)[rsi],rax + att_jmp rmarkp_next_node + +rmarkp_selector_pointer_not_reversed: + movzx eax,word ptr (4-8)[rbx] + cmp rax,16 + jle rmarkp_strict_record_selector_node_6 + mov rax,qword ptr (-24)[r10+rax] + jmp rmarkp_strict_record_selector_node_7 +rmarkp_strict_record_selector_node_6: + mov rax,qword ptr [rdx+rax] +rmarkp_strict_record_selector_node_7: + mov qword ptr 8[rcx],rax + + movzx eax,word ptr (6-8)[rbx] + test rax,rax + je rmarkp_strict_record_selector_node_9 + cmp rax,16 + jle rmarkp_strict_record_selector_node_8 + mov rdx,r10 + sub rax,24 +rmarkp_strict_record_selector_node_8: + mov rax,qword ptr [rdx+rax] + mov qword ptr 16[rcx],rax +rmarkp_strict_record_selector_node_9: + + mov rax,qword ptr ((-8)-8)[rbx] + mov qword ptr [rcx],rax + att_jmp rmarkp_next_node + +rmarkp_reverse_and_mark_next_node: + cmp rcx,rbx + att_ja rmarkp_next_node + + mov rax,qword ptr [rcx] + mov qword ptr [rsi],rax + add rsi,1 + mov qword ptr [rcx],rsi + +/* %rbp ,%rbx : free */ + +rmarkp_next_node: + mov rcx,qword ptr [rsp] + mov rsi,qword ptr 8[rsp] + add rsp,16 + + cmp rcx,1 + att_ja rmarkp_node + +rmarkp_next_node_: + mov rdx,qword ptr rmarkp_n_queue_items_16_offset[r9] + test rdx,rdx + att_je end_rmarkp_nodes + + sub rsp,16 + + mov rbp,qword ptr rmarkp_queue_first_offset[r9] + + lea rbx,[rbp+rdx] + add rdx,32 + + and rbx,7*32 + + mov qword ptr rmarkp_n_queue_items_16_offset[r9],rdx + att_jmp rmarkp_last_item_in_queue + +end_rmarkp_nodes: + ret + +rmarkp_lazy_node: + movsxd rbp,dword ptr (-4)[rax] + test rbp,rbp + att_je rmarkp_next_node + + add rcx,8 + + sub rbp,1 + att_jle rmarkp_lazy_node_1 + + cmp rbp,255 + jge rmarkp_closure_with_unboxed_arguments + +rmarkp_closure_with_unboxed_arguments_: + lea rcx,[rcx+rbp*8] + +rmarkp_push_lazy_args: + mov rbx,qword ptr [rcx] + sub rsp,16 + mov qword ptr 8[rsp],rcx + sub rcx,8 + mov qword ptr [rsp],rbx + sub rbp,1 + att_jg rmarkp_push_lazy_args + + mov rsi,rcx + mov rcx,qword ptr [rcx] + + cmp rsp,qword ptr end_stack_offset[r9] + att_jae rmarkp_node + + att_jmp rmark_using_reversal + +rmarkp_closure_with_unboxed_arguments: +/* (a_size+b_size)+(b_size<<8) */ +/* addl $1,%rbp */ + mov rax,rbp + and rbp,255 + shr rax,8 + sub rbp,rax +/* subl $1,%rbp */ + att_jg rmarkp_closure_with_unboxed_arguments_ + att_je rmarkp_hnf_1 + att_jmp rmarkp_next_node + +rmarkp_hnf_0: + lea rbp,dINT+2[rip] + cmp rax,rbp + je rmarkp_int_3 + + lea rbp,CHAR+2[rip] + cmp rax,rbp + je rmarkp_char_3 + + jb rmarkp_no_normal_hnf_0 + + mov rbp,qword ptr neg_heap_p3_offset[r9] + add rbp,rcx + + mov rdx,rbp + and rdx,31*8 + shr rbp,8 + lea r11,bit_clear_table2[rip] + mov edx,dword ptr [r11+rdx] + and dword ptr [rdi+rbp*4],edx + + lea rdx,((-8)-2)[rax] + mov qword ptr [rsi],rdx + cmp rcx,rbx + att_ja rmarkp_next_node + mov qword ptr [rcx],rax + att_jmp rmarkp_next_node + +rmarkp_int_3: + mov rbp,qword ptr 8[rcx] + cmp rbp,33 + att_jnc rmarkp_next_node + + shl rbp,4 + lea rdx,small_integers[rip] + add rdx,rbp + mov rbp,qword ptr neg_heap_p3_offset[r9] + mov qword ptr [rsi],rdx + add rbp,rcx + + mov rdx,rbp + and rdx,31*8 + shr rbp,8 + lea r11,bit_clear_table2[rip] + mov edx,dword ptr [r11+rdx] + and dword ptr [rdi+rbp*4],edx + + cmp rcx,rbx + att_ja rmarkp_next_node + mov qword ptr [rcx],rax + att_jmp rmarkp_next_node + +rmarkp_char_3: + movzx rdx,byte ptr 8[rcx] + mov rbp,qword ptr neg_heap_p3_offset[r9] + + shl rdx,4 + add rbp,rcx + lea r11,static_characters[rip] + add rdx,r11 + mov qword ptr [rsi],rdx + + mov rdx,rbp + and rdx,31*8 + shr rbp,8 + lea r11,bit_clear_table2[rip] + mov edx,dword ptr [r11+rdx] + and dword ptr [rdi+rbp*4],edx + + cmp rcx,rbx + att_ja rmarkp_next_node + mov qword ptr [rcx],rax + att_jmp rmarkp_next_node + +rmarkp_no_normal_hnf_0: + lea rbp,__ARRAY__+2[rip] + cmp rax,rbp + att_jne rmarkp_next_node + + mov rax,qword ptr 16[rcx] + test rax,rax + je rmarkp_lazy_array + + movzx rdx,word ptr (-2+2)[rax] + test rdx,rdx + je rmarkp_b_array + + movzx rax,word ptr (-2)[rax] + test rax,rax + att_je rmarkp_b_array + + cmp rsp,qword ptr end_stack_offset[r9] + att_jb rmark_array_using_reversal + + sub rax,256 + cmp rdx,rax + mov rbx,rdx + je rmarkp_a_record_array + +rmarkp_ab_record_array: + mov rdx,qword ptr 8[rcx] + add rcx,16 + push rcx + + imul rdx,rax + shl rdx,3 + + sub rax,rbx + add rcx,8 + add rdx,rcx + att_call reorder + + pop rcx + mov rax,rbx + imul rax,qword ptr (-8)[rcx] + jmp rmarkp_lr_array + +rmarkp_b_array: + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + add rax,8 + mov rbp,rax + and rax,31*8 + shr rbp,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + or dword ptr [rdi+rbp*4],eax + + att_jmp rmarkp_next_node + +rmarkp_a_record_array: + mov rax,qword ptr 8[rcx] + add rcx,16 + cmp rbx,2 + att_jb rmarkp_lr_array + + imul rax,rbx + att_jmp rmarkp_lr_array + +rmarkp_lazy_array: + cmp rsp,qword ptr end_stack_offset[r9] + att_jb rmark_array_using_reversal + + mov rax,qword ptr 8[rcx] + add rcx,16 + +rmarkp_lr_array: + mov rbx,qword ptr neg_heap_p3_offset[r9] + add rbx,rcx + shr rbx,3 + add rbx,rax + + mov rdx,rbx + and rbx,31 + shr rdx,5 + lea r11,bit_set_table[rip] + mov ebx,dword ptr [r11+rbx*4] + or dword ptr [rdi+rdx*4],ebx + + cmp rax,1 + jbe rmarkp_array_length_0_1 + + mov rdx,rcx + lea rcx,[rcx+rax*8] + + mov rax,qword ptr [rcx] + + mov rbx,qword ptr [rdx] + mov qword ptr [rdx],rax + + mov qword ptr [rcx],rbx + + mov rax,qword ptr (-8)[rcx] + sub rcx,8 + + mov rbx,qword ptr (-8)[rdx] + + sub rdx,8 + mov qword ptr [rcx],rbx + + mov qword ptr [rdx],rax + + push rcx + mov rsi,rdx + jmp rmarkp_array_nodes + +rmarkp_array_nodes1: + cmp rcx,rsi + ja rmarkp_next_array_node + + mov rbx,qword ptr [rcx] + lea rax,1[rsi] + mov qword ptr [rsi],rbx + mov qword ptr [rcx],rax + +rmarkp_next_array_node: + add rsi,8 + cmp rsi,qword ptr [rsp] + je end_rmarkp_array_node + +rmarkp_array_nodes: + mov rcx,qword ptr [rsi] + + mov rax,qword ptr neg_heap_p3_offset[r9] + add rax,rcx + + cmp rax,qword ptr heap_size_64_65_offset[r9] + att_jnc rmarkp_next_array_node + + mov rbx,rax + and rax,31*8 + shr rbx,8 + lea r11,bit_set_table2[rip] + mov eax,dword ptr [r11+rax] + mov ebp,dword ptr [rdi+rbx*4] + test rbp,rax + att_jne rmarkp_array_nodes1 + + or rbp,rax + mov dword ptr [rdi+rbx*4],ebp + + mov rax,qword ptr [rcx] + call rmarkp_array_node + + add rsi,8 + cmp rsi,qword ptr [rsp] + att_jne rmarkp_array_nodes + +end_rmarkp_array_node: + add rsp,8 + att_jmp rmarkp_next_node + +rmarkp_array_node: + sub rsp,16 + mov qword ptr 8[rsp],rsi + mov rbx,rsi + mov qword ptr [rsp],1 + att_jmp rmarkp_arguments + +rmarkp_array_length_0_1: + lea rcx,-16[rcx] + att_jb rmarkp_next_node + + mov rbx,qword ptr 24[rcx] + mov rbp,qword ptr 16[rcx] + mov qword ptr 24[rcx],rbp + mov rbp,qword ptr 8[rcx] + mov qword ptr 16[rcx],rbp + mov qword ptr 8[rcx],rbx + add rcx,8 + att_jmp rmarkp_hnf_1 |