From 7d0fdbfba815324c5908a6c0db2b47be631b7ca0 Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Wed, 14 Mar 2012 11:22:02 +0000 Subject: fix newlines --- thread/aap.asm | 4804 +++++++------- thread/acompact.asm | 2750 ++++---- thread/acompact_rmark.asm | 2262 +++---- thread/acompact_rmark_prefetch.asm | 2796 ++++----- thread/acompact_rmarkr.asm | 2190 +++---- thread/acopy.asm | 2788 ++++----- thread/afileIO3.asm | 2042 +++--- thread/amark.asm | 4312 ++++++------- thread/amark_prefetch.asm | 3928 ++++++------ thread/astartup.asm | 11712 +++++++++++++++++------------------ thread/athread.asm | 742 +-- 11 files changed, 20163 insertions(+), 20163 deletions(-) (limited to 'thread') diff --git a/thread/aap.asm b/thread/aap.asm index 787537b..347cd32 100644 --- a/thread/aap.asm +++ b/thread/aap.asm @@ -1,2402 +1,2402 @@ - - - d2 equ r10 - d3 equ r11 - - ifndef NEW_DESCRIPTORS - extern __cycle__in__spine:near - extern collect_2:near - endif - -_TEXT segment para 'CODE' -_TEXT ends -_DATA segment para 'DATA' -_DATA ends - - _TEXT segment - - public ap_2 - public ap_3 - public ap_4 - public ap_5 - public ap_6 - public ap_7 - public ap_8 - public ap_9 - public ap_10 - public ap_11 - public ap_12 - public ap_13 - public ap_14 - public ap_15 - public ap_16 - public ap_17 - public ap_18 - public ap_19 - public ap_20 - public ap_21 - public ap_22 - public ap_23 - public ap_24 - public ap_25 - public ap_26 - public ap_27 - public ap_28 - public ap_29 - public ap_30 - public ap_31 - public ap_32 - - public add_empty_node_2 - public add_empty_node_3 - public add_empty_node_4 - public add_empty_node_5 - public add_empty_node_6 - public add_empty_node_7 - public add_empty_node_8 - public add_empty_node_9 - public add_empty_node_10 - public add_empty_node_11 - public add_empty_node_12 - public add_empty_node_13 - public add_empty_node_14 - public add_empty_node_15 - public add_empty_node_16 - public add_empty_node_17 - public add_empty_node_18 - public add_empty_node_19 - public add_empty_node_20 - public add_empty_node_21 - public add_empty_node_22 - public add_empty_node_23 - public add_empty_node_24 - public add_empty_node_25 - public add_empty_node_26 - public add_empty_node_27 - public add_empty_node_28 - public add_empty_node_29 - public add_empty_node_30 - public add_empty_node_31 - public add_empty_node_32 - - public yet_args_needed_5 - public yet_args_needed_6 - public yet_args_needed_7 - public yet_args_needed_8 - public yet_args_needed_9 - public yet_args_needed_10 - public yet_args_needed_11 - public yet_args_needed_12 - public yet_args_needed_13 - public yet_args_needed_14 - public yet_args_needed_15 - public yet_args_needed_16 - public yet_args_needed_17 - public yet_args_needed_18 - public yet_args_needed_19 - public yet_args_needed_20 - public yet_args_needed_21 - public yet_args_needed_22 - public yet_args_needed_23 - public yet_args_needed_24 - public yet_args_needed_25 - public yet_args_needed_26 - public yet_args_needed_27 - public yet_args_needed_28 - public yet_args_needed_29 - public yet_args_needed_30 - public yet_args_needed_31 - -ap_32: - mov rbp,qword ptr [r8] - mov rbx,32*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap32 - -ap_31: - mov rbp,qword ptr [r8] - mov rbx,31*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap31 - -ap_30: - mov rbp,qword ptr [r8] - mov rbx,30*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap30 - -ap_29: - mov rbp,qword ptr [r8] - mov rbx,29*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap29 - -ap_28: - mov rbp,qword ptr [r8] - mov rbx,28*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap28 - -ap_27: - mov rbp,qword ptr [r8] - mov rbx,27*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap27 - -ap_26: - mov rbp,qword ptr [r8] - mov rbx,26*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap26 - -ap_25: - mov rbp,qword ptr [r8] - mov rbx,25*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap25 - -ap_24: - mov rbp,qword ptr [r8] - mov rbx,24*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap24 - -ap_23: - mov rbp,qword ptr [r8] - mov rbx,23*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap23 - -ap_22: - mov rbp,qword ptr [r8] - mov rbx,22*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap22 - -ap_21: - mov rbp,qword ptr [r8] - mov rbx,21*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap21 - -ap_20: - mov rbp,qword ptr [r8] - mov rbx,20*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap20 - -ap_19: - mov rbp,qword ptr [r8] - mov rbx,19*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap19 - -ap_18: - mov rbp,qword ptr [r8] - mov rbx,18*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap18 - -ap_17: - mov rbp,qword ptr [r8] - mov rbx,17*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap17 - -ap_16: - mov rbp,qword ptr [r8] - mov rbx,16*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap16 - -ap_15: - mov rbp,qword ptr [r8] - mov rbx,15*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap15 - -ap_14: - mov rbp,qword ptr [r8] - mov rbx,14*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap14 - -ap_13: - mov rbp,qword ptr [r8] - mov rbx,13*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap13 - -ap_12: - mov rbp,qword ptr [r8] - mov rbx,12*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap12 - -ap_11: - mov rbp,qword ptr [r8] - mov rbx,11*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap11 - -ap_10: - mov rbp,qword ptr [r8] - mov rbx,10*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap10 - -ap_9: - mov rbp,qword ptr [r8] - mov rbx,9*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap9 - -ap_8: - mov rbp,qword ptr [r8] - mov rbx,8*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap8 - -ap_7: - mov rbp,qword ptr [r8] - mov rbx,7*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap7 - -ap_6: - mov rbp,qword ptr [r8] - mov rbx,6*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap6 - -ap_5: - mov rbp,qword ptr [r8] - mov rbx,5*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap5 - -ap_4: - mov rbp,qword ptr [r8] - mov rbx,4*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap4 - -ap_3: - mov rbp,qword ptr [r8] - mov rbx,3*8 - cmp word ptr [rbp],bx - je fast_ap - - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap3 - -ap_2: - mov rbp,qword ptr [r8] - mov rbx,2*8 - cmp word ptr [rbp],bx - jne no_fast_ap2_ - -fast_ap_2_2_: - movzx rax,word ptr -2[rbp] - add rbx,rbp - mov ebp,dword ptr -6[rbx] - ifdef PROFILE - sub rbp,24 - else - sub rbp,12 - endif - cmp rax,1 - jb repl_args_0_2 - je repl_args_1 - - cmp rax,3 - jb repl_args_2 - - mov qword ptr [rsi],rcx - mov qword ptr 8[rsi],rdx - lea rsi,16[rsi] - mov rdx,qword ptr 16[r8] - - jmp fast_ap_ - -no_fast_ap2_: - mov qword ptr [rsi],rcx - mov rcx,rdx - mov rdx,r8 - mov r8d,dword ptr 2[rbp] - add rsi,8 - jmp no_fast_ap2 - -fast_ap_2_2: - mov r8,rdx - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - jmp fast_ap_2_2_ - -fast_ap_2: - mov r8,rdx - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - -fast_ap: - movzx rax,word ptr -2[rbp] - add rbx,rbp - mov ebp,dword ptr -6[rbx] - ifdef PROFILE - sub rbp,24 - else - sub rbp,12 - endif - cmp rax,1 - jb repl_args_0 - je repl_args_1 - - cmp rax,3 - jb repl_args_2 - - mov qword ptr [rsi],rcx - mov qword ptr 8[rsi],rdx - lea rsi,16[rsi] - mov rdx,qword ptr 16[r8] - -fast_ap_: - mov r8,qword ptr 8[r8] - je repl_args_3 - - cmp rax,5 - jb repl_args_4 - je repl_args_5 - - cmp rax,7 - jb repl_args_6 - -repl_args_7_: - mov rbx,qword ptr -16[rdx+rax*8] - mov qword ptr [rsi],rbx - sub rax,1 - add rsi,8 - cmp rax,6 - jne repl_args_7_ - -repl_args_6: - mov rax,qword ptr 32[rdx] - mov qword ptr [rsi],rax - mov rax,qword ptr 24[rdx] - mov qword ptr 8[rsi],rax - mov rax,qword ptr 16[rdx] - mov qword ptr 16[rsi],rax - mov rcx,qword ptr 8[rdx] - mov rdx,qword ptr [rdx] - add rsi,24 - jmp rbp - -repl_args_0: - mov r8,rdx - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 -repl_args_0_2: - jmp rbp - -repl_args_1: - mov r8,qword ptr 8[r8] - jmp rbp - -repl_args_2: - mov qword ptr [rsi],rcx - mov rcx,rdx - add rsi,8 - mov rdx,qword ptr 16[r8] - mov r8,qword ptr 8[r8] - jmp rbp - -repl_args_3: - mov rcx,qword ptr 8[rdx] - mov rdx,qword ptr [rdx] - jmp rbp - -repl_args_4: - mov rax,qword ptr 16[rdx] - mov qword ptr [rsi],rax - mov rcx,qword ptr 8[rdx] - mov rdx,qword ptr [rdx] - add rsi,8 - jmp rbp - -repl_args_5: - mov rax,qword ptr 24[rdx] - mov qword ptr [rsi],rax - mov rax,qword ptr 16[rdx] - mov qword ptr 8[rsi],rax - mov rcx,qword ptr 8[rdx] - mov rdx,qword ptr [rdx] - add rsi,16 - jmp rbp - - -no_fast_ap32: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,31*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap31: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,30*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap30: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,29*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap29: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,28*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap28: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,27*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap27: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,26*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap26: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,25*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap25: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,24*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap24: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,23*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap23: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,22*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap22: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,21*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap21: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,20*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap20: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,19*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap19: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,18*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap18: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,17*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap17: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,16*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap16: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,15*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap15: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,14*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap14: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,13*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap13: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,12*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap12: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,11*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap11: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,10*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap10: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,9*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap9: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,8*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap8: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,7*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap7: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,6*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap6: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,5*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap5: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,4*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap4: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,3*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap3: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - - mov rbx,2*8 - cmp word ptr [rbp],bx - je fast_ap_2 - - mov r8d,dword ptr 2[rbp] -no_fast_ap2: - call r8 - mov rbp,qword ptr [rcx] - mov rdx,rcx - mov rcx,qword ptr -8[rsi] - sub rsi,8 - mov r8d,dword ptr 2[rbp] - jmp r8 - - -add_empty_node_2: - sub r15,3 - jb add_empty_node_2_gc -add_empty_node_2_gc_: - mov qword ptr [rdi],offset __cycle__in__spine - mov r8,rdx - mov rdx,rcx - mov rcx,rdi - add rdi,24 - ret -add_empty_node_2_gc: - call collect_2 - jmp add_empty_node_2_gc_ - -add_empty_node_3: - sub r15,3 - jb add_empty_node_3_gc -add_empty_node_3_gc_: - mov qword ptr [rsi],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_3_gc: - call collect_3 - jmp add_empty_node_3_gc_ - -add_empty_node_4: - sub r15,3 - jb add_empty_node_4_gc -add_empty_node_4_gc_: - mov rbp,qword ptr -8[rsi] - mov qword ptr [rsi],rbp - mov qword ptr -8[rsi],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_4_gc: - call collect_3 - jmp add_empty_node_4_gc_ - -add_empty_node_5: - sub r15,3 - jb add_empty_node_5_gc -add_empty_node_5_gc_: - mov rbp,qword ptr -8[rsi] - mov qword ptr [rsi],rbp - mov rbp,qword ptr -16[rsi] - mov qword ptr -8[rsi],rbp - mov qword ptr -16[rsi],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_5_gc: - call collect_3 - jmp add_empty_node_5_gc_ - -add_empty_node_6: - sub r15,3 - jb add_empty_node_6_gc -add_empty_node_6_gc_: - mov rbp,qword ptr -8[rsi] - mov qword ptr [rsi],rbp - mov rbp,qword ptr -16[rsi] - mov qword ptr -8[rsi],rbp - mov rbp,qword ptr -24[rsi] - mov qword ptr -16[rsi],rbp - mov qword ptr -24[rsi],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_6_gc: - call collect_3 - jmp add_empty_node_6_gc_ - -add_empty_node_7: - sub r15,3 - jb add_empty_node_7_gc -add_empty_node_7_gc_: - mov rbp,qword ptr -8[rsi] - mov qword ptr [rsi],rbp - mov rbp,qword ptr -16[rsi] - mov qword ptr -8[rsi],rbp - mov rbp,qword ptr -24[rsi] - mov qword ptr -16[rsi],rbp - mov rbp,qword ptr -32[rsi] - mov qword ptr -24[rsi],rbp - mov qword ptr -32[rsi],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_7_gc: - call collect_3 - jmp add_empty_node_7_gc_ - -add_empty_node_8: - sub r15,3 - jb add_empty_node_8_gc -add_empty_node_8_gc_: - mov rbp,qword ptr -8[rsi] - mov qword ptr [rsi],rbp - mov rbp,qword ptr -16[rsi] - mov qword ptr -8[rsi],rbp - mov rbp,qword ptr -24[rsi] - mov qword ptr -16[rsi],rbp - mov rbp,qword ptr -32[rsi] - mov qword ptr -24[rsi],rbp - mov rbp,qword ptr -40[rsi] - mov qword ptr -32[rsi],rbp - mov qword ptr -40[rsi],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_8_gc: - call collect_3 - jmp add_empty_node_8_gc_ - -add_empty_node_9: - sub r15,3 - jb add_empty_node_9_gc -add_empty_node_9_gc_: - mov rbp,qword ptr -8[rsi] - mov qword ptr [rsi],rbp - mov rbp,qword ptr -16[rsi] - mov qword ptr -8[rsi],rbp - mov rbp,qword ptr -24[rsi] - mov qword ptr -16[rsi],rbp - mov rbp,qword ptr -32[rsi] - mov qword ptr -24[rsi],rbp - mov rbp,qword ptr -40[rsi] - mov qword ptr -32[rsi],rbp - mov rbp,qword ptr -48[rsi] - mov qword ptr -40[rsi],rbp - mov qword ptr -48[rsi],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_9_gc: - call collect_3 - jmp add_empty_node_9_gc_ - -add_empty_node_10: - sub r15,3 - jb add_empty_node_10_gc -add_empty_node_10_gc_: - mov rbp,qword ptr -8[rsi] - mov qword ptr [rsi],rbp - mov rbp,qword ptr -16[rsi] - mov qword ptr -8[rsi],rbp - mov rbp,qword ptr -24[rsi] - mov qword ptr -16[rsi],rbp - mov rbp,qword ptr -32[rsi] - mov qword ptr -24[rsi],rbp - mov rbp,qword ptr -40[rsi] - mov qword ptr -32[rsi],rbp - mov rbp,qword ptr -48[rsi] - mov qword ptr -40[rsi],rbp - mov rbp,qword ptr -56[rsi] - mov qword ptr -48[rsi],rbp - mov qword ptr -56[rsi],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_10_gc: - call collect_3 - jmp add_empty_node_10_gc_ - -add_empty_node_11: - sub r15,3 - jb add_empty_node_11_gc -add_empty_node_11_gc_: - mov rbp,qword ptr -8[rsi] - mov qword ptr [rsi],rbp - mov rbp,qword ptr -16[rsi] - mov qword ptr -8[rsi],rbp - mov rbp,qword ptr -24[rsi] - mov qword ptr -16[rsi],rbp - mov rbp,qword ptr -32[rsi] - mov qword ptr -24[rsi],rbp - mov rbp,qword ptr -40[rsi] - mov qword ptr -32[rsi],rbp - mov rbp,qword ptr -48[rsi] - mov qword ptr -40[rsi],rbp - mov rbp,qword ptr -56[rsi] - mov qword ptr -48[rsi],rbp - mov rbp,qword ptr -64[rsi] - mov qword ptr -56[rsi],rbp - mov qword ptr -64[rsi],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_11_gc: - call collect_3 - jmp add_empty_node_11_gc_ - -add_empty_node_32: - mov rbx,7 - jmp add_empty_node_12_ -add_empty_node_28: - mov rbx,6 - jmp add_empty_node_12_ -add_empty_node_24: - mov rbx,5 - jmp add_empty_node_12_ -add_empty_node_20: - mov rbx,4 - jmp add_empty_node_12_ -add_empty_node_16: - mov rbx,3 - jmp add_empty_node_12_ -add_empty_node_12: - mov rbx,2 -add_empty_node_12_: - sub r15,3 - jb add_empty_node_12_gc -add_empty_node_12_gc_: - mov rax,rsi -add_empty_node_12_lp: - mov rbp,qword ptr -8[rax] - mov qword ptr [rax],rbp - mov rbp,qword ptr -16[rax] - mov qword ptr -8[rax],rbp - mov rbp,qword ptr -24[rax] - mov qword ptr -16[rax],rbp - mov rbp,qword ptr -32[rax] - mov qword ptr -24[rax],rbp - sub rax,32 - sub rbx,1 - jne add_empty_node_12_lp - mov qword ptr [rax],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_12_gc: - call collect_3 - jmp add_empty_node_12_gc_ - -add_empty_node_29: - mov rbx,6 - jmp add_empty_node_13_ -add_empty_node_25: - mov rbx,5 - jmp add_empty_node_13_ -add_empty_node_21: - mov rbx,4 - jmp add_empty_node_13_ -add_empty_node_17: - mov rbx,3 - jmp add_empty_node_13_ -add_empty_node_13: - mov rbx,2 -add_empty_node_13_: - sub r15,3 - jb add_empty_node_13_gc -add_empty_node_13_gc_: - mov rax,rsi - mov rbp,qword ptr -8[rsi] - mov qword ptr [rsi],rbp -add_empty_node_13_lp: - mov rbp,qword ptr -16[rax] - mov qword ptr -8[rax],rbp - mov rbp,qword ptr -24[rax] - mov qword ptr -16[rax],rbp - mov rbp,qword ptr -32[rax] - mov qword ptr -24[rax],rbp - mov rbp,qword ptr -40[rax] - mov qword ptr -32[rax],rbp - sub rax,32 - sub rbx,1 - jne add_empty_node_13_lp - mov qword ptr -8[rax],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_13_gc: - call collect_3 - jmp add_empty_node_13_gc_ - -add_empty_node_30: - mov rbx,6 - jmp add_empty_node_14_ -add_empty_node_26: - mov rbx,5 - jmp add_empty_node_14_ -add_empty_node_22: - mov rbx,4 - jmp add_empty_node_14_ -add_empty_node_18: - mov rbx,3 - jmp add_empty_node_14_ -add_empty_node_14: - mov rbx,2 -add_empty_node_14_: - sub r15,3 - jb add_empty_node_14_gc -add_empty_node_14_gc_: - mov rax,rsi - mov rbp,qword ptr -8[rsi] - mov qword ptr [rsi],rbp - mov rsi,qword ptr -16[rsi] - mov qword ptr -8[rsi],rbp -add_empty_node_14_lp: - mov rbp,qword ptr -24[rax] - mov qword ptr -16[rax],rbp - mov rbp,qword ptr -32[rax] - mov qword ptr -24[rax],rbp - mov rbp,qword ptr -40[rax] - mov qword ptr -32[rax],rbp - mov rbp,qword ptr -48[rax] - mov qword ptr -40[rax],rbp - sub rax,32 - sub rbx,1 - jne add_empty_node_14_lp - mov qword ptr -16[rax],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_14_gc: - call collect_3 - jmp add_empty_node_14_gc_ - -add_empty_node_31: - mov rbx,6 - jmp add_empty_node_15_ -add_empty_node_27: - mov rbx,5 - jmp add_empty_node_15_ -add_empty_node_23: - mov rbx,4 - jmp add_empty_node_15_ -add_empty_node_19: - mov rbx,3 - jmp add_empty_node_15_ -add_empty_node_15: - mov rbx,2 -add_empty_node_15_: - sub r15,3 - jb add_empty_node_15_gc -add_empty_node_15_gc_: - mov rax,rbp - mov rbp,qword ptr -8[rsi] - mov qword ptr [rsi],rbp - mov rbp,qword ptr -16[rsi] - mov qword ptr -8[rsi],rbp - mov rbp,qword ptr -24[rsi] - mov qword ptr -16[rsi],rbp -add_empty_node_15_lp: - mov rbp,qword ptr -32[rax] - mov qword ptr -24[rax],rbp - mov rbp,qword ptr -40[rax] - mov qword ptr -32[rax],rbp - mov rbp,qword ptr -48[rax] - mov qword ptr -40[rax],rbp - mov rbp,qword ptr -56[rax] - mov qword ptr -48[rax],rbp - sub rax,32 - sub rbx,1 - jne add_empty_node_15_lp - mov qword ptr -24[rax],rdi - mov qword ptr [rdi],offset __cycle__in__spine - add rsi,8 - add rdi,24 - ret -add_empty_node_15_gc: - call collect_3 - jmp add_empty_node_15_gc_ - - -yet_args_needed_0: - sub r15,2 - jb yet_args_needed_0_gc -yet_args_needed_0_gc_r: - mov qword ptr 8[rdi],rcx - mov rax,qword ptr [rdx] - mov rcx,rdi - add rax,8 - mov qword ptr [rdi],rax - add rdi,16 - ret - -yet_args_needed_0_gc: - call collect_2 - jmp yet_args_needed_0_gc_r - - - align (4) - sub r15,3 - jae short build_node_2_gc_r - jmp short build_node_2_gc - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_1: - sub r15,3 - jb yet_args_needed_1_gc -yet_args_needed_1_gc_r: - mov qword ptr 16[rdi],rcx - mov rax,qword ptr [rdx] - mov rcx,rdi - add rax,8 - mov qword ptr [rdi],rax - mov rbx,qword ptr 8[rdx] - mov qword ptr 8[rdi],rbx - add rdi,24 - ret - -yet_args_needed_1_gc: - call collect_2 - jmp yet_args_needed_1_gc_r - -build_node_2_gc_r: - mov qword ptr [rdi],rbx - mov qword ptr 8[rdi],rdx - mov qword ptr 16[rdi],rcx - mov rcx,rdi - add rdi,24 - ret - -build_node_2_gc: - call collect_2 - jmp build_node_2_gc_r - - - align (4) - sub r15,5 - jae short build_node_3_gc_r - jmp short build_node_3_gc - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_2: - sub r15,5 - jb gc_22 -gc_r_22: - mov rax,qword ptr [rdx] - mov qword ptr 8[rdi],rcx - add rax,8 - mov d2,qword ptr 8[rdx] - mov qword ptr 16[rdi],rax - lea rcx,16[rdi] - mov rbp,qword ptr 16[rdx] - mov qword ptr 24[rdi],d2 - mov qword ptr [rdi],rbp - mov qword ptr 32[rdi],rdi - add rdi,40 - ret - -gc_22: call collect_2 - jmp gc_r_22 - -build_node_3_gc_r: - mov qword ptr [rdi],rbx - lea rbp,24[rdi] - mov qword ptr 8[rdi],r8 - mov qword ptr 16[rdi],rbp - mov qword ptr 24[rdi],rdx - mov qword ptr 32[rdi],rcx - mov rcx,rdi - add rdi,40 - ret - -build_node_3_gc: - call collect_2 - jmp build_node_3_gc_r - - - align (4) - sub r15,6 - jae short build_node_4_gc_r - jmp short build_node_4_gc - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_3: - sub r15,6 - jb gc_23 -gc_r_23: - mov rax,qword ptr [rdx] - mov qword ptr 16[rdi],rcx - add rax,8 - mov d2,qword ptr 8[rdx] - mov qword ptr 24[rdi],rax - mov rdx,qword ptr 16[rdx] - mov qword ptr 32[rdi],d2 - mov rbp,qword ptr [rdx] - mov qword ptr 40[rdi],rdi - mov qword ptr [rdi],rbp - mov rbp,qword ptr 8[rdx] - lea rcx,24[rdi] - mov qword ptr 8[rdi],rbp - add rdi,48 - ret - -gc_23: call collect_2 - jmp gc_r_23 - -build_node_4_gc_r: - mov qword ptr [rdi],rbx - lea rbp,24[rdi] - mov qword ptr 8[rdi],r8 - mov qword ptr 16[rdi],rbp - mov qword ptr 24[rdi],rdx - mov qword ptr 32[rdi],rcx - mov rcx,rdi - mov rbp,qword ptr -8[rsi] - mov qword ptr 40[rdi],rbp - sub rsi,8 - add rdi,48 - ret - -build_node_4_gc: - call collect_2 - jmp build_node_4_gc_r - - - align (4) - sub r15,7 - jae short build_node_5_gc_r - jmp build_node_5_gc - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_4: - sub r15,7 - jb gc_24 -gc_r_24: - mov rax,qword ptr [rdx] - mov qword ptr 24[rdi],rcx - add rax,8 - mov d2,qword ptr 8[rdx] - mov qword ptr 32[rdi],rax - mov rdx,qword ptr 16[rdx] - mov qword ptr 40[rdi],d2 - mov rbp,qword ptr [rdx] - mov 48[rdi],rdi - mov qword ptr [rdi],rbp - mov rbp,qword ptr 8[rdx] - lea rcx,32[rdi] - mov qword ptr 8[rdi],rbp - mov rbp,qword ptr 16[rdx] - mov qword ptr 16[rdi],rbp - add rdi,56 - ret - -gc_24: call collect_2 - jmp gc_r_24 - -build_node_5_gc_r: - mov qword ptr [rdi],rbx - lea rbp,24[rdi] - mov qword ptr 8[rdi],r8 - mov qword ptr 16[rdi],rbp - mov qword ptr 24[rdi],rdx - mov qword ptr 32[rdi],rcx - mov rcx,rdi - mov rbp,qword ptr -8[rsi] - mov qword ptr 40[rdi],rbp - mov rbp,qword ptr -16[rsi] - mov qword ptr 48[rdi],rbp - sub rsi,16 - add rdi,56 - ret - -build_node_5_gc: - call collect_2 - jmp build_node_5_gc_r - - - align (4) - mov eax,8 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_5: - mov rbx,qword ptr [rdx] - mov rax,8 - jmp yet_args_needed_ - - - align (4) - mov eax,9 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_6: - mov rbx,qword ptr [rdx] - mov rax,9 - jmp yet_args_needed_ - - align (4) - mov eax,10 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_7: - mov rbx,qword ptr [rdx] - mov rax,10 - jmp yet_args_needed_ - - align (4) - mov eax,11 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_8: - mov rbx,qword ptr [rdx] - mov rax,11 - jmp yet_args_needed_ - - align (4) - mov eax,12 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_9: - mov rbx,qword ptr [rdx] - mov rax,12 - jmp yet_args_needed_ - - align (4) - mov eax,13 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_10: - mov rbx,qword ptr [rdx] - mov rax,13 - jmp yet_args_needed_ - - align (4) - mov eax,14 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_11: - mov rbx,qword ptr [rdx] - mov rax,14 - jmp yet_args_needed_ - - align (4) - mov eax,15 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_12: - mov rbx,qword ptr [rdx] - mov rax,15 - jmp yet_args_needed_ - - align (4) - mov eax,16 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_13: - mov rbx,qword ptr [rdx] - mov rax,16 - jmp yet_args_needed_ - - align (4) - mov eax,17 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_14: - mov rbx,qword ptr [rdx] - mov rax,17 - jmp yet_args_needed_ - - align (4) - mov eax,18 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_15: - mov rbx,qword ptr [rdx] - mov rax,18 - jmp yet_args_needed_ - - align (4) - mov eax,19 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_16: - mov rbx,qword ptr [rdx] - mov rax,19 - jmp yet_args_needed_ - - align (4) - mov eax,20 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_17: - mov rbx,qword ptr [rdx] - mov rax,20 - jmp yet_args_needed_ - - align (4) - mov eax,21 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_18: - mov rbx,qword ptr [rdx] - mov rax,21 - jmp yet_args_needed_ - - align (4) - mov eax,22 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_19: - mov rbx,qword ptr [rdx] - mov rax,22 - jmp yet_args_needed_ - - align (4) - mov eax,23 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_20: - mov rbx,qword ptr [rdx] - mov rax,23 - jmp yet_args_needed_ - - align (4) - mov eax,24 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_21: - mov rbx,qword ptr [rdx] - mov rax,24 - jmp yet_args_needed_ - - align (4) - mov eax,25 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_22: - mov rbx,qword ptr [rdx] - mov rax,25 - jmp yet_args_needed_ - - align (4) - mov eax,26 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_23: - mov rbx,qword ptr [rdx] - mov rax,26 - jmp yet_args_needed_ - - align (4) - mov eax,27 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_24: - mov rbx,qword ptr [rdx] - mov rax,27 - jmp yet_args_needed_ - - align (4) - mov eax,28 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_25: - mov rbx,qword ptr [rdx] - mov rax,28 - jmp yet_args_needed_ - - align (4) - mov eax,29 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_26: - mov rbx,qword ptr [rdx] - mov rax,29 - jmp yet_args_needed_ - - align (4) - mov eax,30 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_27: - mov rbx,qword ptr [rdx] - mov rax,30 - jmp yet_args_needed_ - - align (4) - mov eax,31 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_28: - mov rbx,qword ptr [rdx] - mov rax,31 - jmp yet_args_needed_ - - align (4) - mov eax,32 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_29: - mov rbx,qword ptr [rdx] - mov rax,32 - jmp yet_args_needed_ - - align (4) - mov eax,33 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_30: - mov rbx,qword ptr [rdx] - mov rax,33 - jmp yet_args_needed_ - - align (4) - mov eax,34 - jmp build_node_ - nop - nop - align (4) - ifdef PROFILE - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - endif -yet_args_needed_31: - mov rbx,qword ptr [rdx] - mov rax,34 - jmp yet_args_needed_ - -yet_args_needed: - mov rbx,qword ptr [rdx] - movzx rax,word ptr -2[rbx] - add rax,3 -yet_args_needed_: - sub r15,rax - jb yet_args_needed_gc -yet_args_needed_gc_r: - mov d3,qword ptr 8[rdx] - sub rax,3+1+4 - mov rdx,qword ptr 16[rdx] - mov d2,rdi - mov rbp,qword ptr [rdx] - mov qword ptr [rdi],rbp - mov rbp,qword ptr 8[rdx] - mov qword ptr 8[rdi],rbp - mov rbp,qword ptr 16[rdx] - mov qword ptr 16[rdi],rbp - add rdx,24 - add rdi,24 - -yet_args_needed_cp_a: - mov rbp,qword ptr [rdx] - add rdx,8 - mov qword ptr [rdi],rbp - add rdi,8 - sub rax,1 - jge yet_args_needed_cp_a - - mov qword ptr [rdi],rcx - add rbx,8 - mov qword ptr 8[rdi],rbx - lea rcx,8[rdi] - mov qword ptr 16[rdi],d3 - mov qword ptr 24[rdi],d2 - add rdi,32 - ret - -yet_args_needed_gc: - call collect_2 - jmp yet_args_needed_gc_r - -build_node_: - sub r15,rax - jb build_node_gc -build_node_gc_r: - mov qword ptr [rdi],rbx - lea rbp,24[rdi] - mov qword ptr 8[rdi],r8 - mov qword ptr 16[rdi],rbp - mov qword ptr 24[rdi],rdx - mov qword ptr 32[rdi],rcx - mov rcx,rdi - mov r8,qword ptr -8[rsi] - mov qword ptr 40[rdi],r8 - mov r8,qword ptr -16[rsi] - sub rsi,16 - mov qword ptr 48[rdi],r8 - add rdi,56 - - sub rax,5+2 -build_node_cp_a: - mov r8,qword ptr -8[rsi] - sub rsi,8 - mov qword ptr [rdi],r8 - add rdi,8 - sub rax,1 - jne build_node_cp_a - - ret - -build_node_gc: - call collect_3 - jmp build_node_gc_r - -_TEXT ends - - ifndef NEW_DESCRIPTORS - end - endif + + + d2 equ r10 + d3 equ r11 + + ifndef NEW_DESCRIPTORS + extern __cycle__in__spine:near + extern collect_2:near + endif + +_TEXT segment para 'CODE' +_TEXT ends +_DATA segment para 'DATA' +_DATA ends + + _TEXT segment + + public ap_2 + public ap_3 + public ap_4 + public ap_5 + public ap_6 + public ap_7 + public ap_8 + public ap_9 + public ap_10 + public ap_11 + public ap_12 + public ap_13 + public ap_14 + public ap_15 + public ap_16 + public ap_17 + public ap_18 + public ap_19 + public ap_20 + public ap_21 + public ap_22 + public ap_23 + public ap_24 + public ap_25 + public ap_26 + public ap_27 + public ap_28 + public ap_29 + public ap_30 + public ap_31 + public ap_32 + + public add_empty_node_2 + public add_empty_node_3 + public add_empty_node_4 + public add_empty_node_5 + public add_empty_node_6 + public add_empty_node_7 + public add_empty_node_8 + public add_empty_node_9 + public add_empty_node_10 + public add_empty_node_11 + public add_empty_node_12 + public add_empty_node_13 + public add_empty_node_14 + public add_empty_node_15 + public add_empty_node_16 + public add_empty_node_17 + public add_empty_node_18 + public add_empty_node_19 + public add_empty_node_20 + public add_empty_node_21 + public add_empty_node_22 + public add_empty_node_23 + public add_empty_node_24 + public add_empty_node_25 + public add_empty_node_26 + public add_empty_node_27 + public add_empty_node_28 + public add_empty_node_29 + public add_empty_node_30 + public add_empty_node_31 + public add_empty_node_32 + + public yet_args_needed_5 + public yet_args_needed_6 + public yet_args_needed_7 + public yet_args_needed_8 + public yet_args_needed_9 + public yet_args_needed_10 + public yet_args_needed_11 + public yet_args_needed_12 + public yet_args_needed_13 + public yet_args_needed_14 + public yet_args_needed_15 + public yet_args_needed_16 + public yet_args_needed_17 + public yet_args_needed_18 + public yet_args_needed_19 + public yet_args_needed_20 + public yet_args_needed_21 + public yet_args_needed_22 + public yet_args_needed_23 + public yet_args_needed_24 + public yet_args_needed_25 + public yet_args_needed_26 + public yet_args_needed_27 + public yet_args_needed_28 + public yet_args_needed_29 + public yet_args_needed_30 + public yet_args_needed_31 + +ap_32: + mov rbp,qword ptr [r8] + mov rbx,32*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap32 + +ap_31: + mov rbp,qword ptr [r8] + mov rbx,31*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap31 + +ap_30: + mov rbp,qword ptr [r8] + mov rbx,30*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap30 + +ap_29: + mov rbp,qword ptr [r8] + mov rbx,29*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap29 + +ap_28: + mov rbp,qword ptr [r8] + mov rbx,28*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap28 + +ap_27: + mov rbp,qword ptr [r8] + mov rbx,27*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap27 + +ap_26: + mov rbp,qword ptr [r8] + mov rbx,26*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap26 + +ap_25: + mov rbp,qword ptr [r8] + mov rbx,25*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap25 + +ap_24: + mov rbp,qword ptr [r8] + mov rbx,24*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap24 + +ap_23: + mov rbp,qword ptr [r8] + mov rbx,23*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap23 + +ap_22: + mov rbp,qword ptr [r8] + mov rbx,22*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap22 + +ap_21: + mov rbp,qword ptr [r8] + mov rbx,21*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap21 + +ap_20: + mov rbp,qword ptr [r8] + mov rbx,20*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap20 + +ap_19: + mov rbp,qword ptr [r8] + mov rbx,19*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap19 + +ap_18: + mov rbp,qword ptr [r8] + mov rbx,18*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap18 + +ap_17: + mov rbp,qword ptr [r8] + mov rbx,17*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap17 + +ap_16: + mov rbp,qword ptr [r8] + mov rbx,16*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap16 + +ap_15: + mov rbp,qword ptr [r8] + mov rbx,15*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap15 + +ap_14: + mov rbp,qword ptr [r8] + mov rbx,14*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap14 + +ap_13: + mov rbp,qword ptr [r8] + mov rbx,13*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap13 + +ap_12: + mov rbp,qword ptr [r8] + mov rbx,12*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap12 + +ap_11: + mov rbp,qword ptr [r8] + mov rbx,11*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap11 + +ap_10: + mov rbp,qword ptr [r8] + mov rbx,10*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap10 + +ap_9: + mov rbp,qword ptr [r8] + mov rbx,9*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap9 + +ap_8: + mov rbp,qword ptr [r8] + mov rbx,8*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap8 + +ap_7: + mov rbp,qword ptr [r8] + mov rbx,7*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap7 + +ap_6: + mov rbp,qword ptr [r8] + mov rbx,6*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap6 + +ap_5: + mov rbp,qword ptr [r8] + mov rbx,5*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap5 + +ap_4: + mov rbp,qword ptr [r8] + mov rbx,4*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap4 + +ap_3: + mov rbp,qword ptr [r8] + mov rbx,3*8 + cmp word ptr [rbp],bx + je fast_ap + + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap3 + +ap_2: + mov rbp,qword ptr [r8] + mov rbx,2*8 + cmp word ptr [rbp],bx + jne no_fast_ap2_ + +fast_ap_2_2_: + movzx rax,word ptr -2[rbp] + add rbx,rbp + mov ebp,dword ptr -6[rbx] + ifdef PROFILE + sub rbp,24 + else + sub rbp,12 + endif + cmp rax,1 + jb repl_args_0_2 + je repl_args_1 + + cmp rax,3 + jb repl_args_2 + + mov qword ptr [rsi],rcx + mov qword ptr 8[rsi],rdx + lea rsi,16[rsi] + mov rdx,qword ptr 16[r8] + + jmp fast_ap_ + +no_fast_ap2_: + mov qword ptr [rsi],rcx + mov rcx,rdx + mov rdx,r8 + mov r8d,dword ptr 2[rbp] + add rsi,8 + jmp no_fast_ap2 + +fast_ap_2_2: + mov r8,rdx + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + jmp fast_ap_2_2_ + +fast_ap_2: + mov r8,rdx + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + +fast_ap: + movzx rax,word ptr -2[rbp] + add rbx,rbp + mov ebp,dword ptr -6[rbx] + ifdef PROFILE + sub rbp,24 + else + sub rbp,12 + endif + cmp rax,1 + jb repl_args_0 + je repl_args_1 + + cmp rax,3 + jb repl_args_2 + + mov qword ptr [rsi],rcx + mov qword ptr 8[rsi],rdx + lea rsi,16[rsi] + mov rdx,qword ptr 16[r8] + +fast_ap_: + mov r8,qword ptr 8[r8] + je repl_args_3 + + cmp rax,5 + jb repl_args_4 + je repl_args_5 + + cmp rax,7 + jb repl_args_6 + +repl_args_7_: + mov rbx,qword ptr -16[rdx+rax*8] + mov qword ptr [rsi],rbx + sub rax,1 + add rsi,8 + cmp rax,6 + jne repl_args_7_ + +repl_args_6: + mov rax,qword ptr 32[rdx] + mov qword ptr [rsi],rax + mov rax,qword ptr 24[rdx] + mov qword ptr 8[rsi],rax + mov rax,qword ptr 16[rdx] + mov qword ptr 16[rsi],rax + mov rcx,qword ptr 8[rdx] + mov rdx,qword ptr [rdx] + add rsi,24 + jmp rbp + +repl_args_0: + mov r8,rdx + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 +repl_args_0_2: + jmp rbp + +repl_args_1: + mov r8,qword ptr 8[r8] + jmp rbp + +repl_args_2: + mov qword ptr [rsi],rcx + mov rcx,rdx + add rsi,8 + mov rdx,qword ptr 16[r8] + mov r8,qword ptr 8[r8] + jmp rbp + +repl_args_3: + mov rcx,qword ptr 8[rdx] + mov rdx,qword ptr [rdx] + jmp rbp + +repl_args_4: + mov rax,qword ptr 16[rdx] + mov qword ptr [rsi],rax + mov rcx,qword ptr 8[rdx] + mov rdx,qword ptr [rdx] + add rsi,8 + jmp rbp + +repl_args_5: + mov rax,qword ptr 24[rdx] + mov qword ptr [rsi],rax + mov rax,qword ptr 16[rdx] + mov qword ptr 8[rsi],rax + mov rcx,qword ptr 8[rdx] + mov rdx,qword ptr [rdx] + add rsi,16 + jmp rbp + + +no_fast_ap32: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,31*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap31: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,30*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap30: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,29*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap29: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,28*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap28: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,27*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap27: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,26*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap26: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,25*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap25: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,24*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap24: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,23*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap23: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,22*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap22: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,21*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap21: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,20*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap20: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,19*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap19: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,18*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap18: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,17*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap17: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,16*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap16: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,15*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap15: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,14*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap14: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,13*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap13: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,12*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap12: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,11*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap11: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,10*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap10: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,9*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap9: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,8*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap8: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,7*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap7: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,6*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap6: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,5*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap5: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,4*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap4: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,3*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap3: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + + mov rbx,2*8 + cmp word ptr [rbp],bx + je fast_ap_2 + + mov r8d,dword ptr 2[rbp] +no_fast_ap2: + call r8 + mov rbp,qword ptr [rcx] + mov rdx,rcx + mov rcx,qword ptr -8[rsi] + sub rsi,8 + mov r8d,dword ptr 2[rbp] + jmp r8 + + +add_empty_node_2: + sub r15,3 + jb add_empty_node_2_gc +add_empty_node_2_gc_: + mov qword ptr [rdi],offset __cycle__in__spine + mov r8,rdx + mov rdx,rcx + mov rcx,rdi + add rdi,24 + ret +add_empty_node_2_gc: + call collect_2 + jmp add_empty_node_2_gc_ + +add_empty_node_3: + sub r15,3 + jb add_empty_node_3_gc +add_empty_node_3_gc_: + mov qword ptr [rsi],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_3_gc: + call collect_3 + jmp add_empty_node_3_gc_ + +add_empty_node_4: + sub r15,3 + jb add_empty_node_4_gc +add_empty_node_4_gc_: + mov rbp,qword ptr -8[rsi] + mov qword ptr [rsi],rbp + mov qword ptr -8[rsi],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_4_gc: + call collect_3 + jmp add_empty_node_4_gc_ + +add_empty_node_5: + sub r15,3 + jb add_empty_node_5_gc +add_empty_node_5_gc_: + mov rbp,qword ptr -8[rsi] + mov qword ptr [rsi],rbp + mov rbp,qword ptr -16[rsi] + mov qword ptr -8[rsi],rbp + mov qword ptr -16[rsi],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_5_gc: + call collect_3 + jmp add_empty_node_5_gc_ + +add_empty_node_6: + sub r15,3 + jb add_empty_node_6_gc +add_empty_node_6_gc_: + mov rbp,qword ptr -8[rsi] + mov qword ptr [rsi],rbp + mov rbp,qword ptr -16[rsi] + mov qword ptr -8[rsi],rbp + mov rbp,qword ptr -24[rsi] + mov qword ptr -16[rsi],rbp + mov qword ptr -24[rsi],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_6_gc: + call collect_3 + jmp add_empty_node_6_gc_ + +add_empty_node_7: + sub r15,3 + jb add_empty_node_7_gc +add_empty_node_7_gc_: + mov rbp,qword ptr -8[rsi] + mov qword ptr [rsi],rbp + mov rbp,qword ptr -16[rsi] + mov qword ptr -8[rsi],rbp + mov rbp,qword ptr -24[rsi] + mov qword ptr -16[rsi],rbp + mov rbp,qword ptr -32[rsi] + mov qword ptr -24[rsi],rbp + mov qword ptr -32[rsi],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_7_gc: + call collect_3 + jmp add_empty_node_7_gc_ + +add_empty_node_8: + sub r15,3 + jb add_empty_node_8_gc +add_empty_node_8_gc_: + mov rbp,qword ptr -8[rsi] + mov qword ptr [rsi],rbp + mov rbp,qword ptr -16[rsi] + mov qword ptr -8[rsi],rbp + mov rbp,qword ptr -24[rsi] + mov qword ptr -16[rsi],rbp + mov rbp,qword ptr -32[rsi] + mov qword ptr -24[rsi],rbp + mov rbp,qword ptr -40[rsi] + mov qword ptr -32[rsi],rbp + mov qword ptr -40[rsi],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_8_gc: + call collect_3 + jmp add_empty_node_8_gc_ + +add_empty_node_9: + sub r15,3 + jb add_empty_node_9_gc +add_empty_node_9_gc_: + mov rbp,qword ptr -8[rsi] + mov qword ptr [rsi],rbp + mov rbp,qword ptr -16[rsi] + mov qword ptr -8[rsi],rbp + mov rbp,qword ptr -24[rsi] + mov qword ptr -16[rsi],rbp + mov rbp,qword ptr -32[rsi] + mov qword ptr -24[rsi],rbp + mov rbp,qword ptr -40[rsi] + mov qword ptr -32[rsi],rbp + mov rbp,qword ptr -48[rsi] + mov qword ptr -40[rsi],rbp + mov qword ptr -48[rsi],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_9_gc: + call collect_3 + jmp add_empty_node_9_gc_ + +add_empty_node_10: + sub r15,3 + jb add_empty_node_10_gc +add_empty_node_10_gc_: + mov rbp,qword ptr -8[rsi] + mov qword ptr [rsi],rbp + mov rbp,qword ptr -16[rsi] + mov qword ptr -8[rsi],rbp + mov rbp,qword ptr -24[rsi] + mov qword ptr -16[rsi],rbp + mov rbp,qword ptr -32[rsi] + mov qword ptr -24[rsi],rbp + mov rbp,qword ptr -40[rsi] + mov qword ptr -32[rsi],rbp + mov rbp,qword ptr -48[rsi] + mov qword ptr -40[rsi],rbp + mov rbp,qword ptr -56[rsi] + mov qword ptr -48[rsi],rbp + mov qword ptr -56[rsi],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_10_gc: + call collect_3 + jmp add_empty_node_10_gc_ + +add_empty_node_11: + sub r15,3 + jb add_empty_node_11_gc +add_empty_node_11_gc_: + mov rbp,qword ptr -8[rsi] + mov qword ptr [rsi],rbp + mov rbp,qword ptr -16[rsi] + mov qword ptr -8[rsi],rbp + mov rbp,qword ptr -24[rsi] + mov qword ptr -16[rsi],rbp + mov rbp,qword ptr -32[rsi] + mov qword ptr -24[rsi],rbp + mov rbp,qword ptr -40[rsi] + mov qword ptr -32[rsi],rbp + mov rbp,qword ptr -48[rsi] + mov qword ptr -40[rsi],rbp + mov rbp,qword ptr -56[rsi] + mov qword ptr -48[rsi],rbp + mov rbp,qword ptr -64[rsi] + mov qword ptr -56[rsi],rbp + mov qword ptr -64[rsi],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_11_gc: + call collect_3 + jmp add_empty_node_11_gc_ + +add_empty_node_32: + mov rbx,7 + jmp add_empty_node_12_ +add_empty_node_28: + mov rbx,6 + jmp add_empty_node_12_ +add_empty_node_24: + mov rbx,5 + jmp add_empty_node_12_ +add_empty_node_20: + mov rbx,4 + jmp add_empty_node_12_ +add_empty_node_16: + mov rbx,3 + jmp add_empty_node_12_ +add_empty_node_12: + mov rbx,2 +add_empty_node_12_: + sub r15,3 + jb add_empty_node_12_gc +add_empty_node_12_gc_: + mov rax,rsi +add_empty_node_12_lp: + mov rbp,qword ptr -8[rax] + mov qword ptr [rax],rbp + mov rbp,qword ptr -16[rax] + mov qword ptr -8[rax],rbp + mov rbp,qword ptr -24[rax] + mov qword ptr -16[rax],rbp + mov rbp,qword ptr -32[rax] + mov qword ptr -24[rax],rbp + sub rax,32 + sub rbx,1 + jne add_empty_node_12_lp + mov qword ptr [rax],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_12_gc: + call collect_3 + jmp add_empty_node_12_gc_ + +add_empty_node_29: + mov rbx,6 + jmp add_empty_node_13_ +add_empty_node_25: + mov rbx,5 + jmp add_empty_node_13_ +add_empty_node_21: + mov rbx,4 + jmp add_empty_node_13_ +add_empty_node_17: + mov rbx,3 + jmp add_empty_node_13_ +add_empty_node_13: + mov rbx,2 +add_empty_node_13_: + sub r15,3 + jb add_empty_node_13_gc +add_empty_node_13_gc_: + mov rax,rsi + mov rbp,qword ptr -8[rsi] + mov qword ptr [rsi],rbp +add_empty_node_13_lp: + mov rbp,qword ptr -16[rax] + mov qword ptr -8[rax],rbp + mov rbp,qword ptr -24[rax] + mov qword ptr -16[rax],rbp + mov rbp,qword ptr -32[rax] + mov qword ptr -24[rax],rbp + mov rbp,qword ptr -40[rax] + mov qword ptr -32[rax],rbp + sub rax,32 + sub rbx,1 + jne add_empty_node_13_lp + mov qword ptr -8[rax],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_13_gc: + call collect_3 + jmp add_empty_node_13_gc_ + +add_empty_node_30: + mov rbx,6 + jmp add_empty_node_14_ +add_empty_node_26: + mov rbx,5 + jmp add_empty_node_14_ +add_empty_node_22: + mov rbx,4 + jmp add_empty_node_14_ +add_empty_node_18: + mov rbx,3 + jmp add_empty_node_14_ +add_empty_node_14: + mov rbx,2 +add_empty_node_14_: + sub r15,3 + jb add_empty_node_14_gc +add_empty_node_14_gc_: + mov rax,rsi + mov rbp,qword ptr -8[rsi] + mov qword ptr [rsi],rbp + mov rsi,qword ptr -16[rsi] + mov qword ptr -8[rsi],rbp +add_empty_node_14_lp: + mov rbp,qword ptr -24[rax] + mov qword ptr -16[rax],rbp + mov rbp,qword ptr -32[rax] + mov qword ptr -24[rax],rbp + mov rbp,qword ptr -40[rax] + mov qword ptr -32[rax],rbp + mov rbp,qword ptr -48[rax] + mov qword ptr -40[rax],rbp + sub rax,32 + sub rbx,1 + jne add_empty_node_14_lp + mov qword ptr -16[rax],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_14_gc: + call collect_3 + jmp add_empty_node_14_gc_ + +add_empty_node_31: + mov rbx,6 + jmp add_empty_node_15_ +add_empty_node_27: + mov rbx,5 + jmp add_empty_node_15_ +add_empty_node_23: + mov rbx,4 + jmp add_empty_node_15_ +add_empty_node_19: + mov rbx,3 + jmp add_empty_node_15_ +add_empty_node_15: + mov rbx,2 +add_empty_node_15_: + sub r15,3 + jb add_empty_node_15_gc +add_empty_node_15_gc_: + mov rax,rbp + mov rbp,qword ptr -8[rsi] + mov qword ptr [rsi],rbp + mov rbp,qword ptr -16[rsi] + mov qword ptr -8[rsi],rbp + mov rbp,qword ptr -24[rsi] + mov qword ptr -16[rsi],rbp +add_empty_node_15_lp: + mov rbp,qword ptr -32[rax] + mov qword ptr -24[rax],rbp + mov rbp,qword ptr -40[rax] + mov qword ptr -32[rax],rbp + mov rbp,qword ptr -48[rax] + mov qword ptr -40[rax],rbp + mov rbp,qword ptr -56[rax] + mov qword ptr -48[rax],rbp + sub rax,32 + sub rbx,1 + jne add_empty_node_15_lp + mov qword ptr -24[rax],rdi + mov qword ptr [rdi],offset __cycle__in__spine + add rsi,8 + add rdi,24 + ret +add_empty_node_15_gc: + call collect_3 + jmp add_empty_node_15_gc_ + + +yet_args_needed_0: + sub r15,2 + jb yet_args_needed_0_gc +yet_args_needed_0_gc_r: + mov qword ptr 8[rdi],rcx + mov rax,qword ptr [rdx] + mov rcx,rdi + add rax,8 + mov qword ptr [rdi],rax + add rdi,16 + ret + +yet_args_needed_0_gc: + call collect_2 + jmp yet_args_needed_0_gc_r + + + align (4) + sub r15,3 + jae short build_node_2_gc_r + jmp short build_node_2_gc + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_1: + sub r15,3 + jb yet_args_needed_1_gc +yet_args_needed_1_gc_r: + mov qword ptr 16[rdi],rcx + mov rax,qword ptr [rdx] + mov rcx,rdi + add rax,8 + mov qword ptr [rdi],rax + mov rbx,qword ptr 8[rdx] + mov qword ptr 8[rdi],rbx + add rdi,24 + ret + +yet_args_needed_1_gc: + call collect_2 + jmp yet_args_needed_1_gc_r + +build_node_2_gc_r: + mov qword ptr [rdi],rbx + mov qword ptr 8[rdi],rdx + mov qword ptr 16[rdi],rcx + mov rcx,rdi + add rdi,24 + ret + +build_node_2_gc: + call collect_2 + jmp build_node_2_gc_r + + + align (4) + sub r15,5 + jae short build_node_3_gc_r + jmp short build_node_3_gc + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_2: + sub r15,5 + jb gc_22 +gc_r_22: + mov rax,qword ptr [rdx] + mov qword ptr 8[rdi],rcx + add rax,8 + mov d2,qword ptr 8[rdx] + mov qword ptr 16[rdi],rax + lea rcx,16[rdi] + mov rbp,qword ptr 16[rdx] + mov qword ptr 24[rdi],d2 + mov qword ptr [rdi],rbp + mov qword ptr 32[rdi],rdi + add rdi,40 + ret + +gc_22: call collect_2 + jmp gc_r_22 + +build_node_3_gc_r: + mov qword ptr [rdi],rbx + lea rbp,24[rdi] + mov qword ptr 8[rdi],r8 + mov qword ptr 16[rdi],rbp + mov qword ptr 24[rdi],rdx + mov qword ptr 32[rdi],rcx + mov rcx,rdi + add rdi,40 + ret + +build_node_3_gc: + call collect_2 + jmp build_node_3_gc_r + + + align (4) + sub r15,6 + jae short build_node_4_gc_r + jmp short build_node_4_gc + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_3: + sub r15,6 + jb gc_23 +gc_r_23: + mov rax,qword ptr [rdx] + mov qword ptr 16[rdi],rcx + add rax,8 + mov d2,qword ptr 8[rdx] + mov qword ptr 24[rdi],rax + mov rdx,qword ptr 16[rdx] + mov qword ptr 32[rdi],d2 + mov rbp,qword ptr [rdx] + mov qword ptr 40[rdi],rdi + mov qword ptr [rdi],rbp + mov rbp,qword ptr 8[rdx] + lea rcx,24[rdi] + mov qword ptr 8[rdi],rbp + add rdi,48 + ret + +gc_23: call collect_2 + jmp gc_r_23 + +build_node_4_gc_r: + mov qword ptr [rdi],rbx + lea rbp,24[rdi] + mov qword ptr 8[rdi],r8 + mov qword ptr 16[rdi],rbp + mov qword ptr 24[rdi],rdx + mov qword ptr 32[rdi],rcx + mov rcx,rdi + mov rbp,qword ptr -8[rsi] + mov qword ptr 40[rdi],rbp + sub rsi,8 + add rdi,48 + ret + +build_node_4_gc: + call collect_2 + jmp build_node_4_gc_r + + + align (4) + sub r15,7 + jae short build_node_5_gc_r + jmp build_node_5_gc + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_4: + sub r15,7 + jb gc_24 +gc_r_24: + mov rax,qword ptr [rdx] + mov qword ptr 24[rdi],rcx + add rax,8 + mov d2,qword ptr 8[rdx] + mov qword ptr 32[rdi],rax + mov rdx,qword ptr 16[rdx] + mov qword ptr 40[rdi],d2 + mov rbp,qword ptr [rdx] + mov 48[rdi],rdi + mov qword ptr [rdi],rbp + mov rbp,qword ptr 8[rdx] + lea rcx,32[rdi] + mov qword ptr 8[rdi],rbp + mov rbp,qword ptr 16[rdx] + mov qword ptr 16[rdi],rbp + add rdi,56 + ret + +gc_24: call collect_2 + jmp gc_r_24 + +build_node_5_gc_r: + mov qword ptr [rdi],rbx + lea rbp,24[rdi] + mov qword ptr 8[rdi],r8 + mov qword ptr 16[rdi],rbp + mov qword ptr 24[rdi],rdx + mov qword ptr 32[rdi],rcx + mov rcx,rdi + mov rbp,qword ptr -8[rsi] + mov qword ptr 40[rdi],rbp + mov rbp,qword ptr -16[rsi] + mov qword ptr 48[rdi],rbp + sub rsi,16 + add rdi,56 + ret + +build_node_5_gc: + call collect_2 + jmp build_node_5_gc_r + + + align (4) + mov eax,8 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_5: + mov rbx,qword ptr [rdx] + mov rax,8 + jmp yet_args_needed_ + + + align (4) + mov eax,9 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_6: + mov rbx,qword ptr [rdx] + mov rax,9 + jmp yet_args_needed_ + + align (4) + mov eax,10 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_7: + mov rbx,qword ptr [rdx] + mov rax,10 + jmp yet_args_needed_ + + align (4) + mov eax,11 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_8: + mov rbx,qword ptr [rdx] + mov rax,11 + jmp yet_args_needed_ + + align (4) + mov eax,12 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_9: + mov rbx,qword ptr [rdx] + mov rax,12 + jmp yet_args_needed_ + + align (4) + mov eax,13 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_10: + mov rbx,qword ptr [rdx] + mov rax,13 + jmp yet_args_needed_ + + align (4) + mov eax,14 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_11: + mov rbx,qword ptr [rdx] + mov rax,14 + jmp yet_args_needed_ + + align (4) + mov eax,15 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_12: + mov rbx,qword ptr [rdx] + mov rax,15 + jmp yet_args_needed_ + + align (4) + mov eax,16 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_13: + mov rbx,qword ptr [rdx] + mov rax,16 + jmp yet_args_needed_ + + align (4) + mov eax,17 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_14: + mov rbx,qword ptr [rdx] + mov rax,17 + jmp yet_args_needed_ + + align (4) + mov eax,18 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_15: + mov rbx,qword ptr [rdx] + mov rax,18 + jmp yet_args_needed_ + + align (4) + mov eax,19 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_16: + mov rbx,qword ptr [rdx] + mov rax,19 + jmp yet_args_needed_ + + align (4) + mov eax,20 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_17: + mov rbx,qword ptr [rdx] + mov rax,20 + jmp yet_args_needed_ + + align (4) + mov eax,21 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_18: + mov rbx,qword ptr [rdx] + mov rax,21 + jmp yet_args_needed_ + + align (4) + mov eax,22 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_19: + mov rbx,qword ptr [rdx] + mov rax,22 + jmp yet_args_needed_ + + align (4) + mov eax,23 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_20: + mov rbx,qword ptr [rdx] + mov rax,23 + jmp yet_args_needed_ + + align (4) + mov eax,24 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_21: + mov rbx,qword ptr [rdx] + mov rax,24 + jmp yet_args_needed_ + + align (4) + mov eax,25 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_22: + mov rbx,qword ptr [rdx] + mov rax,25 + jmp yet_args_needed_ + + align (4) + mov eax,26 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_23: + mov rbx,qword ptr [rdx] + mov rax,26 + jmp yet_args_needed_ + + align (4) + mov eax,27 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_24: + mov rbx,qword ptr [rdx] + mov rax,27 + jmp yet_args_needed_ + + align (4) + mov eax,28 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_25: + mov rbx,qword ptr [rdx] + mov rax,28 + jmp yet_args_needed_ + + align (4) + mov eax,29 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_26: + mov rbx,qword ptr [rdx] + mov rax,29 + jmp yet_args_needed_ + + align (4) + mov eax,30 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_27: + mov rbx,qword ptr [rdx] + mov rax,30 + jmp yet_args_needed_ + + align (4) + mov eax,31 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_28: + mov rbx,qword ptr [rdx] + mov rax,31 + jmp yet_args_needed_ + + align (4) + mov eax,32 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_29: + mov rbx,qword ptr [rdx] + mov rax,32 + jmp yet_args_needed_ + + align (4) + mov eax,33 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_30: + mov rbx,qword ptr [rdx] + mov rax,33 + jmp yet_args_needed_ + + align (4) + mov eax,34 + jmp build_node_ + nop + nop + align (4) + ifdef PROFILE + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + endif +yet_args_needed_31: + mov rbx,qword ptr [rdx] + mov rax,34 + jmp yet_args_needed_ + +yet_args_needed: + mov rbx,qword ptr [rdx] + movzx rax,word ptr -2[rbx] + add rax,3 +yet_args_needed_: + sub r15,rax + jb yet_args_needed_gc +yet_args_needed_gc_r: + mov d3,qword ptr 8[rdx] + sub rax,3+1+4 + mov rdx,qword ptr 16[rdx] + mov d2,rdi + mov rbp,qword ptr [rdx] + mov qword ptr [rdi],rbp + mov rbp,qword ptr 8[rdx] + mov qword ptr 8[rdi],rbp + mov rbp,qword ptr 16[rdx] + mov qword ptr 16[rdi],rbp + add rdx,24 + add rdi,24 + +yet_args_needed_cp_a: + mov rbp,qword ptr [rdx] + add rdx,8 + mov qword ptr [rdi],rbp + add rdi,8 + sub rax,1 + jge yet_args_needed_cp_a + + mov qword ptr [rdi],rcx + add rbx,8 + mov qword ptr 8[rdi],rbx + lea rcx,8[rdi] + mov qword ptr 16[rdi],d3 + mov qword ptr 24[rdi],d2 + add rdi,32 + ret + +yet_args_needed_gc: + call collect_2 + jmp yet_args_needed_gc_r + +build_node_: + sub r15,rax + jb build_node_gc +build_node_gc_r: + mov qword ptr [rdi],rbx + lea rbp,24[rdi] + mov qword ptr 8[rdi],r8 + mov qword ptr 16[rdi],rbp + mov qword ptr 24[rdi],rdx + mov qword ptr 32[rdi],rcx + mov rcx,rdi + mov r8,qword ptr -8[rsi] + mov qword ptr 40[rdi],r8 + mov r8,qword ptr -16[rsi] + sub rsi,16 + mov qword ptr 48[rdi],r8 + add rdi,56 + + sub rax,5+2 +build_node_cp_a: + mov r8,qword ptr -8[rsi] + sub rsi,8 + mov qword ptr [rdi],r8 + add rdi,8 + sub rax,1 + jne build_node_cp_a + + ret + +build_node_gc: + call collect_3 + jmp build_node_gc_r + +_TEXT ends + + ifndef NEW_DESCRIPTORS + end + endif diff --git a/thread/acompact.asm b/thread/acompact.asm index 202565c..00b00d1 100644 --- a/thread/acompact.asm +++ b/thread/acompact.asm @@ -1,1375 +1,1375 @@ - -; mark used nodes and pointers in argument parts and link backward pointers - - if THREAD - mov rax,qword ptr heap_size_65_offset[r9] - else - mov rax,qword ptr heap_size_65 - endif - shl rax,6 - if THREAD - mov qword ptr heap_size_64_65_offset[r9],rax - else - mov qword ptr heap_size_64_65,rax - endif - - lea rax,(-16000)[rsp] - if THREAD - mov qword ptr end_stack_offset[r9],rax - else - mov qword ptr end_stack,rax - endif - - mov rax,qword ptr caf_list - - test qword ptr flags,4096 - jne pmarkr - - test rax,rax - je end_mark_cafs - -mark_cafs_lp: - push (-8)[rax] - - lea rsi,8[rax] - mov rax,qword ptr [rax] - lea rcx,[rsi+rax*8] - - if THREAD - mov qword ptr end_vector_offset[r9],rcx - else - mov qword ptr end_vector,rcx - endif - - call rmark_stack_nodes - - pop rax - test rax,rax - jne mark_cafs_lp - -end_mark_cafs: - if THREAD - mov rsi,qword ptr stack_p_offset[r9] - - mov rcx,qword ptr stack_top_offset[r9] - mov qword ptr end_vector_offset[r9],rcx - else - mov rsi,qword ptr stack_p - - mov rcx,qword ptr stack_top - mov qword ptr end_vector,rcx - endif - - call rmark_stack_nodes - - call add_mark_compact_garbage_collect_time - - jmp compact_heap - -pmarkr: - test rax,rax - je end_rmarkp_cafs - -rmarkp_cafs_lp: - push (-8)[rax] - - lea rsi,8[rax] - mov rax,qword ptr [rax] - lea rcx,[rsi+rax*8] - - if THREAD - mov qword ptr end_vector_offset[r9],rcx - else - mov qword ptr end_vector,rcx - endif - - call rmarkp_stack_nodes - - pop rax - test rax,rax - jne rmarkp_cafs_lp - -end_rmarkp_cafs: - if THREAD - mov rsi,qword ptr stack_p_offset[r9] - - mov rcx,qword ptr stack_top_offset[r9] - mov qword ptr end_vector_offset[r9],rcx - else - mov rsi,qword ptr stack_p - - mov rcx,qword ptr stack_top - mov qword ptr end_vector,rcx - endif - - call rmarkp_stack_nodes - - call add_mark_compact_garbage_collect_time - - jmp compact_heap - - include acompact_rmark.asm - - include acompact_rmark_prefetch.asm - - include acompact_rmarkr.asm - -; compact the heap - -compact_heap: - - mov rcx,offset finalizer_list - mov rdx,offset free_finalizer_list - - mov rbp,qword ptr [rcx] -determine_free_finalizers_after_compact1: - if THREAD - lea rax,__Nil-8 - cmp rbp,rax - else - lea r9,__Nil-8 - cmp rbp,r9 - endif - je end_finalizers_after_compact1 - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rbp - mov rbx,rax - and rax,31*9 - shr rbx,8 - mov esi,dword ptr (bit_set_table2)[rax] - test esi,dword ptr [rdi+rbx*4] - je finalizer_not_used_after_compact1 - - mov rax,qword ptr [rbp] - mov rsi,rbp - jmp finalizer_find_descriptor - -finalizer_find_descriptor_lp: - and rax,-4 - mov rsi,rax - mov rax,qword ptr [rax] -finalizer_find_descriptor: - test rax,1 - jne finalizer_find_descriptor_lp - - mov qword ptr [rsi],offset e____system__kFinalizerGCTemp+2 - - cmp rbp,rcx - ja finalizer_no_reverse - - mov rax,qword ptr [rbp] - lea rsi,1[rcx] - mov qword ptr [rbp],rsi - mov qword ptr [rcx],rax - -finalizer_no_reverse: - lea rcx,8[rbp] - mov rbp,qword ptr 8[rbp] - jmp determine_free_finalizers_after_compact1 - -finalizer_not_used_after_compact1: - mov qword ptr [rbp],offset e____system__kFinalizerGCTemp+2 - - 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_compact1 - -end_finalizers_after_compact1: - mov qword ptr [rdx],rbp - - mov rcx,qword ptr finalizer_list - if THREAD - lea rax,__Nil-8 - cmp rcx,rax - else - lea r9,__Nil-8 - cmp rcx,r9 -endif - je finalizer_list_empty - test rcx,3 - jne finalizer_list_already_reversed - mov rax,qword ptr [rcx] - mov qword ptr [rcx],offset finalizer_list+1 - mov qword ptr finalizer_list,rax -finalizer_list_already_reversed: -finalizer_list_empty: - - mov rbp ,offset free_finalizer_list - if THREAD - lea rax,__Nil-8 - cmp qword ptr [rbp],rax - else - lea r9,__Nil-8 - cmp qword ptr [rbp],r9 - endif - je free_finalizer_list_empty - - if THREAD - mov qword ptr end_vector_offset[r9],offset free_finalizer_list+8 - else - mov qword ptr end_vector,offset free_finalizer_list+8 - endif - - test qword ptr flags,4096 - je no_pmarkr - call rmarkp_stack_nodes - jmp free_finalizer_list_empty -no_pmarkr: - call rmark_stack_nodes - -free_finalizer_list_empty: - - if THREAD - mov rax,qword ptr heap_size_65_offset[r9] - else - mov rax,qword ptr heap_size_65 - endif - mov rbx,rax - shl rbx,6 - - if THREAD - add rbx,qword ptr heap_p3_offset[r9] - mov qword ptr end_heap_p3_offset[r9],rbx - else - add rbx,qword ptr heap_p3 - mov qword ptr end_heap_p3,rbx - endif - - add rax,3 - shr rax,2 - mov r12,rax - - if THREAD - mov r8,qword ptr heap_vector_offset[r9] - else - mov r8,qword ptr heap_vector - endif - - lea rbx,4[r8] - neg rbx - if THREAD - mov qword ptr neg_heap_vector_plus_4_offset[r9],rbx - - mov rdi,qword ptr heap_p3_offset[r9] - else - mov qword ptr neg_heap_vector_plus_4,rbx - - mov rdi,qword ptr heap_p3 - endif - xor rsi,rsi - jmp skip_zeros - -; %rax ,%rcx ,%rbp : free -find_non_zero_long: -skip_zeros: - sub r12,1 - jc end_move - mov esi,dword ptr [r8] - add r8,4 - test rsi,rsi - je skip_zeros -; %rbp : free -end_skip_zeros: - if THREAD - mov rbp,qword ptr neg_heap_vector_plus_4_offset[r9] - else - mov rbp,qword ptr neg_heap_vector_plus_4 - endif - - add rbp,r8 - - shl rbp,6 - if THREAD - add rbp,qword ptr heap_p3_offset[r9] - else - add rbp,qword ptr heap_p3 - endif - -bsf_and_copy_nodes: - movzx rax,sil - test rax,rax - jne found_bit1 - movzx rcx,si - shr rcx,8 - jne found_bit2 - mov rax,rsi - and rax,0ff0000h - jne found_bit3 - mov rcx,rsi - shr rcx,24 - movzx rcx,byte ptr first_one_bit_table[rcx*1] - add rcx,24 - jmp copy_nodes - -found_bit3: - shr rax,16 - movzx rcx,byte ptr first_one_bit_table[rax*1] - add rcx,16 - jmp copy_nodes - -found_bit2: - movzx rcx,byte ptr first_one_bit_table[rcx*1] - add rcx,8 - jmp copy_nodes - -found_bit1: - movzx rcx,byte ptr first_one_bit_table[rax*1] - -copy_nodes: - mov rax,qword ptr [rbp+rcx*8] - shr esi,1 - lea rbp,8[rbp+rcx*8] - shr esi,cl - mov rcx,rbp - - dec rax - - test rax,2 - je begin_update_list_2 - -move_argument_part: - mov rbx,qword ptr (-18)[rax] - sub rax,2 - - test rbx,1 - je end_list_2 -find_descriptor_2: - and rbx,-4 - mov rbx,qword ptr [rbx] - test rbx,1 - jne find_descriptor_2 - -end_list_2: - mov rdx,rbx - movzx rbx,word ptr (-2)[rbx] - cmp rbx,256 - jb no_record_arguments - - movzx rdx,word ptr (-2+2)[rdx] - sub rdx,2 - jae copy_record_arguments_aa - - sub rbx,256+3 - -copy_record_arguments_all_b: - push rbx - if THREAD - mov rbx,qword ptr heap_vector_offset[r9] - else - mov rbx,qword ptr heap_vector - endif - -update_up_list_1r: - mov rdx,rax - if THREAD - add rax,qword ptr neg_heap_p3_offset[r9] - else - add rax,qword ptr neg_heap_p3 - endif - - push rcx - - mov rcx,rax - - shr rax,8 - and rcx,31*8 - - mov ecx,dword ptr bit_set_table2[rcx*1] - mov eax,dword ptr [rbx+rax*4] - - and rax,rcx - - pop rcx - je copy_argument_part_1r - - mov rax,qword ptr [rdx] - mov qword ptr [rdx],rdi - sub rax,3 - jmp update_up_list_1r - -copy_argument_part_1r: - mov rax,qword ptr [rdx] - mov qword ptr [rdx],rdi - mov qword ptr [rdi],rax - add rdi,8 - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - shr rax,3 - - mov rbx,rax - and rbx,31 - cmp rbx,1 - jae bit_in_this_word - - dec r12 - mov esi,dword ptr [r8] - add r8,4 - - if THREAD - mov rbp,qword ptr neg_heap_vector_plus_4_offset[r9] - else - mov rbp,qword ptr neg_heap_vector_plus_4 - endif - add rbp,r8 - shl rbp,6 - if THREAD - add rbp,qword ptr heap_p3_offset[r9] - else - add rbp,qword ptr heap_p3 - endif - -bit_in_this_word: - shr esi,1 - add rbp,8 - - pop rbx - -copy_b_record_argument_part_arguments: - mov rax,qword ptr [rcx] - add rcx,8 - mov qword ptr [rdi],rax - add rdi,8 - sub rbx,1 - jnc copy_b_record_argument_part_arguments - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -copy_record_arguments_aa: - sub rbx,256+2 - sub rbx,rdx - - push rbx - push rdx - -update_up_list_2r: - mov rdx,rax - mov rax,qword ptr [rdx] - mov rbx,3 - and rbx,rax - sub rbx,3 - jne copy_argument_part_2r - - mov qword ptr [rdx],rdi - sub rax,3 - jmp update_up_list_2r - -copy_argument_part_2r: - mov qword ptr [rdx],rdi - cmp rax,rcx - jb copy_record_argument_2 - - if THREAD - cmp rax,qword ptr end_heap_p3_offset[r9] - else - cmp rax,qword ptr end_heap_p3 - endif - jae copy_record_argument_2 - - mov rdx,rax - mov rax,qword ptr [rdx] - lea rbx,1[rdi] - mov qword ptr [rdx],rbx -copy_record_argument_2: - mov qword ptr [rdi],rax - add rdi,8 - - pop rbx - sub rbx,1 - jc no_pointers_in_record - -copy_record_pointers: - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jb copy_record_pointers_2 - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jae copy_record_pointers_2 - - mov rax,qword ptr [rdx] - inc rdi - mov qword ptr [rdx],rdi - dec rdi - mov rdx,rax -copy_record_pointers_2: - mov qword ptr [rdi],rdx - add rdi,8 - sub rbx,1 - jnc copy_record_pointers - -no_pointers_in_record: - pop rbx - - sub rbx,1 - jc no_non_pointers_in_record - -copy_non_pointers_in_record: - mov rax,qword ptr [rcx] - add rcx,8 - mov qword ptr [rdi],rax - add rdi,8 - sub rbx,1 - jnc copy_non_pointers_in_record - -no_non_pointers_in_record: - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -no_record_arguments: - sub rbx,3 -update_up_list_2: - mov rdx,rax - mov rax,qword ptr [rax] - inc rax - mov qword ptr [rdx],rdi - test al,3 - jne copy_argument_part_2 - - sub rax,4 - jmp update_up_list_2 - -copy_argument_part_2: - dec rax - cmp rax,rcx - jc copy_arguments_1 - - if THREAD - cmp rax,qword ptr end_heap_p3_offset[r9] - else - cmp rax,qword ptr end_heap_p3 - endif - jnc copy_arguments_1 - - mov rdx,rax - mov rax,qword ptr [rax] - inc rdi - mov qword ptr [rdx],rdi - dec rdi -copy_arguments_1: - mov qword ptr [rdi],rax - add rdi,8 - -copy_argument_part_arguments: - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jc copy_arguments_2 - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jnc copy_arguments_2 - - mov rax,qword ptr [rdx] - inc rdi - mov qword ptr [rdx],rdi - dec rdi - mov rdx,rax -copy_arguments_2: - mov qword ptr [rdi],rdx - add rdi,8 - sub rbx,1 - jnc copy_argument_part_arguments - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -update_list_2_: - dec rax - mov qword ptr [rdx],rdi -begin_update_list_2: - mov rdx,rax - mov rax,qword ptr [rax] -update_list__2: - test rax,1 - jz end_update_list_2 - test rax,2 - jz update_list_2_ - lea rdx,(-3)[rax] - mov rax,qword ptr (-3)[rax] - jmp update_list__2 - -end_update_list_2: - mov qword ptr [rdx],rdi - - mov qword ptr [rdi],rax - add rdi,8 - - test al,2 - je move_lazy_node - - movzx rbx,word ptr (-2)[rax] - test rbx,rbx - je move_hnf_0 - - cmp rbx,256 - jae move_record - - sub rbx,2 - jc move_hnf_1 - je move_hnf_2 - -move_hnf_3: - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jc move_hnf_3_1 - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jnc move_hnf_3_1 - - lea rax,1[rdi] - mov rbx,qword ptr [rdx] - mov qword ptr [rdx],rax - mov rdx,rbx -move_hnf_3_1: - mov qword ptr [rdi],rdx - - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jc move_hnf_3_2 - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jnc move_hnf_3_2 - - lea rax,(8+2+1)[rdi] - mov rbx,qword ptr [rdx] - mov qword ptr [rdx],rax - mov rdx,rbx -move_hnf_3_2: - mov qword ptr 8[rdi],rdx - add rdi,16 - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_hnf_2: - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jc move_hnf_2_1 - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jnc move_hnf_2_1 - - lea rax,1[rdi] - mov rbx,qword ptr [rdx] - mov qword ptr [rdx],rax - mov rdx,rbx -move_hnf_2_1: - mov qword ptr [rdi],rdx - - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jc move_hnf_2_2 - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jnc move_hnf_2_2 - - lea rax,(8+1)[rdi] - mov rbx ,qword ptr [rdx] - mov qword ptr [rdx],rax - mov rdx,rbx -move_hnf_2_2: - mov qword ptr 8[rdi],rdx - add rdi,16 - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_hnf_1: - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jc move_hnf_1_ - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jnc move_hnf_1_ - - lea rax,1[rdi] - mov rbx,qword ptr [rdx] - mov qword ptr [rdx],rax - mov rdx,rbx -move_hnf_1_: - mov qword ptr [rdi],rdx - add rdi,8 - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_record: - sub rbx,258 - jb move_record_1 - je move_record_2 - -move_record_3: - movzx rbx,word ptr (-2+2)[rax] - sub rbx,1 - ja move_hnf_3 - - mov rdx,qword ptr [rcx] - lea rcx,8[rcx] - jb move_record_3_1b - -move_record_3_1a: - cmp rdx,rcx - jb move_record_3_1b - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jae move_record_3_1b - - lea rax,1[rdi] - mov rbx,qword ptr [rdx] - mov qword ptr [rdx],rax - mov rdx,rbx -move_record_3_1b: - mov qword ptr [rdi],rdx - add rdi,8 - - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jb move_record_3_2 - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jae move_record_3_2 - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - - push rbp - - add rax,rdx - - if THREAD - mov rbx,qword ptr heap_vector_offset[r9] - else - mov rbx,qword ptr heap_vector - endif - add rax,8 - mov rbp,rax - and rbp,31*8 - shr rax,8 - mov ebp,dword ptr bit_set_table2[rbp] - test ebp,dword ptr [rbx+rax*4] - je not_linked_record_argument_part_3_b - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdi - - mov rbp,rax - and rbp,31*8 - shr rax,8 - mov ebp,dword ptr bit_set_table2[rbp] - or dword ptr [rbx+rax*4],ebp - pop rbp - - jmp linked_record_argument_part_3_b - -not_linked_record_argument_part_3_b: - or dword ptr [rbx+rax*4],ebp - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdi - - mov rbp,rax - and rbp,31*8 - shr rax,8 - mov ebp,dword ptr bit_clear_table2[rbp] - and dword ptr [rbx+rax*4],ebp - pop rbp - -linked_record_argument_part_3_b: - mov rbx,qword ptr [rdx] - lea rax,(2+1)[rdi] - mov qword ptr [rdx],rax - mov rdx,rbx -move_record_3_2: - mov qword ptr [rdi],rdx - add rdi,8 - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,rcx - shr rbx,3 - dec rbx - and rbx,31 - cmp rbx,2 - jb bit_in_next_word - - shr esi,2 - add rbp,16 - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -bit_in_next_word: - dec r12 - mov esi,dword ptr [r8] - add r8,4 - - and esi,dword ptr bit_clear_table[rbx*4] - - test rsi,rsi - je skip_zeros - jmp end_skip_zeros - -move_record_2: - cmp word ptr (-2+2)[rax],1 - ja move_hnf_2 - jb move_record_2bb - -move_record_2_ab: - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jb move_record_2_1 - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jae move_record_2_1 - - lea rax,1[rdi] - mov rbx ,qword ptr [rdx] - mov qword ptr [rdx],rax - mov rdx,rbx -move_record_2_1: - mov qword ptr [rdi],rdx - mov rbx,qword ptr [rcx] - add rcx,8 - mov qword ptr 8[rdi],rbx - add rdi,16 - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_record_1: - movzx rbx,word ptr (-2+2)[rax] - test rbx,rbx - jne move_hnf_1 - jmp move_real_int_bool_or_char - -move_record_2bb: - mov rax,qword ptr [rcx] - add rcx,8 - mov qword ptr [rdi],rax - add rdi,8 -move_real_int_bool_or_char: - mov rax,qword ptr [rcx] - add rcx,8 - mov qword ptr [rdi],rax - add rdi,8 -copy_normal_hnf_0: - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_hnf_0: - if THREAD - lea rbx,__STRING__+2 - cmp rax,rbx - else - lea r9,__STRING__+2 - cmp rax,r9 - endif - jbe move_string_or_array - cmp rax,offset CHAR+2 - jbe move_real_int_bool_or_char - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_string_or_array: - jne move_array - - mov rax,qword ptr [rcx] - add rax,7 - shr rax,3 - -cp_s_arg_lp3: - mov rbx,qword ptr [rcx] - add rcx,8 - mov qword ptr [rdi],rbx - add rdi,8 - sub rax,1 - jnc cp_s_arg_lp3 - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_array: - test rsi,rsi - push rcx - jne bsf_and_end_array_bit - -skip_zeros_a: - sub r12,1 - mov esi,dword ptr [r8] - add r8,4 - test rsi,rsi - je skip_zeros_a - - if THREAD - mov rbp,qword ptr neg_heap_vector_plus_4_offset[r9] - else - mov rbp,qword ptr neg_heap_vector_plus_4 - endif - add rbp,r8 - - shl rbp,6 - - if THREAD - add rbp,qword ptr heap_p3_offset[r9] - else - add rbp,qword ptr heap_p3 - endif - -bsf_and_end_array_bit: - mov rax,rsi - mov rdx,rsi - and rax,0ffh - jne a_found_bit1 - and rdx,0ff00h - jne a_found_bit2 - mov rax,rsi - mov rdx,rsi - and rax,0ff0000h - jne a_found_bit3 - shr rdx,24 - movzx rcx,byte ptr first_one_bit_table[rdx*1] - add rcx,24 - jmp end_array_bit -a_found_bit3: - shr rax,16 - movzx rcx,byte ptr first_one_bit_table[rax*1] - add rcx,16 - jmp end_array_bit -a_found_bit2: - shr rdx,8 - movzx rcx,byte ptr first_one_bit_table[rdx*1] - add rcx,8 - jmp end_array_bit -a_found_bit1: - movzx rcx,byte ptr first_one_bit_table[rax*1] - -end_array_bit: - lea rbx,[rbp+rcx*8] - shr esi,1 - lea rbp,8[rbp+rcx*8] - shr esi,cl - pop rcx - - cmp rcx,rbx - jne move_a_array - -move_b_array: - mov rdx,qword ptr [rcx] - mov qword ptr [rdi],rdx - mov rbx,qword ptr 8[rcx] - add rcx,8 - - movzx rax,word ptr (-2)[rbx] - add rdi,8 - test rax,rax - je move_strict_basic_array - - sub rax,256 - imul rdx,rax - mov rax,rdx - jmp cp_s_arg_lp3 - -move_strict_basic_array: - mov rax,rdx - cmp rbx,offset dINT+2 - jle cp_s_arg_lp3 - cmp rbx,offset BOOL+2 - je move_bool_array - -move_int32_or_real32_array: - add rax,1 - shr rax,1 - jmp cp_s_arg_lp3 - -move_bool_array: - add rax,7 - shr rax,3 - jmp cp_s_arg_lp3 - -move_a_array: - mov rdx,rbx - sub rbx,rcx - shr rbx,3 - - push rsi - sub rbx,1 - jb end_array - mov rsi,qword ptr [rcx] - - mov rax,qword ptr (-8)[rdx] - mov qword ptr (-8)[rdx],rsi - - mov qword ptr [rdi],rax - - mov rax,qword ptr [rdx] - - mov rsi,qword ptr 8[rcx] - add rcx,16 - - mov qword ptr [rdx],rsi - - mov qword ptr 8[rdi],rax - add rdi,16 - - test rax,rax - je st_move_array_lp - - movzx rsi,word ptr (-2+2)[rax] - movzx rax,word ptr (-2)[rax] - sub rax,256 - cmp rax,rsi - je st_move_array_lp - -move_array_ab: - push rcx - - mov rdx,qword ptr (-16)[rdi] - mov rbx,rsi - imul rdx,rax - shl rdx,3 - - sub rax,rbx - add rdx,rcx - call reorder - - pop rcx - sub rbx,1 - sub rax,1 - - push rbx - push rax - push (-16)[rdi] - jmp st_move_array_lp_ab - -move_array_ab_lp1: - mov rax,qword ptr 16[rsp] -move_array_ab_a_elements: - mov rbx,qword ptr [rcx] - add rcx,8 - cmp rbx,rcx - jb move_array_element_ab - - if THREAD - cmp rbx,qword ptr end_heap_p3_offset[r9] - else - cmp rbx,qword ptr end_heap_p3 - endif - jnc move_array_element_ab - - mov rdx,rbx - mov rbx,qword ptr [rdx] - inc rdi - mov qword ptr [rdx],rdi - dec rdi -move_array_element_ab: - mov qword ptr [rdi],rbx - add rdi,8 - sub rax,1 - jnc move_array_ab_a_elements - - mov rax,qword ptr 8[rsp] -move_array_ab_b_elements: - mov rbx,qword ptr [rcx] - add rcx,8 - mov qword ptr [rdi],rbx - add rdi,8 - sub rax,1 - jnc move_array_ab_b_elements - -st_move_array_lp_ab: - sub qword ptr [rsp],1 - jnc move_array_ab_lp1 - - add rsp,24 - jmp end_array - -move_array_lp1: - mov rax,qword ptr [rcx] - add rcx,8 - add rdi,8 - cmp rax,rcx - jb move_array_element - - if THREAD - cmp rax,qword ptr end_heap_p3_offset[r9] - else - cmp rax,qword ptr end_heap_p3 - endif - jnc move_array_element - - mov rsi,qword ptr [rax] - mov rdx,rax - mov qword ptr (-8)[rdi],rsi - lea rax,(-8+1)[rdi] - mov qword ptr [rdx],rax - - sub rbx,1 - jnc move_array_lp1 - - jmp end_array - -move_array_element: - mov qword ptr (-8)[rdi],rax -st_move_array_lp: - sub rbx,1 - jnc move_array_lp1 - -end_array: - pop rsi - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_lazy_node: - mov rdx,rax - movsxd rbx,dword ptr (-4)[rdx] - test rbx,rbx - je move_lazy_node_0 - - sub rbx,1 - jle move_lazy_node_1 - - cmp rbx,256 - jge move_closure_with_unboxed_arguments - -move_lazy_node_arguments: - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jc move_lazy_node_arguments_ - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jnc move_lazy_node_arguments_ - - mov rax,qword ptr [rdx] - mov qword ptr [rdi],rax - lea rax,1[rdi] - add rdi,8 - mov qword ptr [rdx],rax - sub rbx,1 - jnc move_lazy_node_arguments - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_lazy_node_arguments_: - mov qword ptr [rdi],rdx - add rdi,8 - sub rbx,1 - jnc move_lazy_node_arguments - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_lazy_node_1: - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jc move_lazy_node_1_ - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jnc move_lazy_node_1_ - - lea rax,1[rdi] - mov rbx,qword ptr [rdx] - mov qword ptr [rdx],rax - mov rdx,rbx -move_lazy_node_1_: - mov qword ptr [rdi],rdx - add rdi,16 - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_lazy_node_0: - add rdi,16 - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_closure_with_unboxed_arguments: - je move_closure_with_unboxed_arguments_1 - add rbx,1 - mov rax,rbx - and rbx,255 - shr rax,8 - sub rbx,rax - je move_non_pointers_of_closure - - push rax - -move_closure_with_unboxed_arguments_lp: - mov rdx,qword ptr [rcx] - add rcx,8 - cmp rdx,rcx - jc move_closure_with_unboxed_arguments_ - - if THREAD - cmp rdx,qword ptr end_heap_p3_offset[r9] - else - cmp rdx,qword ptr end_heap_p3 - endif - jnc move_closure_with_unboxed_arguments_ - - mov rax,qword ptr [rdx] - mov qword ptr [rdi],rax - lea rax,1[rdi] - add rdi,8 - mov qword ptr [rdx],rax - sub rbx,1 - jne move_closure_with_unboxed_arguments_lp - - pop rax - jmp move_non_pointers_of_closure - -move_closure_with_unboxed_arguments_: - mov qword ptr [rdi],rdx - add rdi,8 - sub rbx,1 - jne move_closure_with_unboxed_arguments_lp - - pop rax - -move_non_pointers_of_closure: - mov rbx,qword ptr [rcx] - add rcx,8 - mov qword ptr [rdi],rbx - add rdi,8 - sub rax,1 - jne move_non_pointers_of_closure - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -move_closure_with_unboxed_arguments_1: - mov rax,qword ptr [rcx] - mov qword ptr [rdi],rax - add rdi,16 - - test rsi,rsi - jne bsf_and_copy_nodes - jmp find_non_zero_long - -end_move: - - mov rcx,qword ptr finalizer_list - -restore_finalizer_descriptors: - if THREAD - lea rbx,__Nil-8 - cmp rcx,rbx - else - lea r9,__Nil-8 - cmp rcx,r9 - endif - je end_restore_finalizer_descriptors - - mov qword ptr [rcx],offset e____system__kFinalizer+2 - mov rcx,qword ptr 8[rcx] - jmp restore_finalizer_descriptors - -end_restore_finalizer_descriptors: - + +; mark used nodes and pointers in argument parts and link backward pointers + + if THREAD + mov rax,qword ptr heap_size_65_offset[r9] + else + mov rax,qword ptr heap_size_65 + endif + shl rax,6 + if THREAD + mov qword ptr heap_size_64_65_offset[r9],rax + else + mov qword ptr heap_size_64_65,rax + endif + + lea rax,(-16000)[rsp] + if THREAD + mov qword ptr end_stack_offset[r9],rax + else + mov qword ptr end_stack,rax + endif + + mov rax,qword ptr caf_list + + test qword ptr flags,4096 + jne pmarkr + + test rax,rax + je end_mark_cafs + +mark_cafs_lp: + push (-8)[rax] + + lea rsi,8[rax] + mov rax,qword ptr [rax] + lea rcx,[rsi+rax*8] + + if THREAD + mov qword ptr end_vector_offset[r9],rcx + else + mov qword ptr end_vector,rcx + endif + + call rmark_stack_nodes + + pop rax + test rax,rax + jne mark_cafs_lp + +end_mark_cafs: + if THREAD + mov rsi,qword ptr stack_p_offset[r9] + + mov rcx,qword ptr stack_top_offset[r9] + mov qword ptr end_vector_offset[r9],rcx + else + mov rsi,qword ptr stack_p + + mov rcx,qword ptr stack_top + mov qword ptr end_vector,rcx + endif + + call rmark_stack_nodes + + call add_mark_compact_garbage_collect_time + + jmp compact_heap + +pmarkr: + test rax,rax + je end_rmarkp_cafs + +rmarkp_cafs_lp: + push (-8)[rax] + + lea rsi,8[rax] + mov rax,qword ptr [rax] + lea rcx,[rsi+rax*8] + + if THREAD + mov qword ptr end_vector_offset[r9],rcx + else + mov qword ptr end_vector,rcx + endif + + call rmarkp_stack_nodes + + pop rax + test rax,rax + jne rmarkp_cafs_lp + +end_rmarkp_cafs: + if THREAD + mov rsi,qword ptr stack_p_offset[r9] + + mov rcx,qword ptr stack_top_offset[r9] + mov qword ptr end_vector_offset[r9],rcx + else + mov rsi,qword ptr stack_p + + mov rcx,qword ptr stack_top + mov qword ptr end_vector,rcx + endif + + call rmarkp_stack_nodes + + call add_mark_compact_garbage_collect_time + + jmp compact_heap + + include acompact_rmark.asm + + include acompact_rmark_prefetch.asm + + include acompact_rmarkr.asm + +; compact the heap + +compact_heap: + + mov rcx,offset finalizer_list + mov rdx,offset free_finalizer_list + + mov rbp,qword ptr [rcx] +determine_free_finalizers_after_compact1: + if THREAD + lea rax,__Nil-8 + cmp rbp,rax + else + lea r9,__Nil-8 + cmp rbp,r9 + endif + je end_finalizers_after_compact1 + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rbp + mov rbx,rax + and rax,31*9 + shr rbx,8 + mov esi,dword ptr (bit_set_table2)[rax] + test esi,dword ptr [rdi+rbx*4] + je finalizer_not_used_after_compact1 + + mov rax,qword ptr [rbp] + mov rsi,rbp + jmp finalizer_find_descriptor + +finalizer_find_descriptor_lp: + and rax,-4 + mov rsi,rax + mov rax,qword ptr [rax] +finalizer_find_descriptor: + test rax,1 + jne finalizer_find_descriptor_lp + + mov qword ptr [rsi],offset e____system__kFinalizerGCTemp+2 + + cmp rbp,rcx + ja finalizer_no_reverse + + mov rax,qword ptr [rbp] + lea rsi,1[rcx] + mov qword ptr [rbp],rsi + mov qword ptr [rcx],rax + +finalizer_no_reverse: + lea rcx,8[rbp] + mov rbp,qword ptr 8[rbp] + jmp determine_free_finalizers_after_compact1 + +finalizer_not_used_after_compact1: + mov qword ptr [rbp],offset e____system__kFinalizerGCTemp+2 + + 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_compact1 + +end_finalizers_after_compact1: + mov qword ptr [rdx],rbp + + mov rcx,qword ptr finalizer_list + if THREAD + lea rax,__Nil-8 + cmp rcx,rax + else + lea r9,__Nil-8 + cmp rcx,r9 +endif + je finalizer_list_empty + test rcx,3 + jne finalizer_list_already_reversed + mov rax,qword ptr [rcx] + mov qword ptr [rcx],offset finalizer_list+1 + mov qword ptr finalizer_list,rax +finalizer_list_already_reversed: +finalizer_list_empty: + + mov rbp ,offset free_finalizer_list + if THREAD + lea rax,__Nil-8 + cmp qword ptr [rbp],rax + else + lea r9,__Nil-8 + cmp qword ptr [rbp],r9 + endif + je free_finalizer_list_empty + + if THREAD + mov qword ptr end_vector_offset[r9],offset free_finalizer_list+8 + else + mov qword ptr end_vector,offset free_finalizer_list+8 + endif + + test qword ptr flags,4096 + je no_pmarkr + call rmarkp_stack_nodes + jmp free_finalizer_list_empty +no_pmarkr: + call rmark_stack_nodes + +free_finalizer_list_empty: + + if THREAD + mov rax,qword ptr heap_size_65_offset[r9] + else + mov rax,qword ptr heap_size_65 + endif + mov rbx,rax + shl rbx,6 + + if THREAD + add rbx,qword ptr heap_p3_offset[r9] + mov qword ptr end_heap_p3_offset[r9],rbx + else + add rbx,qword ptr heap_p3 + mov qword ptr end_heap_p3,rbx + endif + + add rax,3 + shr rax,2 + mov r12,rax + + if THREAD + mov r8,qword ptr heap_vector_offset[r9] + else + mov r8,qword ptr heap_vector + endif + + lea rbx,4[r8] + neg rbx + if THREAD + mov qword ptr neg_heap_vector_plus_4_offset[r9],rbx + + mov rdi,qword ptr heap_p3_offset[r9] + else + mov qword ptr neg_heap_vector_plus_4,rbx + + mov rdi,qword ptr heap_p3 + endif + xor rsi,rsi + jmp skip_zeros + +; %rax ,%rcx ,%rbp : free +find_non_zero_long: +skip_zeros: + sub r12,1 + jc end_move + mov esi,dword ptr [r8] + add r8,4 + test rsi,rsi + je skip_zeros +; %rbp : free +end_skip_zeros: + if THREAD + mov rbp,qword ptr neg_heap_vector_plus_4_offset[r9] + else + mov rbp,qword ptr neg_heap_vector_plus_4 + endif + + add rbp,r8 + + shl rbp,6 + if THREAD + add rbp,qword ptr heap_p3_offset[r9] + else + add rbp,qword ptr heap_p3 + endif + +bsf_and_copy_nodes: + movzx rax,sil + test rax,rax + jne found_bit1 + movzx rcx,si + shr rcx,8 + jne found_bit2 + mov rax,rsi + and rax,0ff0000h + jne found_bit3 + mov rcx,rsi + shr rcx,24 + movzx rcx,byte ptr first_one_bit_table[rcx*1] + add rcx,24 + jmp copy_nodes + +found_bit3: + shr rax,16 + movzx rcx,byte ptr first_one_bit_table[rax*1] + add rcx,16 + jmp copy_nodes + +found_bit2: + movzx rcx,byte ptr first_one_bit_table[rcx*1] + add rcx,8 + jmp copy_nodes + +found_bit1: + movzx rcx,byte ptr first_one_bit_table[rax*1] + +copy_nodes: + mov rax,qword ptr [rbp+rcx*8] + shr esi,1 + lea rbp,8[rbp+rcx*8] + shr esi,cl + mov rcx,rbp + + dec rax + + test rax,2 + je begin_update_list_2 + +move_argument_part: + mov rbx,qword ptr (-18)[rax] + sub rax,2 + + test rbx,1 + je end_list_2 +find_descriptor_2: + and rbx,-4 + mov rbx,qword ptr [rbx] + test rbx,1 + jne find_descriptor_2 + +end_list_2: + mov rdx,rbx + movzx rbx,word ptr (-2)[rbx] + cmp rbx,256 + jb no_record_arguments + + movzx rdx,word ptr (-2+2)[rdx] + sub rdx,2 + jae copy_record_arguments_aa + + sub rbx,256+3 + +copy_record_arguments_all_b: + push rbx + if THREAD + mov rbx,qword ptr heap_vector_offset[r9] + else + mov rbx,qword ptr heap_vector + endif + +update_up_list_1r: + mov rdx,rax + if THREAD + add rax,qword ptr neg_heap_p3_offset[r9] + else + add rax,qword ptr neg_heap_p3 + endif + + push rcx + + mov rcx,rax + + shr rax,8 + and rcx,31*8 + + mov ecx,dword ptr bit_set_table2[rcx*1] + mov eax,dword ptr [rbx+rax*4] + + and rax,rcx + + pop rcx + je copy_argument_part_1r + + mov rax,qword ptr [rdx] + mov qword ptr [rdx],rdi + sub rax,3 + jmp update_up_list_1r + +copy_argument_part_1r: + mov rax,qword ptr [rdx] + mov qword ptr [rdx],rdi + mov qword ptr [rdi],rax + add rdi,8 + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + shr rax,3 + + mov rbx,rax + and rbx,31 + cmp rbx,1 + jae bit_in_this_word + + dec r12 + mov esi,dword ptr [r8] + add r8,4 + + if THREAD + mov rbp,qword ptr neg_heap_vector_plus_4_offset[r9] + else + mov rbp,qword ptr neg_heap_vector_plus_4 + endif + add rbp,r8 + shl rbp,6 + if THREAD + add rbp,qword ptr heap_p3_offset[r9] + else + add rbp,qword ptr heap_p3 + endif + +bit_in_this_word: + shr esi,1 + add rbp,8 + + pop rbx + +copy_b_record_argument_part_arguments: + mov rax,qword ptr [rcx] + add rcx,8 + mov qword ptr [rdi],rax + add rdi,8 + sub rbx,1 + jnc copy_b_record_argument_part_arguments + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +copy_record_arguments_aa: + sub rbx,256+2 + sub rbx,rdx + + push rbx + push rdx + +update_up_list_2r: + mov rdx,rax + mov rax,qword ptr [rdx] + mov rbx,3 + and rbx,rax + sub rbx,3 + jne copy_argument_part_2r + + mov qword ptr [rdx],rdi + sub rax,3 + jmp update_up_list_2r + +copy_argument_part_2r: + mov qword ptr [rdx],rdi + cmp rax,rcx + jb copy_record_argument_2 + + if THREAD + cmp rax,qword ptr end_heap_p3_offset[r9] + else + cmp rax,qword ptr end_heap_p3 + endif + jae copy_record_argument_2 + + mov rdx,rax + mov rax,qword ptr [rdx] + lea rbx,1[rdi] + mov qword ptr [rdx],rbx +copy_record_argument_2: + mov qword ptr [rdi],rax + add rdi,8 + + pop rbx + sub rbx,1 + jc no_pointers_in_record + +copy_record_pointers: + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jb copy_record_pointers_2 + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jae copy_record_pointers_2 + + mov rax,qword ptr [rdx] + inc rdi + mov qword ptr [rdx],rdi + dec rdi + mov rdx,rax +copy_record_pointers_2: + mov qword ptr [rdi],rdx + add rdi,8 + sub rbx,1 + jnc copy_record_pointers + +no_pointers_in_record: + pop rbx + + sub rbx,1 + jc no_non_pointers_in_record + +copy_non_pointers_in_record: + mov rax,qword ptr [rcx] + add rcx,8 + mov qword ptr [rdi],rax + add rdi,8 + sub rbx,1 + jnc copy_non_pointers_in_record + +no_non_pointers_in_record: + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +no_record_arguments: + sub rbx,3 +update_up_list_2: + mov rdx,rax + mov rax,qword ptr [rax] + inc rax + mov qword ptr [rdx],rdi + test al,3 + jne copy_argument_part_2 + + sub rax,4 + jmp update_up_list_2 + +copy_argument_part_2: + dec rax + cmp rax,rcx + jc copy_arguments_1 + + if THREAD + cmp rax,qword ptr end_heap_p3_offset[r9] + else + cmp rax,qword ptr end_heap_p3 + endif + jnc copy_arguments_1 + + mov rdx,rax + mov rax,qword ptr [rax] + inc rdi + mov qword ptr [rdx],rdi + dec rdi +copy_arguments_1: + mov qword ptr [rdi],rax + add rdi,8 + +copy_argument_part_arguments: + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jc copy_arguments_2 + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jnc copy_arguments_2 + + mov rax,qword ptr [rdx] + inc rdi + mov qword ptr [rdx],rdi + dec rdi + mov rdx,rax +copy_arguments_2: + mov qword ptr [rdi],rdx + add rdi,8 + sub rbx,1 + jnc copy_argument_part_arguments + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +update_list_2_: + dec rax + mov qword ptr [rdx],rdi +begin_update_list_2: + mov rdx,rax + mov rax,qword ptr [rax] +update_list__2: + test rax,1 + jz end_update_list_2 + test rax,2 + jz update_list_2_ + lea rdx,(-3)[rax] + mov rax,qword ptr (-3)[rax] + jmp update_list__2 + +end_update_list_2: + mov qword ptr [rdx],rdi + + mov qword ptr [rdi],rax + add rdi,8 + + test al,2 + je move_lazy_node + + movzx rbx,word ptr (-2)[rax] + test rbx,rbx + je move_hnf_0 + + cmp rbx,256 + jae move_record + + sub rbx,2 + jc move_hnf_1 + je move_hnf_2 + +move_hnf_3: + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jc move_hnf_3_1 + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jnc move_hnf_3_1 + + lea rax,1[rdi] + mov rbx,qword ptr [rdx] + mov qword ptr [rdx],rax + mov rdx,rbx +move_hnf_3_1: + mov qword ptr [rdi],rdx + + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jc move_hnf_3_2 + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jnc move_hnf_3_2 + + lea rax,(8+2+1)[rdi] + mov rbx,qword ptr [rdx] + mov qword ptr [rdx],rax + mov rdx,rbx +move_hnf_3_2: + mov qword ptr 8[rdi],rdx + add rdi,16 + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_hnf_2: + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jc move_hnf_2_1 + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jnc move_hnf_2_1 + + lea rax,1[rdi] + mov rbx,qword ptr [rdx] + mov qword ptr [rdx],rax + mov rdx,rbx +move_hnf_2_1: + mov qword ptr [rdi],rdx + + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jc move_hnf_2_2 + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jnc move_hnf_2_2 + + lea rax,(8+1)[rdi] + mov rbx ,qword ptr [rdx] + mov qword ptr [rdx],rax + mov rdx,rbx +move_hnf_2_2: + mov qword ptr 8[rdi],rdx + add rdi,16 + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_hnf_1: + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jc move_hnf_1_ + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jnc move_hnf_1_ + + lea rax,1[rdi] + mov rbx,qword ptr [rdx] + mov qword ptr [rdx],rax + mov rdx,rbx +move_hnf_1_: + mov qword ptr [rdi],rdx + add rdi,8 + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_record: + sub rbx,258 + jb move_record_1 + je move_record_2 + +move_record_3: + movzx rbx,word ptr (-2+2)[rax] + sub rbx,1 + ja move_hnf_3 + + mov rdx,qword ptr [rcx] + lea rcx,8[rcx] + jb move_record_3_1b + +move_record_3_1a: + cmp rdx,rcx + jb move_record_3_1b + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jae move_record_3_1b + + lea rax,1[rdi] + mov rbx,qword ptr [rdx] + mov qword ptr [rdx],rax + mov rdx,rbx +move_record_3_1b: + mov qword ptr [rdi],rdx + add rdi,8 + + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jb move_record_3_2 + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jae move_record_3_2 + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + + push rbp + + add rax,rdx + + if THREAD + mov rbx,qword ptr heap_vector_offset[r9] + else + mov rbx,qword ptr heap_vector + endif + add rax,8 + mov rbp,rax + and rbp,31*8 + shr rax,8 + mov ebp,dword ptr bit_set_table2[rbp] + test ebp,dword ptr [rbx+rax*4] + je not_linked_record_argument_part_3_b + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdi + + mov rbp,rax + and rbp,31*8 + shr rax,8 + mov ebp,dword ptr bit_set_table2[rbp] + or dword ptr [rbx+rax*4],ebp + pop rbp + + jmp linked_record_argument_part_3_b + +not_linked_record_argument_part_3_b: + or dword ptr [rbx+rax*4],ebp + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdi + + mov rbp,rax + and rbp,31*8 + shr rax,8 + mov ebp,dword ptr bit_clear_table2[rbp] + and dword ptr [rbx+rax*4],ebp + pop rbp + +linked_record_argument_part_3_b: + mov rbx,qword ptr [rdx] + lea rax,(2+1)[rdi] + mov qword ptr [rdx],rax + mov rdx,rbx +move_record_3_2: + mov qword ptr [rdi],rdx + add rdi,8 + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,rcx + shr rbx,3 + dec rbx + and rbx,31 + cmp rbx,2 + jb bit_in_next_word + + shr esi,2 + add rbp,16 + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +bit_in_next_word: + dec r12 + mov esi,dword ptr [r8] + add r8,4 + + and esi,dword ptr bit_clear_table[rbx*4] + + test rsi,rsi + je skip_zeros + jmp end_skip_zeros + +move_record_2: + cmp word ptr (-2+2)[rax],1 + ja move_hnf_2 + jb move_record_2bb + +move_record_2_ab: + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jb move_record_2_1 + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jae move_record_2_1 + + lea rax,1[rdi] + mov rbx ,qword ptr [rdx] + mov qword ptr [rdx],rax + mov rdx,rbx +move_record_2_1: + mov qword ptr [rdi],rdx + mov rbx,qword ptr [rcx] + add rcx,8 + mov qword ptr 8[rdi],rbx + add rdi,16 + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_record_1: + movzx rbx,word ptr (-2+2)[rax] + test rbx,rbx + jne move_hnf_1 + jmp move_real_int_bool_or_char + +move_record_2bb: + mov rax,qword ptr [rcx] + add rcx,8 + mov qword ptr [rdi],rax + add rdi,8 +move_real_int_bool_or_char: + mov rax,qword ptr [rcx] + add rcx,8 + mov qword ptr [rdi],rax + add rdi,8 +copy_normal_hnf_0: + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_hnf_0: + if THREAD + lea rbx,__STRING__+2 + cmp rax,rbx + else + lea r9,__STRING__+2 + cmp rax,r9 + endif + jbe move_string_or_array + cmp rax,offset CHAR+2 + jbe move_real_int_bool_or_char + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_string_or_array: + jne move_array + + mov rax,qword ptr [rcx] + add rax,7 + shr rax,3 + +cp_s_arg_lp3: + mov rbx,qword ptr [rcx] + add rcx,8 + mov qword ptr [rdi],rbx + add rdi,8 + sub rax,1 + jnc cp_s_arg_lp3 + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_array: + test rsi,rsi + push rcx + jne bsf_and_end_array_bit + +skip_zeros_a: + sub r12,1 + mov esi,dword ptr [r8] + add r8,4 + test rsi,rsi + je skip_zeros_a + + if THREAD + mov rbp,qword ptr neg_heap_vector_plus_4_offset[r9] + else + mov rbp,qword ptr neg_heap_vector_plus_4 + endif + add rbp,r8 + + shl rbp,6 + + if THREAD + add rbp,qword ptr heap_p3_offset[r9] + else + add rbp,qword ptr heap_p3 + endif + +bsf_and_end_array_bit: + mov rax,rsi + mov rdx,rsi + and rax,0ffh + jne a_found_bit1 + and rdx,0ff00h + jne a_found_bit2 + mov rax,rsi + mov rdx,rsi + and rax,0ff0000h + jne a_found_bit3 + shr rdx,24 + movzx rcx,byte ptr first_one_bit_table[rdx*1] + add rcx,24 + jmp end_array_bit +a_found_bit3: + shr rax,16 + movzx rcx,byte ptr first_one_bit_table[rax*1] + add rcx,16 + jmp end_array_bit +a_found_bit2: + shr rdx,8 + movzx rcx,byte ptr first_one_bit_table[rdx*1] + add rcx,8 + jmp end_array_bit +a_found_bit1: + movzx rcx,byte ptr first_one_bit_table[rax*1] + +end_array_bit: + lea rbx,[rbp+rcx*8] + shr esi,1 + lea rbp,8[rbp+rcx*8] + shr esi,cl + pop rcx + + cmp rcx,rbx + jne move_a_array + +move_b_array: + mov rdx,qword ptr [rcx] + mov qword ptr [rdi],rdx + mov rbx,qword ptr 8[rcx] + add rcx,8 + + movzx rax,word ptr (-2)[rbx] + add rdi,8 + test rax,rax + je move_strict_basic_array + + sub rax,256 + imul rdx,rax + mov rax,rdx + jmp cp_s_arg_lp3 + +move_strict_basic_array: + mov rax,rdx + cmp rbx,offset dINT+2 + jle cp_s_arg_lp3 + cmp rbx,offset BOOL+2 + je move_bool_array + +move_int32_or_real32_array: + add rax,1 + shr rax,1 + jmp cp_s_arg_lp3 + +move_bool_array: + add rax,7 + shr rax,3 + jmp cp_s_arg_lp3 + +move_a_array: + mov rdx,rbx + sub rbx,rcx + shr rbx,3 + + push rsi + sub rbx,1 + jb end_array + mov rsi,qword ptr [rcx] + + mov rax,qword ptr (-8)[rdx] + mov qword ptr (-8)[rdx],rsi + + mov qword ptr [rdi],rax + + mov rax,qword ptr [rdx] + + mov rsi,qword ptr 8[rcx] + add rcx,16 + + mov qword ptr [rdx],rsi + + mov qword ptr 8[rdi],rax + add rdi,16 + + test rax,rax + je st_move_array_lp + + movzx rsi,word ptr (-2+2)[rax] + movzx rax,word ptr (-2)[rax] + sub rax,256 + cmp rax,rsi + je st_move_array_lp + +move_array_ab: + push rcx + + mov rdx,qword ptr (-16)[rdi] + mov rbx,rsi + imul rdx,rax + shl rdx,3 + + sub rax,rbx + add rdx,rcx + call reorder + + pop rcx + sub rbx,1 + sub rax,1 + + push rbx + push rax + push (-16)[rdi] + jmp st_move_array_lp_ab + +move_array_ab_lp1: + mov rax,qword ptr 16[rsp] +move_array_ab_a_elements: + mov rbx,qword ptr [rcx] + add rcx,8 + cmp rbx,rcx + jb move_array_element_ab + + if THREAD + cmp rbx,qword ptr end_heap_p3_offset[r9] + else + cmp rbx,qword ptr end_heap_p3 + endif + jnc move_array_element_ab + + mov rdx,rbx + mov rbx,qword ptr [rdx] + inc rdi + mov qword ptr [rdx],rdi + dec rdi +move_array_element_ab: + mov qword ptr [rdi],rbx + add rdi,8 + sub rax,1 + jnc move_array_ab_a_elements + + mov rax,qword ptr 8[rsp] +move_array_ab_b_elements: + mov rbx,qword ptr [rcx] + add rcx,8 + mov qword ptr [rdi],rbx + add rdi,8 + sub rax,1 + jnc move_array_ab_b_elements + +st_move_array_lp_ab: + sub qword ptr [rsp],1 + jnc move_array_ab_lp1 + + add rsp,24 + jmp end_array + +move_array_lp1: + mov rax,qword ptr [rcx] + add rcx,8 + add rdi,8 + cmp rax,rcx + jb move_array_element + + if THREAD + cmp rax,qword ptr end_heap_p3_offset[r9] + else + cmp rax,qword ptr end_heap_p3 + endif + jnc move_array_element + + mov rsi,qword ptr [rax] + mov rdx,rax + mov qword ptr (-8)[rdi],rsi + lea rax,(-8+1)[rdi] + mov qword ptr [rdx],rax + + sub rbx,1 + jnc move_array_lp1 + + jmp end_array + +move_array_element: + mov qword ptr (-8)[rdi],rax +st_move_array_lp: + sub rbx,1 + jnc move_array_lp1 + +end_array: + pop rsi + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_lazy_node: + mov rdx,rax + movsxd rbx,dword ptr (-4)[rdx] + test rbx,rbx + je move_lazy_node_0 + + sub rbx,1 + jle move_lazy_node_1 + + cmp rbx,256 + jge move_closure_with_unboxed_arguments + +move_lazy_node_arguments: + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jc move_lazy_node_arguments_ + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jnc move_lazy_node_arguments_ + + mov rax,qword ptr [rdx] + mov qword ptr [rdi],rax + lea rax,1[rdi] + add rdi,8 + mov qword ptr [rdx],rax + sub rbx,1 + jnc move_lazy_node_arguments + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_lazy_node_arguments_: + mov qword ptr [rdi],rdx + add rdi,8 + sub rbx,1 + jnc move_lazy_node_arguments + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_lazy_node_1: + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jc move_lazy_node_1_ + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jnc move_lazy_node_1_ + + lea rax,1[rdi] + mov rbx,qword ptr [rdx] + mov qword ptr [rdx],rax + mov rdx,rbx +move_lazy_node_1_: + mov qword ptr [rdi],rdx + add rdi,16 + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_lazy_node_0: + add rdi,16 + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_closure_with_unboxed_arguments: + je move_closure_with_unboxed_arguments_1 + add rbx,1 + mov rax,rbx + and rbx,255 + shr rax,8 + sub rbx,rax + je move_non_pointers_of_closure + + push rax + +move_closure_with_unboxed_arguments_lp: + mov rdx,qword ptr [rcx] + add rcx,8 + cmp rdx,rcx + jc move_closure_with_unboxed_arguments_ + + if THREAD + cmp rdx,qword ptr end_heap_p3_offset[r9] + else + cmp rdx,qword ptr end_heap_p3 + endif + jnc move_closure_with_unboxed_arguments_ + + mov rax,qword ptr [rdx] + mov qword ptr [rdi],rax + lea rax,1[rdi] + add rdi,8 + mov qword ptr [rdx],rax + sub rbx,1 + jne move_closure_with_unboxed_arguments_lp + + pop rax + jmp move_non_pointers_of_closure + +move_closure_with_unboxed_arguments_: + mov qword ptr [rdi],rdx + add rdi,8 + sub rbx,1 + jne move_closure_with_unboxed_arguments_lp + + pop rax + +move_non_pointers_of_closure: + mov rbx,qword ptr [rcx] + add rcx,8 + mov qword ptr [rdi],rbx + add rdi,8 + sub rax,1 + jne move_non_pointers_of_closure + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +move_closure_with_unboxed_arguments_1: + mov rax,qword ptr [rcx] + mov qword ptr [rdi],rax + add rdi,16 + + test rsi,rsi + jne bsf_and_copy_nodes + jmp find_non_zero_long + +end_move: + + mov rcx,qword ptr finalizer_list + +restore_finalizer_descriptors: + if THREAD + lea rbx,__Nil-8 + cmp rcx,rbx + else + lea r9,__Nil-8 + cmp rcx,r9 + endif + je end_restore_finalizer_descriptors + + mov qword ptr [rcx],offset e____system__kFinalizer+2 + mov rcx,qword ptr 8[rcx] + jmp restore_finalizer_descriptors + +end_restore_finalizer_descriptors: + diff --git a/thread/acompact_rmark.asm b/thread/acompact_rmark.asm index 90469b8..0c21b24 100644 --- a/thread/acompact_rmark.asm +++ b/thread/acompact_rmark.asm @@ -1,1131 +1,1131 @@ - -rmark_stack_nodes1: - mov rbx,qword ptr [rcx] - lea rax,1[rsi] - mov qword ptr [rsi],rbx - mov qword ptr [rcx],rax - -rmark_next_stack_node: - add rsi,8 - -rmark_stack_nodes: - if THREAD - cmp rsi,qword ptr end_vector_offset[r9] - else - cmp rsi,qword ptr end_vector - endif - je end_rmark_nodes - -rmark_more_stack_nodes: - mov rcx,qword ptr [rsi] - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmark_next_stack_node - - mov rbx,rax - and rax,31*8 - shr rbx,8 - mov eax,dword ptr (bit_set_table2)[rax] - mov ebp,dword ptr [rdi+rbx*4] - test rbp,rax - jne rmark_stack_nodes1 - - or rbp,rax - mov dword ptr [rdi+rbx*4],ebp - - mov rax,qword ptr [rcx] - call rmark_stack_node - - add rsi,8 - if THREAD - cmp rsi,qword ptr end_vector_offset[r9] - else - cmp rsi,qword ptr end_vector - endif - jne rmark_more_stack_nodes - ret - -rmark_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 rmark_no_reverse - -rmark_node_d1: - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmark_next_node - - jmp rmark_node_ - -rmark_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 - - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jb rmark_using_reversal - -rmark_node: - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmark_next_node - - mov rbx,rsi - -rmark_node_: - mov rdx,rax - and rax,31*8 - shr rdx,8 - mov eax,dword ptr (bit_set_table2)[rax] - mov ebp,dword ptr [rdi+rdx*4] - test rbp,rax - jne rmark_reverse_and_mark_next_node - - or rbp,rax - mov dword ptr [rdi+rdx*4],ebp - - mov rax,qword ptr [rcx] -rmark_arguments: - cmp rcx,rbx - ja rmark_no_reverse - - lea rbp,1[rsi] - mov qword ptr [rsi],rax - mov qword ptr [rcx],rbp - -rmark_no_reverse: - test al,2 - je rmark_lazy_node - - movzx rbp,word ptr (-2)[rax] - test rbp,rbp - je rmark_hnf_0 - - add rcx,8 - - cmp rbp,256 - jae rmark_record - - sub rbp,2 - je rmark_hnf_2 - jc rmark_hnf_1 - -rmark_hnf_3: - mov rdx,qword ptr 8[rcx] -rmark_hnf_3_: - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jb rmark_using_reversal_ - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbx,rax - and rax,31*8 - shr rbx,8 - mov eax,dword ptr (bit_set_table2)[rax] - test eax,[rdi+rbx*4] - jne rmark_shared_argument_part - - or dword ptr [rdi+rbx*4],eax - -rmark_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 - -rmark_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 - jg rmark_push_hnf_args - - mov rcx,qword ptr [rdx] - - cmp rdx,rsi - ja rmark_no_reverse_argument_pointer - - lea rbp,3[rsi] - mov qword ptr [rsi],rcx - mov qword ptr [rdx],rbp - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmark_next_node - - mov rbx,rdx - jmp rmark_node_ - -rmark_no_reverse_argument_pointer: - mov rsi,rdx - jmp rmark_node - -rmark_shared_argument_part: - cmp rdx,rcx - ja rmark_hnf_1 - - mov rbx,qword ptr [rdx] - lea rax,(8+2+1)[rcx] - mov qword ptr [rdx],rax - mov qword ptr 8[rcx],rbx - jmp rmark_hnf_1 - -rmark_record: - sub rbp,258 - je rmark_record_2 - jb rmark_record_1 - -rmark_record_3: - movzx rbp,word ptr (-2+2)[rax] - mov rdx,qword ptr (16-8)[rcx] - sub rbp,1 - jb rmark_record_3_bb - je rmark_record_3_ab - sub rbp,1 - je rmark_record_3_aab - jmp rmark_hnf_3_ - -rmark_record_3_bb: - sub rcx,8 - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[rax] - or dword ptr [rdi+rbp*4],eax - - cmp rdx,rcx - ja rmark_next_node - - add eax,eax - jne rmark_bit_in_same_word1 - inc rbp - mov rax,1 -rmark_bit_in_same_word1: - test eax,dword ptr [rdi+rbp*4] - je rmark_not_yet_linked_bb - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - add rax,16 - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[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 - jmp rmark_next_node - -rmark_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 - jmp rmark_next_node - -rmark_record_3_ab: - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[rax] - or dword ptr [rdi+rbp*4],eax - - cmp rdx,rcx - ja rmark_hnf_1 - - add eax,eax - jne rmark_bit_in_same_word2 - inc rbp - mov rax,1 -rmark_bit_in_same_word2: - test eax,dword ptr [rdi+rbp*4] - je rmark_not_yet_linked_ab - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - add rax,8 - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[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 - jmp rmark_hnf_1 - -rmark_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 - jmp rmark_hnf_1 - -rmark_record_3_aab: - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jb rmark_using_reversal_ - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[rax] - test eax,dword ptr [rdi+rbp*4] - jne rmark_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 - ja rmark_no_reverse_argument_pointer - - lea rbp,3[rsi] - mov qword ptr [rsi],rcx - mov qword ptr [rdx],rbp - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmark_next_node - - mov rbx,rdx - jmp rmark_node_ - -rmark_record_2: - cmp word ptr (-2+2)[rax],1 - ja rmark_hnf_2 - je rmark_hnf_1 - jmp rmark_next_node - -rmark_record_1: - cmp word ptr (-2+2)[rax],0 - jne rmark_hnf_1 - jmp rmark_next_node - -rmark_lazy_node_1: -; selectors: - jne rmark_selector_node_1 - -rmark_hnf_1: - mov rsi,rcx - mov rcx,qword ptr [rcx] - jmp rmark_node - -; selectors -rmark_indirection_node: - if THREAD - mov rdx,qword ptr neg_heap_p3_offset[r9] - else - mov rdx,qword ptr neg_heap_p3 - endif - sub rcx,8 - add rdx,rcx - - mov rbp,rdx - and rbp,31*8 - shr rdx,8 - mov ebp,dword ptr (bit_clear_table2)[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 - ja rmark_node_d1 - mov qword ptr [rdx],rax - jmp rmark_node_d1 - -rmark_selector_node_1: - add rbp,3 - je rmark_indirection_node - - mov rdx,qword ptr [rcx] - mov r12,rbx - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,rdx - shr rbx,3 - - add rbp,1 - jle rmark_record_selector_node_1 - - mov rbp,rbx - shr rbx,5 - and rbp,31 - mov ebp,dword ptr (bit_set_table)[rbp*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmark_hnf_1 - - mov rbx,qword ptr [rdx] - test bl,2 - je rmark_hnf_1 - - cmp word ptr (-2)[rbx],2 - jbe rmark_small_tuple_or_record - -rmark_large_tuple_or_record: - mov d2,qword ptr 16[rdx] - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,d2 - shr rbx,3 - - mov rbp,rbx - shr rbx,5 - and rbp,31 - mov ebp,dword ptr (bit_set_table)[rbp*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmark_hnf_1 - - ifdef NEW_DESCRIPTORS - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - lea rbx,(-8)[rcx+rbx] - - mov eax,dword ptr (-8)[rax] - - mov d3,rbx - and d3,31*8 - shr rbx,8 - mov d3d,dword ptr (bit_clear_table2)[d3] - and dword ptr [rdi+rbx*4],d3d - - movzx eax,word ptr 4[rax] - mov rbx,r12 - - mov qword ptr (-8)[rcx],offset __indirection - - cmp rax,16 - jl rmark_tuple_or_record_selector_node_2 - - mov rdx,rcx - je rmark_tuple_selector_node_2 - - mov rcx,qword ptr (-24)[d2+rax] - mov qword ptr [rsi],rcx - mov qword ptr [rdx],rcx - jmp rmark_node_d1 - -rmark_tuple_selector_node_2: - mov rcx,qword ptr [d2] - mov qword ptr [rsi],rcx - mov qword ptr [rdx],rcx - jmp rmark_node_d1 - else -rmark_small_tuple_or_record: - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - lea rbx,(-8)[rcx+rbx] - - push rcx - - mov rcx,rbx - and rcx,31*8 - shr rbx,8 - mov ecx,dword ptr (bit_clear_table2)[rcx] - and dword ptr [rdi+rbx*4],ecx - - mov eax,(-8)[rax] - - mov rcx,rdx - push rsi - mov eax,4[rax] - call near ptr rax - pop rsi - pop rdx - - mov qword ptr [rsi],rcx - - mov rbx,r12 - - mov qword ptr (-8)[rdx],offset __indirection - mov qword ptr [rdx],rcx - jmp rmark_node_d1 - endif - -rmark_record_selector_node_1: - je rmark_strict_record_selector_node_1 - - mov rbp,rbx - shr rbx,5 - and rbp,31 - mov ebp,dword ptr (bit_set_table)[rbp*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmark_hnf_1 - - mov rbx,qword ptr [rdx] - test bl,2 - je rmark_hnf_1 - - cmp word ptr (-2)[rbx],258 - jbe rmark_small_tuple_or_record - - ifdef NEW_DESCRIPTORS - mov d2,qword ptr 16[rdx] - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,d2 - shr rbx,3 - - mov rbp,rbx - shr rbx,5 - and rbp,31 - mov ebp,dword ptr (bit_set_table)[rbp*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmark_hnf_1 - -rmark_small_tuple_or_record: - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - lea rbx,(-8)[rcx+rbx] - - mov eax,(-8)[rax] - - mov d3,rbx - and d3,31*8 - shr rbx,8 - mov d3d,dword ptr (bit_clear_table2)[d3] - and dword ptr [rdi+rbx*4],d3d - - movzx eax,word ptr 4[rax] - mov rbx,r12 - - mov qword ptr (-8)[rcx],offset __indirection - - cmp rax,16 - jle rmark_tuple_or_record_selector_node_2 - mov rdx,d2 - sub rax,24 -rmark_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 - jmp rmark_node_d1 - else - jmp rmark_large_tuple_or_record - endif - -rmark_strict_record_selector_node_1: - mov rbp,rbx - shr rbx,5 - and rbp,31 - mov ebp,dword ptr (bit_set_table)[rbp*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmark_hnf_1 - - mov rbx,qword ptr [rdx] - test bl,2 - je rmark_hnf_1 - - cmp word ptr (-2)[rbx],258 - jbe rmark_select_from_small_record - - mov d2,qword ptr 16[rdx] - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,d2 - mov rbp,rbx - - shr rbx,8 - and rbp,31*8 - mov ebp,dword ptr (bit_set_table2)[rbp] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmark_hnf_1 - -rmark_select_from_small_record: - mov ebx,(-8)[rax] - sub rcx,8 - - cmp rcx,r12 - ja rmark_selector_pointer_not_reversed - - ifdef NEW_DESCRIPTORS - movzx eax,word ptr 4[rbx] - cmp rax,16 - jle rmark_strict_record_selector_node_2 - mov rax,qword ptr (-24)[d2+rax] - jmp rmark_strict_record_selector_node_3 -rmark_strict_record_selector_node_2: - mov rax,qword ptr [rdx+rax] -rmark_strict_record_selector_node_3: - mov qword ptr 8[rcx],rax - - movzx eax,word ptr 6[rbx] - test rax,rax - je rmark_strict_record_selector_node_5 - cmp rax,16 - jle rmark_strict_record_selector_node_4 - mov rdx,d2 - sub rax,24 -rmark_strict_record_selector_node_4: - mov rax,qword ptr [rdx+rax] - mov qword ptr 16[rcx],rax -rmark_strict_record_selector_node_5: - - mov rax,qword ptr (-8)[rbx] - else - mov qword ptr [rcx],rax - mov qword ptr [rsi],rcx - - push rsi - mov ebx,4[rbx] - call near ptr rbx - pop rsi - - mov rax,qword ptr [rcx] - endif - add rsi,1 - mov qword ptr [rcx],rsi - mov qword ptr (-1)[rsi],rax - jmp rmark_next_node - -rmark_selector_pointer_not_reversed: - ifdef NEW_DESCRIPTORS - movzx eax,word ptr 4[rbx] - cmp rax,16 - jle rmark_strict_record_selector_node_6 - mov rax,qword ptr (-24)[d2+rax] - jmp rmark_strict_record_selector_node_7 -rmark_strict_record_selector_node_6: - mov rax,qword ptr [rdx+rax] -rmark_strict_record_selector_node_7: - mov qword ptr 8[rcx],rax - - movzx eax,word ptr 6[rbx] - test rax,rax - je rmark_strict_record_selector_node_9 - cmp rax,16 - jle rmark_strict_record_selector_node_8 - mov rdx,d2 - sub rax,24 -rmark_strict_record_selector_node_8: - mov rax,qword ptr [rdx+rax] - mov qword ptr 16[rcx],rax -rmark_strict_record_selector_node_9: - - mov rax,qword ptr (-8)[rbx] - mov qword ptr [rcx],rax - else - mov ebx,4[rbx] - call near ptr rbx - endif - jmp rmark_next_node - -rmark_reverse_and_mark_next_node: - cmp rcx,rbx - ja rmark_next_node - - mov rax,qword ptr [rcx] - mov qword ptr [rsi],rax - add rsi,1 - mov qword ptr [rcx],rsi - -; %rbp ,%rbx : free - -rmark_next_node: - mov rcx,qword ptr [rsp] - mov rsi,qword ptr 8[rsp] - add rsp,16 - - cmp rcx,1 - ja rmark_node - -rmark_next_node_: -end_rmark_nodes: - ret - -rmark_lazy_node: - movsxd rbp,dword ptr (-4)[rax] - test rbp,rbp - je rmark_next_node - - add rcx,8 - - sub rbp,1 - jle rmark_lazy_node_1 - - cmp rbp,255 - jge rmark_closure_with_unboxed_arguments - -rmark_closure_with_unboxed_arguments_: - lea rcx,[rcx+rbp*8] - -rmark_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 - jg rmark_push_lazy_args - - mov rsi,rcx - mov rcx,qword ptr [rcx] - - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jae rmark_node - - jmp rmark_using_reversal - -rmark_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 - jg rmark_closure_with_unboxed_arguments_ - je rmark_hnf_1 - jmp rmark_next_node - -rmark_hnf_0: - cmp rax,offset dINT+2 - je rmark_int_3 - - cmp rax,offset CHAR+2 - je rmark_char_3 - - jb rmark_no_normal_hnf_0 - - if THREAD - mov rbp,qword ptr neg_heap_p3_offset[r9] - else - mov rbp,qword ptr neg_heap_p3 - endif - add rbp,rcx - - mov rdx,rbp - and rdx,31*8 - shr rbp,8 - mov edx,dword ptr (bit_clear_table2)[rdx] - and dword ptr [rdi+rbp*4],edx - - ifdef NEW_DESCRIPTORS - lea rdx,((-8)-2)[rax] - else - lea rdx,((-12)-2)[rax] - endif - mov qword ptr [rsi],rdx - cmp rcx,rbx - ja rmark_next_node - mov qword ptr [rcx],rax - jmp rmark_next_node - -rmark_int_3: - mov rbp,qword ptr 8[rcx] - cmp rbp,33 - jnc rmark_next_node - - shl rbp,4 - lea rdx,(small_integers)[rbp] - if THREAD - mov rbp,qword ptr neg_heap_p3_offset[r9] - else - mov rbp,qword ptr neg_heap_p3 - endif - mov qword ptr [rsi],rdx - add rbp,rcx - - mov rdx,rbp - and rdx,31*8 - shr rbp,8 - mov edx,dword ptr (bit_clear_table2)[rdx] - and dword ptr [rdi+rbp*4],edx - - cmp rcx,rbx - ja rmark_next_node - mov qword ptr [rcx],rax - jmp rmark_next_node - -rmark_char_3: - movzx rdx,byte ptr 8[rcx] - if THREAD - mov rbp,qword ptr neg_heap_p3_offset[r9] - else - mov rbp,qword ptr neg_heap_p3 - endif - - shl rdx,4 - add rbp,rcx - add rdx,offset static_characters - mov qword ptr [rsi],rdx - - mov rdx,rbp - and rdx,31*8 - shr rbp,8 - mov edx,dword ptr (bit_clear_table2)[rdx] - and dword ptr [rdi+rbp*4],edx - - cmp rcx,rbx - ja rmark_next_node - mov qword ptr [rcx],rax - jmp rmark_next_node - -rmark_no_normal_hnf_0: - if THREAD - cmp rax,offset __ARRAY__+2 - else - lea r9,__ARRAY__+2 - cmp rax,r9 - endif - jne rmark_next_node - - mov rax,qword ptr 16[rcx] - test rax,rax - je rmark_lazy_array - - movzx rdx,word ptr (-2+2)[rax] - test rdx,rdx - je rmark_b_array - - movzx rax,word ptr (-2)[rax] - test rax,rax - je rmark_b_array - - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jb rmark_array_using_reversal - - sub rax,256 - cmp rdx,rax - mov rbx,rdx - je rmark_a_record_array - -rmark_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 - call reorder - - pop rcx - mov rax,rbx - imul rax,qword ptr (-8)[rcx] - jmp rmark_lr_array - -rmark_b_array: - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - add rax,8 - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[rax] - or dword ptr [rdi+rbp*4],eax - - jmp rmark_next_node - -rmark_a_record_array: - mov rax,qword ptr 8[rcx] - add rcx,16 - cmp rbx,2 - jb rmark_lr_array - - imul rax,rbx - jmp rmark_lr_array - -rmark_lazy_array: - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jb rmark_array_using_reversal - - mov rax,qword ptr 8[rcx] - add rcx,16 - -rmark_lr_array: - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,rcx - shr rbx,3 - add rbx,rax - - mov rdx,rbx - and rbx,31 - shr rdx,5 - mov ebx,dword ptr (bit_set_table)[rbx*4] - or dword ptr [rdi+rdx*4],ebx - - cmp rax,1 - jbe rmark_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 rmark_array_nodes - -rmark_array_nodes1: - cmp rcx,rsi - ja rmark_next_array_node - - mov rbx,qword ptr [rcx] - lea rax,1[rsi] - mov qword ptr [rsi],rbx - mov qword ptr [rcx],rax - -rmark_next_array_node: - add rsi,8 - cmp rsi,qword ptr [rsp] - je end_rmark_array_node - -rmark_array_nodes: - mov rcx,qword ptr [rsi] - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmark_next_array_node - - mov rbx,rax - and rax,31*8 - shr rbx,8 - mov eax,dword ptr (bit_set_table2)[rax] - mov ebp,dword ptr [rdi+rbx*4] - test rbp,rax - jne rmark_array_nodes1 - - or rbp,rax - mov dword ptr [rdi+rbx*4],ebp - - mov rax,qword ptr [rcx] - call rmark_array_node - - add rsi,8 - cmp rsi,qword ptr [rsp] - jne rmark_array_nodes - -end_rmark_array_node: - add rsp,8 - jmp rmark_next_node - -rmark_array_node: - sub rsp,16 - mov qword ptr 8[rsp],rsi - mov rbx,rsi - mov qword ptr [rsp],1 - jmp rmark_arguments - -rmark_array_length_0_1: - lea rcx,-16[rcx] - jb rmark_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 - jmp rmark_hnf_1 + +rmark_stack_nodes1: + mov rbx,qword ptr [rcx] + lea rax,1[rsi] + mov qword ptr [rsi],rbx + mov qword ptr [rcx],rax + +rmark_next_stack_node: + add rsi,8 + +rmark_stack_nodes: + if THREAD + cmp rsi,qword ptr end_vector_offset[r9] + else + cmp rsi,qword ptr end_vector + endif + je end_rmark_nodes + +rmark_more_stack_nodes: + mov rcx,qword ptr [rsi] + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmark_next_stack_node + + mov rbx,rax + and rax,31*8 + shr rbx,8 + mov eax,dword ptr (bit_set_table2)[rax] + mov ebp,dword ptr [rdi+rbx*4] + test rbp,rax + jne rmark_stack_nodes1 + + or rbp,rax + mov dword ptr [rdi+rbx*4],ebp + + mov rax,qword ptr [rcx] + call rmark_stack_node + + add rsi,8 + if THREAD + cmp rsi,qword ptr end_vector_offset[r9] + else + cmp rsi,qword ptr end_vector + endif + jne rmark_more_stack_nodes + ret + +rmark_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 rmark_no_reverse + +rmark_node_d1: + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmark_next_node + + jmp rmark_node_ + +rmark_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 + + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jb rmark_using_reversal + +rmark_node: + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmark_next_node + + mov rbx,rsi + +rmark_node_: + mov rdx,rax + and rax,31*8 + shr rdx,8 + mov eax,dword ptr (bit_set_table2)[rax] + mov ebp,dword ptr [rdi+rdx*4] + test rbp,rax + jne rmark_reverse_and_mark_next_node + + or rbp,rax + mov dword ptr [rdi+rdx*4],ebp + + mov rax,qword ptr [rcx] +rmark_arguments: + cmp rcx,rbx + ja rmark_no_reverse + + lea rbp,1[rsi] + mov qword ptr [rsi],rax + mov qword ptr [rcx],rbp + +rmark_no_reverse: + test al,2 + je rmark_lazy_node + + movzx rbp,word ptr (-2)[rax] + test rbp,rbp + je rmark_hnf_0 + + add rcx,8 + + cmp rbp,256 + jae rmark_record + + sub rbp,2 + je rmark_hnf_2 + jc rmark_hnf_1 + +rmark_hnf_3: + mov rdx,qword ptr 8[rcx] +rmark_hnf_3_: + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jb rmark_using_reversal_ + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbx,rax + and rax,31*8 + shr rbx,8 + mov eax,dword ptr (bit_set_table2)[rax] + test eax,[rdi+rbx*4] + jne rmark_shared_argument_part + + or dword ptr [rdi+rbx*4],eax + +rmark_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 + +rmark_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 + jg rmark_push_hnf_args + + mov rcx,qword ptr [rdx] + + cmp rdx,rsi + ja rmark_no_reverse_argument_pointer + + lea rbp,3[rsi] + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rbp + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmark_next_node + + mov rbx,rdx + jmp rmark_node_ + +rmark_no_reverse_argument_pointer: + mov rsi,rdx + jmp rmark_node + +rmark_shared_argument_part: + cmp rdx,rcx + ja rmark_hnf_1 + + mov rbx,qword ptr [rdx] + lea rax,(8+2+1)[rcx] + mov qword ptr [rdx],rax + mov qword ptr 8[rcx],rbx + jmp rmark_hnf_1 + +rmark_record: + sub rbp,258 + je rmark_record_2 + jb rmark_record_1 + +rmark_record_3: + movzx rbp,word ptr (-2+2)[rax] + mov rdx,qword ptr (16-8)[rcx] + sub rbp,1 + jb rmark_record_3_bb + je rmark_record_3_ab + sub rbp,1 + je rmark_record_3_aab + jmp rmark_hnf_3_ + +rmark_record_3_bb: + sub rcx,8 + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[rax] + or dword ptr [rdi+rbp*4],eax + + cmp rdx,rcx + ja rmark_next_node + + add eax,eax + jne rmark_bit_in_same_word1 + inc rbp + mov rax,1 +rmark_bit_in_same_word1: + test eax,dword ptr [rdi+rbp*4] + je rmark_not_yet_linked_bb + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + add rax,16 + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[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 + jmp rmark_next_node + +rmark_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 + jmp rmark_next_node + +rmark_record_3_ab: + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[rax] + or dword ptr [rdi+rbp*4],eax + + cmp rdx,rcx + ja rmark_hnf_1 + + add eax,eax + jne rmark_bit_in_same_word2 + inc rbp + mov rax,1 +rmark_bit_in_same_word2: + test eax,dword ptr [rdi+rbp*4] + je rmark_not_yet_linked_ab + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + add rax,8 + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[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 + jmp rmark_hnf_1 + +rmark_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 + jmp rmark_hnf_1 + +rmark_record_3_aab: + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jb rmark_using_reversal_ + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[rax] + test eax,dword ptr [rdi+rbp*4] + jne rmark_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 + ja rmark_no_reverse_argument_pointer + + lea rbp,3[rsi] + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rbp + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmark_next_node + + mov rbx,rdx + jmp rmark_node_ + +rmark_record_2: + cmp word ptr (-2+2)[rax],1 + ja rmark_hnf_2 + je rmark_hnf_1 + jmp rmark_next_node + +rmark_record_1: + cmp word ptr (-2+2)[rax],0 + jne rmark_hnf_1 + jmp rmark_next_node + +rmark_lazy_node_1: +; selectors: + jne rmark_selector_node_1 + +rmark_hnf_1: + mov rsi,rcx + mov rcx,qword ptr [rcx] + jmp rmark_node + +; selectors +rmark_indirection_node: + if THREAD + mov rdx,qword ptr neg_heap_p3_offset[r9] + else + mov rdx,qword ptr neg_heap_p3 + endif + sub rcx,8 + add rdx,rcx + + mov rbp,rdx + and rbp,31*8 + shr rdx,8 + mov ebp,dword ptr (bit_clear_table2)[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 + ja rmark_node_d1 + mov qword ptr [rdx],rax + jmp rmark_node_d1 + +rmark_selector_node_1: + add rbp,3 + je rmark_indirection_node + + mov rdx,qword ptr [rcx] + mov r12,rbx + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,rdx + shr rbx,3 + + add rbp,1 + jle rmark_record_selector_node_1 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + mov ebp,dword ptr (bit_set_table)[rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmark_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + je rmark_hnf_1 + + cmp word ptr (-2)[rbx],2 + jbe rmark_small_tuple_or_record + +rmark_large_tuple_or_record: + mov d2,qword ptr 16[rdx] + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,d2 + shr rbx,3 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + mov ebp,dword ptr (bit_set_table)[rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmark_hnf_1 + + ifdef NEW_DESCRIPTORS + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + lea rbx,(-8)[rcx+rbx] + + mov eax,dword ptr (-8)[rax] + + mov d3,rbx + and d3,31*8 + shr rbx,8 + mov d3d,dword ptr (bit_clear_table2)[d3] + and dword ptr [rdi+rbx*4],d3d + + movzx eax,word ptr 4[rax] + mov rbx,r12 + + mov qword ptr (-8)[rcx],offset __indirection + + cmp rax,16 + jl rmark_tuple_or_record_selector_node_2 + + mov rdx,rcx + je rmark_tuple_selector_node_2 + + mov rcx,qword ptr (-24)[d2+rax] + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rcx + jmp rmark_node_d1 + +rmark_tuple_selector_node_2: + mov rcx,qword ptr [d2] + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rcx + jmp rmark_node_d1 + else +rmark_small_tuple_or_record: + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + lea rbx,(-8)[rcx+rbx] + + push rcx + + mov rcx,rbx + and rcx,31*8 + shr rbx,8 + mov ecx,dword ptr (bit_clear_table2)[rcx] + and dword ptr [rdi+rbx*4],ecx + + mov eax,(-8)[rax] + + mov rcx,rdx + push rsi + mov eax,4[rax] + call near ptr rax + pop rsi + pop rdx + + mov qword ptr [rsi],rcx + + mov rbx,r12 + + mov qword ptr (-8)[rdx],offset __indirection + mov qword ptr [rdx],rcx + jmp rmark_node_d1 + endif + +rmark_record_selector_node_1: + je rmark_strict_record_selector_node_1 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + mov ebp,dword ptr (bit_set_table)[rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmark_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + je rmark_hnf_1 + + cmp word ptr (-2)[rbx],258 + jbe rmark_small_tuple_or_record + + ifdef NEW_DESCRIPTORS + mov d2,qword ptr 16[rdx] + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,d2 + shr rbx,3 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + mov ebp,dword ptr (bit_set_table)[rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmark_hnf_1 + +rmark_small_tuple_or_record: + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + lea rbx,(-8)[rcx+rbx] + + mov eax,(-8)[rax] + + mov d3,rbx + and d3,31*8 + shr rbx,8 + mov d3d,dword ptr (bit_clear_table2)[d3] + and dword ptr [rdi+rbx*4],d3d + + movzx eax,word ptr 4[rax] + mov rbx,r12 + + mov qword ptr (-8)[rcx],offset __indirection + + cmp rax,16 + jle rmark_tuple_or_record_selector_node_2 + mov rdx,d2 + sub rax,24 +rmark_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 + jmp rmark_node_d1 + else + jmp rmark_large_tuple_or_record + endif + +rmark_strict_record_selector_node_1: + mov rbp,rbx + shr rbx,5 + and rbp,31 + mov ebp,dword ptr (bit_set_table)[rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmark_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + je rmark_hnf_1 + + cmp word ptr (-2)[rbx],258 + jbe rmark_select_from_small_record + + mov d2,qword ptr 16[rdx] + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,d2 + mov rbp,rbx + + shr rbx,8 + and rbp,31*8 + mov ebp,dword ptr (bit_set_table2)[rbp] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmark_hnf_1 + +rmark_select_from_small_record: + mov ebx,(-8)[rax] + sub rcx,8 + + cmp rcx,r12 + ja rmark_selector_pointer_not_reversed + + ifdef NEW_DESCRIPTORS + movzx eax,word ptr 4[rbx] + cmp rax,16 + jle rmark_strict_record_selector_node_2 + mov rax,qword ptr (-24)[d2+rax] + jmp rmark_strict_record_selector_node_3 +rmark_strict_record_selector_node_2: + mov rax,qword ptr [rdx+rax] +rmark_strict_record_selector_node_3: + mov qword ptr 8[rcx],rax + + movzx eax,word ptr 6[rbx] + test rax,rax + je rmark_strict_record_selector_node_5 + cmp rax,16 + jle rmark_strict_record_selector_node_4 + mov rdx,d2 + sub rax,24 +rmark_strict_record_selector_node_4: + mov rax,qword ptr [rdx+rax] + mov qword ptr 16[rcx],rax +rmark_strict_record_selector_node_5: + + mov rax,qword ptr (-8)[rbx] + else + mov qword ptr [rcx],rax + mov qword ptr [rsi],rcx + + push rsi + mov ebx,4[rbx] + call near ptr rbx + pop rsi + + mov rax,qword ptr [rcx] + endif + add rsi,1 + mov qword ptr [rcx],rsi + mov qword ptr (-1)[rsi],rax + jmp rmark_next_node + +rmark_selector_pointer_not_reversed: + ifdef NEW_DESCRIPTORS + movzx eax,word ptr 4[rbx] + cmp rax,16 + jle rmark_strict_record_selector_node_6 + mov rax,qword ptr (-24)[d2+rax] + jmp rmark_strict_record_selector_node_7 +rmark_strict_record_selector_node_6: + mov rax,qword ptr [rdx+rax] +rmark_strict_record_selector_node_7: + mov qword ptr 8[rcx],rax + + movzx eax,word ptr 6[rbx] + test rax,rax + je rmark_strict_record_selector_node_9 + cmp rax,16 + jle rmark_strict_record_selector_node_8 + mov rdx,d2 + sub rax,24 +rmark_strict_record_selector_node_8: + mov rax,qword ptr [rdx+rax] + mov qword ptr 16[rcx],rax +rmark_strict_record_selector_node_9: + + mov rax,qword ptr (-8)[rbx] + mov qword ptr [rcx],rax + else + mov ebx,4[rbx] + call near ptr rbx + endif + jmp rmark_next_node + +rmark_reverse_and_mark_next_node: + cmp rcx,rbx + ja rmark_next_node + + mov rax,qword ptr [rcx] + mov qword ptr [rsi],rax + add rsi,1 + mov qword ptr [rcx],rsi + +; %rbp ,%rbx : free + +rmark_next_node: + mov rcx,qword ptr [rsp] + mov rsi,qword ptr 8[rsp] + add rsp,16 + + cmp rcx,1 + ja rmark_node + +rmark_next_node_: +end_rmark_nodes: + ret + +rmark_lazy_node: + movsxd rbp,dword ptr (-4)[rax] + test rbp,rbp + je rmark_next_node + + add rcx,8 + + sub rbp,1 + jle rmark_lazy_node_1 + + cmp rbp,255 + jge rmark_closure_with_unboxed_arguments + +rmark_closure_with_unboxed_arguments_: + lea rcx,[rcx+rbp*8] + +rmark_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 + jg rmark_push_lazy_args + + mov rsi,rcx + mov rcx,qword ptr [rcx] + + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jae rmark_node + + jmp rmark_using_reversal + +rmark_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 + jg rmark_closure_with_unboxed_arguments_ + je rmark_hnf_1 + jmp rmark_next_node + +rmark_hnf_0: + cmp rax,offset dINT+2 + je rmark_int_3 + + cmp rax,offset CHAR+2 + je rmark_char_3 + + jb rmark_no_normal_hnf_0 + + if THREAD + mov rbp,qword ptr neg_heap_p3_offset[r9] + else + mov rbp,qword ptr neg_heap_p3 + endif + add rbp,rcx + + mov rdx,rbp + and rdx,31*8 + shr rbp,8 + mov edx,dword ptr (bit_clear_table2)[rdx] + and dword ptr [rdi+rbp*4],edx + + ifdef NEW_DESCRIPTORS + lea rdx,((-8)-2)[rax] + else + lea rdx,((-12)-2)[rax] + endif + mov qword ptr [rsi],rdx + cmp rcx,rbx + ja rmark_next_node + mov qword ptr [rcx],rax + jmp rmark_next_node + +rmark_int_3: + mov rbp,qword ptr 8[rcx] + cmp rbp,33 + jnc rmark_next_node + + shl rbp,4 + lea rdx,(small_integers)[rbp] + if THREAD + mov rbp,qword ptr neg_heap_p3_offset[r9] + else + mov rbp,qword ptr neg_heap_p3 + endif + mov qword ptr [rsi],rdx + add rbp,rcx + + mov rdx,rbp + and rdx,31*8 + shr rbp,8 + mov edx,dword ptr (bit_clear_table2)[rdx] + and dword ptr [rdi+rbp*4],edx + + cmp rcx,rbx + ja rmark_next_node + mov qword ptr [rcx],rax + jmp rmark_next_node + +rmark_char_3: + movzx rdx,byte ptr 8[rcx] + if THREAD + mov rbp,qword ptr neg_heap_p3_offset[r9] + else + mov rbp,qword ptr neg_heap_p3 + endif + + shl rdx,4 + add rbp,rcx + add rdx,offset static_characters + mov qword ptr [rsi],rdx + + mov rdx,rbp + and rdx,31*8 + shr rbp,8 + mov edx,dword ptr (bit_clear_table2)[rdx] + and dword ptr [rdi+rbp*4],edx + + cmp rcx,rbx + ja rmark_next_node + mov qword ptr [rcx],rax + jmp rmark_next_node + +rmark_no_normal_hnf_0: + if THREAD + cmp rax,offset __ARRAY__+2 + else + lea r9,__ARRAY__+2 + cmp rax,r9 + endif + jne rmark_next_node + + mov rax,qword ptr 16[rcx] + test rax,rax + je rmark_lazy_array + + movzx rdx,word ptr (-2+2)[rax] + test rdx,rdx + je rmark_b_array + + movzx rax,word ptr (-2)[rax] + test rax,rax + je rmark_b_array + + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jb rmark_array_using_reversal + + sub rax,256 + cmp rdx,rax + mov rbx,rdx + je rmark_a_record_array + +rmark_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 + call reorder + + pop rcx + mov rax,rbx + imul rax,qword ptr (-8)[rcx] + jmp rmark_lr_array + +rmark_b_array: + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + add rax,8 + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[rax] + or dword ptr [rdi+rbp*4],eax + + jmp rmark_next_node + +rmark_a_record_array: + mov rax,qword ptr 8[rcx] + add rcx,16 + cmp rbx,2 + jb rmark_lr_array + + imul rax,rbx + jmp rmark_lr_array + +rmark_lazy_array: + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jb rmark_array_using_reversal + + mov rax,qword ptr 8[rcx] + add rcx,16 + +rmark_lr_array: + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,rcx + shr rbx,3 + add rbx,rax + + mov rdx,rbx + and rbx,31 + shr rdx,5 + mov ebx,dword ptr (bit_set_table)[rbx*4] + or dword ptr [rdi+rdx*4],ebx + + cmp rax,1 + jbe rmark_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 rmark_array_nodes + +rmark_array_nodes1: + cmp rcx,rsi + ja rmark_next_array_node + + mov rbx,qword ptr [rcx] + lea rax,1[rsi] + mov qword ptr [rsi],rbx + mov qword ptr [rcx],rax + +rmark_next_array_node: + add rsi,8 + cmp rsi,qword ptr [rsp] + je end_rmark_array_node + +rmark_array_nodes: + mov rcx,qword ptr [rsi] + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmark_next_array_node + + mov rbx,rax + and rax,31*8 + shr rbx,8 + mov eax,dword ptr (bit_set_table2)[rax] + mov ebp,dword ptr [rdi+rbx*4] + test rbp,rax + jne rmark_array_nodes1 + + or rbp,rax + mov dword ptr [rdi+rbx*4],ebp + + mov rax,qword ptr [rcx] + call rmark_array_node + + add rsi,8 + cmp rsi,qword ptr [rsp] + jne rmark_array_nodes + +end_rmark_array_node: + add rsp,8 + jmp rmark_next_node + +rmark_array_node: + sub rsp,16 + mov qword ptr 8[rsp],rsi + mov rbx,rsi + mov qword ptr [rsp],1 + jmp rmark_arguments + +rmark_array_length_0_1: + lea rcx,-16[rcx] + jb rmark_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 + jmp rmark_hnf_1 diff --git a/thread/acompact_rmark_prefetch.asm b/thread/acompact_rmark_prefetch.asm index e921c8f..4b8b354 100644 --- a/thread/acompact_rmark_prefetch.asm +++ b/thread/acompact_rmark_prefetch.asm @@ -1,1398 +1,1398 @@ - -_TEXT ends - _DATA segment -rmarkp_n_queue_items_16: - dq 0 -rmarkp_queue_first: - dq 0 -rmarkp_queue: - dq 0,0,0,0,0,0,0,0 - dq 0,0,0,0,0,0,0,0 - dq 0,0,0,0,0,0,0,0 - dq 0,0,0,0,0,0,0,0 -_DATA ends - _TEXT segment - -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 - if THREAD - cmp rsi,qword ptr end_vector_offset[r9] - else - cmp rsi,qword ptr end_vector - endif - je end_rmarkp_nodes - -rmarkp_stack_nodes: - mov rcx,qword ptr [rsi] - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmarkp_next_stack_node - - mov rbx,rax - and rax,31*8 - shr rbx,8 - mov eax,dword ptr (bit_set_table2)[rax] - mov ebp,dword ptr [rdi+rbx*4] - test rbp,rax - 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 - if THREAD - cmp rsi,qword ptr end_vector_offset[r9] - else - cmp rsi,qword ptr end_vector - endif - 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: - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - 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 - - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jb rmark_using_reversal - -rmarkp_node: - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmarkp_next_node - - mov rbx,rsi - -rmarkp_node_: - - - - mov rdx,rax - and rax,31*8 - shr rdx,8 - mov eax,dword ptr (bit_set_table2)[rax] - test eax,dword ptr [rdi+rdx*4] - jne rmarkp_reverse_and_mark_next_node - - mov rbp,qword ptr rmarkp_queue_first - mov rdx,qword ptr rmarkp_n_queue_items_16 - - prefetch [rcx] - mov qword ptr rmarkp_queue[rbp],rcx - mov qword ptr rmarkp_queue+8[rbp],rsi - mov qword ptr rmarkp_queue+16[rbp],rbx - lea rbx,[rbp+rdx] - add rbp,32 - - and rbp,7*32 - and rbx,7*32 - - mov qword ptr rmarkp_queue_first,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 - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmarkp_add_items - - mov rdx,rax - and rax,31*8 - shr rdx,8 - mov eax,dword ptr bit_set_table2[rax] - mov ebp,dword ptr [rdi+rdx*4] - test rbp,rax - je rmarkp_add_item - - cmp rcx,rsi - ja rmarkp_add_items - - mov rax,[rcx] - mov [rsi],rax - add rsi,1 - mov [rcx],rsi - jmp rmarkp_add_items - -rmarkp_add_stacked_item: - je rmarkp_last_item_in_queue -rmarkp_add_items2: - mov rsi,8[rsp] - add rsi,8 - if THREAD - cmp rsi,qword ptr end_vector_offset[r9] - else - cmp rsi,qword ptr end_vector - endif - je rmarkp_last_item_in_queue - - mov rcx,[rsi] - mov 8[rsp],rsi - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmarkp_add_items2 - - mov rdx,rax - and rax,31*8 - shr rdx,8 - mov eax,dword ptr bit_set_table2[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 - jmp rmarkp_add_items2 - -rmarkp_add_item2: - prefetch [rcx] - mov rbp,qword ptr rmarkp_queue_first - mov rdx,qword ptr rmarkp_n_queue_items_16 - - mov qword ptr rmarkp_queue[rbp],rcx - mov qword ptr rmarkp_queue+8[rbp],rsi - mov qword ptr rmarkp_queue+16[rbp],-1 - add rbp,32 - and rbp,7*32 - - sub rdx,32 - - mov qword ptr rmarkp_queue_first,rbp - mov qword ptr rmarkp_n_queue_items_16,rdx - - cmp rdx,-(4*32) - jne rmarkp_add_items2 - jmp rmarkp_last_item_in_queue - -rmarkp_add_items3: - mov rsi,8[rsp] - add rsi,8 - cmp rsi,24[rsp] - je rmarkp_last_item_in_queue - - mov rcx,[rsi] - mov 8[rsp],rsi - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmarkp_add_items3 - - mov rdx,rax - and rax,31*8 - shr rdx,8 - mov eax,dword ptr bit_set_table2[rax] - mov ebp,[rdi+rdx*4] - test rbp,rax - je rmarkp_add_item3 - - cmp rcx,rsi - ja rmarkp_add_items3 - - mov rax,[rcx] - mov [rsi],rax - add rsi,1 - mov [rcx],rsi - jmp rmarkp_add_items3 - -rmarkp_add_item3: - prefetch [rcx] - mov rbp,qword ptr rmarkp_queue_first - mov rdx,qword ptr rmarkp_n_queue_items_16 - - mov qword ptr rmarkp_queue[rbp],rcx - mov qword ptr rmarkp_queue+8[rbp],rsi - mov qword ptr rmarkp_queue+16[rbp],rsi - add rbp,32 - and rbp,7*32 - - sub rdx,32 - - mov qword ptr rmarkp_queue_first,rbp - mov qword ptr rmarkp_n_queue_items_16,rdx - - cmp rdx,-(4*32) - jne rmarkp_add_items3 - jmp rmarkp_last_item_in_queue - -rmarkp_add_item: - prefetch [rcx] - mov rbp,qword ptr rmarkp_queue_first - mov rdx,qword ptr rmarkp_n_queue_items_16 - - mov qword ptr rmarkp_queue[rbp],rcx - mov qword ptr rmarkp_queue+8[rbp],rsi - mov qword ptr rmarkp_queue+16[rbp],rsi - add rbp,32 - and rbp,7*32 - - sub rdx,32 - - mov qword ptr rmarkp_queue_first,rbp - mov qword ptr rmarkp_n_queue_items_16,rdx - - cmp rdx,-(4*32) - jne rmarkp_add_items - -rmarkp_last_item_in_queue: - mov rcx,qword ptr rmarkp_queue[rbx] - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - - mov rsi,qword ptr rmarkp_queue+8[rbx] - mov rbx,qword ptr rmarkp_queue+16[rbx] - - add rax,rcx - -rmarkp_node_no_prefetch: - - - - mov rdx,rax - and rax,31*8 - shr rdx,8 - mov eax,dword ptr (bit_set_table2)[rax] - mov ebp,dword ptr [rdi+rdx*4] - test rbp,rax - 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 - 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 - je rmarkp_hnf_2 - jc rmarkp_hnf_1 - -rmarkp_hnf_3: - mov rdx,qword ptr 8[rcx] -rmarkp_hnf_3_: - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jb rmark_using_reversal_ - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbx,rax - and rax,31*8 - shr rbx,8 - mov eax,dword ptr (bit_set_table2)[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 - 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 - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmarkp_next_node - - mov rbx,rdx - jmp rmarkp_node_ - -rmarkp_no_reverse_argument_pointer: - mov rsi,rdx - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmarkp_next_node - mov rbx,rsi - jmp rmarkp_node_no_prefetch - -rmarkp_shared_argument_part: - cmp rdx,rcx - 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 - 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 - jmp rmarkp_hnf_3_ - -rmarkp_record_3_bb: - sub rcx,8 - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[rax] - or dword ptr [rdi+rbp*4],eax - - cmp rdx,rcx - 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 - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - add rax,16 - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[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 - 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 - jmp rmarkp_next_node - -rmarkp_record_3_ab: - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[rax] - or dword ptr [rdi+rbp*4],eax - - cmp rdx,rcx - 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 - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - add rax,8 - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[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 - 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 - jmp rmarkp_hnf_1 - -rmarkp_record_3_aab: - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jb rmark_using_reversal_ - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[rax] - test eax,dword ptr [rdi+rbp*4] - 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 - ja rmarkp_no_reverse_argument_pointer - - lea rbp,3[rsi] - mov qword ptr [rsi],rcx - mov qword ptr [rdx],rbp - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmarkp_next_node - - mov rbx,rdx - jmp rmarkp_node_ - -rmarkp_record_2: - cmp word ptr (-2+2)[rax],1 - ja rmarkp_hnf_2 - je rmarkp_hnf_1 - jmp rmarkp_next_node - -rmarkp_record_1: - cmp word ptr (-2+2)[rax],0 - jne rmarkp_hnf_1 - 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] - jmp rmarkp_node - -; selectors -rmarkp_indirection_node: - if THREAD - mov rdx,qword ptr neg_heap_p3_offset[r9] - else - mov rdx,qword ptr neg_heap_p3 - endif - sub rcx,8 - add rdx,rcx - - mov rbp,rdx - and rbp,31*8 - shr rdx,8 - mov ebp,dword ptr (bit_clear_table2)[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 - ja rmarkp_node_d1 - mov qword ptr [rdx],rax - jmp rmarkp_node_d1 - -rmarkp_selector_node_1: - add rbp,3 - je rmarkp_indirection_node - - mov rdx,qword ptr [rcx] - mov r12,rbx - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,rdx - shr rbx,3 - - add rbp,1 - jle rmarkp_record_selector_node_1 - - mov rbp,rbx - shr rbx,5 - and rbp,31 - mov ebp,dword ptr (bit_set_table)[rbp*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmarkp_hnf_1 - - mov rbx,qword ptr [rdx] - test bl,2 - je rmarkp_hnf_1 - - cmp word ptr (-2)[rbx],2 - jbe rmarkp_small_tuple_or_record - -rmarkp_large_tuple_or_record: - mov d2,qword ptr 16[rdx] - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,d2 - shr rbx,3 - - mov rbp,rbx - shr rbx,5 - and rbp,31 - mov ebp,dword ptr (bit_set_table)[rbp*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmarkp_hnf_1 - - ifdef NEW_DESCRIPTORS - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - lea rbx,(-8)[rcx+rbx] - - mov eax,(-8)[rax] - - mov d3,rbx - and d3,31*8 - shr rbx,8 - mov d3d,dword ptr (bit_clear_table2)[d3] - and dword ptr [rdi+rbx*4],d3d - - movzx eax,word ptr 4[rax] - mov rbx,r12 - - mov qword ptr (-8)[rcx],offset __indirection - - 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)[d2+rax] - mov qword ptr [rsi],rcx - mov qword ptr [rdx],rcx - jmp rmarkp_node_d1 - -rmarkp_tuple_selector_node_2: - mov rcx,qword ptr [d2] - mov qword ptr [rsi],rcx - mov qword ptr [rdx],rcx - jmp rmarkp_node_d1 - else -rmarkp_small_tuple_or_record: - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - lea rbx,(-8)[rcx+rbx] - - push rcx - - mov rcx,rbx - and rcx,31*8 - shr rbx,8 - mov ecx,dword ptr (bit_clear_table2)[rcx] - and dword ptr [rdi+rbx*4],ecx - - mov eax,(-8)[rax] - - mov rcx,rdx - push rsi - mov eax,4[rax] - call near ptr rax - pop rsi - pop rdx - - mov qword ptr [rsi],rcx - - mov rbx,r12 - - mov qword ptr (-8)[rdx],offset __indirection - mov qword ptr [rdx],rcx - jmp rmarkp_node_d1 - endif - -rmarkp_record_selector_node_1: - je rmarkp_strict_record_selector_node_1 - - mov rbp,rbx - shr rbx,5 - and rbp,31 - mov ebp,dword ptr (bit_set_table)[rbp*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmarkp_hnf_1 - - mov rbx,qword ptr [rdx] - test bl,2 - je rmarkp_hnf_1 - - cmp word ptr (-2)[rbx],258 - jbe rmarkp_small_tuple_or_record - - ifdef NEW_DESCRIPTORS - mov d2,qword ptr 16[rdx] - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,d2 - shr rbx,3 - - mov rbp,rbx - shr rbx,5 - and rbp,31 - mov ebp,dword ptr (bit_set_table)[rbp*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmarkp_hnf_1 - -rmarkp_small_tuple_or_record: - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - - lea rbx,(-8)[rcx+rbx] - - mov eax,(-8)[rax] - - mov d3,rbx - and d3,31*8 - shr rbx,8 - mov d3d,dword ptr (bit_clear_table2)[d3] - and dword ptr [rdi+rbx*4],d3d - - movzx eax,word ptr 4[rax] - mov rbx,r12 - - mov qword ptr (-8)[rcx],offset __indirection - - cmp rax,16 - jle rmarkp_tuple_or_record_selector_node_2 - mov rdx,d2 - 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 - jmp rmarkp_node_d1 - else - jmp rmarkp_large_tuple_or_record - endif - -rmarkp_strict_record_selector_node_1: - mov rbp,rbx - shr rbx,5 - and rbp,31 - mov ebp,dword ptr (bit_set_table)[rbp*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmarkp_hnf_1 - - mov rbx,qword ptr [rdx] - test bl,2 - je rmarkp_hnf_1 - - cmp word ptr (-2)[rbx],258 - jbe rmarkp_select_from_small_record - - mov d2,qword ptr 16[rdx] - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,d2 - mov rbp,rbx - - shr rbx,8 - and rbp,31*8 - mov ebp,dword ptr (bit_set_table2)[rbp] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp - jne rmarkp_hnf_1 - -rmarkp_select_from_small_record: - mov ebx,(-8)[rax] - sub rcx,8 - - cmp rcx,r12 - ja rmarkp_selector_pointer_not_reversed - - ifdef NEW_DESCRIPTORS - movzx eax,word ptr 4[rbx] - cmp rax,16 - jle rmarkp_strict_record_selector_node_2 - mov rax,qword ptr (-24)[d2+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[rbx] - test rax,rax - je rmarkp_strict_record_selector_node_5 - cmp rax,16 - jle rmarkp_strict_record_selector_node_4 - mov rdx,d2 - 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)[rbx] - else - mov qword ptr [rcx],rax - mov qword ptr [rsi],rcx - - push rsi - mov ebx,4[rbx] - call near ptr rbx - pop rsi - - mov rax,qword ptr [rcx] - endif - add rsi,1 - mov qword ptr [rcx],rsi - mov qword ptr (-1)[rsi],rax - jmp rmarkp_next_node - -rmarkp_selector_pointer_not_reversed: - ifdef NEW_DESCRIPTORS - movzx eax,word ptr 4[rbx] - cmp rax,16 - jle rmarkp_strict_record_selector_node_6 - mov rax,qword ptr (-24)[d2+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[rbx] - test rax,rax - je rmarkp_strict_record_selector_node_9 - cmp rax,16 - jle rmarkp_strict_record_selector_node_8 - mov rdx,d2 - 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)[rbx] - mov qword ptr [rcx],rax - else - mov ebx,4[rbx] - call near ptr rbx - endif - jmp rmarkp_next_node - -rmarkp_reverse_and_mark_next_node: - cmp rcx,rbx - 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 - ja rmarkp_node - -rmarkp_next_node_: - mov rdx,qword ptr rmarkp_n_queue_items_16 - test rdx,rdx - je end_rmarkp_nodes - - sub rsp,16 - - mov rbp,qword ptr rmarkp_queue_first - - lea rbx,[rbp+rdx] - add rdx,32 - - and rbx,7*32 - - mov qword ptr rmarkp_n_queue_items_16,rdx - jmp rmarkp_last_item_in_queue - -end_rmarkp_nodes: - ret - -rmarkp_lazy_node: - movsxd rbp,dword ptr (-4)[rax] - test rbp,rbp - je rmarkp_next_node - - add rcx,8 - - sub rbp,1 - 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 - jg rmarkp_push_lazy_args - - mov rsi,rcx - mov rcx,qword ptr [rcx] - - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jae rmarkp_node - - 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 - jg rmarkp_closure_with_unboxed_arguments_ - je rmarkp_hnf_1 - jmp rmarkp_next_node - -rmarkp_hnf_0: - cmp rax,offset dINT+2 - je rmarkp_int_3 - - cmp rax,offset CHAR+2 - je rmarkp_char_3 - - jb rmarkp_no_normal_hnf_0 - - if THREAD - mov rbp,qword ptr neg_heap_p3_offset[r9] - else - mov rbp,qword ptr neg_heap_p3 - endif - add rbp,rcx - - mov rdx,rbp - and rdx,31*8 - shr rbp,8 - mov edx,dword ptr (bit_clear_table2)[rdx] - and dword ptr [rdi+rbp*4],edx - - ifdef NEW_DESCRIPTORS - lea rdx,((-8)-2)[rax] - else - lea rdx,((-12)-2)[rax] - endif - mov qword ptr [rsi],rdx - cmp rcx,rbx - ja rmarkp_next_node - mov qword ptr [rcx],rax - jmp rmarkp_next_node - -rmarkp_int_3: - mov rbp,qword ptr 8[rcx] - cmp rbp,33 - jnc rmarkp_next_node - - shl rbp,4 - lea rdx,(small_integers)[rbp] - if THREAD - mov rbp,qword ptr neg_heap_p3_offset[r9] - else - mov rbp,qword ptr neg_heap_p3 - endif - mov qword ptr [rsi],rdx - add rbp,rcx - - mov rdx,rbp - and rdx,31*8 - shr rbp,8 - mov edx,dword ptr (bit_clear_table2)[rdx] - and dword ptr [rdi+rbp*4],edx - - cmp rcx,rbx - ja rmarkp_next_node - mov qword ptr [rcx],rax - jmp rmarkp_next_node - -rmarkp_char_3: - movzx rdx,byte ptr 8[rcx] - if THREAD - mov rbp,qword ptr neg_heap_p3_offset[r9] - else - mov rbp,qword ptr neg_heap_p3 - endif - - shl rdx,4 - add rbp,rcx - add rdx,offset static_characters - mov qword ptr [rsi],rdx - - mov rdx,rbp - and rdx,31*8 - shr rbp,8 - mov edx,dword ptr (bit_clear_table2)[rdx] - and dword ptr [rdi+rbp*4],edx - - cmp rcx,rbx - ja rmarkp_next_node - mov qword ptr [rcx],rax - jmp rmarkp_next_node - -rmarkp_no_normal_hnf_0: - if THREAD - cmp rax,offset __ARRAY__+2 - else - lea r9,__ARRAY__+2 - cmp rax,r9 - endif - 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 - je rmarkp_b_array - - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - 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 - call reorder - - pop rcx - mov rax,rbx - imul rax,qword ptr (-8)[rcx] - jmp rmarkp_lr_array - -rmarkp_b_array: - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - add rax,8 - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[rax] - or dword ptr [rdi+rbp*4],eax - - jmp rmarkp_next_node - -rmarkp_a_record_array: - mov rax,qword ptr 8[rcx] - add rcx,16 - cmp rbx,2 - jb rmarkp_lr_array - - imul rax,rbx - jmp rmarkp_lr_array - -rmarkp_lazy_array: - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jb rmark_array_using_reversal - - mov rax,qword ptr 8[rcx] - add rcx,16 - -rmarkp_lr_array: - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,rcx - shr rbx,3 - add rbx,rax - - mov rdx,rbx - and rbx,31 - shr rdx,5 - mov ebx,dword ptr (bit_set_table)[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] - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmarkp_next_array_node - - mov rbx,rax - and rax,31*8 - shr rbx,8 - mov eax,dword ptr (bit_set_table2)[rax] - mov ebp,dword ptr [rdi+rbx*4] - test rbp,rax - 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] - jne rmarkp_array_nodes - -end_rmarkp_array_node: - add rsp,8 - jmp rmarkp_next_node - -rmarkp_array_node: - sub rsp,16 - mov qword ptr 8[rsp],rsi - mov rbx,rsi - mov qword ptr [rsp],1 - jmp rmarkp_arguments - -rmarkp_array_length_0_1: - lea rcx,-16[rcx] - 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 - jmp rmarkp_hnf_1 + +_TEXT ends + _DATA segment +rmarkp_n_queue_items_16: + dq 0 +rmarkp_queue_first: + dq 0 +rmarkp_queue: + dq 0,0,0,0,0,0,0,0 + dq 0,0,0,0,0,0,0,0 + dq 0,0,0,0,0,0,0,0 + dq 0,0,0,0,0,0,0,0 +_DATA ends + _TEXT segment + +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 + if THREAD + cmp rsi,qword ptr end_vector_offset[r9] + else + cmp rsi,qword ptr end_vector + endif + je end_rmarkp_nodes + +rmarkp_stack_nodes: + mov rcx,qword ptr [rsi] + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmarkp_next_stack_node + + mov rbx,rax + and rax,31*8 + shr rbx,8 + mov eax,dword ptr (bit_set_table2)[rax] + mov ebp,dword ptr [rdi+rbx*4] + test rbp,rax + 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 + if THREAD + cmp rsi,qword ptr end_vector_offset[r9] + else + cmp rsi,qword ptr end_vector + endif + 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: + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + 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 + + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jb rmark_using_reversal + +rmarkp_node: + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmarkp_next_node + + mov rbx,rsi + +rmarkp_node_: + + + + mov rdx,rax + and rax,31*8 + shr rdx,8 + mov eax,dword ptr (bit_set_table2)[rax] + test eax,dword ptr [rdi+rdx*4] + jne rmarkp_reverse_and_mark_next_node + + mov rbp,qword ptr rmarkp_queue_first + mov rdx,qword ptr rmarkp_n_queue_items_16 + + prefetch [rcx] + mov qword ptr rmarkp_queue[rbp],rcx + mov qword ptr rmarkp_queue+8[rbp],rsi + mov qword ptr rmarkp_queue+16[rbp],rbx + lea rbx,[rbp+rdx] + add rbp,32 + + and rbp,7*32 + and rbx,7*32 + + mov qword ptr rmarkp_queue_first,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 + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmarkp_add_items + + mov rdx,rax + and rax,31*8 + shr rdx,8 + mov eax,dword ptr bit_set_table2[rax] + mov ebp,dword ptr [rdi+rdx*4] + test rbp,rax + je rmarkp_add_item + + cmp rcx,rsi + ja rmarkp_add_items + + mov rax,[rcx] + mov [rsi],rax + add rsi,1 + mov [rcx],rsi + jmp rmarkp_add_items + +rmarkp_add_stacked_item: + je rmarkp_last_item_in_queue +rmarkp_add_items2: + mov rsi,8[rsp] + add rsi,8 + if THREAD + cmp rsi,qword ptr end_vector_offset[r9] + else + cmp rsi,qword ptr end_vector + endif + je rmarkp_last_item_in_queue + + mov rcx,[rsi] + mov 8[rsp],rsi + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmarkp_add_items2 + + mov rdx,rax + and rax,31*8 + shr rdx,8 + mov eax,dword ptr bit_set_table2[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 + jmp rmarkp_add_items2 + +rmarkp_add_item2: + prefetch [rcx] + mov rbp,qword ptr rmarkp_queue_first + mov rdx,qword ptr rmarkp_n_queue_items_16 + + mov qword ptr rmarkp_queue[rbp],rcx + mov qword ptr rmarkp_queue+8[rbp],rsi + mov qword ptr rmarkp_queue+16[rbp],-1 + add rbp,32 + and rbp,7*32 + + sub rdx,32 + + mov qword ptr rmarkp_queue_first,rbp + mov qword ptr rmarkp_n_queue_items_16,rdx + + cmp rdx,-(4*32) + jne rmarkp_add_items2 + jmp rmarkp_last_item_in_queue + +rmarkp_add_items3: + mov rsi,8[rsp] + add rsi,8 + cmp rsi,24[rsp] + je rmarkp_last_item_in_queue + + mov rcx,[rsi] + mov 8[rsp],rsi + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmarkp_add_items3 + + mov rdx,rax + and rax,31*8 + shr rdx,8 + mov eax,dword ptr bit_set_table2[rax] + mov ebp,[rdi+rdx*4] + test rbp,rax + je rmarkp_add_item3 + + cmp rcx,rsi + ja rmarkp_add_items3 + + mov rax,[rcx] + mov [rsi],rax + add rsi,1 + mov [rcx],rsi + jmp rmarkp_add_items3 + +rmarkp_add_item3: + prefetch [rcx] + mov rbp,qword ptr rmarkp_queue_first + mov rdx,qword ptr rmarkp_n_queue_items_16 + + mov qword ptr rmarkp_queue[rbp],rcx + mov qword ptr rmarkp_queue+8[rbp],rsi + mov qword ptr rmarkp_queue+16[rbp],rsi + add rbp,32 + and rbp,7*32 + + sub rdx,32 + + mov qword ptr rmarkp_queue_first,rbp + mov qword ptr rmarkp_n_queue_items_16,rdx + + cmp rdx,-(4*32) + jne rmarkp_add_items3 + jmp rmarkp_last_item_in_queue + +rmarkp_add_item: + prefetch [rcx] + mov rbp,qword ptr rmarkp_queue_first + mov rdx,qword ptr rmarkp_n_queue_items_16 + + mov qword ptr rmarkp_queue[rbp],rcx + mov qword ptr rmarkp_queue+8[rbp],rsi + mov qword ptr rmarkp_queue+16[rbp],rsi + add rbp,32 + and rbp,7*32 + + sub rdx,32 + + mov qword ptr rmarkp_queue_first,rbp + mov qword ptr rmarkp_n_queue_items_16,rdx + + cmp rdx,-(4*32) + jne rmarkp_add_items + +rmarkp_last_item_in_queue: + mov rcx,qword ptr rmarkp_queue[rbx] + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + + mov rsi,qword ptr rmarkp_queue+8[rbx] + mov rbx,qword ptr rmarkp_queue+16[rbx] + + add rax,rcx + +rmarkp_node_no_prefetch: + + + + mov rdx,rax + and rax,31*8 + shr rdx,8 + mov eax,dword ptr (bit_set_table2)[rax] + mov ebp,dword ptr [rdi+rdx*4] + test rbp,rax + 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 + 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 + je rmarkp_hnf_2 + jc rmarkp_hnf_1 + +rmarkp_hnf_3: + mov rdx,qword ptr 8[rcx] +rmarkp_hnf_3_: + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jb rmark_using_reversal_ + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbx,rax + and rax,31*8 + shr rbx,8 + mov eax,dword ptr (bit_set_table2)[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 + 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 + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmarkp_next_node + + mov rbx,rdx + jmp rmarkp_node_ + +rmarkp_no_reverse_argument_pointer: + mov rsi,rdx + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmarkp_next_node + mov rbx,rsi + jmp rmarkp_node_no_prefetch + +rmarkp_shared_argument_part: + cmp rdx,rcx + 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 + 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 + jmp rmarkp_hnf_3_ + +rmarkp_record_3_bb: + sub rcx,8 + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[rax] + or dword ptr [rdi+rbp*4],eax + + cmp rdx,rcx + 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 + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + add rax,16 + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[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 + 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 + jmp rmarkp_next_node + +rmarkp_record_3_ab: + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[rax] + or dword ptr [rdi+rbp*4],eax + + cmp rdx,rcx + 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 + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + add rax,8 + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[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 + 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 + jmp rmarkp_hnf_1 + +rmarkp_record_3_aab: + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jb rmark_using_reversal_ + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[rax] + test eax,dword ptr [rdi+rbp*4] + 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 + ja rmarkp_no_reverse_argument_pointer + + lea rbp,3[rsi] + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rbp + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmarkp_next_node + + mov rbx,rdx + jmp rmarkp_node_ + +rmarkp_record_2: + cmp word ptr (-2+2)[rax],1 + ja rmarkp_hnf_2 + je rmarkp_hnf_1 + jmp rmarkp_next_node + +rmarkp_record_1: + cmp word ptr (-2+2)[rax],0 + jne rmarkp_hnf_1 + 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] + jmp rmarkp_node + +; selectors +rmarkp_indirection_node: + if THREAD + mov rdx,qword ptr neg_heap_p3_offset[r9] + else + mov rdx,qword ptr neg_heap_p3 + endif + sub rcx,8 + add rdx,rcx + + mov rbp,rdx + and rbp,31*8 + shr rdx,8 + mov ebp,dword ptr (bit_clear_table2)[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 + ja rmarkp_node_d1 + mov qword ptr [rdx],rax + jmp rmarkp_node_d1 + +rmarkp_selector_node_1: + add rbp,3 + je rmarkp_indirection_node + + mov rdx,qword ptr [rcx] + mov r12,rbx + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,rdx + shr rbx,3 + + add rbp,1 + jle rmarkp_record_selector_node_1 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + mov ebp,dword ptr (bit_set_table)[rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmarkp_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + je rmarkp_hnf_1 + + cmp word ptr (-2)[rbx],2 + jbe rmarkp_small_tuple_or_record + +rmarkp_large_tuple_or_record: + mov d2,qword ptr 16[rdx] + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,d2 + shr rbx,3 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + mov ebp,dword ptr (bit_set_table)[rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmarkp_hnf_1 + + ifdef NEW_DESCRIPTORS + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + lea rbx,(-8)[rcx+rbx] + + mov eax,(-8)[rax] + + mov d3,rbx + and d3,31*8 + shr rbx,8 + mov d3d,dword ptr (bit_clear_table2)[d3] + and dword ptr [rdi+rbx*4],d3d + + movzx eax,word ptr 4[rax] + mov rbx,r12 + + mov qword ptr (-8)[rcx],offset __indirection + + 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)[d2+rax] + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rcx + jmp rmarkp_node_d1 + +rmarkp_tuple_selector_node_2: + mov rcx,qword ptr [d2] + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rcx + jmp rmarkp_node_d1 + else +rmarkp_small_tuple_or_record: + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + lea rbx,(-8)[rcx+rbx] + + push rcx + + mov rcx,rbx + and rcx,31*8 + shr rbx,8 + mov ecx,dword ptr (bit_clear_table2)[rcx] + and dword ptr [rdi+rbx*4],ecx + + mov eax,(-8)[rax] + + mov rcx,rdx + push rsi + mov eax,4[rax] + call near ptr rax + pop rsi + pop rdx + + mov qword ptr [rsi],rcx + + mov rbx,r12 + + mov qword ptr (-8)[rdx],offset __indirection + mov qword ptr [rdx],rcx + jmp rmarkp_node_d1 + endif + +rmarkp_record_selector_node_1: + je rmarkp_strict_record_selector_node_1 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + mov ebp,dword ptr (bit_set_table)[rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmarkp_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + je rmarkp_hnf_1 + + cmp word ptr (-2)[rbx],258 + jbe rmarkp_small_tuple_or_record + + ifdef NEW_DESCRIPTORS + mov d2,qword ptr 16[rdx] + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,d2 + shr rbx,3 + + mov rbp,rbx + shr rbx,5 + and rbp,31 + mov ebp,dword ptr (bit_set_table)[rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmarkp_hnf_1 + +rmarkp_small_tuple_or_record: + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + + lea rbx,(-8)[rcx+rbx] + + mov eax,(-8)[rax] + + mov d3,rbx + and d3,31*8 + shr rbx,8 + mov d3d,dword ptr (bit_clear_table2)[d3] + and dword ptr [rdi+rbx*4],d3d + + movzx eax,word ptr 4[rax] + mov rbx,r12 + + mov qword ptr (-8)[rcx],offset __indirection + + cmp rax,16 + jle rmarkp_tuple_or_record_selector_node_2 + mov rdx,d2 + 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 + jmp rmarkp_node_d1 + else + jmp rmarkp_large_tuple_or_record + endif + +rmarkp_strict_record_selector_node_1: + mov rbp,rbx + shr rbx,5 + and rbp,31 + mov ebp,dword ptr (bit_set_table)[rbp*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmarkp_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + je rmarkp_hnf_1 + + cmp word ptr (-2)[rbx],258 + jbe rmarkp_select_from_small_record + + mov d2,qword ptr 16[rdx] + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,d2 + mov rbp,rbx + + shr rbx,8 + and rbp,31*8 + mov ebp,dword ptr (bit_set_table2)[rbp] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rbp + jne rmarkp_hnf_1 + +rmarkp_select_from_small_record: + mov ebx,(-8)[rax] + sub rcx,8 + + cmp rcx,r12 + ja rmarkp_selector_pointer_not_reversed + + ifdef NEW_DESCRIPTORS + movzx eax,word ptr 4[rbx] + cmp rax,16 + jle rmarkp_strict_record_selector_node_2 + mov rax,qword ptr (-24)[d2+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[rbx] + test rax,rax + je rmarkp_strict_record_selector_node_5 + cmp rax,16 + jle rmarkp_strict_record_selector_node_4 + mov rdx,d2 + 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)[rbx] + else + mov qword ptr [rcx],rax + mov qword ptr [rsi],rcx + + push rsi + mov ebx,4[rbx] + call near ptr rbx + pop rsi + + mov rax,qword ptr [rcx] + endif + add rsi,1 + mov qword ptr [rcx],rsi + mov qword ptr (-1)[rsi],rax + jmp rmarkp_next_node + +rmarkp_selector_pointer_not_reversed: + ifdef NEW_DESCRIPTORS + movzx eax,word ptr 4[rbx] + cmp rax,16 + jle rmarkp_strict_record_selector_node_6 + mov rax,qword ptr (-24)[d2+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[rbx] + test rax,rax + je rmarkp_strict_record_selector_node_9 + cmp rax,16 + jle rmarkp_strict_record_selector_node_8 + mov rdx,d2 + 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)[rbx] + mov qword ptr [rcx],rax + else + mov ebx,4[rbx] + call near ptr rbx + endif + jmp rmarkp_next_node + +rmarkp_reverse_and_mark_next_node: + cmp rcx,rbx + 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 + ja rmarkp_node + +rmarkp_next_node_: + mov rdx,qword ptr rmarkp_n_queue_items_16 + test rdx,rdx + je end_rmarkp_nodes + + sub rsp,16 + + mov rbp,qword ptr rmarkp_queue_first + + lea rbx,[rbp+rdx] + add rdx,32 + + and rbx,7*32 + + mov qword ptr rmarkp_n_queue_items_16,rdx + jmp rmarkp_last_item_in_queue + +end_rmarkp_nodes: + ret + +rmarkp_lazy_node: + movsxd rbp,dword ptr (-4)[rax] + test rbp,rbp + je rmarkp_next_node + + add rcx,8 + + sub rbp,1 + 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 + jg rmarkp_push_lazy_args + + mov rsi,rcx + mov rcx,qword ptr [rcx] + + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jae rmarkp_node + + 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 + jg rmarkp_closure_with_unboxed_arguments_ + je rmarkp_hnf_1 + jmp rmarkp_next_node + +rmarkp_hnf_0: + cmp rax,offset dINT+2 + je rmarkp_int_3 + + cmp rax,offset CHAR+2 + je rmarkp_char_3 + + jb rmarkp_no_normal_hnf_0 + + if THREAD + mov rbp,qword ptr neg_heap_p3_offset[r9] + else + mov rbp,qword ptr neg_heap_p3 + endif + add rbp,rcx + + mov rdx,rbp + and rdx,31*8 + shr rbp,8 + mov edx,dword ptr (bit_clear_table2)[rdx] + and dword ptr [rdi+rbp*4],edx + + ifdef NEW_DESCRIPTORS + lea rdx,((-8)-2)[rax] + else + lea rdx,((-12)-2)[rax] + endif + mov qword ptr [rsi],rdx + cmp rcx,rbx + ja rmarkp_next_node + mov qword ptr [rcx],rax + jmp rmarkp_next_node + +rmarkp_int_3: + mov rbp,qword ptr 8[rcx] + cmp rbp,33 + jnc rmarkp_next_node + + shl rbp,4 + lea rdx,(small_integers)[rbp] + if THREAD + mov rbp,qword ptr neg_heap_p3_offset[r9] + else + mov rbp,qword ptr neg_heap_p3 + endif + mov qword ptr [rsi],rdx + add rbp,rcx + + mov rdx,rbp + and rdx,31*8 + shr rbp,8 + mov edx,dword ptr (bit_clear_table2)[rdx] + and dword ptr [rdi+rbp*4],edx + + cmp rcx,rbx + ja rmarkp_next_node + mov qword ptr [rcx],rax + jmp rmarkp_next_node + +rmarkp_char_3: + movzx rdx,byte ptr 8[rcx] + if THREAD + mov rbp,qword ptr neg_heap_p3_offset[r9] + else + mov rbp,qword ptr neg_heap_p3 + endif + + shl rdx,4 + add rbp,rcx + add rdx,offset static_characters + mov qword ptr [rsi],rdx + + mov rdx,rbp + and rdx,31*8 + shr rbp,8 + mov edx,dword ptr (bit_clear_table2)[rdx] + and dword ptr [rdi+rbp*4],edx + + cmp rcx,rbx + ja rmarkp_next_node + mov qword ptr [rcx],rax + jmp rmarkp_next_node + +rmarkp_no_normal_hnf_0: + if THREAD + cmp rax,offset __ARRAY__+2 + else + lea r9,__ARRAY__+2 + cmp rax,r9 + endif + 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 + je rmarkp_b_array + + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + 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 + call reorder + + pop rcx + mov rax,rbx + imul rax,qword ptr (-8)[rcx] + jmp rmarkp_lr_array + +rmarkp_b_array: + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + add rax,8 + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[rax] + or dword ptr [rdi+rbp*4],eax + + jmp rmarkp_next_node + +rmarkp_a_record_array: + mov rax,qword ptr 8[rcx] + add rcx,16 + cmp rbx,2 + jb rmarkp_lr_array + + imul rax,rbx + jmp rmarkp_lr_array + +rmarkp_lazy_array: + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jb rmark_array_using_reversal + + mov rax,qword ptr 8[rcx] + add rcx,16 + +rmarkp_lr_array: + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,rcx + shr rbx,3 + add rbx,rax + + mov rdx,rbx + and rbx,31 + shr rdx,5 + mov ebx,dword ptr (bit_set_table)[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] + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmarkp_next_array_node + + mov rbx,rax + and rax,31*8 + shr rbx,8 + mov eax,dword ptr (bit_set_table2)[rax] + mov ebp,dword ptr [rdi+rbx*4] + test rbp,rax + 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] + jne rmarkp_array_nodes + +end_rmarkp_array_node: + add rsp,8 + jmp rmarkp_next_node + +rmarkp_array_node: + sub rsp,16 + mov qword ptr 8[rsp],rsi + mov rbx,rsi + mov qword ptr [rsp],1 + jmp rmarkp_arguments + +rmarkp_array_length_0_1: + lea rcx,-16[rcx] + 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 + jmp rmarkp_hnf_1 diff --git a/thread/acompact_rmarkr.asm b/thread/acompact_rmarkr.asm index 56a91a0..21d25c7 100644 --- a/thread/acompact_rmarkr.asm +++ b/thread/acompact_rmarkr.asm @@ -1,1095 +1,1095 @@ - -rmark_using_reversal: - push rsi - push rsi - mov rsi,1 - jmp rmarkr_node - -rmark_using_reversal_: - sub rcx,8 - push rbx - push rsi - cmp rcx,rbx - ja rmark_no_undo_reverse_1 - mov qword ptr [rsi],rcx - mov qword ptr [rcx],rax -rmark_no_undo_reverse_1: - mov rsi,1 - jmp rmarkr_arguments - -rmark_array_using_reversal: - push rbx - push rsi - cmp rcx,rbx - ja rmark_no_undo_reverse_2 - mov qword ptr [rsi],rcx - mov qword ptr [rcx],offset __ARRAY__+2 -rmark_no_undo_reverse_2: - mov rsi,1 - jmp rmarkr_arguments - -rmarkr_hnf_2: - or qword ptr [rcx],2 - mov rbp,qword ptr 8[rcx] - mov qword ptr 8[rcx],rsi - lea rsi,8[rcx] - mov rcx,rbp - -rmarkr_node: - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - if THREAD - cmp rax,qword ptr heap_size_64_65_offset[r9] - else - cmp rax,qword ptr heap_size_64_65 - endif - jnc rmarkr_next_node_after_static - - mov rbx,rax - and rax,31*8 - shr rbx,8 - - mov eax,dword ptr (bit_set_table2)[rax] - mov ebp,dword ptr [rdi+rbx*4] - - test rbp,rax - jne rmarkr_next_node - - or rbp,rax - mov dword ptr [rdi+rbx*4],ebp - -rmarkr_arguments: - mov rax,qword ptr [rcx] - test al,2 - je rmarkr_lazy_node - - movzx rbp,word ptr (-2)[rax] - test rbp,rbp - je rmarkr_hnf_0 - - add rcx,8 - - cmp rbp,256 - jae rmarkr_record - - sub rbp,2 - je rmarkr_hnf_2 - jc rmarkr_hnf_1 - -rmarkr_hnf_3: - mov rdx,qword ptr 8[rcx] - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbx,rax - and rax,31*8 - shr rbx,8 - mov eax,dword ptr (bit_set_table2)[rax] - test eax,[rdi+rbx*4] - jne rmarkr_shared_argument_part - - or dword ptr [rdi+rbx*4],eax - -rmarkr_no_shared_argument_part: - or qword ptr [rcx],2 - mov qword ptr 8[rcx],rsi - add rcx,8 - - or qword ptr [rdx],1 - lea rdx,[rdx+rbp*8] - - mov rbp,qword ptr [rdx] - mov qword ptr [rdx],rcx - mov rsi,rdx - mov rcx,rbp - jmp rmarkr_node - -rmarkr_shared_argument_part: - cmp rdx,rcx - ja rmarkr_hnf_1 - - mov rbx,qword ptr [rdx] - lea rax,(8+2+1)[rcx] - mov qword ptr [rdx],rax - mov qword ptr 8[rcx],rbx - jmp rmarkr_hnf_1 - -rmarkr_record: - sub rbp,258 - je rmarkr_record_2 - jb rmarkr_record_1 - -rmarkr_record_3: - movzx rbp,word ptr (-2+2)[rax] - sub rbp,1 - jb rmarkr_record_3_bb - je rmarkr_record_3_ab - dec rbp - je rmarkr_record_3_aab - jmp rmarkr_hnf_3 - -rmarkr_record_3_bb: - mov rdx,qword ptr (16-8)[rcx] - sub rcx,8 - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[rax] - or dword ptr [rdi+rbp*4],eax - - cmp rdx,rcx - ja rmarkr_next_node - - add eax,eax - jne rmarkr_bit_in_same_word1 - inc rbp - mov rax,1 -rmarkr_bit_in_same_word1: - test eax,dword ptr [rdi+rbp*4] - je rmarkr_not_yet_linked_bb - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - add rax,2*8 - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[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 - jmp rmarkr_next_node - -rmarkr_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 - jmp rmarkr_next_node - -rmarkr_record_3_ab: - mov rdx,qword ptr 8[rcx] - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[rax] - or dword ptr [rdi+rbp*4],eax - - cmp rdx,rcx - ja rmarkr_hnf_1 - - add eax,eax - jne rmarkr_bit_in_same_word2 - inc rbp - mov rax,1 -rmarkr_bit_in_same_word2: - test eax,dword ptr [rdi+rbp*4] - je rmarkr_not_yet_linked_ab - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - - add rax,8 - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[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 - jmp rmarkr_hnf_1 - -rmarkr_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 - jmp rmarkr_hnf_1 - -rmarkr_record_3_aab: - mov rdx,qword ptr 8[rcx] - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdx - - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr (bit_set_table2)[rax] - test eax,dword ptr [rdi+rbp*4] - jne rmarkr_shared_argument_part - or dword ptr [rdi+rbp*4],eax - - add qword ptr [rcx],2 - mov qword ptr 8[rcx],rsi - add rcx,8 - - mov rsi,qword ptr [rdx] - mov qword ptr [rdx],rcx - mov rcx,rsi - lea rsi,1[rdx] - jmp rmarkr_node - -rmarkr_record_2: - cmp word ptr (-2+2)[rax],1 - ja rmarkr_hnf_2 - je rmarkr_hnf_1 - sub rcx,8 - jmp rmarkr_next_node - -rmarkr_record_1: - cmp word ptr (-2+2)[rax],0 - jne rmarkr_hnf_1 - sub rcx,8 - jmp rmarkr_next_node - -rmarkr_lazy_node_1: - jne rmarkr_selector_node_1 - -rmarkr_hnf_1: - mov rbp,qword ptr [rcx] - mov qword ptr [rcx],rsi - - lea rsi,2[rcx] - mov rcx,rbp - jmp rmarkr_node - -rmarkr_indirection_node: - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - lea rbx,(-8)[rcx+rbx] - - mov rax,rbx - and rax,31*8 - shr rbx,8 - mov eax,dword ptr (bit_clear_table2)[rax] - and dword ptr [rdi+rbx*4],eax - - mov rcx,qword ptr [rcx] - jmp rmarkr_node - -rmarkr_selector_node_1: - add rbp,3 - je rmarkr_indirection_node - - mov rdx,qword ptr [rcx] - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,rdx - shr rbx,3 - - add rbp,1 - jle rmarkr_record_selector_node_1 - - push rax - mov rax,rbx - - shr rbx,5 - and rax,31 - - mov eax,dword ptr (bit_set_table)[rax*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rax - - pop rax - jne rmarkr_hnf_1 - - mov rbx,qword ptr [rdx] - test bl,2 - je rmarkr_hnf_1 - - cmp word ptr (-2)[rbx],2 - jbe rmarkr_small_tuple_or_record - -rmarkr_large_tuple_or_record: - mov rbx,qword ptr 16[rdx] - if THREAD - add rbx,qword ptr neg_heap_p3_offset[r9] - else - add rbx,qword ptr neg_heap_p3 - endif - shr rbx,3 - - push rax - mov rax,rbx - - shr rbx,5 - and rax,31 - - mov eax,dword ptr (bit_set_table)[rax*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rax - - pop rax - jne rmarkr_hnf_1 - - ifdef NEW_DESCRIPTORS - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - lea rbx,(-8)[rcx+rbx] - - push rcx - - mov eax,dword ptr (-8)[rax] - - mov rcx,rbx - and rcx,31*8 - shr rbx,8 - mov ecx,dword ptr (bit_clear_table2)[rcx] - and dword ptr [rdi+rbx*4],ecx - - movzx eax,word ptr 4[rax] - cmp rax,16 - jl rmarkr_tuple_or_record_selector_node_2 - mov rdx,qword ptr 16[rdx] - je rmarkr_tuple_selector_node_2 - mov rcx,qword ptr (-24)[rdx+rax] - pop rdx - mov qword ptr (-8)[rdx],offset __indirection - mov qword ptr [rdx],rcx - jmp rmarkr_node - -rmarkr_tuple_selector_node_2: - mov rcx,qword ptr [rdx] - pop rdx - mov qword ptr (-8)[rdx],offset __indirection - mov qword ptr [rdx],rcx - jmp rmarkr_node - else -rmarkr_small_tuple_or_record: - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - lea rbx,(-8)[rcx+rbx] - - push rcx - - mov rcx,rbx - and rcx,31*8 - shr rbx,8 - mov ecx,dword ptr (bit_clear_table2)[rcx] - and dword ptr [rdi+rbx*4],ecx - - mov eax,(-8)[rax] - - mov rcx,rdx - push rbp - mov eax,4[rax] - call near ptr rax - pop rbp - pop rdx - - mov qword ptr (-8)[rdx],offset __indirection - mov qword ptr [rdx],rcx - jmp rmarkr_node - endif - -rmarkr_record_selector_node_1: - je rmarkr_strict_record_selector_node_1 - - push rax - mov rax,rbx - - shr rbx,5 - and rax,31 - - mov eax,dword ptr (bit_set_table)[rax*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rax - - pop rax - jne rmarkr_hnf_1 - - mov rbx,qword ptr [rdx] - test bl,2 - je rmarkr_hnf_1 - - cmp word ptr (-2)[rbx],258 - ifdef NEW_DESCRIPTORS - jbe rmarkr_small_tuple_or_record - - mov rbx,qword ptr 16[rdx] - if THREAD - add rbx,qword ptr neg_heap_p3_offset[r9] - else - add rbx,qword ptr neg_heap_p3 - endif - shr rbx,3 - - push rax - mov rax,rbx - shr rbx,5 - and rax,31 - mov eax,dword ptr (bit_set_table)[rax*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rax - pop rax - jne rmarkr_hnf_1 - -rmarkr_small_tuple_or_record: - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - lea rbx,(-8)[rcx+rbx] - - push rcx - - mov eax,(-8)[rax] - - mov rcx,rbx - and rcx,31*8 - shr rbx,8 - mov ecx,dword ptr (bit_clear_table2)[rcx] - and dword ptr [rdi+rbx*4],ecx - - movzx eax,word ptr 4[rax] - cmp rax,16 - jle rmarkr_tuple_or_record_selector_node_2 - mov rdx,qword ptr 16[rdx] - sub rax,24 -rmarkr_tuple_or_record_selector_node_2: - mov rcx,qword ptr [rdx+rax] - pop rdx - mov qword ptr (-8)[rdx],offset __indirection - mov qword ptr [rdx],rcx - jmp rmarkr_node - else - jbe rmarkr_small_tuple_or_record - jmp rmarkr_large_tuple_or_record - endif - -rmarkr_strict_record_selector_node_1: - push rax - mov rax,rbx - - shr rbx,5 - and rax,31 - - mov eax,dword ptr (bit_set_table)[rax*4] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rax - - pop rax - jne rmarkr_hnf_1 - - mov rbx,qword ptr [rdx] - test bl,2 - je rmarkr_hnf_1 - - cmp word ptr (-2)[rbx],258 - jbe rmarkr_select_from_small_record - - mov rbx,qword ptr 16[rdx] - if THREAD - add rbx,qword ptr neg_heap_p3_offset[r9] - else - add rbx,qword ptr neg_heap_p3 - endif - - push rax - mov rax,rbx - - shr rbx,8 - and rax,31*8 - - mov eax,dword ptr (bit_set_table2)[rax] - mov ebx,dword ptr [rdi+rbx*4] - and rbx,rax - - pop rax - jne rmarkr_hnf_1 - -rmarkr_select_from_small_record: - mov eax,(-8)[rax] - sub rcx,8 - - ifdef NEW_DESCRIPTORS - movzx ebx,word ptr 4[rax] - cmp rbx,16 - jle rmarkr_strict_record_selector_node_2 - add rbx,qword ptr 16[rdx] - mov rbx,qword ptr (-24)[rbx] - jmp rmarkr_strict_record_selector_node_3 -rmarkr_strict_record_selector_node_2: - mov rbx,qword ptr [rdx+rbx] -rmarkr_strict_record_selector_node_3: - mov qword ptr 8[rcx],rbx - - movzx ebx,word ptr 6[rax] - test rbx,rbx - je rmarkr_strict_record_selector_node_5 - cmp rbx,16 - jle rmarkr_strict_record_selector_node_4 - mov rdx,qword ptr 16[rdx] - sub rbx,24 -rmarkr_strict_record_selector_node_4: - mov rbx,qword ptr [rdx+rbx] - mov qword ptr 16[rcx],rbx -rmarkr_strict_record_selector_node_5: - - mov rax,qword ptr (-8)[rbx] - mov qword ptr [rcx],rax - else - mov eax,4[rax] - call near ptr rax - endif - jmp rmarkr_next_node - -; a2,d1: free - -rmarkr_next_node: - test rsi,3 - jne rmarkr_parent - - mov rbp,qword ptr (-8)[rsi] - mov rbx,3 - - and rbx,rbp - sub rsi,8 - - cmp rbx,3 - je rmarkr_argument_part_cycle1 - - mov rdx,qword ptr 8[rsi] - mov qword ptr [rsi],rdx - -rmarkr_c_argument_part_cycle1: - cmp rcx,rsi - ja rmarkr_no_reverse_1 - - mov rdx,qword ptr [rcx] - lea rax,(8+1)[rsi] - mov qword ptr 8[rsi],rdx - mov qword ptr [rcx],rax - - or rsi,rbx - mov rcx,rbp - xor rcx,rbx - jmp rmarkr_node - -rmarkr_no_reverse_1: - mov qword ptr 8[rsi],rcx - mov rcx,rbp - or rsi,rbx - xor rcx,rbx - jmp rmarkr_node - -rmarkr_lazy_node: - movsxd rbp,dword ptr (-4)[rax] - test rbp,rbp - je rmarkr_next_node - - add rcx,8 - - sub rbp,1 - jle rmarkr_lazy_node_1 - - cmp rbp,255 - jge rmarkr_closure_with_unboxed_arguments - -rmarkr_closure_with_unboxed_arguments_: - or qword ptr [rcx],2 - lea rcx,[rcx+rbp*8] - - mov rbp,qword ptr [rcx] - mov qword ptr [rcx],rsi - mov rsi,rcx - mov rcx,rbp - jmp rmarkr_node - -rmarkr_closure_with_unboxed_arguments: -; (a_size+b_size)+(b_size<<8) -; add rbp,1 - mov rax,rbp - and rbp,255 - shr rax,8 - sub rbp,rax -; sub rbp,1 - jg rmarkr_closure_with_unboxed_arguments_ - je rmarkr_hnf_1 - sub rcx,8 - jmp rmarkr_next_node - -rmarkr_hnf_0: - cmp rax,offset dINT+2 - je rmarkr_int_3 - - cmp rax,offset CHAR+2 - je rmarkr_char_3 - - jb rmarkr_no_normal_hnf_0 - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,rcx - - mov rcx,rbx - and rcx,31*8 - shr rbx,8 - mov ecx,dword ptr (bit_clear_table2)[rcx] - and dword ptr [rdi+rbx*4],ecx - - ifdef NEW_DESCRIPTORS - lea rcx,((-8)-2)[rax] - else - lea rcx,((-12)-2)[rax] - endif - jmp rmarkr_next_node_after_static - -rmarkr_int_3: - mov rbp,qword ptr 8[rcx] - cmp rbp,33 - jnc rmarkr_next_node - - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,rcx - - mov rcx,rbx - and rcx,31*8 - shr rbx,8 - mov ecx,dword ptr (bit_clear_table2)[rcx] - shl rbp,4 - and dword ptr [rdi+rbx*4],ecx - - lea rcx,(small_integers)[rbp] - jmp rmarkr_next_node_after_static - -rmarkr_char_3: - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - - movzx rax,byte ptr 8[rcx] - add rbx,rcx - - mov rbp,rbx - and rbp,31*8 - shr rbx,8 - mov ebp,dword ptr (bit_clear_table2)[rbp] - and dword ptr [rdi+rbx*4],ebp - - shl rax,4 - lea rcx,static_characters[rax] - jmp rmarkr_next_node_after_static - -rmarkr_no_normal_hnf_0: - if THREAD - cmp rax,offset __ARRAY__+2 - else - lea r9,__ARRAY__+2 - cmp rax,r9 - endif - jne rmarkr_next_node - - mov rax,qword ptr 16[rcx] - test rax,rax - je rmarkr_lazy_array - - movzx rbx,word ptr (-2+2)[rax] - test rbx,rbx - je rmarkr_b_array - - movzx rax,word ptr (-2)[rax] - test rax,rax - je rmarkr_b_array - - sub rax,256 - cmp rbx,rax - je rmarkr_a_record_array - -rmarkr_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 - call reorder - - pop rcx - mov rax,rbx - imul rax,qword ptr (-8)[rcx] - jmp rmarkr_lr_array - -rmarkr_b_array: - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rcx - add rax,8 - mov rbp,rax - and rax,31*8 - shr rbp,8 - mov eax,dword ptr bit_set_table2[rax] - or dword ptr [rdi+rbp*4],eax - jmp rmarkr_next_node - -rmarkr_a_record_array: - mov rax,qword ptr 8[rcx] - add rcx,16 - cmp rbx,2 - jb rmarkr_lr_array - - imul rax,rbx - jmp rmarkr_lr_array - -rmarkr_lazy_array: - mov rax,qword ptr 8[rcx] - add rcx,16 - -rmarkr_lr_array: - if THREAD - mov rbx,qword ptr neg_heap_p3_offset[r9] - else - mov rbx,qword ptr neg_heap_p3 - endif - add rbx,rcx - shr rbx,3 - add rbx,rax - - mov rdx,rbx - and rbx,31 - shr rdx,5 - mov ebx,dword ptr (bit_set_table)[rbx*4] - or dword ptr [rdi+rdx*4],ebx - - cmp rax,1 - jbe rmarkr_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 - add rax,2 - mov rbx,qword ptr (-8)[rdx] - sub rdx,8 - mov qword ptr [rcx],rbx - mov qword ptr [rdx],rax - - mov rax,qword ptr (-8)[rcx] - sub rcx,8 - mov qword ptr [rcx],rsi - mov rsi,rcx - mov rcx,rax - jmp rmarkr_node - -rmarkr_array_length_0_1: - lea rcx,-16[rcx] - jb rmarkr_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 - jmp rmarkr_hnf_1 - -; a2: free - -rmarkr_parent: - mov rbx,rsi - and rbx,3 - - and rsi,-4 - je end_rmarkr - - sub rbx,1 - je rmarkr_argument_part_parent - - mov rbp,qword ptr [rsi] - - cmp rcx,rsi - ja rmarkr_no_reverse_2 - - mov rdx,rcx - lea rax,1[rsi] - mov rcx,qword ptr [rdx] - mov qword ptr [rdx],rax - -rmarkr_no_reverse_2: - mov qword ptr [rsi],rcx - lea rcx,(-8)[rsi] - mov rsi,rbp - jmp rmarkr_next_node - -rmarkr_argument_part_parent: - mov rbp,qword ptr [rsi] - - mov rdx,rsi - mov rsi,rcx - mov rcx,rdx - -rmarkr_skip_upward_pointers: - mov rax,rbp - and rax,3 - cmp rax,3 - jne rmarkr_no_upward_pointer - - lea rdx,(-3)[rbp] - mov rbp,qword ptr (-3)[rbp] - jmp rmarkr_skip_upward_pointers - -rmarkr_no_upward_pointer: - cmp rsi,rcx - ja rmarkr_no_reverse_3 - - mov rbx,rsi - mov rsi,qword ptr [rsi] - lea rax,1[rcx] - mov qword ptr [rbx],rax - -rmarkr_no_reverse_3: - mov qword ptr [rdx],rsi - lea rsi,(-8)[rbp] - - and rsi,-4 - - mov rdx,rsi - mov rbx,3 - - mov rbp,qword ptr [rsi] - - and rbx,rbp - mov rax,qword ptr 8[rdx] - - or rsi,rbx - mov qword ptr [rdx],rax - - cmp rcx,rdx - ja rmarkr_no_reverse_4 - - mov rax,qword ptr [rcx] - mov qword ptr 8[rdx],rax - lea rax,(8+2+1)[rdx] - mov qword ptr [rcx],rax - mov rcx,rbp - and rcx,-4 - jmp rmarkr_node - -rmarkr_no_reverse_4: - mov qword ptr 8[rdx],rcx - mov rcx,rbp - and rcx,-4 - jmp rmarkr_node - -rmarkr_argument_part_cycle1: - mov rax,qword ptr 8[rsi] - push rdx - -rmarkr_skip_pointer_list1: - mov rdx,rbp - and rdx,-4 - mov rbp,qword ptr [rdx] - mov rbx,3 - and rbx,rbp - cmp rbx,3 - je rmarkr_skip_pointer_list1 - - mov qword ptr [rdx],rax - pop rdx - jmp rmarkr_c_argument_part_cycle1 - -rmarkr_next_node_after_static: - test rsi,3 - jne rmarkr_parent_after_static - - mov rbp,qword ptr (-8)[rsi] - mov rbx,3 - - and rbx,rbp - sub rsi,8 - - cmp rbx,3 - je rmarkr_argument_part_cycle2 - - mov rax,qword ptr 8[rsi] - mov qword ptr [rsi],rax - -rmarkr_c_argument_part_cycle2: - mov qword ptr 8[rsi],rcx - mov rcx,rbp - or rsi,rbx - xor rcx,rbx - jmp rmarkr_node - -rmarkr_parent_after_static: - mov rbx,rsi - and rbx,3 - - and rsi,-4 - je end_rmarkr_after_static - - sub rbx,1 - je rmarkr_argument_part_parent_after_static - - mov rbp,qword ptr [rsi] - mov qword ptr [rsi],rcx - lea rcx,(-8)[rsi] - mov rsi,rbp - jmp rmarkr_next_node - -rmarkr_argument_part_parent_after_static: - mov rbp,qword ptr [rsi] - - mov rdx,rsi - mov rsi,rcx - mov rcx,rdx - -; movl rbp,qword ptr [rdx] -rmarkr_skip_upward_pointers_2: - mov rax,rbp - and rax,3 - cmp rax,3 - jne rmarkr_no_reverse_3 - - lea rdx,(-3)[rbp] - mov rbp,qword ptr (-3)[rbp] - jmp rmarkr_skip_upward_pointers_2 - -rmarkr_argument_part_cycle2: - mov rax,qword ptr 8[rsi] - push rdx - -rmarkr_skip_pointer_list2: - mov rdx,rbp - and rdx,-4 - mov rbp,qword ptr [rdx] - mov rbx,3 - and rbx,rbp - cmp rbx,3 - je rmarkr_skip_pointer_list2 - - mov qword ptr [rdx],rax - pop rdx - jmp rmarkr_c_argument_part_cycle2 - -end_rmarkr_after_static: - mov rsi,qword ptr [rsp] - add rsp,16 - mov qword ptr [rsi],rcx - jmp rmarkr_next_stack_node - -end_rmarkr: - pop rsi - pop rbx - - cmp rcx,rbx - ja rmarkr_no_reverse_5 - - mov rdx,rcx - lea rax,1[rsi] - mov rcx,qword ptr [rcx] - mov qword ptr [rdx],rax - -rmarkr_no_reverse_5: - mov qword ptr [rsi],rcx - -rmarkr_next_stack_node: - if THREAD - cmp rsp,qword ptr end_stack_offset[r9] - else - cmp rsp,qword ptr end_stack - endif - jae rmarkr_end - - mov rcx,qword ptr [rsp] - mov rsi,qword ptr 8[rsp] - add rsp,16 - - cmp rcx,1 - ja rmark_using_reversal - - test qword ptr flags,4096 - je rmark_next_node_ - jmp rmarkp_next_node_ - -rmarkr_end: - test qword ptr flags,4096 - je rmark_next_node - jmp rmarkp_next_node + +rmark_using_reversal: + push rsi + push rsi + mov rsi,1 + jmp rmarkr_node + +rmark_using_reversal_: + sub rcx,8 + push rbx + push rsi + cmp rcx,rbx + ja rmark_no_undo_reverse_1 + mov qword ptr [rsi],rcx + mov qword ptr [rcx],rax +rmark_no_undo_reverse_1: + mov rsi,1 + jmp rmarkr_arguments + +rmark_array_using_reversal: + push rbx + push rsi + cmp rcx,rbx + ja rmark_no_undo_reverse_2 + mov qword ptr [rsi],rcx + mov qword ptr [rcx],offset __ARRAY__+2 +rmark_no_undo_reverse_2: + mov rsi,1 + jmp rmarkr_arguments + +rmarkr_hnf_2: + or qword ptr [rcx],2 + mov rbp,qword ptr 8[rcx] + mov qword ptr 8[rcx],rsi + lea rsi,8[rcx] + mov rcx,rbp + +rmarkr_node: + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + if THREAD + cmp rax,qword ptr heap_size_64_65_offset[r9] + else + cmp rax,qword ptr heap_size_64_65 + endif + jnc rmarkr_next_node_after_static + + mov rbx,rax + and rax,31*8 + shr rbx,8 + + mov eax,dword ptr (bit_set_table2)[rax] + mov ebp,dword ptr [rdi+rbx*4] + + test rbp,rax + jne rmarkr_next_node + + or rbp,rax + mov dword ptr [rdi+rbx*4],ebp + +rmarkr_arguments: + mov rax,qword ptr [rcx] + test al,2 + je rmarkr_lazy_node + + movzx rbp,word ptr (-2)[rax] + test rbp,rbp + je rmarkr_hnf_0 + + add rcx,8 + + cmp rbp,256 + jae rmarkr_record + + sub rbp,2 + je rmarkr_hnf_2 + jc rmarkr_hnf_1 + +rmarkr_hnf_3: + mov rdx,qword ptr 8[rcx] + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbx,rax + and rax,31*8 + shr rbx,8 + mov eax,dword ptr (bit_set_table2)[rax] + test eax,[rdi+rbx*4] + jne rmarkr_shared_argument_part + + or dword ptr [rdi+rbx*4],eax + +rmarkr_no_shared_argument_part: + or qword ptr [rcx],2 + mov qword ptr 8[rcx],rsi + add rcx,8 + + or qword ptr [rdx],1 + lea rdx,[rdx+rbp*8] + + mov rbp,qword ptr [rdx] + mov qword ptr [rdx],rcx + mov rsi,rdx + mov rcx,rbp + jmp rmarkr_node + +rmarkr_shared_argument_part: + cmp rdx,rcx + ja rmarkr_hnf_1 + + mov rbx,qword ptr [rdx] + lea rax,(8+2+1)[rcx] + mov qword ptr [rdx],rax + mov qword ptr 8[rcx],rbx + jmp rmarkr_hnf_1 + +rmarkr_record: + sub rbp,258 + je rmarkr_record_2 + jb rmarkr_record_1 + +rmarkr_record_3: + movzx rbp,word ptr (-2+2)[rax] + sub rbp,1 + jb rmarkr_record_3_bb + je rmarkr_record_3_ab + dec rbp + je rmarkr_record_3_aab + jmp rmarkr_hnf_3 + +rmarkr_record_3_bb: + mov rdx,qword ptr (16-8)[rcx] + sub rcx,8 + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[rax] + or dword ptr [rdi+rbp*4],eax + + cmp rdx,rcx + ja rmarkr_next_node + + add eax,eax + jne rmarkr_bit_in_same_word1 + inc rbp + mov rax,1 +rmarkr_bit_in_same_word1: + test eax,dword ptr [rdi+rbp*4] + je rmarkr_not_yet_linked_bb + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + add rax,2*8 + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[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 + jmp rmarkr_next_node + +rmarkr_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 + jmp rmarkr_next_node + +rmarkr_record_3_ab: + mov rdx,qword ptr 8[rcx] + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[rax] + or dword ptr [rdi+rbp*4],eax + + cmp rdx,rcx + ja rmarkr_hnf_1 + + add eax,eax + jne rmarkr_bit_in_same_word2 + inc rbp + mov rax,1 +rmarkr_bit_in_same_word2: + test eax,dword ptr [rdi+rbp*4] + je rmarkr_not_yet_linked_ab + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + + add rax,8 + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[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 + jmp rmarkr_hnf_1 + +rmarkr_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 + jmp rmarkr_hnf_1 + +rmarkr_record_3_aab: + mov rdx,qword ptr 8[rcx] + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdx + + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr (bit_set_table2)[rax] + test eax,dword ptr [rdi+rbp*4] + jne rmarkr_shared_argument_part + or dword ptr [rdi+rbp*4],eax + + add qword ptr [rcx],2 + mov qword ptr 8[rcx],rsi + add rcx,8 + + mov rsi,qword ptr [rdx] + mov qword ptr [rdx],rcx + mov rcx,rsi + lea rsi,1[rdx] + jmp rmarkr_node + +rmarkr_record_2: + cmp word ptr (-2+2)[rax],1 + ja rmarkr_hnf_2 + je rmarkr_hnf_1 + sub rcx,8 + jmp rmarkr_next_node + +rmarkr_record_1: + cmp word ptr (-2+2)[rax],0 + jne rmarkr_hnf_1 + sub rcx,8 + jmp rmarkr_next_node + +rmarkr_lazy_node_1: + jne rmarkr_selector_node_1 + +rmarkr_hnf_1: + mov rbp,qword ptr [rcx] + mov qword ptr [rcx],rsi + + lea rsi,2[rcx] + mov rcx,rbp + jmp rmarkr_node + +rmarkr_indirection_node: + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + lea rbx,(-8)[rcx+rbx] + + mov rax,rbx + and rax,31*8 + shr rbx,8 + mov eax,dword ptr (bit_clear_table2)[rax] + and dword ptr [rdi+rbx*4],eax + + mov rcx,qword ptr [rcx] + jmp rmarkr_node + +rmarkr_selector_node_1: + add rbp,3 + je rmarkr_indirection_node + + mov rdx,qword ptr [rcx] + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,rdx + shr rbx,3 + + add rbp,1 + jle rmarkr_record_selector_node_1 + + push rax + mov rax,rbx + + shr rbx,5 + and rax,31 + + mov eax,dword ptr (bit_set_table)[rax*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rax + + pop rax + jne rmarkr_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + je rmarkr_hnf_1 + + cmp word ptr (-2)[rbx],2 + jbe rmarkr_small_tuple_or_record + +rmarkr_large_tuple_or_record: + mov rbx,qword ptr 16[rdx] + if THREAD + add rbx,qword ptr neg_heap_p3_offset[r9] + else + add rbx,qword ptr neg_heap_p3 + endif + shr rbx,3 + + push rax + mov rax,rbx + + shr rbx,5 + and rax,31 + + mov eax,dword ptr (bit_set_table)[rax*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rax + + pop rax + jne rmarkr_hnf_1 + + ifdef NEW_DESCRIPTORS + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + lea rbx,(-8)[rcx+rbx] + + push rcx + + mov eax,dword ptr (-8)[rax] + + mov rcx,rbx + and rcx,31*8 + shr rbx,8 + mov ecx,dword ptr (bit_clear_table2)[rcx] + and dword ptr [rdi+rbx*4],ecx + + movzx eax,word ptr 4[rax] + cmp rax,16 + jl rmarkr_tuple_or_record_selector_node_2 + mov rdx,qword ptr 16[rdx] + je rmarkr_tuple_selector_node_2 + mov rcx,qword ptr (-24)[rdx+rax] + pop rdx + mov qword ptr (-8)[rdx],offset __indirection + mov qword ptr [rdx],rcx + jmp rmarkr_node + +rmarkr_tuple_selector_node_2: + mov rcx,qword ptr [rdx] + pop rdx + mov qword ptr (-8)[rdx],offset __indirection + mov qword ptr [rdx],rcx + jmp rmarkr_node + else +rmarkr_small_tuple_or_record: + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + lea rbx,(-8)[rcx+rbx] + + push rcx + + mov rcx,rbx + and rcx,31*8 + shr rbx,8 + mov ecx,dword ptr (bit_clear_table2)[rcx] + and dword ptr [rdi+rbx*4],ecx + + mov eax,(-8)[rax] + + mov rcx,rdx + push rbp + mov eax,4[rax] + call near ptr rax + pop rbp + pop rdx + + mov qword ptr (-8)[rdx],offset __indirection + mov qword ptr [rdx],rcx + jmp rmarkr_node + endif + +rmarkr_record_selector_node_1: + je rmarkr_strict_record_selector_node_1 + + push rax + mov rax,rbx + + shr rbx,5 + and rax,31 + + mov eax,dword ptr (bit_set_table)[rax*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rax + + pop rax + jne rmarkr_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + je rmarkr_hnf_1 + + cmp word ptr (-2)[rbx],258 + ifdef NEW_DESCRIPTORS + jbe rmarkr_small_tuple_or_record + + mov rbx,qword ptr 16[rdx] + if THREAD + add rbx,qword ptr neg_heap_p3_offset[r9] + else + add rbx,qword ptr neg_heap_p3 + endif + shr rbx,3 + + push rax + mov rax,rbx + shr rbx,5 + and rax,31 + mov eax,dword ptr (bit_set_table)[rax*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rax + pop rax + jne rmarkr_hnf_1 + +rmarkr_small_tuple_or_record: + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + lea rbx,(-8)[rcx+rbx] + + push rcx + + mov eax,(-8)[rax] + + mov rcx,rbx + and rcx,31*8 + shr rbx,8 + mov ecx,dword ptr (bit_clear_table2)[rcx] + and dword ptr [rdi+rbx*4],ecx + + movzx eax,word ptr 4[rax] + cmp rax,16 + jle rmarkr_tuple_or_record_selector_node_2 + mov rdx,qword ptr 16[rdx] + sub rax,24 +rmarkr_tuple_or_record_selector_node_2: + mov rcx,qword ptr [rdx+rax] + pop rdx + mov qword ptr (-8)[rdx],offset __indirection + mov qword ptr [rdx],rcx + jmp rmarkr_node + else + jbe rmarkr_small_tuple_or_record + jmp rmarkr_large_tuple_or_record + endif + +rmarkr_strict_record_selector_node_1: + push rax + mov rax,rbx + + shr rbx,5 + and rax,31 + + mov eax,dword ptr (bit_set_table)[rax*4] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rax + + pop rax + jne rmarkr_hnf_1 + + mov rbx,qword ptr [rdx] + test bl,2 + je rmarkr_hnf_1 + + cmp word ptr (-2)[rbx],258 + jbe rmarkr_select_from_small_record + + mov rbx,qword ptr 16[rdx] + if THREAD + add rbx,qword ptr neg_heap_p3_offset[r9] + else + add rbx,qword ptr neg_heap_p3 + endif + + push rax + mov rax,rbx + + shr rbx,8 + and rax,31*8 + + mov eax,dword ptr (bit_set_table2)[rax] + mov ebx,dword ptr [rdi+rbx*4] + and rbx,rax + + pop rax + jne rmarkr_hnf_1 + +rmarkr_select_from_small_record: + mov eax,(-8)[rax] + sub rcx,8 + + ifdef NEW_DESCRIPTORS + movzx ebx,word ptr 4[rax] + cmp rbx,16 + jle rmarkr_strict_record_selector_node_2 + add rbx,qword ptr 16[rdx] + mov rbx,qword ptr (-24)[rbx] + jmp rmarkr_strict_record_selector_node_3 +rmarkr_strict_record_selector_node_2: + mov rbx,qword ptr [rdx+rbx] +rmarkr_strict_record_selector_node_3: + mov qword ptr 8[rcx],rbx + + movzx ebx,word ptr 6[rax] + test rbx,rbx + je rmarkr_strict_record_selector_node_5 + cmp rbx,16 + jle rmarkr_strict_record_selector_node_4 + mov rdx,qword ptr 16[rdx] + sub rbx,24 +rmarkr_strict_record_selector_node_4: + mov rbx,qword ptr [rdx+rbx] + mov qword ptr 16[rcx],rbx +rmarkr_strict_record_selector_node_5: + + mov rax,qword ptr (-8)[rbx] + mov qword ptr [rcx],rax + else + mov eax,4[rax] + call near ptr rax + endif + jmp rmarkr_next_node + +; a2,d1: free + +rmarkr_next_node: + test rsi,3 + jne rmarkr_parent + + mov rbp,qword ptr (-8)[rsi] + mov rbx,3 + + and rbx,rbp + sub rsi,8 + + cmp rbx,3 + je rmarkr_argument_part_cycle1 + + mov rdx,qword ptr 8[rsi] + mov qword ptr [rsi],rdx + +rmarkr_c_argument_part_cycle1: + cmp rcx,rsi + ja rmarkr_no_reverse_1 + + mov rdx,qword ptr [rcx] + lea rax,(8+1)[rsi] + mov qword ptr 8[rsi],rdx + mov qword ptr [rcx],rax + + or rsi,rbx + mov rcx,rbp + xor rcx,rbx + jmp rmarkr_node + +rmarkr_no_reverse_1: + mov qword ptr 8[rsi],rcx + mov rcx,rbp + or rsi,rbx + xor rcx,rbx + jmp rmarkr_node + +rmarkr_lazy_node: + movsxd rbp,dword ptr (-4)[rax] + test rbp,rbp + je rmarkr_next_node + + add rcx,8 + + sub rbp,1 + jle rmarkr_lazy_node_1 + + cmp rbp,255 + jge rmarkr_closure_with_unboxed_arguments + +rmarkr_closure_with_unboxed_arguments_: + or qword ptr [rcx],2 + lea rcx,[rcx+rbp*8] + + mov rbp,qword ptr [rcx] + mov qword ptr [rcx],rsi + mov rsi,rcx + mov rcx,rbp + jmp rmarkr_node + +rmarkr_closure_with_unboxed_arguments: +; (a_size+b_size)+(b_size<<8) +; add rbp,1 + mov rax,rbp + and rbp,255 + shr rax,8 + sub rbp,rax +; sub rbp,1 + jg rmarkr_closure_with_unboxed_arguments_ + je rmarkr_hnf_1 + sub rcx,8 + jmp rmarkr_next_node + +rmarkr_hnf_0: + cmp rax,offset dINT+2 + je rmarkr_int_3 + + cmp rax,offset CHAR+2 + je rmarkr_char_3 + + jb rmarkr_no_normal_hnf_0 + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,rcx + + mov rcx,rbx + and rcx,31*8 + shr rbx,8 + mov ecx,dword ptr (bit_clear_table2)[rcx] + and dword ptr [rdi+rbx*4],ecx + + ifdef NEW_DESCRIPTORS + lea rcx,((-8)-2)[rax] + else + lea rcx,((-12)-2)[rax] + endif + jmp rmarkr_next_node_after_static + +rmarkr_int_3: + mov rbp,qword ptr 8[rcx] + cmp rbp,33 + jnc rmarkr_next_node + + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,rcx + + mov rcx,rbx + and rcx,31*8 + shr rbx,8 + mov ecx,dword ptr (bit_clear_table2)[rcx] + shl rbp,4 + and dword ptr [rdi+rbx*4],ecx + + lea rcx,(small_integers)[rbp] + jmp rmarkr_next_node_after_static + +rmarkr_char_3: + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + + movzx rax,byte ptr 8[rcx] + add rbx,rcx + + mov rbp,rbx + and rbp,31*8 + shr rbx,8 + mov ebp,dword ptr (bit_clear_table2)[rbp] + and dword ptr [rdi+rbx*4],ebp + + shl rax,4 + lea rcx,static_characters[rax] + jmp rmarkr_next_node_after_static + +rmarkr_no_normal_hnf_0: + if THREAD + cmp rax,offset __ARRAY__+2 + else + lea r9,__ARRAY__+2 + cmp rax,r9 + endif + jne rmarkr_next_node + + mov rax,qword ptr 16[rcx] + test rax,rax + je rmarkr_lazy_array + + movzx rbx,word ptr (-2+2)[rax] + test rbx,rbx + je rmarkr_b_array + + movzx rax,word ptr (-2)[rax] + test rax,rax + je rmarkr_b_array + + sub rax,256 + cmp rbx,rax + je rmarkr_a_record_array + +rmarkr_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 + call reorder + + pop rcx + mov rax,rbx + imul rax,qword ptr (-8)[rcx] + jmp rmarkr_lr_array + +rmarkr_b_array: + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rcx + add rax,8 + mov rbp,rax + and rax,31*8 + shr rbp,8 + mov eax,dword ptr bit_set_table2[rax] + or dword ptr [rdi+rbp*4],eax + jmp rmarkr_next_node + +rmarkr_a_record_array: + mov rax,qword ptr 8[rcx] + add rcx,16 + cmp rbx,2 + jb rmarkr_lr_array + + imul rax,rbx + jmp rmarkr_lr_array + +rmarkr_lazy_array: + mov rax,qword ptr 8[rcx] + add rcx,16 + +rmarkr_lr_array: + if THREAD + mov rbx,qword ptr neg_heap_p3_offset[r9] + else + mov rbx,qword ptr neg_heap_p3 + endif + add rbx,rcx + shr rbx,3 + add rbx,rax + + mov rdx,rbx + and rbx,31 + shr rdx,5 + mov ebx,dword ptr (bit_set_table)[rbx*4] + or dword ptr [rdi+rdx*4],ebx + + cmp rax,1 + jbe rmarkr_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 + add rax,2 + mov rbx,qword ptr (-8)[rdx] + sub rdx,8 + mov qword ptr [rcx],rbx + mov qword ptr [rdx],rax + + mov rax,qword ptr (-8)[rcx] + sub rcx,8 + mov qword ptr [rcx],rsi + mov rsi,rcx + mov rcx,rax + jmp rmarkr_node + +rmarkr_array_length_0_1: + lea rcx,-16[rcx] + jb rmarkr_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 + jmp rmarkr_hnf_1 + +; a2: free + +rmarkr_parent: + mov rbx,rsi + and rbx,3 + + and rsi,-4 + je end_rmarkr + + sub rbx,1 + je rmarkr_argument_part_parent + + mov rbp,qword ptr [rsi] + + cmp rcx,rsi + ja rmarkr_no_reverse_2 + + mov rdx,rcx + lea rax,1[rsi] + mov rcx,qword ptr [rdx] + mov qword ptr [rdx],rax + +rmarkr_no_reverse_2: + mov qword ptr [rsi],rcx + lea rcx,(-8)[rsi] + mov rsi,rbp + jmp rmarkr_next_node + +rmarkr_argument_part_parent: + mov rbp,qword ptr [rsi] + + mov rdx,rsi + mov rsi,rcx + mov rcx,rdx + +rmarkr_skip_upward_pointers: + mov rax,rbp + and rax,3 + cmp rax,3 + jne rmarkr_no_upward_pointer + + lea rdx,(-3)[rbp] + mov rbp,qword ptr (-3)[rbp] + jmp rmarkr_skip_upward_pointers + +rmarkr_no_upward_pointer: + cmp rsi,rcx + ja rmarkr_no_reverse_3 + + mov rbx,rsi + mov rsi,qword ptr [rsi] + lea rax,1[rcx] + mov qword ptr [rbx],rax + +rmarkr_no_reverse_3: + mov qword ptr [rdx],rsi + lea rsi,(-8)[rbp] + + and rsi,-4 + + mov rdx,rsi + mov rbx,3 + + mov rbp,qword ptr [rsi] + + and rbx,rbp + mov rax,qword ptr 8[rdx] + + or rsi,rbx + mov qword ptr [rdx],rax + + cmp rcx,rdx + ja rmarkr_no_reverse_4 + + mov rax,qword ptr [rcx] + mov qword ptr 8[rdx],rax + lea rax,(8+2+1)[rdx] + mov qword ptr [rcx],rax + mov rcx,rbp + and rcx,-4 + jmp rmarkr_node + +rmarkr_no_reverse_4: + mov qword ptr 8[rdx],rcx + mov rcx,rbp + and rcx,-4 + jmp rmarkr_node + +rmarkr_argument_part_cycle1: + mov rax,qword ptr 8[rsi] + push rdx + +rmarkr_skip_pointer_list1: + mov rdx,rbp + and rdx,-4 + mov rbp,qword ptr [rdx] + mov rbx,3 + and rbx,rbp + cmp rbx,3 + je rmarkr_skip_pointer_list1 + + mov qword ptr [rdx],rax + pop rdx + jmp rmarkr_c_argument_part_cycle1 + +rmarkr_next_node_after_static: + test rsi,3 + jne rmarkr_parent_after_static + + mov rbp,qword ptr (-8)[rsi] + mov rbx,3 + + and rbx,rbp + sub rsi,8 + + cmp rbx,3 + je rmarkr_argument_part_cycle2 + + mov rax,qword ptr 8[rsi] + mov qword ptr [rsi],rax + +rmarkr_c_argument_part_cycle2: + mov qword ptr 8[rsi],rcx + mov rcx,rbp + or rsi,rbx + xor rcx,rbx + jmp rmarkr_node + +rmarkr_parent_after_static: + mov rbx,rsi + and rbx,3 + + and rsi,-4 + je end_rmarkr_after_static + + sub rbx,1 + je rmarkr_argument_part_parent_after_static + + mov rbp,qword ptr [rsi] + mov qword ptr [rsi],rcx + lea rcx,(-8)[rsi] + mov rsi,rbp + jmp rmarkr_next_node + +rmarkr_argument_part_parent_after_static: + mov rbp,qword ptr [rsi] + + mov rdx,rsi + mov rsi,rcx + mov rcx,rdx + +; movl rbp,qword ptr [rdx] +rmarkr_skip_upward_pointers_2: + mov rax,rbp + and rax,3 + cmp rax,3 + jne rmarkr_no_reverse_3 + + lea rdx,(-3)[rbp] + mov rbp,qword ptr (-3)[rbp] + jmp rmarkr_skip_upward_pointers_2 + +rmarkr_argument_part_cycle2: + mov rax,qword ptr 8[rsi] + push rdx + +rmarkr_skip_pointer_list2: + mov rdx,rbp + and rdx,-4 + mov rbp,qword ptr [rdx] + mov rbx,3 + and rbx,rbp + cmp rbx,3 + je rmarkr_skip_pointer_list2 + + mov qword ptr [rdx],rax + pop rdx + jmp rmarkr_c_argument_part_cycle2 + +end_rmarkr_after_static: + mov rsi,qword ptr [rsp] + add rsp,16 + mov qword ptr [rsi],rcx + jmp rmarkr_next_stack_node + +end_rmarkr: + pop rsi + pop rbx + + cmp rcx,rbx + ja rmarkr_no_reverse_5 + + mov rdx,rcx + lea rax,1[rsi] + mov rcx,qword ptr [rcx] + mov qword ptr [rdx],rax + +rmarkr_no_reverse_5: + mov qword ptr [rsi],rcx + +rmarkr_next_stack_node: + if THREAD + cmp rsp,qword ptr end_stack_offset[r9] + else + cmp rsp,qword ptr end_stack + endif + jae rmarkr_end + + mov rcx,qword ptr [rsp] + mov rsi,qword ptr 8[rsp] + add rsp,16 + + cmp rcx,1 + ja rmark_using_reversal + + test qword ptr flags,4096 + je rmark_next_node_ + jmp rmarkp_next_node_ + +rmarkr_end: + test qword ptr flags,4096 + je rmark_next_node + jmp rmarkp_next_node diff --git a/thread/acopy.asm b/thread/acopy.asm index b0213d0..cddf663 100644 --- a/thread/acopy.asm +++ b/thread/acopy.asm @@ -1,1394 +1,1394 @@ - -COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP = 1 - - push rsi - - if THREAD - mov rdi,heap_p2_offset[r9] - - mov rax,heap_size_257_offset[r9] - else - mov rdi,heap_p2 - - mov rax,heap_size_257 - endif - shl rax,7 - if THREAD - mov semi_space_size_offset[r9],rax - else - mov semi_space_size,rax - endif - lea rsi,[rdi+rax] - - if THREAD - mov qword ptr (heap2_begin_and_end_offset+8)[r9],rsi - else - mov qword ptr (heap2_begin_and_end+8),rsi - endif - - mov rax,qword ptr caf_list - test rax,rax - je end_copy_cafs - -copy_cafs_lp: - push (-8)[rax] - - lea rbp,8[rax] - mov rbx,qword ptr [rax] - sub rbx,1 - call copy_lp2 - - pop rax - test rax,rax - jne copy_cafs_lp - -end_copy_cafs: - mov rbx,qword ptr [rsp] - if THREAD - mov rbp,stack_p_offset[r9] - else - mov rbp,stack_p - endif - sub rbx,rbp - shr rbx,3 - - sub rbx,1 - jb end_copy0 - call copy_lp2 -end_copy0: - if THREAD - mov rbp,heap_p2_offset[r9] - else - mov rbp,heap_p2 - endif - - jmp copy_lp1 -; -; Copy all referenced nodes to the other semi space -; - -in_hnf_1_2: - dec rbx -copy_lp2_lp1: - call copy_lp2 -copy_lp1: - cmp rbp,rdi - jae end_copy1 - - mov rax,[rbp] - add rbp,8 - test al,2 - je not_in_hnf_1 -in_hnf_1: - movzx rbx,word ptr (-2)[rax] - - test rbx,rbx - je copy_array_21 - - cmp rbx,2 - jbe in_hnf_1_2 - - cmp rbx,256 - jae copy_record_21 - - mov rax,8[rbp] - - test al,1 - jne node_without_arguments_part - - push rbx - xor rbx,rbx - - call copy_lp2 - - pop rbx - add rbp,8 - - sub rbx,2 - jmp copy_lp2_lp1 - -node_without_arguments_part: - dec rax - xor rbx,rbx - - mov 8[rbp],rax - call copy_lp2 - - add rbp,8 - jmp copy_lp1 - -copy_record_21: - sub rbx,258 - ja copy_record_arguments_3 - - movzx rbx,word ptr (-2+2)[rax] - if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP - jb in_hnf_1_2 - - sub rbx,1 - ja copy_lp2_lp1 - jmp copy_node_arity1 - else - jb copy_record_arguments_1 - - sub rbx,1 - ja copy_lp2_lp1 - je copy_node_arity1 - add rbp,16 - jmp copy_lp1 - -copy_record_arguments_1: - dec rbx - jmp copy_lp2_lp1 - je copy_lp2_lp1 - add rbp,8 - jmp copy_lp1 - endif - -copy_record_arguments_3: - test byte ptr 8[rbp],1 - jne record_node_without_arguments_part - - movzx rdx,word ptr (-2+2)[rax] - if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP - sub rdx,1 - else - test rdx,rdx - je copy_record_arguments_3b - sub rdx,1 - je copy_record_arguments_3abb - endif - - lea rcx,(3*8)[rbp+rbx*8] - push rcx - push rdx - - sub rbx,rbx - call copy_lp2 - - add rbp,8 - pop rbx - dec rbx - call copy_lp2 - - pop rbp - jmp copy_lp1 - - ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP -copy_record_arguments_3abb: - push rbx - sub rbx,rbx - - call copy_lp2 - - pop rbx - - lea rbp,(2*8)[rbp+rbx*8] - jmp copy_lp1 - -copy_record_arguments_3b: - lea rbp,(3*8)[rbp+rbx*8] - jmp copy_lp1 - endif - -record_node_without_arguments_part: - and qword ptr 8[rbp],-2 - - ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP - cmp word ptr (-2+2)[rax],0 - je record_node_without_arguments_part_3b - endif - - sub rbx,rbx - call copy_lp2 - - add rbp,8 - jmp copy_lp1 - - ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP -record_node_without_arguments_part_3b: - add rbp,16 - jmp copy_lp1 - endif - -not_in_hnf_1: - movsxd rbx,dword ptr (-4)[rax] - cmp rbx,257 - jge copy_unboxed_closure_arguments - sub rbx,1 - jg copy_lp2_lp1 - -copy_node_arity1: - xor rbx,rbx - call copy_lp2 - - add rbp,8 - jmp copy_lp1 - -copy_unboxed_closure_arguments: - je copy_unboxed_closure_arguments1 - - xor rax,rax - mov al,bh - and rbx,255 - sub rbx,rax - - sub rbx,1 - jl copy_unboxed_closure_arguments_without_pointers - - push rax - call copy_lp2 - pop rax - -copy_unboxed_closure_arguments_without_pointers: - lea rbp,[rbp+rax*8] - jmp copy_lp1 - -copy_unboxed_closure_arguments1: - add rbp,16 - jmp copy_lp1 - -copy_array_21: - mov rbx,qword ptr 8[rbp] - add rbp,16 - test rbx,rbx - je copy_array_21_a - - movzx rax,word ptr (-2)[rbx] - movzx rbx,word ptr (-2+2)[rbx] - sub rax,256 - test rbx,rbx - je copy_array_21_b - - cmp rbx,rax - je copy_array_21_r_a - -copy_array_21_ab: - cmp qword ptr (-16)[rbp],0 - je copy_lp1 - - sub rax,rbx - shl rax,3 - sub rbx,1 - - push rbx - push rax - mov rbx,qword ptr (-16)[rbp] - sub rbx,1 - push rbx - -copy_array_21_lp_ab: - mov rbx,qword ptr 16[rsp] - call copy_lp2 - - add rbp,qword ptr 8[rsp] - sub qword ptr [rsp],1 - jnc copy_array_21_lp_ab - - add rsp,24 - jmp copy_lp1 - -copy_array_21_b: - mov rbx,qword ptr (-16)[rbp] - imul rbx,rax - lea rbp,[rbp+rbx*8] - jmp copy_lp1 - -copy_array_21_r_a: - mov rbx,qword ptr (-16)[rbp] - imul rbx,rax - sub rbx,1 - jc copy_lp1 - jmp copy_lp2_lp1 - -copy_array_21_a: - mov rbx,qword ptr (-16)[rbp] - sub rbx,1 - jc copy_lp1 - jmp copy_lp2_lp1 - -; -; Copy nodes to the other semi-space -; - -copy_lp2: - mov rdx,qword ptr [rbp] - -; selectors: -continue_after_selector_2: - mov rcx,qword ptr [rdx] - test cl,2 - je not_in_hnf_2 - -in_hnf_2: - movzx rax,word ptr (-2)[rcx] - test rax,rax - je copy_arity_0_node2 - - cmp rax,256 - jae copy_record_2 - - sub rax,2 - mov [rbp],rdi - - lea rbp,8[rbp ] - ja copy_hnf_node2_3 - - mov [rdi],rcx - jb copy_hnf_node2_1 - - inc rdi - mov rcx,8[rdx] - - mov [rdx],rdi - mov rax,16[rdx] - - sub rbx,1 - mov (8-1)[rdi],rcx - - mov (16-1)[rdi],rax - lea rdi,(24-1)[rdi] - - jae copy_lp2 - ret - -copy_hnf_node2_1: - inc rdi - mov rax,8[rdx] - - sub rbx,1 - mov [rdx],rdi - - mov (8-1)[rdi],rax - lea rdi,(16-1)[rdi] - - jae copy_lp2 - ret - -copy_hnf_node2_3: - mov [rdi],rcx - inc rdi - - mov [rdx],rdi - mov rcx,8[rdx] - - mov (8-1)[rdi],rcx - mov rcx,16[rdx] - - add rdi,24-1 - mov rdx,[rcx] - - test dl,1 - jne arguments_already_copied_2 - - mov (-8)[rdi],rdi - add rcx,8 - - mov [rdi],rdx - inc rdi - - mov (-8)[rcx],rdi - add rdi,8-1 - -cp_hnf_arg_lp2: - mov rdx,[rcx] - add rcx,8 - - mov [rdi],rdx - add rdi,8 - - dec rax - jne cp_hnf_arg_lp2 - - sub rbx,1 - jae copy_lp2 - ret - -arguments_already_copied_2: - mov (-8)[rdi],rdx - - sub rbx,1 - jae copy_lp2 - ret - -copy_arity_0_node2: - cmp rcx,offset __STRING__+2 - jbe copy_string_or_array_2 - - cmp rcx,offset CHAR+2 - ja copy_normal_hnf_0_2 - -copy_int_bool_or_char_2: - mov rax,8[rdx] - je copy_char_2 - - cmp rcx,offset dINT+2 - jne no_small_int_or_char_2 - -copy_int_2: - cmp rax,33 - jae no_small_int_or_char_2 - - shl rax,4 - add rbp,8 - - add rax,offset small_integers - sub rbx,1 - - mov (-8)[rbp],rax - jae copy_lp2 - ret - -copy_char_2: - and rax,255 - - shl rax,4 - add rbp,8 - - add rax,offset static_characters - sub rbx,1 - - mov (-8)[rbp],rax - jae copy_lp2 - ret - -no_small_int_or_char_2: - if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP -copy_record_node2_1_b: - endif - mov (-16)[rsi],rcx - add rbp,8 - - mov (-8)[rsi],rax - sub rsi,15 - - mov [rdx],rsi - dec rsi - - mov (-8)[rbp],rsi - - sub rbx,1 - jae copy_lp2 - ret - -copy_normal_hnf_0_2: - ifdef NEW_DESCRIPTORS - sub rcx,2-(-8) - else - sub rcx,2-(-12) - endif - sub rbx,1 - - mov [rbp],rcx - lea rbp,8[rbp] - jae copy_lp2 - ret - -already_copied_2: - dec rcx - sub rbx,1 - - mov [rbp],rcx - lea rbp,8[rbp] - - jae copy_lp2 - ret - -copy_record_2: - sub rax,258 - ja copy_record_node2_3 - - if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP - jb copy_record_node2_1 - - cmp word ptr (-2+2)[rcx],0 - je copy_record_node2_bb - - mov qword ptr [rbp],rdi - mov qword ptr [rdi],rcx - - lea rcx,1[rdi] - mov rax,qword ptr 8[rdx] - - mov qword ptr [rdx],rcx - - mov qword ptr 8[rdi],rax - mov rax,qword ptr 16[rdx] - - add rbp,8 - mov qword ptr 16[rdi],rax - - add rdi,24 - sub rbx,1 - jae copy_lp2 - ret - -copy_record_node2_1: - mov rax,qword ptr 8[rdx] - - cmp word ptr (-2+2)[rcx],0 - je copy_record_node2_1_b - - mov qword ptr [rbp],rdi - mov qword ptr [rdi],rcx - - lea rcx,1[rdi] - mov qword ptr 8[rdi],rax - - mov qword ptr [rdx],rcx - add rbp,8 - - add rdi,16 - sub rbx,1 - jae copy_lp2 - ret - -copy_record_node2_bb: - mov (-24)[rsi],rcx - sub rsi,24-1 - - mov [rdx],rsi - dec rsi - - mov rax,8[rdx] - mov rcx,16[rdx] - - mov [rbp],rsi - add rbp,8 - - mov 8[rsi],rax - sub rbx,1 - - mov 16[rsi],rcx - - jae copy_lp2 - ret - else - mov qword ptr [rbp],rdi - mov qword ptr [rdi],rcx - - lea rcx,1[rdi] - mov rax,qword ptr 8[rdx] - - mov qword ptr [rdx],rcx - jb copy_record_node2_1 - - mov qword ptr 8[rdi],rax - mov rax,qword ptr 16[rdx] - - add rbp,8 - mov qword ptr 16[rdi],rax - - add rdi,24 - sub rbx,1 - jae copy_lp2 - ret - -copy_record_node2_1: - add rbp,8 - mov qword ptr 8[rdi],rax - - add rdi,16 - sub rbx,1 - jae copy_lp2 - ret - endif - -copy_record_node2_3: - if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP - cmp word ptr (-2+2)[rcx],1 - jbe copy_record_node2_3_ab_or_b - endif - - push rax - lea rax,1[rdi] - - mov qword ptr [rdx],rax - mov rax,qword ptr 16[rdx] - - mov qword ptr [rdi],rcx - mov rdx,qword ptr 8[rdx] - - if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP - mov qword ptr 8[rdi],rdx - mov qword ptr [rbp],rdi - add rbp,8 - - mov rcx,rax - test byte ptr [rax],1 - jne record_arguments_already_copied_2 - else - mov rcx,rax - if THREAD - sub rax,qword ptr heap_p1_offset[r9] - else - sub rax,qword ptr heap_p1 - endif - - shr rax,4 - mov qword ptr 8[rdi],rdx - - mov rdx,rax - and rax,31 - - shr rdx,3 - mov qword ptr [rbp],rdi - - and rdx,-4 - mov eax,dword ptr (bit_set_table)[rax*4] - - if THREAD - add rdx,qword ptr heap_copied_vector_offset[r9] - else - add rdx,qword ptr heap_copied_vector - endif - add rbp,8 - - test eax,[rdx] - jne record_arguments_already_copied_2 - - or [rdx],eax - endif - lea rdx,24[rdi] - - pop rax - mov qword ptr 16[rdi],rdx - - add rdi,25 - mov rdx,qword ptr [rcx] - - mov qword ptr [rcx],rdi - add rcx,8 - - mov qword ptr (-1)[rdi],rdx - add rdi,7 - -cp_record_arg_lp2: - mov rdx,qword ptr [rcx] - add rcx,8 - - mov qword ptr [rdi],rdx - add rdi,8 - - sub rax,1 - jne cp_record_arg_lp2 - - sub rbx,1 - jae copy_lp2 - ret - -record_arguments_already_copied_2: - mov rdx,qword ptr [rcx] - pop rax - - mov qword ptr 16[rdi],rdx - add rdi,24 - - sub rbx,1 - jae copy_lp2 - ret - - if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP -copy_record_node2_3_ab_or_b: - jb copy_record_node2_3_b - - push rax - lea rax,1[rdi] - - mov qword ptr [rdx],rax - mov rax,qword ptr 16[rdx] - - mov qword ptr [rdi],rcx - mov rdx,qword ptr 8[rdx] - - mov rcx,rax - if THREAD - sub rax,qword ptr heap_p1_offset[r9] - else - sub rax,qword ptr heap_p1 - endif - - shr rax,4 - mov qword ptr 8[rdi],rdx - - mov rdx,rax - and rax,31 - - shr rdx,3 - mov qword ptr [rbp],rdi - - and rdx,-4 - mov eax,dword ptr (bit_set_table)[rax*4] - - if THREAD - add rdx,qword ptr heap_copied_vector_offset[r9] - else - add rdx,qword ptr heap_copied_vector - endif - add rbp,8 - - test eax,[rdx] - jne record_arguments_already_copied_2 - - or [rdx],eax - pop rax - - sub rsi,8 - - shl rax,3 - sub rsi,rax - - push rsi - add rsi,1 - - mov qword ptr 16[rdi],rsi - add rdi,24 - - mov rdx,qword ptr [rcx] - jmp cp_record_arg_lp3_c - -copy_record_node2_3_b: - push rax - lea rax,(-24+1)[rsi] - - mov qword ptr [rdx],rax - mov rax,qword ptr 16[rdx] - - mov qword ptr (-24)[rsi],rcx - mov rdx,qword ptr 8[rdx] - - mov rcx,rax - if THREAD - sub rax,qword ptr heap_p1_offset[r9] - else - sub rax,qword ptr heap_p1 - endif - - shr rax,4 - mov qword ptr (-16)[rsi],rdx - - mov rdx,rax - and rax,31 - sub rsi,24 - - shr rdx,3 - mov qword ptr [rbp],rsi - - and rdx,-4 - mov eax,dword ptr (bit_set_table)[rax*4] - - if THREAD - add rdx,qword ptr heap_copied_vector_offset[r9] - else - add rdx,qword ptr heap_copied_vector - endif - add rbp,8 - - test eax,[rdx] - jne record_arguments_already_copied_3_b - - or [rdx],eax - pop rax - - mov rdx,rsi - sub rsi,8 - - shl rax,3 - sub rsi,rax - - mov qword ptr 16[rdx],rsi - - mov rdx,qword ptr [rcx] - - push rsi - add rsi,1 - -cp_record_arg_lp3_c: - mov qword ptr [rcx],rsi - add rcx,8 - mov qword ptr (-1) [rsi],rdx - add rsi,7 - -cp_record_arg_lp3: - mov rdx,qword ptr [rcx] - add rcx,8 - - mov qword ptr [rsi],rdx - add rsi,8 - - sub rax,8 - jne cp_record_arg_lp3 - - pop rsi - - sub rbx,1 - jae copy_lp2 - ret - -record_arguments_already_copied_3_b: - mov rdx,qword ptr [rcx] - pop rax - - sub rdx,1 - mov qword ptr 16[rsi],rdx - - sub rbx,1 - jae copy_lp2 - ret - endif - -not_in_hnf_2: - test cl,1 - jne already_copied_2 - - movsxd rax,dword ptr (-4)[rcx] - test rax,rax - jle copy_arity_0_node2_ - -copy_node2_1_: - and rax,255 - sub rax,2 - jl copy_arity_1_node2 -copy_node2_3: - mov [rbp],rdi - add rbp,8 - mov [rdi],rcx - inc rdi - mov [rdx],rdi - mov rcx,8[rdx] - add rdx,16 - mov (8-1)[rdi],rcx - add rdi,16-1 - -cp_arg_lp2: - mov rcx,[rdx] - add rdx,8 - mov [rdi],rcx - add rdi,8 - sub rax,1 - jae cp_arg_lp2 - - sub rbx,1 - jae copy_lp2 - ret - -copy_arity_1_node2: -copy_arity_1_node2_: - mov [rbp],rdi - inc rdi - - add rbp,8 - mov [rdx],rdi - - mov rax,8[rdx] - mov (-1)[rdi],rcx - - mov (8-1)[rdi],rax - add rdi,24-1 - - sub rbx,1 - jae copy_lp2 - ret - -copy_indirection_2: - mov rax,rdx - mov rdx,8[rdx] - - mov rcx,[rdx] - test cl,2 - jne in_hnf_2 - - test cl,1 - jne already_copied_2 - - cmp dword ptr (-4)[rcx],-2 - je skip_indirections_2 - - mov eax,(-4)[rcx] - test rax,rax - jle copy_arity_0_node2_ - jmp copy_node2_1_ - -skip_indirections_2: - mov rdx,8[rdx] - - mov rcx,[rdx] - test cl,2 - jne update_indirection_list_2 - test cl,1 - jne update_indirection_list_2 - - cmp dword ptr (-4)[rcx],-2 - je skip_indirections_2 - -update_indirection_list_2: - lea rcx,8[rax] - mov rax,8[rax] - mov [rcx],rdx - cmp rdx,rax - jne update_indirection_list_2 - - jmp continue_after_selector_2 - -copy_selector_2: - cmp rax,-2 - je copy_indirection_2 - jl copy_record_selector_2 - - mov rax,8[rdx] - ifdef NEW_DESCRIPTORS - mov d2,[rax] - test d2b,2 - je copy_arity_1_node2_ - - mov d3d,dword ptr (-8)[rcx] - - cmp word ptr (-2)[d2],2 - jbe copy_selector_2_ - - mov d2,16[rax] - - test byte ptr [d2],1 - jne copy_arity_1_node2_ - - movzx d3,word ptr 4[d3] - mov qword ptr [rdx],offset __indirection - - cmp d3,16 - jl copy_selector_2_1 - je copy_selector_2_2 - - mov rcx,qword ptr (-24)[d2+d3] - mov qword ptr 8[rdx],rcx - mov rdx,rcx - jmp continue_after_selector_2 - -copy_selector_2_1: - mov rcx,qword ptr 8[rax] - mov qword ptr 8[rdx],rcx - mov rdx,rcx - jmp continue_after_selector_2 - -copy_selector_2_2: - mov rcx,qword ptr [d2] - mov qword ptr 8[rdx],rcx - mov rdx,rcx - jmp continue_after_selector_2 - -copy_selector_2_: - movzx d3,word ptr 4[d3] - mov qword ptr [rdx],offset __indirection - - mov rcx,qword ptr [rax+d3] - mov qword ptr 8[rdx],rcx - mov rdx,rcx - jmp continue_after_selector_2 - else - mov rax,[rax] - test al,2 - je copy_arity_1_node2_ - - cmp word ptr (-2)[rax],2 - jbe copy_selector_2_ - - if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP -copy_selector_2__: - endif - mov rax,8[rdx] - mov rax,16[rax] - test byte ptr [rax],1 - jne copy_arity_1_node2_ - -copy_selector_2_: - mov eax,(-8)[rcx] - - mov rcx,8[rdx] - push rdx - push rbp - mov eax,4[rax] - call near ptr rax - pop rbp - pop rdx - - mov qword ptr [rdx],offset __indirection - mov 8[rdx],rcx - - mov rdx,rcx - jmp continue_after_selector_2 - endif - -copy_record_selector_2: - cmp rax,-3 - mov rax,qword ptr 8[rdx] - mov d2,qword ptr [rax] - je copy_strict_record_selector_2 - - test d2b,2 - je copy_arity_1_node2_ - - mov d3d,dword ptr (-8)[rcx] - - cmp word ptr (-2)[d2],258 - ifdef NEW_DESCRIPTORS - jbe copy_record_selector_2_ - else - jbe copy_selector_2_ - endif - - if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP - cmp word ptr (-2+2)[d2],2 - jae copy_selector_2__ - endif - - mov d4,qword ptr 16[rax] - - lea d2,(-24)[d4] - if THREAD - sub d4,qword ptr heap_p1_offset[r9] - else - sub d4,qword ptr heap_p1 - endif - - mov d5,d4 - and d4,31*16 - - shr d5,7 - - shr d4,2 - and d5,-4 - - if THREAD - add d5,qword ptr heap_copied_vector_offset[r9] - else - add d5,qword ptr heap_copied_vector - endif - - mov d4d,dword ptr (bit_set_table)[d4] - - and d4d,dword ptr [d5] - - ifdef NEW_DESCRIPTORS - if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP - je copy_record_selector_2_ - jmp copy_arity_1_node2_ -copy_selector_2__: - mov d4,qword ptr 16[rax] - lea d2,(-24)[d4] - test byte ptr [d4],1 - jne copy_arity_1_node2_ - else - jne copy_arity_1_node2_ - endif -copy_record_selector_2_: - movzx d3,word ptr 4[d3] - mov qword ptr [rdx],offset __indirection - - cmp d3,16 - jle copy_record_selector_3 - mov rax,d2 -copy_record_selector_3: - mov rcx,qword ptr [rax+d3] - mov qword ptr 8[rdx],rcx - mov rdx,rcx - jmp continue_after_selector_2 - else - jne copy_arity_1_node2_ - jmp copy_selector_2_ - endif - -copy_strict_record_selector_2: - test d2b,2 - je copy_arity_1_node2_ - - mov d3d,dword ptr (-8)[rcx] - - cmp word ptr (-2)[d2],258 - jbe copy_strict_record_selector_2_ - - if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP - cmp word ptr (-2+2)[d2],2 - jb copy_strict_record_selector_2_b - - mov d4,qword ptr 16[rax] - lea d2,(-24)[d4] - test byte ptr [d4],1 - jne copy_arity_1_node2_ - - jmp copy_strict_record_selector_2_ - -copy_strict_record_selector_2_b: - endif - - mov d4,qword ptr 16[rax] - - lea d2,(-24)[d4] - if THREAD - sub d4,qword ptr heap_p1_offset[r9] - else - sub d4,qword ptr heap_p1 - endif - - mov d5,d4 - and d4,31*16 - - shr d5,7 - - shr d4,2 - and d5,-4 - - if THREAD - add d5,qword ptr heap_copied_vector_offset[r9] - else - add d5,qword ptr heap_copied_vector - endif - - mov d4d,dword ptr (bit_set_table)[d4] - - and d4d,[d5] - - jne copy_arity_1_node2_ - -copy_strict_record_selector_2_: - ifdef NEW_DESCRIPTORS - movzx rcx,word ptr 4[d3] - cmp rcx,16 - jle copy_strict_record_selector_3 - mov rcx,qword ptr [d2+rcx] - jmp copy_strict_record_selector_4 -copy_strict_record_selector_3: - mov rcx,qword ptr [rax+rcx] -copy_strict_record_selector_4: - mov qword ptr 8[rdx],rcx - - movzx rcx,word ptr 6[d3] - test rcx,rcx - je copy_strict_record_selector_6 - cmp rcx,16 - jle copy_strict_record_selector_5 - mov rax,d2 -copy_strict_record_selector_5: - mov rcx,qword ptr [rax+rcx] - mov qword ptr 16[rdx],rcx -copy_strict_record_selector_6: - - mov rcx,qword ptr (-8)[d3] - mov qword ptr [rdx],rcx - jmp in_hnf_2 - else - mov rcx,rdx - mov rdx,qword ptr 8[rdx] - - push rbp - mov eax,4[d3] - call near ptr rax - pop rbp - - mov rdx,rcx - mov rcx,qword ptr [rcx] - test cl,2 - jne in_hnf_2 - hlt - endif - -copy_arity_0_node2_: - jl copy_selector_2 - - mov (-24)[rsi],rcx - sub rsi,24 - mov [rbp],rsi - lea rax,1[rsi] - - add rbp,8 - mov [rdx],rax - - sub rbx,1 - jae copy_lp2 - ret - -copy_string_or_array_2: - mov rcx,rdx - jne copy_array_2 - - if THREAD - sub rdx,heap_p1_offset[r9] - cmp rdx,semi_space_size_offset[r9] - else - sub rdx,heap_p1 - cmp rdx,semi_space_size - endif - jae copy_string_or_array_constant - - mov rdx,8[rcx] - add rbp,8 - - add rdx,7 - push rbx - - mov rax,rdx - and rdx,-8 - - shr rax,3 - sub rsi,rdx - - mov rbx,[rcx] - add rcx,8 - - mov (-16)[rsi],rbx - sub rsi,16 - - mov (-8)[rbp],rsi - lea rdx,1[rsi] - - mov (-8)[rcx],rdx - lea rdx,8[rsi] - -cp_s_arg_lp2: - mov rbx,[rcx] - add rcx,8 - - mov [rdx],rbx - add rdx,8 - - sub rax,1 - jge cp_s_arg_lp2 - - pop rbx - sub rbx,1 - jae copy_lp2 - ret - -copy_array_2: - if THREAD - sub rdx,heap_p1_offset[r9] - cmp rdx,semi_space_size_offset[r9] - else - sub rdx,heap_p1 - cmp rdx,semi_space_size - endif - jae copy_string_or_array_constant - - push rbx - - mov rax,qword ptr 16[rcx] - test rax,rax - je copy_array_a2 - - movzx rbx,word ptr (-2)[rax] - - test rbx,rbx - je copy_strict_basic_array_2 - - sub rbx,256 - imul rbx,qword ptr 8[rcx] - jmp copy_array_a3 - -copy_array_a2: - mov rbx,qword ptr 8[rcx] -copy_array_a3: - mov rdx,rdi - lea rdi,24[rdi+rbx*8] - - mov qword ptr [rbp],rdx - mov rax,qword ptr [rcx] - - add rbp,8 - mov qword ptr [rdx],rax - - lea rax,1[rdx] - add rdx,8 - - mov qword ptr [rcx],rax - add rcx,8 - - lea rax,1[rbx] - jmp cp_s_arg_lp2 - -copy_strict_basic_array_2: - mov rbx,qword ptr 8[rcx] - - cmp rax,offset dINT+2 - jle copy_int_or_real_array_2 - - cmp rax,offset BOOL+2 - je copy_bool_array_2 - -copy_int32_or_real32_array_2: - add rbx,1 - shr rbx,1 - -copy_int_or_real_array_2: - shl rbx,3 - lea rdx,(-24)[rsi] - - sub rdx,rbx - mov rax,qword ptr [rcx] - - shr rbx,3 - mov qword ptr [rbp],rdx - - add rbp,8 - mov rsi,rdx - - mov qword ptr [rdx],rax - lea rax,1[rdx] - - add rdx,8 - mov qword ptr [rcx],rax - - add rcx,8 - lea rax,1[rbx] - jmp cp_s_arg_lp2 - -copy_bool_array_2: - add rbx,7 - shr rbx,3 - jmp copy_int_or_real_array_2 - -copy_string_or_array_constant: - mov qword ptr [rbp],rcx - add rbp,8 - - sub rbx,1 - jae copy_lp2 - ret - -end_copy1: - if THREAD - mov heap_end_after_gc_offset[r9],rsi - else - mov heap_end_after_gc,rsi - endif - - mov rcx,offset finalizer_list - mov rdx,offset free_finalizer_list - mov rbp,qword ptr finalizer_list - -determine_free_finalizers_after_copy: - mov rax,qword ptr [rbp] - test al,1 - je finalizer_not_used_after_copy - - mov rbp,qword ptr 8[rbp] - sub rax,1 - mov qword ptr [rcx],rax - lea rcx,8[rax] - jmp determine_free_finalizers_after_copy - -finalizer_not_used_after_copy: - if THREAD - lea rax,__Nil-8 - cmp rbp,rax - else - lea r9,__Nil-8 - cmp rbp,r9 - endif - je end_finalizers_after_copy - - mov qword ptr [rdx],rbp - lea rdx,8[rbp] - mov rbp,qword ptr 8[rbp] - jmp determine_free_finalizers_after_copy - -end_finalizers_after_copy: - mov qword ptr [rcx],rbp - mov qword ptr [rdx],rbp + +COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP = 1 + + push rsi + + if THREAD + mov rdi,heap_p2_offset[r9] + + mov rax,heap_size_257_offset[r9] + else + mov rdi,heap_p2 + + mov rax,heap_size_257 + endif + shl rax,7 + if THREAD + mov semi_space_size_offset[r9],rax + else + mov semi_space_size,rax + endif + lea rsi,[rdi+rax] + + if THREAD + mov qword ptr (heap2_begin_and_end_offset+8)[r9],rsi + else + mov qword ptr (heap2_begin_and_end+8),rsi + endif + + mov rax,qword ptr caf_list + test rax,rax + je end_copy_cafs + +copy_cafs_lp: + push (-8)[rax] + + lea rbp,8[rax] + mov rbx,qword ptr [rax] + sub rbx,1 + call copy_lp2 + + pop rax + test rax,rax + jne copy_cafs_lp + +end_copy_cafs: + mov rbx,qword ptr [rsp] + if THREAD + mov rbp,stack_p_offset[r9] + else + mov rbp,stack_p + endif + sub rbx,rbp + shr rbx,3 + + sub rbx,1 + jb end_copy0 + call copy_lp2 +end_copy0: + if THREAD + mov rbp,heap_p2_offset[r9] + else + mov rbp,heap_p2 + endif + + jmp copy_lp1 +; +; Copy all referenced nodes to the other semi space +; + +in_hnf_1_2: + dec rbx +copy_lp2_lp1: + call copy_lp2 +copy_lp1: + cmp rbp,rdi + jae end_copy1 + + mov rax,[rbp] + add rbp,8 + test al,2 + je not_in_hnf_1 +in_hnf_1: + movzx rbx,word ptr (-2)[rax] + + test rbx,rbx + je copy_array_21 + + cmp rbx,2 + jbe in_hnf_1_2 + + cmp rbx,256 + jae copy_record_21 + + mov rax,8[rbp] + + test al,1 + jne node_without_arguments_part + + push rbx + xor rbx,rbx + + call copy_lp2 + + pop rbx + add rbp,8 + + sub rbx,2 + jmp copy_lp2_lp1 + +node_without_arguments_part: + dec rax + xor rbx,rbx + + mov 8[rbp],rax + call copy_lp2 + + add rbp,8 + jmp copy_lp1 + +copy_record_21: + sub rbx,258 + ja copy_record_arguments_3 + + movzx rbx,word ptr (-2+2)[rax] + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + jb in_hnf_1_2 + + sub rbx,1 + ja copy_lp2_lp1 + jmp copy_node_arity1 + else + jb copy_record_arguments_1 + + sub rbx,1 + ja copy_lp2_lp1 + je copy_node_arity1 + add rbp,16 + jmp copy_lp1 + +copy_record_arguments_1: + dec rbx + jmp copy_lp2_lp1 + je copy_lp2_lp1 + add rbp,8 + jmp copy_lp1 + endif + +copy_record_arguments_3: + test byte ptr 8[rbp],1 + jne record_node_without_arguments_part + + movzx rdx,word ptr (-2+2)[rax] + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + sub rdx,1 + else + test rdx,rdx + je copy_record_arguments_3b + sub rdx,1 + je copy_record_arguments_3abb + endif + + lea rcx,(3*8)[rbp+rbx*8] + push rcx + push rdx + + sub rbx,rbx + call copy_lp2 + + add rbp,8 + pop rbx + dec rbx + call copy_lp2 + + pop rbp + jmp copy_lp1 + + ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP +copy_record_arguments_3abb: + push rbx + sub rbx,rbx + + call copy_lp2 + + pop rbx + + lea rbp,(2*8)[rbp+rbx*8] + jmp copy_lp1 + +copy_record_arguments_3b: + lea rbp,(3*8)[rbp+rbx*8] + jmp copy_lp1 + endif + +record_node_without_arguments_part: + and qword ptr 8[rbp],-2 + + ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + cmp word ptr (-2+2)[rax],0 + je record_node_without_arguments_part_3b + endif + + sub rbx,rbx + call copy_lp2 + + add rbp,8 + jmp copy_lp1 + + ife COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP +record_node_without_arguments_part_3b: + add rbp,16 + jmp copy_lp1 + endif + +not_in_hnf_1: + movsxd rbx,dword ptr (-4)[rax] + cmp rbx,257 + jge copy_unboxed_closure_arguments + sub rbx,1 + jg copy_lp2_lp1 + +copy_node_arity1: + xor rbx,rbx + call copy_lp2 + + add rbp,8 + jmp copy_lp1 + +copy_unboxed_closure_arguments: + je copy_unboxed_closure_arguments1 + + xor rax,rax + mov al,bh + and rbx,255 + sub rbx,rax + + sub rbx,1 + jl copy_unboxed_closure_arguments_without_pointers + + push rax + call copy_lp2 + pop rax + +copy_unboxed_closure_arguments_without_pointers: + lea rbp,[rbp+rax*8] + jmp copy_lp1 + +copy_unboxed_closure_arguments1: + add rbp,16 + jmp copy_lp1 + +copy_array_21: + mov rbx,qword ptr 8[rbp] + add rbp,16 + test rbx,rbx + je copy_array_21_a + + movzx rax,word ptr (-2)[rbx] + movzx rbx,word ptr (-2+2)[rbx] + sub rax,256 + test rbx,rbx + je copy_array_21_b + + cmp rbx,rax + je copy_array_21_r_a + +copy_array_21_ab: + cmp qword ptr (-16)[rbp],0 + je copy_lp1 + + sub rax,rbx + shl rax,3 + sub rbx,1 + + push rbx + push rax + mov rbx,qword ptr (-16)[rbp] + sub rbx,1 + push rbx + +copy_array_21_lp_ab: + mov rbx,qword ptr 16[rsp] + call copy_lp2 + + add rbp,qword ptr 8[rsp] + sub qword ptr [rsp],1 + jnc copy_array_21_lp_ab + + add rsp,24 + jmp copy_lp1 + +copy_array_21_b: + mov rbx,qword ptr (-16)[rbp] + imul rbx,rax + lea rbp,[rbp+rbx*8] + jmp copy_lp1 + +copy_array_21_r_a: + mov rbx,qword ptr (-16)[rbp] + imul rbx,rax + sub rbx,1 + jc copy_lp1 + jmp copy_lp2_lp1 + +copy_array_21_a: + mov rbx,qword ptr (-16)[rbp] + sub rbx,1 + jc copy_lp1 + jmp copy_lp2_lp1 + +; +; Copy nodes to the other semi-space +; + +copy_lp2: + mov rdx,qword ptr [rbp] + +; selectors: +continue_after_selector_2: + mov rcx,qword ptr [rdx] + test cl,2 + je not_in_hnf_2 + +in_hnf_2: + movzx rax,word ptr (-2)[rcx] + test rax,rax + je copy_arity_0_node2 + + cmp rax,256 + jae copy_record_2 + + sub rax,2 + mov [rbp],rdi + + lea rbp,8[rbp ] + ja copy_hnf_node2_3 + + mov [rdi],rcx + jb copy_hnf_node2_1 + + inc rdi + mov rcx,8[rdx] + + mov [rdx],rdi + mov rax,16[rdx] + + sub rbx,1 + mov (8-1)[rdi],rcx + + mov (16-1)[rdi],rax + lea rdi,(24-1)[rdi] + + jae copy_lp2 + ret + +copy_hnf_node2_1: + inc rdi + mov rax,8[rdx] + + sub rbx,1 + mov [rdx],rdi + + mov (8-1)[rdi],rax + lea rdi,(16-1)[rdi] + + jae copy_lp2 + ret + +copy_hnf_node2_3: + mov [rdi],rcx + inc rdi + + mov [rdx],rdi + mov rcx,8[rdx] + + mov (8-1)[rdi],rcx + mov rcx,16[rdx] + + add rdi,24-1 + mov rdx,[rcx] + + test dl,1 + jne arguments_already_copied_2 + + mov (-8)[rdi],rdi + add rcx,8 + + mov [rdi],rdx + inc rdi + + mov (-8)[rcx],rdi + add rdi,8-1 + +cp_hnf_arg_lp2: + mov rdx,[rcx] + add rcx,8 + + mov [rdi],rdx + add rdi,8 + + dec rax + jne cp_hnf_arg_lp2 + + sub rbx,1 + jae copy_lp2 + ret + +arguments_already_copied_2: + mov (-8)[rdi],rdx + + sub rbx,1 + jae copy_lp2 + ret + +copy_arity_0_node2: + cmp rcx,offset __STRING__+2 + jbe copy_string_or_array_2 + + cmp rcx,offset CHAR+2 + ja copy_normal_hnf_0_2 + +copy_int_bool_or_char_2: + mov rax,8[rdx] + je copy_char_2 + + cmp rcx,offset dINT+2 + jne no_small_int_or_char_2 + +copy_int_2: + cmp rax,33 + jae no_small_int_or_char_2 + + shl rax,4 + add rbp,8 + + add rax,offset small_integers + sub rbx,1 + + mov (-8)[rbp],rax + jae copy_lp2 + ret + +copy_char_2: + and rax,255 + + shl rax,4 + add rbp,8 + + add rax,offset static_characters + sub rbx,1 + + mov (-8)[rbp],rax + jae copy_lp2 + ret + +no_small_int_or_char_2: + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP +copy_record_node2_1_b: + endif + mov (-16)[rsi],rcx + add rbp,8 + + mov (-8)[rsi],rax + sub rsi,15 + + mov [rdx],rsi + dec rsi + + mov (-8)[rbp],rsi + + sub rbx,1 + jae copy_lp2 + ret + +copy_normal_hnf_0_2: + ifdef NEW_DESCRIPTORS + sub rcx,2-(-8) + else + sub rcx,2-(-12) + endif + sub rbx,1 + + mov [rbp],rcx + lea rbp,8[rbp] + jae copy_lp2 + ret + +already_copied_2: + dec rcx + sub rbx,1 + + mov [rbp],rcx + lea rbp,8[rbp] + + jae copy_lp2 + ret + +copy_record_2: + sub rax,258 + ja copy_record_node2_3 + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + jb copy_record_node2_1 + + cmp word ptr (-2+2)[rcx],0 + je copy_record_node2_bb + + mov qword ptr [rbp],rdi + mov qword ptr [rdi],rcx + + lea rcx,1[rdi] + mov rax,qword ptr 8[rdx] + + mov qword ptr [rdx],rcx + + mov qword ptr 8[rdi],rax + mov rax,qword ptr 16[rdx] + + add rbp,8 + mov qword ptr 16[rdi],rax + + add rdi,24 + sub rbx,1 + jae copy_lp2 + ret + +copy_record_node2_1: + mov rax,qword ptr 8[rdx] + + cmp word ptr (-2+2)[rcx],0 + je copy_record_node2_1_b + + mov qword ptr [rbp],rdi + mov qword ptr [rdi],rcx + + lea rcx,1[rdi] + mov qword ptr 8[rdi],rax + + mov qword ptr [rdx],rcx + add rbp,8 + + add rdi,16 + sub rbx,1 + jae copy_lp2 + ret + +copy_record_node2_bb: + mov (-24)[rsi],rcx + sub rsi,24-1 + + mov [rdx],rsi + dec rsi + + mov rax,8[rdx] + mov rcx,16[rdx] + + mov [rbp],rsi + add rbp,8 + + mov 8[rsi],rax + sub rbx,1 + + mov 16[rsi],rcx + + jae copy_lp2 + ret + else + mov qword ptr [rbp],rdi + mov qword ptr [rdi],rcx + + lea rcx,1[rdi] + mov rax,qword ptr 8[rdx] + + mov qword ptr [rdx],rcx + jb copy_record_node2_1 + + mov qword ptr 8[rdi],rax + mov rax,qword ptr 16[rdx] + + add rbp,8 + mov qword ptr 16[rdi],rax + + add rdi,24 + sub rbx,1 + jae copy_lp2 + ret + +copy_record_node2_1: + add rbp,8 + mov qword ptr 8[rdi],rax + + add rdi,16 + sub rbx,1 + jae copy_lp2 + ret + endif + +copy_record_node2_3: + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + cmp word ptr (-2+2)[rcx],1 + jbe copy_record_node2_3_ab_or_b + endif + + push rax + lea rax,1[rdi] + + mov qword ptr [rdx],rax + mov rax,qword ptr 16[rdx] + + mov qword ptr [rdi],rcx + mov rdx,qword ptr 8[rdx] + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + mov qword ptr 8[rdi],rdx + mov qword ptr [rbp],rdi + add rbp,8 + + mov rcx,rax + test byte ptr [rax],1 + jne record_arguments_already_copied_2 + else + mov rcx,rax + if THREAD + sub rax,qword ptr heap_p1_offset[r9] + else + sub rax,qword ptr heap_p1 + endif + + shr rax,4 + mov qword ptr 8[rdi],rdx + + mov rdx,rax + and rax,31 + + shr rdx,3 + mov qword ptr [rbp],rdi + + and rdx,-4 + mov eax,dword ptr (bit_set_table)[rax*4] + + if THREAD + add rdx,qword ptr heap_copied_vector_offset[r9] + else + add rdx,qword ptr heap_copied_vector + endif + add rbp,8 + + test eax,[rdx] + jne record_arguments_already_copied_2 + + or [rdx],eax + endif + lea rdx,24[rdi] + + pop rax + mov qword ptr 16[rdi],rdx + + add rdi,25 + mov rdx,qword ptr [rcx] + + mov qword ptr [rcx],rdi + add rcx,8 + + mov qword ptr (-1)[rdi],rdx + add rdi,7 + +cp_record_arg_lp2: + mov rdx,qword ptr [rcx] + add rcx,8 + + mov qword ptr [rdi],rdx + add rdi,8 + + sub rax,1 + jne cp_record_arg_lp2 + + sub rbx,1 + jae copy_lp2 + ret + +record_arguments_already_copied_2: + mov rdx,qword ptr [rcx] + pop rax + + mov qword ptr 16[rdi],rdx + add rdi,24 + + sub rbx,1 + jae copy_lp2 + ret + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP +copy_record_node2_3_ab_or_b: + jb copy_record_node2_3_b + + push rax + lea rax,1[rdi] + + mov qword ptr [rdx],rax + mov rax,qword ptr 16[rdx] + + mov qword ptr [rdi],rcx + mov rdx,qword ptr 8[rdx] + + mov rcx,rax + if THREAD + sub rax,qword ptr heap_p1_offset[r9] + else + sub rax,qword ptr heap_p1 + endif + + shr rax,4 + mov qword ptr 8[rdi],rdx + + mov rdx,rax + and rax,31 + + shr rdx,3 + mov qword ptr [rbp],rdi + + and rdx,-4 + mov eax,dword ptr (bit_set_table)[rax*4] + + if THREAD + add rdx,qword ptr heap_copied_vector_offset[r9] + else + add rdx,qword ptr heap_copied_vector + endif + add rbp,8 + + test eax,[rdx] + jne record_arguments_already_copied_2 + + or [rdx],eax + pop rax + + sub rsi,8 + + shl rax,3 + sub rsi,rax + + push rsi + add rsi,1 + + mov qword ptr 16[rdi],rsi + add rdi,24 + + mov rdx,qword ptr [rcx] + jmp cp_record_arg_lp3_c + +copy_record_node2_3_b: + push rax + lea rax,(-24+1)[rsi] + + mov qword ptr [rdx],rax + mov rax,qword ptr 16[rdx] + + mov qword ptr (-24)[rsi],rcx + mov rdx,qword ptr 8[rdx] + + mov rcx,rax + if THREAD + sub rax,qword ptr heap_p1_offset[r9] + else + sub rax,qword ptr heap_p1 + endif + + shr rax,4 + mov qword ptr (-16)[rsi],rdx + + mov rdx,rax + and rax,31 + sub rsi,24 + + shr rdx,3 + mov qword ptr [rbp],rsi + + and rdx,-4 + mov eax,dword ptr (bit_set_table)[rax*4] + + if THREAD + add rdx,qword ptr heap_copied_vector_offset[r9] + else + add rdx,qword ptr heap_copied_vector + endif + add rbp,8 + + test eax,[rdx] + jne record_arguments_already_copied_3_b + + or [rdx],eax + pop rax + + mov rdx,rsi + sub rsi,8 + + shl rax,3 + sub rsi,rax + + mov qword ptr 16[rdx],rsi + + mov rdx,qword ptr [rcx] + + push rsi + add rsi,1 + +cp_record_arg_lp3_c: + mov qword ptr [rcx],rsi + add rcx,8 + mov qword ptr (-1) [rsi],rdx + add rsi,7 + +cp_record_arg_lp3: + mov rdx,qword ptr [rcx] + add rcx,8 + + mov qword ptr [rsi],rdx + add rsi,8 + + sub rax,8 + jne cp_record_arg_lp3 + + pop rsi + + sub rbx,1 + jae copy_lp2 + ret + +record_arguments_already_copied_3_b: + mov rdx,qword ptr [rcx] + pop rax + + sub rdx,1 + mov qword ptr 16[rsi],rdx + + sub rbx,1 + jae copy_lp2 + ret + endif + +not_in_hnf_2: + test cl,1 + jne already_copied_2 + + movsxd rax,dword ptr (-4)[rcx] + test rax,rax + jle copy_arity_0_node2_ + +copy_node2_1_: + and rax,255 + sub rax,2 + jl copy_arity_1_node2 +copy_node2_3: + mov [rbp],rdi + add rbp,8 + mov [rdi],rcx + inc rdi + mov [rdx],rdi + mov rcx,8[rdx] + add rdx,16 + mov (8-1)[rdi],rcx + add rdi,16-1 + +cp_arg_lp2: + mov rcx,[rdx] + add rdx,8 + mov [rdi],rcx + add rdi,8 + sub rax,1 + jae cp_arg_lp2 + + sub rbx,1 + jae copy_lp2 + ret + +copy_arity_1_node2: +copy_arity_1_node2_: + mov [rbp],rdi + inc rdi + + add rbp,8 + mov [rdx],rdi + + mov rax,8[rdx] + mov (-1)[rdi],rcx + + mov (8-1)[rdi],rax + add rdi,24-1 + + sub rbx,1 + jae copy_lp2 + ret + +copy_indirection_2: + mov rax,rdx + mov rdx,8[rdx] + + mov rcx,[rdx] + test cl,2 + jne in_hnf_2 + + test cl,1 + jne already_copied_2 + + cmp dword ptr (-4)[rcx],-2 + je skip_indirections_2 + + mov eax,(-4)[rcx] + test rax,rax + jle copy_arity_0_node2_ + jmp copy_node2_1_ + +skip_indirections_2: + mov rdx,8[rdx] + + mov rcx,[rdx] + test cl,2 + jne update_indirection_list_2 + test cl,1 + jne update_indirection_list_2 + + cmp dword ptr (-4)[rcx],-2 + je skip_indirections_2 + +update_indirection_list_2: + lea rcx,8[rax] + mov rax,8[rax] + mov [rcx],rdx + cmp rdx,rax + jne update_indirection_list_2 + + jmp continue_after_selector_2 + +copy_selector_2: + cmp rax,-2 + je copy_indirection_2 + jl copy_record_selector_2 + + mov rax,8[rdx] + ifdef NEW_DESCRIPTORS + mov d2,[rax] + test d2b,2 + je copy_arity_1_node2_ + + mov d3d,dword ptr (-8)[rcx] + + cmp word ptr (-2)[d2],2 + jbe copy_selector_2_ + + mov d2,16[rax] + + test byte ptr [d2],1 + jne copy_arity_1_node2_ + + movzx d3,word ptr 4[d3] + mov qword ptr [rdx],offset __indirection + + cmp d3,16 + jl copy_selector_2_1 + je copy_selector_2_2 + + mov rcx,qword ptr (-24)[d2+d3] + mov qword ptr 8[rdx],rcx + mov rdx,rcx + jmp continue_after_selector_2 + +copy_selector_2_1: + mov rcx,qword ptr 8[rax] + mov qword ptr 8[rdx],rcx + mov rdx,rcx + jmp continue_after_selector_2 + +copy_selector_2_2: + mov rcx,qword ptr [d2] + mov qword ptr 8[rdx],rcx + mov rdx,rcx + jmp continue_after_selector_2 + +copy_selector_2_: + movzx d3,word ptr 4[d3] + mov qword ptr [rdx],offset __indirection + + mov rcx,qword ptr [rax+d3] + mov qword ptr 8[rdx],rcx + mov rdx,rcx + jmp continue_after_selector_2 + else + mov rax,[rax] + test al,2 + je copy_arity_1_node2_ + + cmp word ptr (-2)[rax],2 + jbe copy_selector_2_ + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP +copy_selector_2__: + endif + mov rax,8[rdx] + mov rax,16[rax] + test byte ptr [rax],1 + jne copy_arity_1_node2_ + +copy_selector_2_: + mov eax,(-8)[rcx] + + mov rcx,8[rdx] + push rdx + push rbp + mov eax,4[rax] + call near ptr rax + pop rbp + pop rdx + + mov qword ptr [rdx],offset __indirection + mov 8[rdx],rcx + + mov rdx,rcx + jmp continue_after_selector_2 + endif + +copy_record_selector_2: + cmp rax,-3 + mov rax,qword ptr 8[rdx] + mov d2,qword ptr [rax] + je copy_strict_record_selector_2 + + test d2b,2 + je copy_arity_1_node2_ + + mov d3d,dword ptr (-8)[rcx] + + cmp word ptr (-2)[d2],258 + ifdef NEW_DESCRIPTORS + jbe copy_record_selector_2_ + else + jbe copy_selector_2_ + endif + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + cmp word ptr (-2+2)[d2],2 + jae copy_selector_2__ + endif + + mov d4,qword ptr 16[rax] + + lea d2,(-24)[d4] + if THREAD + sub d4,qword ptr heap_p1_offset[r9] + else + sub d4,qword ptr heap_p1 + endif + + mov d5,d4 + and d4,31*16 + + shr d5,7 + + shr d4,2 + and d5,-4 + + if THREAD + add d5,qword ptr heap_copied_vector_offset[r9] + else + add d5,qword ptr heap_copied_vector + endif + + mov d4d,dword ptr (bit_set_table)[d4] + + and d4d,dword ptr [d5] + + ifdef NEW_DESCRIPTORS + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + je copy_record_selector_2_ + jmp copy_arity_1_node2_ +copy_selector_2__: + mov d4,qword ptr 16[rax] + lea d2,(-24)[d4] + test byte ptr [d4],1 + jne copy_arity_1_node2_ + else + jne copy_arity_1_node2_ + endif +copy_record_selector_2_: + movzx d3,word ptr 4[d3] + mov qword ptr [rdx],offset __indirection + + cmp d3,16 + jle copy_record_selector_3 + mov rax,d2 +copy_record_selector_3: + mov rcx,qword ptr [rax+d3] + mov qword ptr 8[rdx],rcx + mov rdx,rcx + jmp continue_after_selector_2 + else + jne copy_arity_1_node2_ + jmp copy_selector_2_ + endif + +copy_strict_record_selector_2: + test d2b,2 + je copy_arity_1_node2_ + + mov d3d,dword ptr (-8)[rcx] + + cmp word ptr (-2)[d2],258 + jbe copy_strict_record_selector_2_ + + if COPY_RECORDS_WITHOUT_POINTERS_TO_END_OF_HEAP + cmp word ptr (-2+2)[d2],2 + jb copy_strict_record_selector_2_b + + mov d4,qword ptr 16[rax] + lea d2,(-24)[d4] + test byte ptr [d4],1 + jne copy_arity_1_node2_ + + jmp copy_strict_record_selector_2_ + +copy_strict_record_selector_2_b: + endif + + mov d4,qword ptr 16[rax] + + lea d2,(-24)[d4] + if THREAD + sub d4,qword ptr heap_p1_offset[r9] + else + sub d4,qword ptr heap_p1 + endif + + mov d5,d4 + and d4,31*16 + + shr d5,7 + + shr d4,2 + and d5,-4 + + if THREAD + add d5,qword ptr heap_copied_vector_offset[r9] + else + add d5,qword ptr heap_copied_vector + endif + + mov d4d,dword ptr (bit_set_table)[d4] + + and d4d,[d5] + + jne copy_arity_1_node2_ + +copy_strict_record_selector_2_: + ifdef NEW_DESCRIPTORS + movzx rcx,word ptr 4[d3] + cmp rcx,16 + jle copy_strict_record_selector_3 + mov rcx,qword ptr [d2+rcx] + jmp copy_strict_record_selector_4 +copy_strict_record_selector_3: + mov rcx,qword ptr [rax+rcx] +copy_strict_record_selector_4: + mov qword ptr 8[rdx],rcx + + movzx rcx,word ptr 6[d3] + test rcx,rcx + je copy_strict_record_selector_6 + cmp rcx,16 + jle copy_strict_record_selector_5 + mov rax,d2 +copy_strict_record_selector_5: + mov rcx,qword ptr [rax+rcx] + mov qword ptr 16[rdx],rcx +copy_strict_record_selector_6: + + mov rcx,qword ptr (-8)[d3] + mov qword ptr [rdx],rcx + jmp in_hnf_2 + else + mov rcx,rdx + mov rdx,qword ptr 8[rdx] + + push rbp + mov eax,4[d3] + call near ptr rax + pop rbp + + mov rdx,rcx + mov rcx,qword ptr [rcx] + test cl,2 + jne in_hnf_2 + hlt + endif + +copy_arity_0_node2_: + jl copy_selector_2 + + mov (-24)[rsi],rcx + sub rsi,24 + mov [rbp],rsi + lea rax,1[rsi] + + add rbp,8 + mov [rdx],rax + + sub rbx,1 + jae copy_lp2 + ret + +copy_string_or_array_2: + mov rcx,rdx + jne copy_array_2 + + if THREAD + sub rdx,heap_p1_offset[r9] + cmp rdx,semi_space_size_offset[r9] + else + sub rdx,heap_p1 + cmp rdx,semi_space_size + endif + jae copy_string_or_array_constant + + mov rdx,8[rcx] + add rbp,8 + + add rdx,7 + push rbx + + mov rax,rdx + and rdx,-8 + + shr rax,3 + sub rsi,rdx + + mov rbx,[rcx] + add rcx,8 + + mov (-16)[rsi],rbx + sub rsi,16 + + mov (-8)[rbp],rsi + lea rdx,1[rsi] + + mov (-8)[rcx],rdx + lea rdx,8[rsi] + +cp_s_arg_lp2: + mov rbx,[rcx] + add rcx,8 + + mov [rdx],rbx + add rdx,8 + + sub rax,1 + jge cp_s_arg_lp2 + + pop rbx + sub rbx,1 + jae copy_lp2 + ret + +copy_array_2: + if THREAD + sub rdx,heap_p1_offset[r9] + cmp rdx,semi_space_size_offset[r9] + else + sub rdx,heap_p1 + cmp rdx,semi_space_size + endif + jae copy_string_or_array_constant + + push rbx + + mov rax,qword ptr 16[rcx] + test rax,rax + je copy_array_a2 + + movzx rbx,word ptr (-2)[rax] + + test rbx,rbx + je copy_strict_basic_array_2 + + sub rbx,256 + imul rbx,qword ptr 8[rcx] + jmp copy_array_a3 + +copy_array_a2: + mov rbx,qword ptr 8[rcx] +copy_array_a3: + mov rdx,rdi + lea rdi,24[rdi+rbx*8] + + mov qword ptr [rbp],rdx + mov rax,qword ptr [rcx] + + add rbp,8 + mov qword ptr [rdx],rax + + lea rax,1[rdx] + add rdx,8 + + mov qword ptr [rcx],rax + add rcx,8 + + lea rax,1[rbx] + jmp cp_s_arg_lp2 + +copy_strict_basic_array_2: + mov rbx,qword ptr 8[rcx] + + cmp rax,offset dINT+2 + jle copy_int_or_real_array_2 + + cmp rax,offset BOOL+2 + je copy_bool_array_2 + +copy_int32_or_real32_array_2: + add rbx,1 + shr rbx,1 + +copy_int_or_real_array_2: + shl rbx,3 + lea rdx,(-24)[rsi] + + sub rdx,rbx + mov rax,qword ptr [rcx] + + shr rbx,3 + mov qword ptr [rbp],rdx + + add rbp,8 + mov rsi,rdx + + mov qword ptr [rdx],rax + lea rax,1[rdx] + + add rdx,8 + mov qword ptr [rcx],rax + + add rcx,8 + lea rax,1[rbx] + jmp cp_s_arg_lp2 + +copy_bool_array_2: + add rbx,7 + shr rbx,3 + jmp copy_int_or_real_array_2 + +copy_string_or_array_constant: + mov qword ptr [rbp],rcx + add rbp,8 + + sub rbx,1 + jae copy_lp2 + ret + +end_copy1: + if THREAD + mov heap_end_after_gc_offset[r9],rsi + else + mov heap_end_after_gc,rsi + endif + + mov rcx,offset finalizer_list + mov rdx,offset free_finalizer_list + mov rbp,qword ptr finalizer_list + +determine_free_finalizers_after_copy: + mov rax,qword ptr [rbp] + test al,1 + je finalizer_not_used_after_copy + + mov rbp,qword ptr 8[rbp] + sub rax,1 + mov qword ptr [rcx],rax + lea rcx,8[rax] + jmp determine_free_finalizers_after_copy + +finalizer_not_used_after_copy: + if THREAD + lea rax,__Nil-8 + cmp rbp,rax + else + lea r9,__Nil-8 + cmp rbp,r9 + endif + je end_finalizers_after_copy + + mov qword ptr [rdx],rbp + lea rdx,8[rbp] + mov rbp,qword ptr 8[rbp] + jmp determine_free_finalizers_after_copy + +end_finalizers_after_copy: + mov qword ptr [rcx],rbp + mov qword ptr [rdx],rbp diff --git a/thread/afileIO3.asm b/thread/afileIO3.asm index 62efe53..e93dca0 100644 --- a/thread/afileIO3.asm +++ b/thread/afileIO3.asm @@ -1,1021 +1,1021 @@ - -; nonvolatile registers: rbx rsi rdi rbp r12 r13 r14 r15 -; volatile registers: rax rcx rdx r8 r9 r10 r11 - - THREAD equ 1 - -_TEXT segment para 'CODE' -_TEXT ends -_DATA segment para 'DATA' -_DATA ends - - _DATA segment - align 8 - -freadstring_error: - db "Error in freadsubstring parameters." - db 10,0 - db 0,0,0 -fwritestring_error: - db "Error in fwritesubstring parameters." - db 10,0 - db 0,0 - - extrn clean_exception_handler:near - public clean_unwind_info -clean_unwind_info: - DD 000000009H - DD imagerel(clean_exception_handler) - -_DATA ends - - _TEXT segment - - public stdioF - public stderrF - public openF - public closeF - public reopenF - public readFC - public readFI - public readFR - public readFS - public readFString - public readLineF - public writeFC - public writeFI - public writeFR - public writeFS - public writeFString - public endF - public errorF - public positionF - public seekF - public shareF - public flushF - public openSF - public readSFC - public readSFI - public readSFR - public readSFS - public readLineSF - public endSF - public positionSF - public seekSF - -; imports - - extrn open_file:near - extrn open_stdio:near - extrn open_stderr:near - extrn re_open_file:near - extrn close_file:near - extrn file_read_char:near - extrn file_read_int:near - extrn file_read_real:near - extrn file_read_characters:near - extrn file_read_line:near - extrn file_write_char:near - extrn file_write_int:near - extrn file_write_real:near - extrn file_write_characters:near - extrn file_end:near - extrn file_error:near - extrn file_position:near - extrn file_seek:near - extrn file_share:near - extrn flush_file_buffer:near - extrn open_s_file:near - extrn file_read_s_char:near - extrn file_read_s_int:near - extrn file_read_s_real:near - extrn file_read_s_string:near - extrn file_read_s_line:near - extrn file_s_end:near - extrn file_s_position:near - extrn file_s_seek:near - - extrn collect_0:near - extrn collect_1:near - - extrn print_error:near - - extrn __STRING__:near - -stdioF: - mov rbp,rsp - and rsp,-16 - if THREAD - mov r14,r9 - endif - sub rsp,32 - call open_stdio - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov rbx,rax - mov rax,-1 - ret - -stderrF: - mov rbp,rsp - and rsp,-16 - if THREAD - mov r14,r9 - endif - sub rsp,32 - call open_stderr - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov rbx,rax - mov rax,-1 - ret - -openF: - mov rbp,rsp - and rsp,-16 - - mov rdx,rax - add rcx,8 - if THREAD - mov r14,r9 - endif - sub rsp,32 - call open_file - mov rsp,rbp - if THREAD - mov r9,r14 - endif - xor r10,r10 - test rax,rax - setns r10b - mov rbx,rax - mov rax,-1 - ret - -closeF: mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call close_file - mov rsp,rbp - if THREAD - mov r9,r14 - endif - ret - -reopenF: - mov rdx,rax - mov rcx,r10 - mov rbx,r10 - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call re_open_file - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov r10d,eax - mov rax,-1 - ret - -readFC: - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_read_char - mov rsp,rbp - if THREAD - mov r9,r14 - endif - cmp eax,-1 - je readFC_eof - - mov r10,rax - mov rax,-1 - mov r11,1 - ret - -readFC_eof: - xor r10,r10 - mov rax,-1 - xor r11,r11 - ret - -readFI: - mov rbp,rsp - sub rsp,40+8 - if THREAD - mov r14,r9 - endif - and rsp,-16 - - lea rdx,32[rsp] - mov rcx,rbx - call file_read_int - - mov r10,32[rsp] - - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov r11,rax - mov rax,-1 - ret - -readFR: - mov rbp,rsp - sub rsp,40+8 - if THREAD - mov r14,r9 - endif - and rsp,-16 - - lea rdx,32[rsp] - mov rcx,rbx - call file_read_real - - movlpd xmm0,qword ptr 32[rsp] - - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov r10,rax - mov rax,-1 - ret - -readFString: - mov rbp,8[rcx] - cmp r11,rbp - jae readFString_error - - sub rbp,r11 - cmp r10,rbp - ja readFString_error - - push rcx - - push r11 - - lea r8,16[rcx+r11] - mov rdx,rsp - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_read_characters - mov rsp,rbp - if THREAD - mov r9,r14 - endif - add rsp,8 - pop rcx - - mov r10,rax - mov rax,-1 - ret - -readFString_error: - mov rbp,offset freadstring_error - jmp print_error - -readFS: lea rbp,16+7[rax] - shr rbp,3 - sub r15,rbp - jb readFS_gc -readFS_r_gc: - add r15,rbp - - lea r8,__STRING__+2 - mov qword ptr [rdi],r8 -; mov qword ptr [rdi],offset __STRING__+2 - - lea r8,16[rdi] - mov 8[rdi],rax - lea rdx,8[rdi] - mov rcx,r10 - - mov rbx,r10 - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_read_characters - mov rsp,rbp - if THREAD - mov r9,r14 - endif - -readFS_end: - add rax,16+7 - mov rcx,rdi - shr rax,3 - sub r15,rax - lea rdi,[rdi+rax*8] - mov rax,-1 - ret - -readFS_gc: push rbp - call collect_0 - pop rbp - jmp readFS_r_gc - -readLineF: - cmp r15,32+2 - jb readLineF_gc - -readLineF_r_gc: - lea r8,__STRING__+2 - mov qword ptr [rdi],r8 -; mov qword ptr [rdi],offset __STRING__+2 - - lea r8,16[rdi] - lea rdx,-16[r15*8] - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_read_line - mov rsp,rbp - - mov 8[rdi],rax - if THREAD - mov r9,r14 - endif - test rax,rax - jns readFS_end - - lea rax,-16[r15*8] - mov r12,rdi - mov 8[rdi],rax - add rdi,16 - -readLineF_lp: - add rdi,rax - - mov r13,8[r12] - mov rcx,r12 - shr r13,3 - xor r15,r15 - add r13,2+32 - sub r15,r13 - - call collect_1 - - add r15,r13 - mov rax,8[rcx] - lea rdx,16[rcx] - lea rcx,7[rax] - shr rcx,3 - sub r15,2 - sub r15,rcx - - mov r12,rdi - - lea rbp,__STRING__+2 - mov qword ptr [rdi],rbp -; mov qword ptr [rdi],offset __STRING__+2 - - mov 8[rdi],rax - add rdi,16 - jmp st_copy_string1 - -copy_st_lp1: - mov rbp,[rdx] - add rdx,8 - mov [rdi],rbp - add rdi,8 -st_copy_string1: - sub rcx,1 - jnc copy_st_lp1 - - mov r8,rdi - lea rdx,[r15*8] - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_read_line - mov rsp,rbp - if THREAD - mov r9,r14 - endif - test rax,rax - js readLineF_again - - add 8[r12],rax - add rax,7 - - mov rcx,r12 - - shr rax,3 - sub r15,rax - lea rdi,[rdi+rax*8] - - mov rax,-1 - ret - -readLineF_gc: - sub r15,32+2 - call collect_0 - add r15,32+2 - jmp readLineF_r_gc - -readLineF_again: - mov rcx,8[r12] - lea rax,[r15*8] - add rcx,rax - mov 8[r12],rcx - jmp readLineF_lp - -writeFC: - mov rcx,r10 - mov rdx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_write_char - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov rax,-1 - ret - -writeFI: - mov rcx,r10 - mov rdx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_write_int - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov rax,-1 - ret - -writeFR: - mov rdx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_write_real - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov rax,-1 - ret - -writeFS: - mov r8,rbx - mov rdx,8[rcx] - add rcx,16 - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_write_characters - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov rax,-1 - ret - -writeFString: - mov rbp,8[rcx] - cmp r11,rbp - jae writeFString_error - - sub rbp,r11 - cmp r10,rbp - ja writeFString_error - - mov r8,rbx - mov rdx,r10 - lea rcx,16[rcx+r11] - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_write_characters - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov rax,-1 - - ret - -writeFString_error: - mov rbp,offset fwritestring_error - jmp print_error - -endF: - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_end - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov r10,rax - mov rax,-1 - ret - -errorF: - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_error - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov r10,rax - mov rax,-1 - ret - -positionF: - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_position - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov r10,rax - mov rax,-1 - ret - -seekF: - mov r8,rax - mov rdx,rbx - mov rcx,r11 - - mov rbx,r11 - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_seek - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov r10,rax - mov rax,-1 - ret - -shareF: - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_share - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov rax,-1 - ret - -flushF: - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call flush_file_buffer - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov r10,rax - mov rax,-1 - ret - -openSF: mov rdx,rax - add rcx,8 - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call open_s_file - mov rsp,rbp - if THREAD - mov r9,r14 - endif - xor r10,r10 - test rax,rax - setns r10b - - mov rbx,rax - xor rax,rax - ret - -readSFC: - push rax - - mov rdx,rsp - mov rax,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_read_s_char - mov rsp,rbp - if THREAD - mov r9,r14 - endif - cmp rax,-1 - je readSFC_eof - - pop rax - mov r10,rax - mov r11,1 - ret - -readSFC_eof: - pop rax - xor r10,r10 - xor r11,r11 - ret - -readSFI: - push rax - mov r8,rsp - sub rsp,8 - mov rdx,rsp - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_read_s_int - mov rsp,rbp - if THREAD - mov r9,r14 - endif - pop r10 - mov r11,rax - pop rax - - ret - -readSFR: - push rax - mov r8,rsp - sub rsp,8 - mov rdx,rsp - mov rcx,rbx - - mov rbp,rsp - sub rsp,40+8 - if THREAD - mov r14,r9 - endif - and rsp,-16 - call file_read_s_real - mov rsp,rbp - if THREAD - mov r9,r14 - endif - movlpd xmm0,qword ptr [rsp] - mov r10,rax - add rsp,8 - pop rax - - ret - -readSFS: - lea rbp,16+7[rax] - shr rbp,3 - sub r15,rbp - jb readSFS_gc -readSFS_r_gc: - add r15,rbp - - if THREAD - lea rbp,__STRING__+2 - mov qword ptr [rdi],rbp - else - lea r9,__STRING__+2 - mov qword ptr [rdi],r9 - endif -; mov qword ptr [rdi],offset __STRING__+2 - - push rbx - - if THREAD - mov r14,r9 - endif - mov r9,rsp - lea r8,8[rdi] - mov rdx,rax - mov rcx,r10 - - mov rbx,r10 - - mov rbp,rsp - or rsp,8 - sub rsp,40 - call file_read_s_string - mov rsp,rbp - if THREAD - mov r9,r14 - endif - -readSFS_end: - add rax,16+7 - mov rcx,rdi - shr rax,3 - sub r15,rax - lea rdi,[rdi+rax*8] - pop rax - ret - -readSFS_gc: push rbp - call collect_0 - pop rbp - jmp readSFS_r_gc - -readLineSF: - cmp r15,32+2 - ja readLineSF_gc - -readLineSF_r_gc: - push rax - - if THREAD - lea rbp,__STRING__+2 - mov qword ptr [rdi],rbp - else - lea r9,__STRING__+2 - mov qword ptr [rdi],r9 - endif -; mov qword ptr [rdi],offset __STRING__+2 - - if THREAD - mov r14,r9 - endif - mov r9,rsp - lea r8,16[rdi] - lea rdx,-16[r15*8] - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - sub rsp,40 - call file_read_s_line - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov 8[rdi],rax - - test rax,rax - jns readSFS_end - - lea rax,-16[r15*8] - mov r12,rdi - mov 8[rdi],rax - add rdi,16 - -readLineSF_lp: - add rdi,rax - - mov r13,8[r12] - mov rcx,r12 - shr r13,3 - xor r15,r15 - add r13,2+32 - sub r15,r13 - - call collect_1 - - add r15,r13 - mov rax,8[rcx] - lea rdx,16[rcx] - lea rcx,7[rax] - shr rcx,3 - sub r15,2 - sub r15,rcx - - mov r12,rdi - - lea rbp,__STRING__+2 - mov qword ptr [rdi],rbp -; mov qword ptr [rdi],offset __STRING__+2 - - mov 8[rdi],rax - add rdi,16 - jmp st_copy_string2 - -copy_st_lp2: - mov rbp,[rdx] - add rdx,8 - mov [rdi],rbp - add rdi,8 -st_copy_string2: - sub rcx,1 - jnc copy_st_lp2 - - if THREAD - mov r14,r9 - endif - mov r9,rsp - mov r8,rdi - lea rdx,[r15*8] - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - sub rsp,40 - call file_read_s_line - mov rsp,rbp - if THREAD - mov r9,r14 - endif - test rax,rax - js readLineSF_again - - add 8[r12],rax - add rax,7 - - mov rcx,r12 - - shr rax,3 - sub r15,rax - lea rdi,[rdi+rax*8] - - pop rax - ret - -readLineSF_gc: - sub r15,32+2 - call collect_0 - add r15,32+2 - jmp readLineSF_r_gc - -readLineSF_again: - mov rcx,8[r12] - lea rax,[r15*8] - add rcx,rax - mov 8[r12],rcx - jmp readLineSF_lp - -endSF: - mov rdx,rax - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_s_end - mov rsp,rbp - if THREAD - mov r9,r14 - endif - ret - -positionSF: - mov rdx,rax - mov rcx,rbx - - mov rbp,rsp - or rsp,8 - if THREAD - mov r14,r9 - endif - sub rsp,40 - call file_s_position - mov rsp,rbp - if THREAD - mov r9,r14 - endif - ret - -seekSF: - push rbx - if THREAD - mov r14,r9 - endif - mov r9,rsp - mov r8,rax - mov rdx,r10 - mov rcx,r11 - - mov rbx,r11 - - mov rbp,rsp - or rsp,8 - sub rsp,40 - call file_s_seek - mov rsp,rbp - if THREAD - mov r9,r14 - endif - mov r10,rax - pop rax - - ret - -_TEXT ends - - - end + +; nonvolatile registers: rbx rsi rdi rbp r12 r13 r14 r15 +; volatile registers: rax rcx rdx r8 r9 r10 r11 + + THREAD equ 1 + +_TEXT segment para 'CODE' +_TEXT ends +_DATA segment para 'DATA' +_DATA ends + + _DATA segment + align 8 + +freadstring_error: + db "Error in freadsubstring parameters." + db 10,0 + db 0,0,0 +fwritestring_error: + db "Error in fwritesubstring parameters." + db 10,0 + db 0,0 + + extrn clean_exception_handler:near + public clean_unwind_info +clean_unwind_info: + DD 000000009H + DD imagerel(clean_exception_handler) + +_DATA ends + + _TEXT segment + + public stdioF + public stderrF + public openF + public closeF + public reopenF + public readFC + public readFI + public readFR + public readFS + public readFString + public readLineF + public writeFC + public writeFI + public writeFR + public writeFS + public writeFString + public endF + public errorF + public positionF + public seekF + public shareF + public flushF + public openSF + public readSFC + public readSFI + public readSFR + public readSFS + public readLineSF + public endSF + public positionSF + public seekSF + +; imports + + extrn open_file:near + extrn open_stdio:near + extrn open_stderr:near + extrn re_open_file:near + extrn close_file:near + extrn file_read_char:near + extrn file_read_int:near + extrn file_read_real:near + extrn file_read_characters:near + extrn file_read_line:near + extrn file_write_char:near + extrn file_write_int:near + extrn file_write_real:near + extrn file_write_characters:near + extrn file_end:near + extrn file_error:near + extrn file_position:near + extrn file_seek:near + extrn file_share:near + extrn flush_file_buffer:near + extrn open_s_file:near + extrn file_read_s_char:near + extrn file_read_s_int:near + extrn file_read_s_real:near + extrn file_read_s_string:near + extrn file_read_s_line:near + extrn file_s_end:near + extrn file_s_position:near + extrn file_s_seek:near + + extrn collect_0:near + extrn collect_1:near + + extrn print_error:near + + extrn __STRING__:near + +stdioF: + mov rbp,rsp + and rsp,-16 + if THREAD + mov r14,r9 + endif + sub rsp,32 + call open_stdio + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov rbx,rax + mov rax,-1 + ret + +stderrF: + mov rbp,rsp + and rsp,-16 + if THREAD + mov r14,r9 + endif + sub rsp,32 + call open_stderr + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov rbx,rax + mov rax,-1 + ret + +openF: + mov rbp,rsp + and rsp,-16 + + mov rdx,rax + add rcx,8 + if THREAD + mov r14,r9 + endif + sub rsp,32 + call open_file + mov rsp,rbp + if THREAD + mov r9,r14 + endif + xor r10,r10 + test rax,rax + setns r10b + mov rbx,rax + mov rax,-1 + ret + +closeF: mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call close_file + mov rsp,rbp + if THREAD + mov r9,r14 + endif + ret + +reopenF: + mov rdx,rax + mov rcx,r10 + mov rbx,r10 + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call re_open_file + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov r10d,eax + mov rax,-1 + ret + +readFC: + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_read_char + mov rsp,rbp + if THREAD + mov r9,r14 + endif + cmp eax,-1 + je readFC_eof + + mov r10,rax + mov rax,-1 + mov r11,1 + ret + +readFC_eof: + xor r10,r10 + mov rax,-1 + xor r11,r11 + ret + +readFI: + mov rbp,rsp + sub rsp,40+8 + if THREAD + mov r14,r9 + endif + and rsp,-16 + + lea rdx,32[rsp] + mov rcx,rbx + call file_read_int + + mov r10,32[rsp] + + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov r11,rax + mov rax,-1 + ret + +readFR: + mov rbp,rsp + sub rsp,40+8 + if THREAD + mov r14,r9 + endif + and rsp,-16 + + lea rdx,32[rsp] + mov rcx,rbx + call file_read_real + + movlpd xmm0,qword ptr 32[rsp] + + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov r10,rax + mov rax,-1 + ret + +readFString: + mov rbp,8[rcx] + cmp r11,rbp + jae readFString_error + + sub rbp,r11 + cmp r10,rbp + ja readFString_error + + push rcx + + push r11 + + lea r8,16[rcx+r11] + mov rdx,rsp + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_read_characters + mov rsp,rbp + if THREAD + mov r9,r14 + endif + add rsp,8 + pop rcx + + mov r10,rax + mov rax,-1 + ret + +readFString_error: + mov rbp,offset freadstring_error + jmp print_error + +readFS: lea rbp,16+7[rax] + shr rbp,3 + sub r15,rbp + jb readFS_gc +readFS_r_gc: + add r15,rbp + + lea r8,__STRING__+2 + mov qword ptr [rdi],r8 +; mov qword ptr [rdi],offset __STRING__+2 + + lea r8,16[rdi] + mov 8[rdi],rax + lea rdx,8[rdi] + mov rcx,r10 + + mov rbx,r10 + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_read_characters + mov rsp,rbp + if THREAD + mov r9,r14 + endif + +readFS_end: + add rax,16+7 + mov rcx,rdi + shr rax,3 + sub r15,rax + lea rdi,[rdi+rax*8] + mov rax,-1 + ret + +readFS_gc: push rbp + call collect_0 + pop rbp + jmp readFS_r_gc + +readLineF: + cmp r15,32+2 + jb readLineF_gc + +readLineF_r_gc: + lea r8,__STRING__+2 + mov qword ptr [rdi],r8 +; mov qword ptr [rdi],offset __STRING__+2 + + lea r8,16[rdi] + lea rdx,-16[r15*8] + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_read_line + mov rsp,rbp + + mov 8[rdi],rax + if THREAD + mov r9,r14 + endif + test rax,rax + jns readFS_end + + lea rax,-16[r15*8] + mov r12,rdi + mov 8[rdi],rax + add rdi,16 + +readLineF_lp: + add rdi,rax + + mov r13,8[r12] + mov rcx,r12 + shr r13,3 + xor r15,r15 + add r13,2+32 + sub r15,r13 + + call collect_1 + + add r15,r13 + mov rax,8[rcx] + lea rdx,16[rcx] + lea rcx,7[rax] + shr rcx,3 + sub r15,2 + sub r15,rcx + + mov r12,rdi + + lea rbp,__STRING__+2 + mov qword ptr [rdi],rbp +; mov qword ptr [rdi],offset __STRING__+2 + + mov 8[rdi],rax + add rdi,16 + jmp st_copy_string1 + +copy_st_lp1: + mov rbp,[rdx] + add rdx,8 + mov [rdi],rbp + add rdi,8 +st_copy_string1: + sub rcx,1 + jnc copy_st_lp1 + + mov r8,rdi + lea rdx,[r15*8] + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_read_line + mov rsp,rbp + if THREAD + mov r9,r14 + endif + test rax,rax + js readLineF_again + + add 8[r12],rax + add rax,7 + + mov rcx,r12 + + shr rax,3 + sub r15,rax + lea rdi,[rdi+rax*8] + + mov rax,-1 + ret + +readLineF_gc: + sub r15,32+2 + call collect_0 + add r15,32+2 + jmp readLineF_r_gc + +readLineF_again: + mov rcx,8[r12] + lea rax,[r15*8] + add rcx,rax + mov 8[r12],rcx + jmp readLineF_lp + +writeFC: + mov rcx,r10 + mov rdx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_write_char + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov rax,-1 + ret + +writeFI: + mov rcx,r10 + mov rdx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_write_int + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov rax,-1 + ret + +writeFR: + mov rdx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_write_real + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov rax,-1 + ret + +writeFS: + mov r8,rbx + mov rdx,8[rcx] + add rcx,16 + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_write_characters + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov rax,-1 + ret + +writeFString: + mov rbp,8[rcx] + cmp r11,rbp + jae writeFString_error + + sub rbp,r11 + cmp r10,rbp + ja writeFString_error + + mov r8,rbx + mov rdx,r10 + lea rcx,16[rcx+r11] + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_write_characters + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov rax,-1 + + ret + +writeFString_error: + mov rbp,offset fwritestring_error + jmp print_error + +endF: + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_end + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov r10,rax + mov rax,-1 + ret + +errorF: + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_error + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov r10,rax + mov rax,-1 + ret + +positionF: + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_position + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov r10,rax + mov rax,-1 + ret + +seekF: + mov r8,rax + mov rdx,rbx + mov rcx,r11 + + mov rbx,r11 + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_seek + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov r10,rax + mov rax,-1 + ret + +shareF: + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_share + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov rax,-1 + ret + +flushF: + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call flush_file_buffer + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov r10,rax + mov rax,-1 + ret + +openSF: mov rdx,rax + add rcx,8 + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call open_s_file + mov rsp,rbp + if THREAD + mov r9,r14 + endif + xor r10,r10 + test rax,rax + setns r10b + + mov rbx,rax + xor rax,rax + ret + +readSFC: + push rax + + mov rdx,rsp + mov rax,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_read_s_char + mov rsp,rbp + if THREAD + mov r9,r14 + endif + cmp rax,-1 + je readSFC_eof + + pop rax + mov r10,rax + mov r11,1 + ret + +readSFC_eof: + pop rax + xor r10,r10 + xor r11,r11 + ret + +readSFI: + push rax + mov r8,rsp + sub rsp,8 + mov rdx,rsp + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_read_s_int + mov rsp,rbp + if THREAD + mov r9,r14 + endif + pop r10 + mov r11,rax + pop rax + + ret + +readSFR: + push rax + mov r8,rsp + sub rsp,8 + mov rdx,rsp + mov rcx,rbx + + mov rbp,rsp + sub rsp,40+8 + if THREAD + mov r14,r9 + endif + and rsp,-16 + call file_read_s_real + mov rsp,rbp + if THREAD + mov r9,r14 + endif + movlpd xmm0,qword ptr [rsp] + mov r10,rax + add rsp,8 + pop rax + + ret + +readSFS: + lea rbp,16+7[rax] + shr rbp,3 + sub r15,rbp + jb readSFS_gc +readSFS_r_gc: + add r15,rbp + + if THREAD + lea rbp,__STRING__+2 + mov qword ptr [rdi],rbp + else + lea r9,__STRING__+2 + mov qword ptr [rdi],r9 + endif +; mov qword ptr [rdi],offset __STRING__+2 + + push rbx + + if THREAD + mov r14,r9 + endif + mov r9,rsp + lea r8,8[rdi] + mov rdx,rax + mov rcx,r10 + + mov rbx,r10 + + mov rbp,rsp + or rsp,8 + sub rsp,40 + call file_read_s_string + mov rsp,rbp + if THREAD + mov r9,r14 + endif + +readSFS_end: + add rax,16+7 + mov rcx,rdi + shr rax,3 + sub r15,rax + lea rdi,[rdi+rax*8] + pop rax + ret + +readSFS_gc: push rbp + call collect_0 + pop rbp + jmp readSFS_r_gc + +readLineSF: + cmp r15,32+2 + ja readLineSF_gc + +readLineSF_r_gc: + push rax + + if THREAD + lea rbp,__STRING__+2 + mov qword ptr [rdi],rbp + else + lea r9,__STRING__+2 + mov qword ptr [rdi],r9 + endif +; mov qword ptr [rdi],offset __STRING__+2 + + if THREAD + mov r14,r9 + endif + mov r9,rsp + lea r8,16[rdi] + lea rdx,-16[r15*8] + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + sub rsp,40 + call file_read_s_line + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov 8[rdi],rax + + test rax,rax + jns readSFS_end + + lea rax,-16[r15*8] + mov r12,rdi + mov 8[rdi],rax + add rdi,16 + +readLineSF_lp: + add rdi,rax + + mov r13,8[r12] + mov rcx,r12 + shr r13,3 + xor r15,r15 + add r13,2+32 + sub r15,r13 + + call collect_1 + + add r15,r13 + mov rax,8[rcx] + lea rdx,16[rcx] + lea rcx,7[rax] + shr rcx,3 + sub r15,2 + sub r15,rcx + + mov r12,rdi + + lea rbp,__STRING__+2 + mov qword ptr [rdi],rbp +; mov qword ptr [rdi],offset __STRING__+2 + + mov 8[rdi],rax + add rdi,16 + jmp st_copy_string2 + +copy_st_lp2: + mov rbp,[rdx] + add rdx,8 + mov [rdi],rbp + add rdi,8 +st_copy_string2: + sub rcx,1 + jnc copy_st_lp2 + + if THREAD + mov r14,r9 + endif + mov r9,rsp + mov r8,rdi + lea rdx,[r15*8] + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + sub rsp,40 + call file_read_s_line + mov rsp,rbp + if THREAD + mov r9,r14 + endif + test rax,rax + js readLineSF_again + + add 8[r12],rax + add rax,7 + + mov rcx,r12 + + shr rax,3 + sub r15,rax + lea rdi,[rdi+rax*8] + + pop rax + ret + +readLineSF_gc: + sub r15,32+2 + call collect_0 + add r15,32+2 + jmp readLineSF_r_gc + +readLineSF_again: + mov rcx,8[r12] + lea rax,[r15*8] + add rcx,rax + mov 8[r12],rcx + jmp readLineSF_lp + +endSF: + mov rdx,rax + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_s_end + mov rsp,rbp + if THREAD + mov r9,r14 + endif + ret + +positionSF: + mov rdx,rax + mov rcx,rbx + + mov rbp,rsp + or rsp,8 + if THREAD + mov r14,r9 + endif + sub rsp,40 + call file_s_position + mov rsp,rbp + if THREAD + mov r9,r14 + endif + ret + +seekSF: + push rbx + if THREAD + mov r14,r9 + endif + mov r9,rsp + mov r8,rax + mov rdx,r10 + mov rcx,r11 + + mov rbx,r11 + + mov rbp,rsp + or rsp,8 + sub rsp,40 + call file_s_seek + mov rsp,rbp + if THREAD + mov r9,r14 + endif + mov r10,rax + pop rax + + ret + +_TEXT ends + + + end 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 diff --git a/thread/amark_prefetch.asm b/thread/amark_prefetch.asm index 86ec2fe..2cd0977 100644 --- a/thread/amark_prefetch.asm +++ b/thread/amark_prefetch.asm @@ -1,1964 +1,1964 @@ - -_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: - 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 - - mov r11,rax - if THREAD - mov qword ptr lazy_array_list_offset[r9],rbx - else - mov qword ptr lazy_array_list,rbx - endif - - lea rsi,(-4000)[rsp] - - mov rax,qword ptr caf_list - - if THREAD - mov qword ptr end_stack_offset[r9],rsi - else - mov qword ptr end_stack,rsi - endif - - mov r15,0 - mov r8,0 - - if THREAD - mov r10,neg_heap_p3_offset[r9] - mov r13,qword ptr end_stack_offset[r9] - else - mov r10,neg_heap_p3 - mov r13,qword ptr end_stack - endif - 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: - 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 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] - if THREAD - mov rsi,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 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 - if THREAD - mov rdx,rsi - else - mov rdx,r9 - endif - je pmark_tuple_selector_node_2 - if THREAD - mov rcx,qword ptr (-24)[rsi+rax] - else - mov rcx,qword ptr (-24)[r9+rax] - endif - mov qword ptr [rbp],rcx - jmp pmark_node - -pmark_tuple_selector_node_2: - if THREAD - mov rcx,qword ptr [rsi] - else - mov rcx,qword ptr [r9] - endif - 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 - - 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 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] - if THREAD - mov rsi,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 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 - if THREAD - mov rdx,rsi - else - mov rdx,r9 - endif - 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] - if THREAD - mov rsi,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 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 - if THREAD - mov rbx,qword ptr (-24)[rsi+rbx] - else - mov rbx,qword ptr (-24)[r9+rbx] - endif - 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 - if THREAD - mov rdx,rsi - else - mov rdx,r9 - endif - 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: - if THREAD - cmp rax,offset dINT+2 - else - lea r9,dINT+2 - cmp rax,r9 - endif - jb pmark_real_file_or_string - - or dword ptr [rdi+rbx*4],esi - - if THREAD - cmp rax,offset CHAR+2 - else - lea r9,CHAR+2 - cmp rax,r9 - endif - 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: - if THREAD - cmp rax,offset __STRING__+2 - else - lea r9,__STRING__+2 - cmp rax,r9 - endif - 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 dINT+2 - jle pmark_strict_int_or_real_array - cmp rbp,offset BOOL+2 - je pmark_strict_bool_array - add rax,6+1 - shr rax,1 - jmp pmark_basic_array_ -pmark_strict_int_or_real_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 - if THREAD - mov r13,qword ptr end_stack_offset[r9] - else - mov r13,qword ptr end_stack - endif - 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: - if THREAD - mov r13,qword ptr 16[rbp] - add r13,r10 - mov rbx,r13 - and r13,31*8 - else - mov r8,qword ptr 16[rbp] - mov r9,r8 - - add r8,r10 - mov rbx,r8 - and r8,31*8 - endif - shr rbx,8 - if THREAD - mov r13d,dword ptr (bit_set_table2)[r13] - test r13d,dword ptr [rdi+rbx*4] - else - mov r8d,dword ptr (bit_set_table2)[r8] - test r8d,dword ptr [rdi+rbx*4] - endif - jne pmarkr_no_selector_2 - - ifdef NEW_DESCRIPTORS - if THREAD - mov rbx,qword ptr 16[rbp] - endif - mov eax,dword ptr (-8)[rax] - lea rdx,__indirection - if THREAD - else - pop rbx - endif - - mov qword ptr (-8)[rcx],rdx - movzx eax,word ptr 4[rax] - if THREAD - mov r13,rcx - else - mov r8,rcx - endif - - cmp rax,16 - jl pmarkr_tuple_selector_node_1 - if THREAD - else - mov rdx,r9 - endif - je pmarkr_tuple_selector_node_2 - if THREAD - mov rcx,qword ptr (-24)[rbx+rax] - mov qword ptr [r13],rcx - pop rbx - else - mov rcx,qword ptr (-24)[r9+rax] - mov qword ptr [r8],rcx - endif - jmp pmarkr_node - -pmarkr_tuple_selector_node_2: - if THREAD - mov rcx,qword ptr [rbx] - mov qword ptr [r13],rcx - pop rbx - else - mov rcx,qword ptr [r9] - mov qword ptr [r8],rcx - endif - jmp pmarkr_node - endif - -pmarkr_small_tuple_or_record: - ifdef NEW_DESCRIPTORS - mov eax,(-8)[rax] - lea rdx,__indirection - if THREAD - else - pop rbx - endif - - mov qword ptr (-8)[rcx],rdx - movzx eax,word ptr 4[rax] - if THREAD - mov r13,rcx - else - mov r8,rcx - endif -pmarkr_tuple_selector_node_1: - mov rcx,qword ptr [rbp+rax] - if THREAD - mov qword ptr [r13],rcx - pop rbx - else - mov qword ptr [r8],rcx - endif - 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 - - if THREAD - mov r13,qword ptr 16[rbp] - add r13,r10 - mov rbx,r13 - and r13,31*8 - else - mov r8,qword ptr 16[rbp] - mov r9,r8 - - add r8,r10 - mov rbx,r8 - and r8,31*8 - endif - shr rbx,8 - if THREAD - mov r13d,dword ptr (bit_set_table2)[r13] - test r13d,dword ptr [rdi+rbx*4] - else - mov r8d,dword ptr (bit_set_table2)[r8] - test r8d,dword ptr [rdi+rbx*4] - endif - jne pmarkr_no_selector_2 - - if THREAD - mov rbx,qword ptr 16[rbp] - endif - -pmarkr_small_record: - mov eax,dword ptr (-8)[rax] - lea rdx,__indirection - if THREAD - else - pop rbx - endif - - mov qword ptr (-8)[rcx],rdx - movzx eax,word ptr 4[rax] - if THREAD - mov r13,rcx - else - mov r8,rcx - endif - - cmp rax,16 - jle pmarkr_record_selector_node_2 - if THREAD - mov rbp,rbx - else - mov rdx,r9 - endif - sub rax,24 -pmarkr_record_selector_node_2: - mov rcx,qword ptr [rbp+rax] - if THREAD - mov qword ptr [r13],rcx - pop rbx - else - mov qword ptr [r8],rcx - endif - 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 - - if THREAD - mov r13,qword ptr 16[rbp] - add r13,r10 - mov rbx,r13 - and r13,31*8 - else - mov r8,qword ptr 16[rbp] - mov r9,r8 - - add r8,r10 - mov rbx,r8 - and r8,31*8 - endif - shr rbx,8 - if THREAD - mov r13d,dword ptr (bit_set_table2)[r13] - test r13d,dword ptr [rdi+rbx*4] - else - mov r8d,dword ptr (bit_set_table2)[r8] - test r8d,dword ptr [rdi+rbx*4] - endif - jne pmarkr_no_selector_2 - if THREAD - mov r13,qword ptr 16[rbp] - endif - -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 - if THREAD - mov rbx,qword ptr (-24)[r13+rbx] - else - mov rbx,qword ptr (-24)[r9+rbx] - endif - 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 - if THREAD - mov rbp,r13 - else - mov rbp,r9 - endif - 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: - mov rax,qword ptr (-8)[rax] - mov qword ptr [rcx],rax - pop rbx - 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: - if THREAD - cmp rax,offset __STRING__+2 - else - lea r9,__STRING__+2 - cmp rax,r9 - endif - 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 - 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 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] - 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 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 dINT+2 - jle pmarkr_strict_int_or_real_array - cmp rbp,offset BOOL+2 - je pmarkr_strict_bool_array - add rax,6+1 - shr rax,1 - jmp pmarkr_basic_array -pmarkr_strict_int_or_real_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 + +_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: + 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 + + mov r11,rax + if THREAD + mov qword ptr lazy_array_list_offset[r9],rbx + else + mov qword ptr lazy_array_list,rbx + endif + + lea rsi,(-4000)[rsp] + + mov rax,qword ptr caf_list + + if THREAD + mov qword ptr end_stack_offset[r9],rsi + else + mov qword ptr end_stack,rsi + endif + + mov r15,0 + mov r8,0 + + if THREAD + mov r10,neg_heap_p3_offset[r9] + mov r13,qword ptr end_stack_offset[r9] + else + mov r10,neg_heap_p3 + mov r13,qword ptr end_stack + endif + 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: + 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 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] + if THREAD + mov rsi,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 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 + if THREAD + mov rdx,rsi + else + mov rdx,r9 + endif + je pmark_tuple_selector_node_2 + if THREAD + mov rcx,qword ptr (-24)[rsi+rax] + else + mov rcx,qword ptr (-24)[r9+rax] + endif + mov qword ptr [rbp],rcx + jmp pmark_node + +pmark_tuple_selector_node_2: + if THREAD + mov rcx,qword ptr [rsi] + else + mov rcx,qword ptr [r9] + endif + 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 + + 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 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] + if THREAD + mov rsi,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 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 + if THREAD + mov rdx,rsi + else + mov rdx,r9 + endif + 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] + if THREAD + mov rsi,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 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 + if THREAD + mov rbx,qword ptr (-24)[rsi+rbx] + else + mov rbx,qword ptr (-24)[r9+rbx] + endif + 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 + if THREAD + mov rdx,rsi + else + mov rdx,r9 + endif + 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: + if THREAD + cmp rax,offset dINT+2 + else + lea r9,dINT+2 + cmp rax,r9 + endif + jb pmark_real_file_or_string + + or dword ptr [rdi+rbx*4],esi + + if THREAD + cmp rax,offset CHAR+2 + else + lea r9,CHAR+2 + cmp rax,r9 + endif + 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: + if THREAD + cmp rax,offset __STRING__+2 + else + lea r9,__STRING__+2 + cmp rax,r9 + endif + 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 dINT+2 + jle pmark_strict_int_or_real_array + cmp rbp,offset BOOL+2 + je pmark_strict_bool_array + add rax,6+1 + shr rax,1 + jmp pmark_basic_array_ +pmark_strict_int_or_real_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 + if THREAD + mov r13,qword ptr end_stack_offset[r9] + else + mov r13,qword ptr end_stack + endif + 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: + if THREAD + mov r13,qword ptr 16[rbp] + add r13,r10 + mov rbx,r13 + and r13,31*8 + else + mov r8,qword ptr 16[rbp] + mov r9,r8 + + add r8,r10 + mov rbx,r8 + and r8,31*8 + endif + shr rbx,8 + if THREAD + mov r13d,dword ptr (bit_set_table2)[r13] + test r13d,dword ptr [rdi+rbx*4] + else + mov r8d,dword ptr (bit_set_table2)[r8] + test r8d,dword ptr [rdi+rbx*4] + endif + jne pmarkr_no_selector_2 + + ifdef NEW_DESCRIPTORS + if THREAD + mov rbx,qword ptr 16[rbp] + endif + mov eax,dword ptr (-8)[rax] + lea rdx,__indirection + if THREAD + else + pop rbx + endif + + mov qword ptr (-8)[rcx],rdx + movzx eax,word ptr 4[rax] + if THREAD + mov r13,rcx + else + mov r8,rcx + endif + + cmp rax,16 + jl pmarkr_tuple_selector_node_1 + if THREAD + else + mov rdx,r9 + endif + je pmarkr_tuple_selector_node_2 + if THREAD + mov rcx,qword ptr (-24)[rbx+rax] + mov qword ptr [r13],rcx + pop rbx + else + mov rcx,qword ptr (-24)[r9+rax] + mov qword ptr [r8],rcx + endif + jmp pmarkr_node + +pmarkr_tuple_selector_node_2: + if THREAD + mov rcx,qword ptr [rbx] + mov qword ptr [r13],rcx + pop rbx + else + mov rcx,qword ptr [r9] + mov qword ptr [r8],rcx + endif + jmp pmarkr_node + endif + +pmarkr_small_tuple_or_record: + ifdef NEW_DESCRIPTORS + mov eax,(-8)[rax] + lea rdx,__indirection + if THREAD + else + pop rbx + endif + + mov qword ptr (-8)[rcx],rdx + movzx eax,word ptr 4[rax] + if THREAD + mov r13,rcx + else + mov r8,rcx + endif +pmarkr_tuple_selector_node_1: + mov rcx,qword ptr [rbp+rax] + if THREAD + mov qword ptr [r13],rcx + pop rbx + else + mov qword ptr [r8],rcx + endif + 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 + + if THREAD + mov r13,qword ptr 16[rbp] + add r13,r10 + mov rbx,r13 + and r13,31*8 + else + mov r8,qword ptr 16[rbp] + mov r9,r8 + + add r8,r10 + mov rbx,r8 + and r8,31*8 + endif + shr rbx,8 + if THREAD + mov r13d,dword ptr (bit_set_table2)[r13] + test r13d,dword ptr [rdi+rbx*4] + else + mov r8d,dword ptr (bit_set_table2)[r8] + test r8d,dword ptr [rdi+rbx*4] + endif + jne pmarkr_no_selector_2 + + if THREAD + mov rbx,qword ptr 16[rbp] + endif + +pmarkr_small_record: + mov eax,dword ptr (-8)[rax] + lea rdx,__indirection + if THREAD + else + pop rbx + endif + + mov qword ptr (-8)[rcx],rdx + movzx eax,word ptr 4[rax] + if THREAD + mov r13,rcx + else + mov r8,rcx + endif + + cmp rax,16 + jle pmarkr_record_selector_node_2 + if THREAD + mov rbp,rbx + else + mov rdx,r9 + endif + sub rax,24 +pmarkr_record_selector_node_2: + mov rcx,qword ptr [rbp+rax] + if THREAD + mov qword ptr [r13],rcx + pop rbx + else + mov qword ptr [r8],rcx + endif + 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 + + if THREAD + mov r13,qword ptr 16[rbp] + add r13,r10 + mov rbx,r13 + and r13,31*8 + else + mov r8,qword ptr 16[rbp] + mov r9,r8 + + add r8,r10 + mov rbx,r8 + and r8,31*8 + endif + shr rbx,8 + if THREAD + mov r13d,dword ptr (bit_set_table2)[r13] + test r13d,dword ptr [rdi+rbx*4] + else + mov r8d,dword ptr (bit_set_table2)[r8] + test r8d,dword ptr [rdi+rbx*4] + endif + jne pmarkr_no_selector_2 + if THREAD + mov r13,qword ptr 16[rbp] + endif + +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 + if THREAD + mov rbx,qword ptr (-24)[r13+rbx] + else + mov rbx,qword ptr (-24)[r9+rbx] + endif + 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 + if THREAD + mov rbp,r13 + else + mov rbp,r9 + endif + 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: + mov rax,qword ptr (-8)[rax] + mov qword ptr [rcx],rax + pop rbx + 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: + if THREAD + cmp rax,offset __STRING__+2 + else + lea r9,__STRING__+2 + cmp rax,r9 + endif + 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 + 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 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] + 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 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 dINT+2 + jle pmarkr_strict_int_or_real_array + cmp rbp,offset BOOL+2 + je pmarkr_strict_bool_array + add rax,6+1 + shr rax,1 + jmp pmarkr_basic_array +pmarkr_strict_int_or_real_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 diff --git a/thread/astartup.asm b/thread/astartup.asm index 33ac35f..6862e97 100644 --- a/thread/astartup.asm +++ b/thread/astartup.asm @@ -1,5856 +1,5856 @@ - -; File: astartup.asm -; Author: John van Groningen -; Machine: amd64 - -_TEXT segment para 'CODE' -_TEXT ends -_DATA segment para 'DATA' -_DATA ends - - d2 equ r10 - d3 equ r11 - d4 equ r12 - d5 equ r13 - - d3d equ r11d - d4d equ r12d - - d2b equ r10b - - ifdef LINUX - .intel_syntax noprefix - endif - - THREAD equ 1 - - ifndef LINUX - extrn convert_real_to_string:near - endif - ifndef LINUX - extrn write_heap:near - endif - extrn return_code:near - extrn execution_aborted:near - extrn e____system__kFinalizerGCTemp:near - extrn e____system__kFinalizer:near - - ifdef LINUX - .globl times - .globl exit - else - extrn GetTickCount:near - extrn ExitProcess:near - endif - if THREAD - extrn TlsAlloc:near - endif - - ifdef USE_LIBM - extrn cos:near - extrn sin:near - extrn tan:near - extrn atan:near - endif - -NEW_DESCRIPTORS = 1 - - _DATA segment - align (1 shl 3) - - ife THREAD -semi_space_size dq 0 - -heap_p1 dq 0 -heap_p2 dq 0 -heap_p3 dq 0 -neg_heap_p3 dq 0 -end_heap_p3 dq 0 - -neg_heap_vector_plus_4 dq 0 - -heap_size_64_65 dq 0 -heap_vector dq 0 -stack_top dq 0 -end_vector dq 0 - -heap_size_257 dq 0 -heap_copied_vector dq 0 - -heap_end_after_gc dq 0 -extra_heap dq 0 -extra_heap_size dq 0 -stack_p dq 0 -halt_sp dq 0 - -n_allocated_words dq 0 - endif - - if THREAD - public tlsp_tls_index -tlsp_tls_index dq 0 - endif - -last_time dq 0 -execute_time dq 0 -garbage_collect_time dq 0 -IO_time dq 0 - -compact_garbage_collect_time dq 0 -mark_compact_garbage_collect_time dq 0 -total_gc_bytes dq 0 -total_compact_gc_bytes dq 0 - - ife THREAD - public saved_heap_p -saved_heap_p label ptr - dq 0 - dq 0 - - public saved_a_stack_p -saved_a_stack_p dq 0 - - public end_a_stack -end_a_stack dq 0 - - public int_to_real_scratch -int_to_real_scratch dq 0 - endif - -heap_end_write_heap dq 0 -d3_flag_write_heap dq 0 - - ife THREAD -heap2_begin_and_end label ptr - dq 0 - dq 0 - endif - - public a_stack_guard_page -a_stack_guard_page dq 0 - - public profile_stack_pointer -profile_stack_pointer dq 0 - -dll_initialised dq 0 - ife THREAD - public end_b_stack -end_b_stack dq 0 - endif -basic_only dq 0 - ife THREAD -heap_size_65 dq 0 -heap_copied_vector_size dq 0 -heap_end_after_copy_gc dq 0 -heap_mbp dq 0 -heap_p dq 0 -stack_mbp dq 0 - -bit_counter label ptr - dq 0 -bit_vector_p label ptr - dq 0 -zero_bits_before_mark label ptr - dq 1 -n_free_words_after_mark label ptr - dq 1000 -n_last_heap_free_bytes label ptr - dq 0 -lazy_array_list label ptr - dq 0 -n_marked_words label ptr - dq 0 -end_stack label ptr - dq 0 - -bit_vector_size label ptr - dq 0 - endif - - if THREAD - - comm main_thread_local_storage:512 - -heap_p1_offset = 0 -heap_p2_offset = 8 -heap_p3_offset = 16 - -saved_heap_p_offset = 24 -saved_r15_offset = 32 -saved_a_stack_p_offset = 40 - -heap_vector_offset = 48 -end_vector_offset = 56 ; temp -neg_heap_vector_plus_4_offset = 64 ; temp - -heap_size_64_65_offset = 72 ; temp -heap_size_257_offset = 80 - -heap_copied_vector_offset = 88 - -heap_end_after_gc_offset = 96 - -extra_heap_offset = 104 -extra_heap_size_offset = 112 - -stack_top_offset = 120 ; temp -stack_p_offset = 128 - -halt_sp_offset = 136 - -n_allocated_words_offset = 144 ; temp - -heap2_begin_and_end_offset = 152 -heap_copied_vector_size_offset = 168 -heap_end_after_copy_gc_offset = 176 -heap_mbp_offset = 184 -heap_p_offset = 192 -stack_mbp_offset = 200 -bit_counter_offset = 208 -bit_vector_p_offset = 216 -bit_vector_size_offset = 224 -zero_bits_before_mark_offset = 232 -n_free_words_after_mark_offset = 240 -n_last_heap_free_bytes_offset = 248 -n_marked_words_offset = 256 ; temp -end_stack_offset = 264 ; temp -lazy_array_list_offset = 272 ; temp -heap_size_offset = 280 -heap_size_65_offset = 288 -a_stack_size_offset = 296 -garbage_collect_flag_offset = 304 - -semi_space_size_offset = 312 ; temp -neg_heap_p3_offset = 320 ; temp -end_heap_p3_offset = 328 ; temp - - endif - -caf_list label ptr - dq 0 - public caf_listp -caf_listp label ptr - dq 0 - -zero_length_string label ptr - dq __STRING__+2 - dq 0 -true_string label ptr - dq __STRING__+2 - dq 4 -true_c_string label ptr - db "True" - db 0,0,0,0 -false_string label ptr - dq __STRING__+2 - dq 5 -false_c_string label ptr - db "False" - db 0,0,0 -file_c_string label ptr - db "File" - db 0,0,0,0 - ife THREAD -garbage_collect_flag label ptr - db 0 - db 0,0,0 - align (1 shl 3) - endif - - comm sprintf_buffer:32 - -out_of_memory_string_1 label ptr - db "Not enough memory to allocate heap and stack" - db 10,0 -printf_int_string label ptr - db "%d" - db 0 -printf_real_string label ptr - db "%.15g" - db 0 -printf_string_string label ptr - db "%s" - db 0 -printf_char_string label ptr - db "%c" - db 0 -garbage_collect_string_1 label ptr - db "A stack: " - db 0 -garbage_collect_string_2 label ptr - db " bytes. BC stack: " - db 0 -garbage_collect_string_3 label ptr - db " bytes." - db 10,0 -heap_use_after_gc_string_1 label ptr - db "Heap use after garbage collection: " - db 0 -heap_use_after_compact_gc_string_1 label ptr - db "Heap use after compacting garbage collection: " - db 0 -heap_use_after_gc_string_2 label ptr - db " Bytes." - db 10,0 -stack_overflow_string label ptr - db "Stack overflow." - db 10,0 -out_of_memory_string_4 label ptr - db "Heap full." - db 10,0 -time_string_1 label ptr - db "Execution: " - db 0 -time_string_2 label ptr - db " Garbage collection: " - db 0 -time_string_3 label ptr - db " " - db 0 -time_string_4 label ptr - db " Total: " - db 0 -high_index_string label ptr - db "Index too high in UPDATE string." - db 10,0 -low_index_string label ptr - db "Index negative in UPDATE string." - db 10,0 -IO_error_string label ptr - db "IO error: " - db 0 -new_line_string label ptr - db 10,0 -sprintf_time_string label ptr - db "%d.%02d" - db 0 -marked_gc_string_1 label ptr - db "Marked: " - db 0 - if THREAD -tls_alloc_error_string label ptr - db "Could not allocate thread local storage index" - db 10,0 - endif - - ifdef PROFILE - align 8 -m_system: - dd 6 - db "System" - db 0 - db 0 - - dd m_system -garbage_collector_name: - dq 0 - db "garbage_collector" - db 0 - align 8 - endif - - align 16 - public sign_real_mask -sign_real_mask label ptr - dq 8000000000000000h,8000000000000000h - public abs_real_mask -abs_real_mask label ptr - dq 7fffffffffffffffh,7fffffffffffffffh - - align (1 shl 3) -NAN_real label ptr - dd 0ffffffffh,7fffffffh -one_real label ptr - dd 00000000h,3ff00000h -zero_real label ptr - dd 00000000h,00000000h - - align (1 shl 2) -bit_set_table label ptr - dd 00000001h,00000002h,00000004h,00000008h - dd 00000010h,00000020h,00000040h,00000080h - dd 00000100h,00000200h,00000400h,00000800h - dd 00001000h,00002000h,00004000h,00008000h - dd 00010000h,00020000h,00040000h,00080000h - dd 00100000h,00200000h,00400000h,00800000h - dd 01000000h,02000000h,04000000h,08000000h - dd 10000000h,20000000h,40000000h,80000000h - dd 0 -bit_set_table2 label ptr - dd 00000001h,0,00000002h,0,00000004h,0,00000008h,0 - dd 00000010h,0,00000020h,0,00000040h,0,00000080h,0 - dd 00000100h,0,00000200h,0,00000400h,0,00000800h,0 - dd 00001000h,0,00002000h,0,00004000h,0,00008000h,0 - dd 00010000h,0,00020000h,0,00040000h,0,00080000h,0 - dd 00100000h,0,00200000h,0,00400000h,0,00800000h,0 - dd 01000000h,0,02000000h,0,04000000h,0,08000000h,0 - dd 10000000h,0,20000000h,0,40000000h,0,80000000h,0 - dd 0,0 -bit_clear_table label ptr - dd 0fffffffeh,0fffffffdh,0fffffffbh,0fffffff7h - dd 0ffffffefh,0ffffffdfh,0ffffffbfh,0ffffff7fh - dd 0fffffeffh,0fffffdffh,0fffffbffh,0fffff7ffh - dd 0ffffefffh,0ffffdfffh,0ffffbfffh,0ffff7fffh - dd 0fffeffffh,0fffdffffh,0fffbffffh,0fff7ffffh - dd 0ffefffffh,0ffdfffffh,0ffbfffffh,0ff7fffffh - dd 0feffffffh,0fdffffffh,0fbffffffh,0f7ffffffh - dd 0efffffffh,0dfffffffh,0bfffffffh,7fffffffh - dd 0ffffffffh -bit_clear_table2 label ptr - dd 0fffffffeh,-1,0fffffffdh,-1,0fffffffbh,-1,0fffffff7h,-1 - dd 0ffffffefh,-1,0ffffffdfh,-1,0ffffffbfh,-1,0ffffff7fh,-1 - dd 0fffffeffh,-1,0fffffdffh,-1,0fffffbffh,-1,0fffff7ffh,-1 - dd 0ffffefffh,-1,0ffffdfffh,-1,0ffffbfffh,-1,0ffff7fffh,-1 - dd 0fffeffffh,-1,0fffdffffh,-1,0fffbffffh,-1,0fff7ffffh,-1 - dd 0ffefffffh,-1,0ffdfffffh,-1,0ffbfffffh,-1,0ff7fffffh,-1 - dd 0feffffffh,-1,0fdffffffh,-1,0fbffffffh,-1,0f7ffffffh,-1 - dd 0efffffffh,-1,0dfffffffh,-1,0bfffffffh,-1,7fffffffh,-1 - dd 0ffffffffh,-1 -first_one_bit_table label ptr - db -1,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 - - align(1 shl 2) - comm sprintf_time_buffer:20 - - align(1 shl 3) - -; public small_integers - comm small_integers:33*16 -; public static_characters - comm static_characters:256*16 - -; extrn clean_exception_handler:near -; public clean_unwind_info -;clean_unwind_info: -; DD 000000009H -; DD imagerel(clean_exception_handler) - -_DATA ends - _TEXT segment - - public abc_main - public print - public print_char - public print_int - public print_real - public print__string__ - public print__chars__sc - public print_sc - public print_symbol - public print_symbol_sc - public printD - public DtoAC - public push_t_r_args - public push_a_r_args - public halt - public dump - - public catAC - public sliceAC - public updateAC - public eqAC - public cmpAC - - public string_to_string_node - public int_array_to_node - public real_array_to_node - - public _create_arrayB - public _create_arrayC - public _create_arrayI - public _create_arrayI32 - public _create_arrayR - public _create_arrayR32 - public _create_r_array - public create_array - public create_arrayB - public create_arrayC - public create_arrayI - public create_arrayI32 - public create_arrayR - public create_arrayR32 - public create_R_array - - public BtoAC - public ItoAC - public RtoAC - public eqD - - public collect_0 - public collect_1 - public collect_2 - public collect_3 - - public yet_args_needed - public yet_args_needed_0 - public yet_args_needed_1 - public yet_args_needed_2 - public yet_args_needed_3 - public yet_args_needed_4 - - public _c3,_c4,_c5,_c6,_c7,_c8,_c9,_c10,_c11,_c12 - public _c13,_c14,_c15,_c16,_c17,_c18,_c19,_c20,_c21,_c22 - public _c23,_c24,_c25,_c26,_c27,_c28,_c29,_c30,_c31,_c32 - - public e__system__nind - public e__system__eaind -; old names of the previous two labels for compatibility, remove later - public __indirection,__eaind - extrn e__system__dind:near - public eval_fill - - public eval_upd_0,eval_upd_1,eval_upd_2,eval_upd_3,eval_upd_4 - public eval_upd_5,eval_upd_6,eval_upd_7,eval_upd_8,eval_upd_9 - public eval_upd_10,eval_upd_11,eval_upd_12,eval_upd_13,eval_upd_14 - public eval_upd_15,eval_upd_16,eval_upd_17,eval_upd_18,eval_upd_19 - public eval_upd_20,eval_upd_21,eval_upd_22,eval_upd_23,eval_upd_24 - public eval_upd_25,eval_upd_26,eval_upd_27,eval_upd_28,eval_upd_29 - public eval_upd_30,eval_upd_31,eval_upd_32 - - public repl_args_b - public push_arg_b - public del_args - - public add_IO_time - public add_execute_time - public IO_error - public stack_overflow - - public out_of_memory_4 - public print_error - - ifdef LINUX - .globl __start - else - extrn _start:near - endif - - ifdef PROFILE -; extrn init_profiler:near -; extrn profile_n:near -; extrn profile_s:near -; extrn profile_r:near -; extrn write_profile_information:near -; extrn write_profile_stack:near - endif - - ifdef USE_LIBM - public cos_real - public sin_real - public tan_real - public asin_real - public acos_real - public atan_real - public ln_real - public log10_real - public exp_real - public pow_real - endif - public entier_real - public r_to_i_real - ifdef USE_LIBM - public _c_pow - public _c_log10 - public _c_entier - endif - - public __driver - -; from system.abc: - extrn dINT:near - extrn INT32:near - extrn CHAR:near - extrn BOOL:near - extrn REAL:near - extrn REAL32:near - extrn FILE:near - extrn __STRING__:near - extrn __ARRAY__:near - extrn __cycle__in__spine:near - extrn __print__graph:near - extrn __eval__to__nf:near - -; from wcon.c: - extrn w_print_char:near - extrn w_print_string:near - extrn w_print_text:near - extrn w_print_int:near - extrn w_print_real:near - - extrn ew_print_char:near - extrn ew_print_text:near - extrn ew_print_string:near - extrn ew_print_int:near - extrn ew_print_real:near - - extrn ab_stack_size:near - extrn heap_size:near - extrn flags:near - -; from standard c library: - - ifndef LINUX - extrn allocate_memory:near - ife THREAD - extrn allocate_memory_with_guard_page_at_end:near - endif - extrn free_memory:near - endif - - extrn heap_size_multiple:near - extrn initial_heap_size:near - - extrn min_write_heap_size:near - - extrn __Nil:near -; public finalizer_list - comm finalizer_list:qword -; public free_finalizer_list - comm free_finalizer_list:qword - -abc_main: - push rbx - push rcx - push rdx - push rbp - push rsi - push rdi - - call init_clean - test rax,rax - jne init_error - - call init_timer - - if THREAD - mov halt_sp_offset[r9],rsp - else - mov halt_sp,rsp - endif - - ifdef PROFILE - call init_profiler - endif - - ifdef LINUX - call __start - -exit_: - else - call _start - -exit: - endif - - call exit_clean - -init_error: - pop rdi - pop rsi - pop rbp - pop rdx - pop rcx - pop rbx - - ifdef LINUX - mov eax,dword ptr return_code - jne return_code_set_1 - mov eax,-1 -return_code_set_1: - endif - ret - - - public DllMain -DllMain: - cmp edx,1 - je DLL_PROCESS_ATTACH - jb DLL_PROCESS_DETACH - ret - -DLL_PROCESS_ATTACH: - push rbx - push rbp - push rsi - push rdi - ifndef LINUX - db 49h - push rsp - db 49h - push rbp - db 49h - push rsi - db 49h - push rdi - else - push r12 - push r13 - push r14 - push r15 - endif - mov qword ptr dll_initialised,1 - - call init_clean - test rax,rax - jne init_dll_error - - call init_timer - - if THREAD - mov halt_sp_offset[r9],rsp - else - mov halt_sp,rsp - endif - - ifdef PROFILE - call init_profiler - endif - - if THREAD - mov qword ptr saved_heap_p_offset[r9],rdi - mov qword ptr saved_r15_offset[r9],r15 - mov qword ptr saved_a_stack_p_offset[r9],rsi - else - mov qword ptr saved_heap_p,rdi - mov qword ptr saved_heap_p+8,r15 - mov saved_a_stack_p,rsi - endif - - mov rax,1 - jmp exit_dll_init - -init_dll_error: - xor rax,rax - jmp exit_dll_init - -DLL_PROCESS_DETACH: - push rbx - push rbp - push rsi - push rdi - ifndef LINUX - db 49h - push rsp - db 49h - push rbp - db 49h - push rsi - db 49h - push rdi - else - push r12 - push r13 - push r14 - push r15 - endif - - if THREAD - mov rdi,qword ptr saved_heap_p_offset[r9] - mov r15,qword ptr saved_r15_offset[r9] - mov rsi,qword ptr saved_a_stack_p_offset[r9] - else - mov rdi,qword ptr saved_heap_p - mov r15,qword ptr saved_heap_p+8 - mov rsi,saved_a_stack_p - endif - - call exit_clean - -exit_dll_init: - ifndef LINUX - db 49h - pop rdi - db 49h - pop rsi - db 49h - pop rbp - db 49h - pop rsp - else - pop r15 - pop r14 - pop r13 - pop r12 - endif - pop rdi - pop rsi - pop rbp - pop rbx - ret - -init_clean: - if THREAD - ifdef LINUX - sub rsp,8 - - mov rdi,rsp - sub rsi,rsi - - mov rbp,rsp - and rsp,-16 - call pthread_key_create - mov rsp,rbp - - lea r9,main_thread_local_storage - - test eax,eax - jne tls_alloc_error - - mov rdi,qword ptr [rsp] - mov rsi,r9 - - mov qword ptr tlsp_tls_index,rdi - - mov rbp,rsp - and rsp,-16 - call pthread_setspecific - mov rsp,rbp - - lea r9,main_thread_local_storage - - test eax,eax - jne tls_alloc_error - - add rsp,8 - - lea r9,main_thread_local_storage - else - sub rsp,32 - call TlsAlloc - add rsp,32 - - cmp rax,64 - jae tls_alloc_error - - mov qword ptr tlsp_tls_index,rax - - lea r9,main_thread_local_storage - - mov qword ptr gs:[1480h+rax*8],r9 - endif - endif - - lea rax,128[rsp] - sub rsp,32+8 - - ife THREAD - sub rax,qword ptr ab_stack_size - mov end_b_stack,rax - endif - mov rax,qword ptr flags - and rax,1 - mov basic_only,rax - -; call allow_prefetch_for_athlon - - mov rax,qword ptr heap_size - if THREAD - mov heap_size_offset[r9],rax - endif - sub rax,7 - xor rdx,rdx - mov rbx,65 - div rbx - if THREAD - mov qword ptr heap_size_65_offset[r9],rax - - mov rax,qword ptr heap_size_offset[r9] - else - mov qword ptr heap_size_65,rax - - mov rax,qword ptr heap_size - endif - - sub rax,7 - xor rdx,rdx - mov rbx,257 - div rbx - if THREAD - mov heap_size_257_offset[r9],rax - else - mov heap_size_257,rax - endif - add rax,7 - and rax,-8 - if THREAD - mov qword ptr heap_copied_vector_size_offset[r9],rax - mov qword ptr heap_end_after_copy_gc_offset[r9],0 - - mov rax,qword ptr heap_size_offset[r9] - else - mov qword ptr heap_copied_vector_size,rax - mov qword ptr heap_end_after_copy_gc,0 - - mov rax,qword ptr heap_size - endif - add rax,7 - and rax,-8 - if THREAD - mov qword ptr heap_size_offset[r9],rax - else - mov qword ptr heap_size,rax - endif - add rax,7 - - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov rdi,rax - call malloc - else - mov rcx,rax - call allocate_memory - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - - test rax,rax - je no_memory_2 - - if THREAD - mov heap_mbp_offset[r9],rax - else - mov heap_mbp,rax - endif - lea rdi,7[rax] - and rdi,-8 - if THREAD - mov heap_p_offset[r9],rdi - else - mov heap_p,rdi - endif - - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r14,rdi - mov rdi,qword ptr ab_stack_size - if THREAD - mov qword ptr a_stack_size_offset[r9],rdi - endif - add rdi,7 - call malloc - mov rdi,r14 - else - mov rcx,qword ptr ab_stack_size - if THREAD - mov qword ptr a_stack_size_offset[r9],rcx - endif - add rcx,7 - if THREAD - call allocate_memory - else - call allocate_memory_with_guard_page_at_end - endif - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - - test rax,rax - je no_memory_3 - - if THREAD - mov stack_mbp_offset[r9],rax - - add rax,qword ptr a_stack_size_offset[r9] - else - mov stack_mbp,rax - - add rax,qword ptr ab_stack_size - endif - add rax,7+4095 - and rax,-4096 - mov qword ptr a_stack_guard_page,rax - if THREAD - sub rax,qword ptr a_stack_size_offset[r9] - else - sub rax,qword ptr ab_stack_size - endif - - add rax,7 - and rax,-8 - - mov rsi,rax - if THREAD - mov stack_p_offset[r9],rax - else - mov stack_p,rax - endif - ife THREAD - add rax,qword ptr ab_stack_size - sub rax,64 - mov qword ptr end_a_stack,rax - endif - lea rcx,small_integers - xor rax,rax - lea rbx,(dINT+2) - -make_small_integers_lp: - mov [rcx],rbx - mov 8[rcx],rax - inc rax - add rcx,16 - cmp rax,33 - jne make_small_integers_lp - - lea rcx,static_characters - xor rax,rax - lea rbx,(CHAR+2) - -make_static_characters_lp: - mov [rcx],rbx - mov 8[rcx],rax - inc rax - add rcx,16 - cmp rax,256 - jne make_static_characters_lp - - lea rcx,(caf_list+8) - mov qword ptr caf_listp,rcx - - lea rcx,__Nil-8 - mov qword ptr finalizer_list,rcx - mov qword ptr free_finalizer_list,rcx - - if THREAD - mov heap_p1_offset[r9],rdi - - mov rbp,qword ptr heap_size_257_offset[r9] - else - mov heap_p1,rdi - - mov rbp,qword ptr heap_size_257 - endif - shl rbp,4 - lea rax,[rdi+rbp*8] - if THREAD - mov heap_copied_vector_offset[r9],rax - add rax,heap_copied_vector_size_offset[r9] - mov heap_p2_offset[r9],rax - - mov byte ptr garbage_collect_flag_offset[r9],0 - else - mov heap_copied_vector,rax - add rax,heap_copied_vector_size - mov heap_p2,rax - - mov byte ptr garbage_collect_flag,0 - endif - - test byte ptr flags,64 - je no_mark1 - - if THREAD - mov rax,qword ptr heap_size_65_offset[r9] - mov qword ptr heap_vector_offset[r9],rdi - else - mov rax,qword ptr heap_size_65 - mov qword ptr heap_vector,rdi - endif - add rdi,rax - - add rdi,7 - and rdi,-8 - - if THREAD - mov qword ptr heap_p3_offset[r9],rdi - else - mov qword ptr heap_p3,rdi - endif - lea rbp,[rax*8] - if THREAD - mov byte ptr garbage_collect_flag_offset [r9],-1 - else - mov byte ptr garbage_collect_flag,-1 - endif - -no_mark1: - mov rax,qword ptr initial_heap_size - - mov rbx,4000 - test byte ptr flags,64 - jne no_mark9 - add rbx,rbx -no_mark9: - - cmp rax,rbx - jle too_large_or_too_small - shr rax,3 - cmp rax,rbp - jge too_large_or_too_small - mov rbp,rax -too_large_or_too_small: - - lea rax,[rdi+rbp*8] - if THREAD - mov heap_end_after_gc_offset[r9],rax - else - mov heap_end_after_gc,rax - endif - - test byte ptr flags,64 - je no_mark2 - if THREAD - mov qword ptr bit_vector_size_offset[r9],rbp - else - mov qword ptr bit_vector_size,rbp - endif -no_mark2: - - mov r15,rbp - - add rsp,32+8 - xor rax,rax - ret - - if THREAD -tls_alloc_error: - mov rbp,rsp - and rsp,-16 - ifdef LINUX - lea rdi,tls_alloc_error_string - else - lea rcx,tls_alloc_error_string - endif - call ew_print_string - mov rsp,rbp - - add rsp,8 - mov rax,1 - ret - endif - -no_memory_2: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - lea rdi,out_of_memory_string_1 - else - lea rcx,out_of_memory_string_1 - endif - call ew_print_string - mov rsp,rbp - - mov qword ptr execution_aborted,1 - - add rsp,32 - if THREAD - mov r9,rbx - endif - mov rax,1 - ret - -no_memory_3: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - lea rdi,out_of_memory_string_1 - else - lea ecx,out_of_memory_string_1 - endif - call ew_print_string - - mov qword ptr execution_aborted,1 - - if THREAD - mov r9,rbx - endif - - ifdef LINUX - if THREAD - mov rdi,heap_mbp_offset[r9] - else - mov rdi,heap_mbp - endif - call free - else - if THREAD - mov rcx,heap_mbp_offset[r9] - else - mov rcx,heap_mbp - endif - call free_memory - endif - - mov rsp,rbp - if THREAD - mov r9,rbx - endif - add rsp,32 - mov rax,1 - ret - -exit_clean: - call add_execute_time - - mov rax,qword ptr flags - test al,8 - je no_print_execution_time - - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifndef LINUX - sub rsp,32 - endif - - ifdef LINUX - lea rdi,time_string_1 - else - lea rcx,time_string_1 - endif - call ew_print_string - - mov rax,execute_time - call print_time - - ifdef LINUX - lea rdi,time_string_2 - else - lea rcx,time_string_2 - endif - call ew_print_string - - mov rax,garbage_collect_time - ifdef MEASURE_GC - else - add rax,mark_compact_garbage_collect_time - add rax,compact_garbage_collect_time - endif - call print_time - - ifdef MEASURE_GC - - ifdef LINUX - lea rdi,time_string_3 - else - lea rcx,time_string_3 - endif - call ew_print_string - - mov rax,mark_compact_garbage_collect_time - call print_time - - ifdef LINUX - lea rdi,time_string_3 - else - lea rcx,time_string_3 - endif - call ew_print_string - - mov rax,compact_garbage_collect_time - call print_time - - endif - - ifdef LINUX - lea rdi,time_string_4 - else - lea rcx,time_string_4 - endif - call ew_print_string - - mov rax,execute_time - add rax,garbage_collect_time - add rax,IO_time - - add rax,mark_compact_garbage_collect_time - add rax,compact_garbage_collect_time - - call print_time - - ifdef LINUX - mov rdi,10 - else - mov rcx,10 - endif - call ew_print_char - - ifdef MEASURE_GC - - ifdef LINUX - mov rdi,total_gc_bytes - else - mov rcx,total_gc_bytes - endif - call ew_print_int - - ifdef LINUX - mov rdi,32 - else - mov rcx,32 - endif - call ew_print_char - - ifdef LINUX - mov rdi,total_compact_gc_bytes - else - mov rcx,total_compact_gc_bytes - endif - call ew_print_int - - ifdef LINUX - mov rdi,32 - else - mov rcx,32 - endif - call ew_print_char - - mov rax,1000 - cvtsi2sd xmm1,rax - cvtsi2sd xmm0,qword ptr garbage_collect_time - divsd xmm0,xmm1 - call ew_print_real - - ifdef LINUX - mov rdi,32 - else - mov rcx,32 - endif - call ew_print_char - - mov rax,1000 - cvtsi2sd xmm1,rax - cvtsi2sd xmm0,qword ptr mark_compact_garbage_collect_time - divsd xmm0,xmm1 - call ew_print_real - - ifdef LINUX - mov rdi,32 - else - mov rcx,32 - endif - call ew_print_char - - mov rax,1000 - cvtsi2sd xmm1,rax - cvtsi2sd xmm0,qword ptr compact_garbage_collect_time - divsd xmm0,xmm1 - call ew_print_real - - ifdef LINUX - mov rdi,10 - else - mov rcx,10 - endif - call ew_print_char - - mov rax,1000 - cvtsi2sd xmm1,rax - cvtsi2sd xmm2,qword ptr garbage_collect_time - divsd xmm2,xmm1 - mov rax,qword ptr total_gc_bytes - cvtsi2sd xmm0,rax - divsd xmm0,xmm2 - call ew_print_real - - ifdef LINUX - mov rdi,32 - else - mov rcx,32 - endif - call ew_print_char - - mov rax,1000 - cvtsi2sd xmm1,rax - cvtsi2sd xmm2,qword ptr mark_compact_garbage_collect_time - divsd xmm2,xmm1 - mov rax,qword ptr total_compact_gc_bytes - cvtsi2sd xmm0,rax - divsd xmm0,xmm2 - call ew_print_real - - ifdef LINUX - mov rdi,32 - else - mov rcx,32 - endif - call ew_print_char - - mov rax,1000 - cvtsi2sd xmm1,rax - cvtsi2sd xmm2,qword ptr compact_garbage_collect_time - divsd xmm2,xmm1 - mov rax,qword ptr total_compact_gc_bytes - cvtsi2sd xmm0,rax - divsd xmm0,xmm2 - call ew_print_real - - ifdef LINUX - mov rdi,32 - else - mov rcx,32 - endif - call ew_print_char - - mov rax,1000 - cvtsi2sd xmm1,rax - cvtsi2sd xmm2,qword ptr mark_compact_garbage_collect_time - cvtsi2sd xmm3,qword ptr compact_garbage_collect_time - addsd xmm2,xmm3 - divsd xmm2,xmm1 - mov rax,qword ptr total_compact_gc_bytes - cvtsi2sd xmm0,rax - divsd xmm0,xmm2 - call ew_print_real - - ifdef LINUX - mov rdi,10 - else - mov rcx,10 - endif - call ew_print_char - - endif - - mov rsp,rbp - if THREAD - mov r9,rbx - endif - -no_print_execution_time: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - if THREAD - mov rdi,stack_mbp_offset[r9] - else - mov rdi,stack_mbp - endif - call free - if THREAD - mov r9,rbx - endif - - if THREAD - mov rdi,heap_mbp_offset[r9] - else - mov rdi,heap_mbp - endif - call free - else - if THREAD - mov rcx,stack_mbp_offset[r9] - else - mov rcx,stack_mbp - endif - sub rsp,32 - call free_memory - if THREAD - mov r9,rbx - endif - - if THREAD - mov rcx,heap_mbp_offset[r9] - else - mov rcx,heap_mbp - endif - call free_memory - add rsp,32 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - - ifdef PROFILE - ifndef TRACE - call write_profile_information - endif - endif - - ret - -__driver: - mov rbp,qword ptr flags - test rbp,16 - je __print__graph - jmp __eval__to__nf - -print_time: - push rbp - if THREAD - mov r14,r9 - push rbx - endif - - xor rdx,rdx - mov rbx,1000 - div rbx - mov rcx,rax - mov rax,rdx - xor rdx,rdx - mov rbx,10 - div rbx - - push rax - - mov rbp,rsp - and rsp,-16 - ifdef LINUX - mov rdi,rcx - else - sub rsp,32 - endif - call ew_print_int - mov rsp,rbp - - lea rcx,sprintf_time_buffer - - xor rdx,rdx - mov rbx,10 - -; movb $'.',(%rcx) - mov byte ptr [rcx],46 - - pop rax - - div rbx - add rax,48 - add rdx,48 - mov byte ptr 1[rcx],al - mov byte ptr 2[rcx],dl - - mov rbp,rsp - and rsp,-16 - ifdef LINUX - mov rsi,3 - mov rdi,rcx - else - mov rdx,3 - sub rsp,32 - endif - call ew_print_text - mov rsp,rbp - - if THREAD - pop rbx - mov r9,r14 - endif - pop rbp - ret - -print_sc: - mov rbp,basic_only - test rbp,rbp - jne end_print - -print: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - mov rdi,rax - else - mov rcx,rax - sub rsp,32 - endif - call w_print_string - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - -end_print: - ret - -dump: - call print - jmp halt - -printD: test al,2 - jne printD_ - - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - - lea rdi,4[rax] - mov esi,0[rax] - else - lea rcx,4[rax] - mov edx,dword ptr [rax] - sub rsp,32 - endif - call w_print_text - ifdef LINUX - mov rsi,r13 - mov rsi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - ret - -DtoAC_record: - ifdef NEW_DESCRIPTORS - movsxd rbp,dword ptr (-6)[rax] - else - movsx rbp,dword ptr (-4)[rbp] - endif - jmp DtoAC_string_a2 - -DtoAC: test al,2 - jne DtoAC_ - - mov rbp,rax - jmp DtoAC_string_a2 - -DtoAC_: - ifdef NEW_DESCRIPTORS - cmp word ptr (-2)[rax],256 - jae DtoAC_record - - movzx rbx,word ptr [rax] - lea rbp,10[rax+rbx] - else - lea rbp,(-2)[rax] - movsx rbx,word ptr [rbp] - cmp rbx,256 - jae DtoAC_record - - shl rbx,3 - sub rbp,rbx - - movzx rbx,word ptr (-2)[rbp] - lea rbp,4[rbp+rbx*8] - endif - -DtoAC_string_a2: - mov eax,dword ptr [rbp] - lea rcx,4[rbp] - jmp build_string - -print_symbol: - xor rbx,rbx - jmp print_symbol_2 - -print_symbol_sc: - mov rbx,basic_only -print_symbol_2: - mov rax,[rcx] - - cmp rax,offset dINT+2 - je print_int_node - - cmp rax,offset CHAR+2 - je print_char_denotation - - cmp rax,offset BOOL+2 - je print_bool - - cmp rax,offset REAL+2 - je print_real_node - - test rbx,rbx - jne end_print_symbol - -printD_: - ifdef NEW_DESCRIPTORS - cmp word ptr (-2)[rax],256 - jae print_record - - movzx rbx,word ptr [rax] - lea rbp,10[rax+rbx] - jmp print_string_a2 - -print_record: - movsxd rbp,dword ptr (-6)[rax] - jmp print_string_a2 - else - lea rbp,(-2)[rax] - movsx rbx,word ptr [rbp] - cmp rbx,256 - jae print_record - - shl rbx,3 - sub rbp,rbx - - movzx rbx,word ptr (-2)[rbp] - lea rbp,4[rbp+rbx*8] - jmp print_string_a2 - -print_record: - mov ebp,(-4)[rbp] - jmp print_string_a2 - endif - -end_print_symbol: - ret - -print_int_node: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - mov rdi,8[rcx] - else - sub rsp,32 - mov rcx,8[rcx] - endif - call w_print_int - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - ret - -print_int: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - mov rdi,rax - else - mov rcx,rax - sub rsp,32 - endif - call w_print_int - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - ret - -print_char_denotation: - test rbx,rbx - jne print_char_node - - mov rbp,rsp - and rsp,-16 - if THREAD - mov r14,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - else - sub rsp,32 - endif - mov rbx,8[rcx] - - ifdef LINUX - mov rdi,0x27 - else - mov rcx,27h - endif - call w_print_char - - ifdef LINUX - mov rdi,rbx - else - mov rcx,rbx - endif - call w_print_char - - ifdef LINUX - mov rdi,0x27 - else - mov rcx,27h - endif - call w_print_char - - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,r14 - endif - ret - -print_char_node: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - - mov rdi,8[rcx] -else - mov rcx,8[rcx] - sub rsp,32 - endif - call w_print_char - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - ret - -print_char: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - - mov rdi,rax - else - mov rcx,rax - sub rsp,32 - endif - call w_print_char - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - ret - -print_bool: - movsx rcx,byte ptr 8[rcx] - test rcx,rcx - je print_false - -print_true: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - lea rdi,true_c_string - else - lea rcx,true_c_string - sub rsp,32 - endif - call w_print_string - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - ret - -print_false: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - lea rdi,false_c_string - else - lea rcx,false_c_string - sub rsp,32 - endif - call w_print_string - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - ret - -print_real_node: - movlpd xmm0,qword ptr 8[rcx] -print_real: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - else - sub rsp,32 - endif - call w_print_real - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - ret - -print_string_a2: - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - lea rdi,4[rbp] - mov esi,0[rbp] - mov rbp,rsp - and rsp,-16 - else - lea rcx,4[rbp] - mov edx,0[rbp] - mov rbp,rsp - and rsp,-16 - sub rsp,32 - endif - call w_print_text - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - ret - -print__chars__sc: - mov rbp,basic_only - test rbp,rbp - jne no_print_chars - -print__string__: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - mov rsi,8[rcx] - lea rdi,16[rcx] - else - mov rdx,8[rcx] - lea rcx,16[rcx] - sub rsp,32 - endif - call w_print_text - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif -no_print_chars: - ret - -push_a_r_args: - push rdi - - mov rdx,qword ptr 16[rcx] - sub rdx,2 - movzx rdi,word ptr [rdx] - sub rdi,256 - movzx rbx,word ptr 2[rdx] - add rdx,4 - push rdx - - mov rdx,rdi - sub rdx,rbx - - shl rax,3 - lea rcx,24[rcx+rbx*8] - dec rdi -mul_array_size_lp: - add rcx,rax - sub rdi,1 - jnc mul_array_size_lp - - lea rdi,[rcx+rdx*8] - jmp push_a_elements -push_a_elements_lp: - mov rax,qword ptr (-8)[rcx] - sub rcx,8 - mov qword ptr [rsi],rax - add rsi,8 -push_a_elements: - sub rbx,1 - jnc push_a_elements_lp - - mov rcx,rdi - pop rax - pop rdi - - pop rbp - jmp push_b_elements -push_b_elements_lp: - push (-8)[rcx] - sub rcx,8 -push_b_elements: - sub rdx,1 - jnc push_b_elements_lp - - jmp rbp - -push_t_r_args: - pop rbp - - mov rdx,qword ptr [rcx] - add rcx,8 - sub rdx,2 - movzx rax,word ptr [rdx] - sub rax,256 - movzx rbx,word ptr 2[rdx] - add rdx,4 - - mov qword ptr [rsi],rdx - mov qword ptr 8[rsi],rbx - - sub rbx,rax - neg rbx - - lea rdx,[rcx+rax*8] - cmp rax,2 - jbe small_record - mov rdx,qword ptr 8[rcx] - lea rdx,(-8)[rdx+rax*8] -small_record: - jmp push_r_b_elements - -push_r_b_elements_lp: - dec rax - jne not_first_arg_b - - push [rcx] - jmp push_r_b_elements -not_first_arg_b: - push (-8)[rdx] - sub rdx,8 -push_r_b_elements: - sub rbx,1 - jnc push_r_b_elements_lp - - mov rbx,qword ptr 8[rsi] - push rbp - push [rsi] - jmp push_r_a_elements - -push_r_a_elements_lp: - dec rax - jne not_first_arg_a - - mov rbp,qword ptr [rcx] - mov qword ptr [rsi],rbp - add rsi,8 - jmp push_r_a_elements -not_first_arg_a: - mov rbp,qword ptr (-8)[rdx] - sub rdx,8 - mov qword ptr [rsi],rbp - add rsi,8 -push_r_a_elements: - sub rbx,1 - jnc push_r_a_elements_lp - - pop rax - ret - -BtoAC: - test al,al - je BtoAC_false -BtoAC_true: - mov rcx,offset true_string - ret -BtoAC_false: - mov rcx,offset false_string - ret - -RtoAC: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - lea rsi,printf_real_string - lea rdi,sprintf_buffer - mov rax,1 - call sprintf - mov rsi,r13 - mov rdi,r14 - else - lea rdx,sprintf_buffer - sub rsp,32 - call convert_real_to_string - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - jmp return_sprintf_buffer - -ItoAC: - mov rcx,offset sprintf_buffer - call int_to_string - - mov rax,rcx - sub rax,offset sprintf_buffer - - jmp sprintf_buffer_to_string - - public convert_int_to_string -convert_int_to_string: - push rbp - push rbx - mov rax,rdx - call int_to_string - mov rax,rcx - pop rbx - pop rbp - ret - -int_to_string: - test rax,rax - jns no_minus - mov byte ptr [rcx],45 - inc rcx - neg rax -no_minus: - mov rbp,rcx - - je zero_digit - -calculate_digits: - cmp rax,10 - jb last_digit - - mov rdx,0cccccccccccccccdh - mov rbx,rax - - mul rdx - - mov rax,rdx - and rdx,-8 - add rbx,48 - - shr rax,3 - sub rbx,rdx - shr rdx,2 - - sub rbx,rdx - mov byte ptr [rcx],bl - - inc rcx - jmp calculate_digits - -last_digit: - test rax,rax - je no_zero -zero_digit: - add rax,48 - mov byte ptr [rcx],al - inc rcx -no_zero: - mov rdx,rcx - -reverse_digits: - dec rdx - cmp rbp,rdx - jae end_reverse_digits - mov bl,byte ptr [rbp] - mov al,byte ptr [rdx] - mov byte ptr [rdx],bl - mov byte ptr [rbp],al - inc rbp - jmp reverse_digits - -end_reverse_digits: - mov byte ptr [rcx],0 - ret - -return_sprintf_buffer: - mov rax,offset sprintf_buffer-1 -skip_characters: - inc rax - cmp byte ptr [rax],0 - jne skip_characters - - sub rax,offset sprintf_buffer - -sprintf_buffer_to_string: - mov rcx,offset sprintf_buffer -build_string: - - lea rbx,16+7[rax] - shr rbx,3 - - sub r15,rbx - jge D_to_S_no_gc - - push rcx - call collect_0 - pop rcx - -D_to_S_no_gc: - if THREAD - lea rbp,__STRING__+2 - sub rbx,2 - mov qword ptr [rdi],rbp - mov 8[rdi],rax - mov rbp,rdi - else - sub rbx,2 - mov rbp,rdi - lea r9,__STRING__+2 - mov qword ptr [rdi],r9 - mov 8[rdi],rax - endif - add rdi,16 - jmp D_to_S_cp_str_2 - -D_to_S_cp_str_1: - mov rax,[rcx] - add rcx,8 - mov [rdi],rax - add rdi,8 -D_to_S_cp_str_2: - sub rbx,1 - jnc D_to_S_cp_str_1 - - mov rcx,rbp - ret - -eqD: mov rax,[rcx] - cmp rax,[rdx] - jne eqD_false - - cmp rax,offset dINT+2 - je eqD_INT - cmp rax,offset CHAR+2 - je eqD_CHAR - cmp rax ,offset BOOL+2 - je eqD_BOOL - cmp rax ,offset REAL+2 - je eqD_REAL - - mov rax ,1 - ret - -eqD_CHAR: -eqD_INT: - mov rbx,8[rcx] - xor rax,rax - cmp rbx,8[rdx] - sete al - ret - -eqD_BOOL: - mov bl,byte ptr 8[rcx] - xor rax,rax - cmp bl,byte ptr 8[rdx] - sete al - ret - -eqD_REAL: - movlpd xmm0,qword ptr 8[rcx] - comisd xmm0,qword ptr 8[rdx] - fnstsw ax - and ah,68 - xor ah,64 - sete al - and rax,1 - ret - -eqD_false: - xor rax ,rax - ret -; -; the timer -; - - -init_timer: - mov rbp,rsp - and rsp,-16 - sub rsp,32 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - mov rdi,rsp - call times - mov rsi,r13 - mov rdi,r14 - mov eax,[rsp] - imul eax,10 - else - call GetTickCount - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - - mov last_time,rax - xor rax,rax - mov execute_time,rax - mov garbage_collect_time,rax - mov IO_time,rax - - mov mark_compact_garbage_collect_time,rax - mov compact_garbage_collect_time,rax - - ret - -get_time_diff: - mov rbp,rsp - and rsp,-16 - sub rsp,32 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - mov rdi,rsp - call times - mov rsi,r13 - mov rdi,r14 - mov eax,[rsp] - imul eax,10 - else - call GetTickCount - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - - lea rcx,last_time - mov rdx,[rcx] - mov [rcx],rax - sub rax,rdx - ret - -add_execute_time: - call get_time_diff - lea rcx,execute_time - -add_time: - add rax,[rcx] - mov [rcx],rax - ret - -add_garbage_collect_time: - call get_time_diff - mov rcx,offset garbage_collect_time - jmp add_time - -add_IO_time: - call get_time_diff - mov rcx,offset IO_time - jmp add_time - -add_mark_compact_garbage_collect_time: - call get_time_diff - mov rcx,offset mark_compact_garbage_collect_time - jmp add_time - -add_compact_garbage_collect_time: - call get_time_diff - mov rcx,offset compact_garbage_collect_time - jmp add_time -; -; the garbage collector -; - -collect_3: - ifdef PROFILE - lea rbp,garbage_collector_name - call profile_s - endif - mov [rsi],rcx - mov 8[rsi],rdx - mov 16[rsi],r8 - add rsi,24 - call collect_0_ - mov r8,(-8)[rsi] - mov rdx,(-16)[rsi] - mov rcx,(-24)[rsi] - sub rsi,24 - ifdef PROFILE - jmp profile_r - else - ret - endif - -collect_2: - ifdef PROFILE - lea rbp,garbage_collector_name - call profile_s - endif - mov [rsi],rcx - mov 8[rsi],rdx - add rsi,16 - call collect_0_ - mov rdx,(-8)[rsi] - mov rcx,(-16)[rsi] - sub rsi,16 - ifdef PROFILE - jmp profile_r - else - ret - endif - -collect_1: - ifdef PROFILE - lea rbp,garbage_collector_name - call profile_s - endif - mov [rsi],rcx - add rsi,8 - call collect_0_ - mov rcx,(-8)[rsi] - sub rsi,8 - ifdef PROFILE - jmp profile_r - else - ret - endif - -collect_0: - ifdef PROFILE - lea rbp,garbage_collector_name - call profile_s - endif - call collect_0_ - ifdef PROFILE - jmp profile_r - else - ret - endif - -collect_0_: - mov rbp,rdi - - push rax - push rbx - - if THREAD - mov rbx,qword ptr heap_end_after_gc_offset[r9] - else - mov rbx,qword ptr heap_end_after_gc - endif - sub rbx,rdi - - shr rbx,3 - sub rbx,r15 - if THREAD - mov qword ptr n_allocated_words_offset[r9],rbx - else - mov qword ptr n_allocated_words,rbx - endif - - test byte ptr flags,64 - je no_mark3 - - if THREAD - mov rbp,qword ptr bit_counter_offset[r9] - else - mov rbp,qword ptr bit_counter - endif - test rbp,rbp - je no_scan - - push rsi - mov rsi,rbx - - xor rbx,rbx - if THREAD - mov rcx,qword ptr bit_vector_p_offset[r9] - else - mov rcx,qword ptr bit_vector_p - 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 dword ptr (-4)[rcx],ebx - mov rax,rcx - 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 rbp,(-4)[rdx] - if THREAD - sub rbp,qword ptr heap_vector_offset[r9] - else - sub rbp,qword ptr heap_vector - endif - shl rbp,6 - if THREAD - mov rdi,qword ptr heap_p3_offset[r9] - else - mov rdi,qword ptr heap_p3 - endif - add rdi,rbp - - lea rbp,[rdi+rax*8] - if THREAD - mov qword ptr heap_end_after_gc_offset[r9],rbp - else - mov qword ptr heap_end_after_gc,rbp - endif - - mov r15,rax - sub r15,rsi - - pop rsi - pop rbx - pop rax - ret - -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: - pop rsi - if THREAD - mov qword ptr bit_counter_offset[r9],rbp - else - mov qword ptr bit_counter,rbp - endif - -no_scan: - -no_mark3: - if THREAD - movsx rax,byte ptr garbage_collect_flag_offset[r9] - else - movsx rax,byte ptr garbage_collect_flag - endif - test rax,rax - jle collect - - sub rax,2 - if THREAD - mov byte ptr garbage_collect_flag_offset[r9],al - - mov rbp,qword ptr extra_heap_size_offset[r9] - else - mov byte ptr garbage_collect_flag,al - - mov rbp,qword ptr extra_heap_size - endif - cmp rbx,rbp - ja collect - - if THREAD - mov rdi,qword ptr extra_heap_offset[r9] - else - mov rdi,qword ptr extra_heap - endif - - mov r15,rbp - - lea rbp,[rdi+rbp*8] - if THREAD - mov qword ptr heap_end_after_gc_offset[r9],rbp - else - mov qword ptr heap_end_after_gc,rbp - endif - - sub r15,rbx - - pop rbx - pop rax - ret - -collect: - ifdef LINUX - sub rsp,104 - else - sub rsp,88 - endif - mov 32[rsp],r10 - mov 24[rsp],r11 - mov 16[rsp],r12 - mov 8[rsp],r13 - mov [rsp],r14 - movsd 40[rsp],xmm0 - movsd 48[rsp],xmm1 - movsd 56[rsp],xmm2 - movsd 64[rsp],xmm3 - movsd 72[rsp],xmm4 - movsd 80[rsp],xmm5 - ifdef LINUX - movsd 88[rsp],xmm6 - movsd 96[rsp],xmm7 - endif - - call add_execute_time - - test qword ptr flags,4 - je no_print_stack_sizes - - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov r13,rsi - mov r14,rdi - else - sub rsp,32 - endif - - if 0 - ifdef LINUX - mov rdi,qword ptr 64[rsp] - else - mov rcx,qword ptr 96[rsp] - endif - call ew_print_int - - ifdef LINUX - mov rdi,32 - else - mov rcx,32 - endif - call ew_print_char - endif - - ifdef LINUX - lea rdi,garbage_collect_string_1 - else - lea rcx,garbage_collect_string_1 - endif - call ew_print_string - - ifdef LINUX - mov rdi,r13 - if THREAD - mov r9,rbx - sub rdi,stack_p_offset[r9] - else - sub rdi,stack_p - endif - else - mov rcx,rsi - if THREAD - mov r9,rbx - sub rcx,stack_p_offset[r9] - else - sub rcx,stack_p - endif - endif - call ew_print_int - - ifdef LINUX - lea rdi,garbage_collect_string_2 - else - lea rcx,garbage_collect_string_2 - endif - call ew_print_string - - ifdef LINUX - if THREAD - mov r9,rbx - mov rdi,halt_sp_offset[r9] - else - mov rdi,halt_sp - endif - sub rdi,rsp - else - if THREAD - mov r9,rbx - mov rcx,halt_sp_offset[r9] - else - mov rcx,halt_sp - endif - sub rcx,rsp - endif - call ew_print_int - - ifdef LINUX - lea rdi,garbage_collect_string_3 - else - lea rcx,garbage_collect_string_3 - endif - call ew_print_string - - ifdef LINUX - mov rsi,r13 - mov rdi,r14 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - -no_print_stack_sizes: - if THREAD - mov rax,stack_p_offset[r9] - add rax,qword ptr a_stack_size_offset[r9] - else - mov rax,stack_p - add rax,qword ptr ab_stack_size - endif - cmp rsi,rax - ja stack_overflow - - test byte ptr flags,64 - jne compacting_collector - - if THREAD - cmp byte ptr garbage_collect_flag_offset[r9],0 - else - cmp byte ptr garbage_collect_flag,0 - endif - jne compacting_collector - - if THREAD - mov rbp,heap_copied_vector_offset[r9] - - cmp qword ptr heap_end_after_copy_gc_offset[r9],0 - else - mov rbp,heap_copied_vector - - cmp qword ptr heap_end_after_copy_gc,0 - endif - - je zero_all - - mov rax,rdi - if THREAD - sub rax,qword ptr heap_p1_offset[r9] - else - sub rax,qword ptr heap_p1 - endif - add rax,127*8 - shr rax,9 - call zero_bit_vector - - if THREAD - mov rdx,qword ptr heap_end_after_copy_gc_offset[r9] - sub rdx,qword ptr heap_p1_offset[r9] - else - mov rdx,qword ptr heap_end_after_copy_gc - sub rdx,qword ptr heap_p1 - endif - shr rdx,7 - and rdx,-4 - - if THREAD - mov rbp,qword ptr heap_copied_vector_offset[r9] - mov rax,qword ptr heap_copied_vector_size_offset[r9] - else - mov rbp,qword ptr heap_copied_vector - mov rax,qword ptr heap_copied_vector_size - endif - add rbp,rdx - sub rax,rdx - shr rax,2 - - if THREAD - mov qword ptr heap_end_after_copy_gc_offset[r9],0 - else - mov qword ptr heap_end_after_copy_gc,0 - endif - - call zero_bit_vector - jmp end_zero_bit_vector - -zero_all: - if THREAD - mov rax,heap_copied_vector_size_offset[r9] - else - mov rax,heap_copied_vector_size - endif - shr rax,2 - call zero_bit_vector - -end_zero_bit_vector: - - include acopy.asm - - if THREAD - mov qword ptr heap2_begin_and_end_offset[r9],rsi - else - mov qword ptr heap2_begin_and_end,rsi - endif - mov r15,rsi - sub r15,rdi - - if THREAD - mov rax,heap_size_257_offset[r9] - else - mov rax,heap_size_257 - endif - shl rax,7 - sub rax,r15 - add qword ptr total_gc_bytes,rax - - shr r15,3 - - pop rsi - - call add_garbage_collect_time - - if THREAD - sub r15,qword ptr n_allocated_words_offset[r9] - else - sub r15,qword ptr n_allocated_words - endif - jc switch_to_mark_scan - - lea rax,[r15+r15*4] - shl rax,6 - if THREAD - mov rbx,qword ptr heap_size_offset[r9] - else - mov rbx,qword ptr heap_size - endif - mov rcx,rbx - shl rbx,2 - add rbx,rcx - add rbx,rbx - add rbx,rcx - cmp rax,rbx - jnc no_mark_scan - -switch_to_mark_scan: - if THREAD - mov rax,qword ptr heap_size_65_offset[r9] - else - mov rax,qword ptr heap_size_65 - endif - shl rax,6 - if THREAD - mov rbx,qword ptr heap_p_offset[r9] - - mov rcx,qword ptr heap_p1_offset[r9] - cmp rcx,qword ptr heap_p2_offset[r9] - else - mov rbx,qword ptr heap_p - - mov rcx,qword ptr heap_p1 - cmp rcx,qword ptr heap_p2 - endif - jc vector_at_begin - -vector_at_end: - if THREAD - mov qword ptr heap_p3_offset[r9],rbx - else - mov qword ptr heap_p3,rbx - endif - add rbx,rax - if THREAD - mov qword ptr heap_vector_offset[r9],rbx - - mov rax,qword ptr heap_p1_offset[r9] - mov qword ptr extra_heap_offset[r9],rax - else - mov qword ptr heap_vector,rbx - - mov rax,qword ptr heap_p1 - mov qword ptr extra_heap,rax - endif - sub rbx,rax - shr rbx,3 - if THREAD - mov qword ptr extra_heap_size_offset[r9],rbx - else - mov qword ptr extra_heap_size,rbx - endif - jmp switch_to_mark_scan_2 - -vector_at_begin: - if THREAD - mov qword ptr heap_vector_offset[r9],rbx - add rbx,qword ptr heap_size_offset[r9] - else - mov qword ptr heap_vector,rbx - add rbx,qword ptr heap_size - endif - sub rbx,rax - if THREAD - mov qword ptr heap_p3_offset[r9],rbx - else - mov qword ptr heap_p3,rbx - endif - - if THREAD - mov qword ptr extra_heap_offset[r9],rbx - mov rcx,qword ptr heap_p2_offset[r9] - else - mov qword ptr extra_heap,rbx - mov rcx,qword ptr heap_p2 - endif - sub rcx,rbx - shr rcx,3 - if THREAD - mov qword ptr extra_heap_size_offset[r9],rcx - else - mov qword ptr extra_heap_size,rcx - endif - -switch_to_mark_scan_2: - if THREAD - mov rax,heap_size_257_offset[r9] - else - mov rax,heap_size_257 - endif - shl rax,7-3 - sub rax,r15 - shl rax,3 - - if THREAD - mov byte ptr garbage_collect_flag_offset[r9],1 - else - mov byte ptr garbage_collect_flag,1 - endif - - lea rcx,heap_use_after_gc_string_1 - - test r15,r15 - jns end_garbage_collect - - if THREAD - mov byte ptr garbage_collect_flag_offset[r9],-1 - - mov rbx,qword ptr extra_heap_size_offset[r9] - else - mov byte ptr garbage_collect_flag,-1 - - mov rbx,qword ptr extra_heap_size - endif - mov r15,rbx - if THREAD - sub r15,qword ptr n_allocated_words_offset[r9] - else - sub r15,qword ptr n_allocated_words - endif - js out_of_memory_4_3 - - if THREAD - mov rdi,qword ptr extra_heap_offset[r9] - else - mov rdi,qword ptr extra_heap - endif - shl rbx,3 - add rbx,rdi - if THREAD - mov qword ptr heap_end_after_gc_offset[r9],rbx - else - mov qword ptr heap_end_after_gc,rbx - endif - - mov qword ptr heap_end_write_heap,rdi - - mov qword ptr d3_flag_write_heap,1 - jmp end_garbage_collect_ - -no_mark_scan: -; exchange the semi_spaces - if THREAD - mov rax,heap_p1_offset[r9] - mov rbx,heap_p2_offset[r9] - mov heap_p2_offset[r9],rax - mov heap_p1_offset[r9],rbx - - mov rax,heap_size_257_offset[r9] - else - mov rax,heap_p1 - mov rbx,heap_p2 - mov heap_p2,rax - mov heap_p1,rbx - - mov rax,heap_size_257 - endif - shl rax,7-3 - mov rbx,rax - sub rax,r15 - - mov rcx,rax - imul qword ptr heap_size_multiple - shrd rax,rdx,9 - shr rdx,9 - jne no_small_heap1 - - cmp rax,4000 - jge not_too_small1 - mov rax,4000 -not_too_small1: - sub rbx,rax - jb no_small_heap1 - - sub r15,rbx - shl rbx,3 - if THREAD - mov rbp,qword ptr heap_end_after_gc_offset[r9] - mov qword ptr heap_end_after_copy_gc_offset[r9],rbp - else - mov rbp,qword ptr heap_end_after_gc - mov qword ptr heap_end_after_copy_gc,rbp - endif - sub rbp,rbx - if THREAD - mov qword ptr heap_end_after_gc_offset[r9],rbp - else - mov qword ptr heap_end_after_gc,rbp - endif - -no_small_heap1: - mov rax,rcx - shl rax,3 - - lea rcx,heap_use_after_gc_string_1 - -end_garbage_collect: - - mov qword ptr heap_end_write_heap,rdi - mov qword ptr d3_flag_write_heap,0 - -end_garbage_collect_: - test qword ptr flags,2 - je no_heap_use_message - - push rax - - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - - ifdef LINUX - mov r13,rsi - mov r14,rdi - - mov rdi,rcx - else - sub rsp,32 - endif - call ew_print_string - - ifdef LINUX - mov rdi,[rbp] - else - mov rcx,[rbp] - endif - call ew_print_int - - 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 - else - add rsp,32 - endif - mov rsp,rbp - if THREAD - mov r9,rbx - endif - - pop rax - -no_heap_use_message: - call call_finalizers - - test byte ptr flags,32 - je no_write_heap - - cmp rax,qword ptr min_write_heap_size - jb no_write_heap - - push rcx - push rdx - push rbp - push rsi - push rdi - - sub rsp,128 - - mov rax,qword ptr d3_flag_write_heap - test rax,rax - jne copy_to_compact_with_alloc_in_extra_heap - - if THREAD - movsx rax,byte ptr garbage_collect_flag_offset[r9] - - mov rcx,qword ptr heap2_begin_and_end_offset[r9] - mov rdx,qword ptr (heap2_begin_and_end_offset+8)[r9] - - lea rbx,heap_p1_offset[r9] - else - movsx rax,byte ptr garbage_collect_flag - - mov rcx,qword ptr heap2_begin_and_end - mov rdx,qword ptr (heap2_begin_and_end+8) - - mov rbx,offset heap_p1 - endif - - test rax,rax - je gc0 - - if THREAD - lea rbx,heap_p2_offset[r9] - else - mov rbx,offset heap_p2 - endif - jg gc1 - - if THREAD - lea rbx,heap_p3_offset[r9] - else - mov rbx,offset heap_p3 - endif - xor rcx,rcx - xor rdx,rdx - -gc0: -gc1: - mov rbx,qword ptr [rbx] - - mov rax,rsp - - mov qword ptr [rax],rbx - mov qword ptr 8[rax],rdi - - mov qword ptr 16[rax],rcx - mov qword ptr 24[rax],rdx - - if THREAD - mov rbx ,qword ptr stack_p_offset[r9] - else - mov rbx ,qword ptr stack_p - endif - mov qword ptr 32[rax],rbx - - mov qword ptr 40[rax],rsi - mov qword ptr 48[rax],0 - mov qword ptr 56[rax],0 - - mov qword ptr 64[rax],offset small_integers - mov qword ptr 72[rax],offset static_characters - - mov qword ptr 80[rax],offset dINT+2 - mov qword ptr 88[rax],offset CHAR+2 - mov qword ptr 96[rax],offset REAL+2 - mov qword ptr 104[rax],offset BOOL+2 - mov qword ptr 112[rax],offset __STRING__+2 - mov qword ptr 120[rax],offset __ARRAY__+2 - - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - ifdef LINUX - mov rdi,rax - else - mov rcx,rax - sub rsp,32 - endif - ifndef LINUX - call write_heap - endif - mov rsp,rbp - add rsp,128 - if THREAD - mov r9,rbx - endif - - pop rdi - pop rsi - pop rbp - pop rdx - pop rcx -no_write_heap: - -restore_registers_after_gc_and_return: - mov r10,32[rsp] - mov r11,24[rsp] - mov r12,16[rsp] - mov r13,8[rsp] - mov r14,[rsp] - movlpd xmm0,40[rsp] - movlpd xmm1,48[rsp] - movlpd xmm2,56[rsp] - movlpd xmm3,64[rsp] - movlpd xmm4,72[rsp] - movlpd xmm5,80[rsp] - ifdef LINUX - movlpd xmm6,88[rsp] - movlpd xmm7,96[rsp] - add rsp,104 - else - add rsp,88 - endif - pop rbx - pop rax - ret - -call_finalizers: - mov rax,qword ptr free_finalizer_list - -call_finalizers_lp: - if THREAD - lea rbx,__Nil-8 - cmp rax,rbx - else - lea r9,__Nil-8 - cmp rax,r9 - endif - je end_call_finalizers - push 8[rax] - mov rbx,qword ptr 16[rax] - push 8[rbx] - call qword ptr [rbx] - add rsp,8 - pop rax - jmp call_finalizers_lp -end_call_finalizers: - - if THREAD - lea rbx,__Nil-8 - mov qword ptr free_finalizer_list,rbx - else - lea r9,__Nil-8 - mov qword ptr free_finalizer_list,r9 - endif - ret - -copy_to_compact_with_alloc_in_extra_heap: - if THREAD - mov rcx,qword ptr heap2_begin_and_end_offset[r9] - mov rdx,qword ptr (heap2_begin_and_end_offset+8)[r9] - lea rbx,heap_p2_offset[r9] - else - mov rcx,qword ptr heap2_begin_and_end - mov rdx,qword ptr (heap2_begin_and_end+8) - mov rbx,offset heap_p2 - endif - jmp gc1 - -allow_prefetch_for_athlon: - test qword ptr flags,4096 - jne no_prefetch_flag - - xor rax,rax - cpuid - test rax,rax - jz disable_prefetch_flag - - ifdef LINUX - cmp rbx,'A'+('u'*0x100)+('t'*0x10000)+('h'*0x1000000) - jne disable_prefetch_flag - cmp rdx,'e'+('n'*0x100)+('t'*0x10000)+('i'*0x1000000) - jne disable_prefetch_flag - cmp rcx,'c'+('A'*0x100)+('M'*0x10000)+('D'*0x1000000) - jne disable_prefetch_flag - else - cmp rbx,'A'+('u' shl 8)+('t' shl 16)+('h' shl 24) - jne disable_prefetch_flag - cmp rdx,'e'+('n' shl 8)+('t' shl 16)+('i' shl 24) - jne disable_prefetch_flag - cmp rcx,'c'+('A' shl 8)+('M' shl 16)+('D' shl 24) - jne disable_prefetch_flag - endif - -; mov rax,1 -; cpuid -; and rax,0f00h -; cmp rax,600h -; je keep_prefetch_flag - - ret - -disable_prefetch_flag: - and qword ptr flags,-4097 -keep_prefetch_flag: -no_prefetch_flag: - ret - -out_of_memory_4_3: -out_of_memory_4_2: -out_of_memory_4_1: -out_of_memory_4: - call add_garbage_collect_time - - mov rbp,offset out_of_memory_string_4 - jmp print_error - -zero_bit_vector: - xor rdx,rdx - test al,1 - je zero_bits1_1 - mov dword ptr [rbp],edx - add rbp,4 -zero_bits1_1: - shr rax,1 - - mov rbx,rax - shr rax,1 - test bl,1 - je zero_bits1_5 - - sub rbp,8 - jmp zero_bits1_2 - -zero_bits1_4: - mov dword ptr [rbp],edx - mov dword ptr 4[rbp],edx -zero_bits1_2: - mov dword ptr 8[rbp],edx - mov dword ptr 12[rbp],edx - add rbp,16 -zero_bits1_5: - sub rax,1 - jae zero_bits1_4 - ret - -reorder: - push rsi - push rbp - - mov rbp,rax - shl rbp,3 - mov rsi,rbx - shl rsi,3 - add rcx,rsi - sub rdx,rbp - - push rsi - push rbp - push rbx - push rax - jmp st_reorder_lp - -reorder_lp: - mov rbp,qword ptr [rcx] - mov rsi,qword ptr (-8)[rdx] - mov qword ptr (-8)[rdx],rbp - sub rdx,8 - mov qword ptr [rcx],rsi - add rcx,8 - - dec rax - jne next_b_in_element - mov rax,qword ptr [rsp] - add rcx,qword ptr 24[rsp] -next_b_in_element: - dec rbx - jne next_a_in_element - mov rbx,qword ptr 8[rsp] - sub rdx,qword ptr 16[rsp] -next_a_in_element: -st_reorder_lp: - cmp rdx,rcx - ja reorder_lp - - pop rax - pop rbx - add rsp,16 - pop rbp - pop rsi - ret - -; -; the sliding compacting garbage collector -; - -compacting_collector: -; zero all mark bits - - if THREAD - mov rax,qword ptr heap_p3_offset[r9] - else - mov rax,qword ptr heap_p3 - endif - neg rax - if THREAD - mov qword ptr neg_heap_p3_offset[r9],rax - - mov qword ptr stack_top_offset[r9],rsi - - mov rdi,qword ptr heap_vector_offset[r9] - else - mov qword ptr neg_heap_p3,rax - - mov qword ptr stack_top,rsi - - mov rdi,qword ptr heap_vector - endif - - test byte ptr flags,64 - je no_mark4 - - if THREAD - cmp qword ptr zero_bits_before_mark_offset[r9],0 - else - cmp qword ptr zero_bits_before_mark,0 - endif - je no_zero_bits - - if THREAD - mov qword ptr zero_bits_before_mark_offset[r9],0 - else - mov qword ptr zero_bits_before_mark,0 - endif - -no_mark4: - mov rbp,rdi - if THREAD - mov rax,qword ptr heap_size_65_offset[r9] - else - mov rax,qword ptr heap_size_65 - endif - add rax,3 - shr rax,2 - - xor rbx,rbx - - test al,1 - je zero_bits_1 - mov dword ptr [rbp],ebx - add rbp,4 -zero_bits_1: - mov rcx,rax - shr rax,2 - - test cl,2 - je zero_bits_5 - - sub rbp,8 - jmp zero_bits_2 - -zero_bits_4: - mov dword ptr [rbp],ebx - mov dword ptr 4[rbp],ebx -zero_bits_2: - mov dword ptr 8[rbp],ebx - mov dword ptr 12[rbp],ebx - add rbp,16 -zero_bits_5: - sub rax,1 - jnc zero_bits_4 - - test byte ptr flags,64 - je no_mark5 - -no_zero_bits: - if THREAD - mov rax,qword ptr n_last_heap_free_bytes_offset[r9] - mov rbx,qword ptr n_free_words_after_mark_offset[r9] - else - mov rax,qword ptr n_last_heap_free_bytes - mov rbx,qword ptr n_free_words_after_mark - endif - shl rbx,3 - - mov rbp,rbx - shl rbp,3 - add rbp,rbx - shr rbp,2 - - cmp rax,rbp - jg compact_gc - - if THREAD - mov rbx,qword ptr bit_vector_size_offset[r9] - else - mov rbx,qword ptr bit_vector_size - endif - shl rbx,3 - - sub rax,rbx - neg rax - - imul qword ptr heap_size_multiple - shrd rax,rdx,7 - shr rdx,7 - jne no_smaller_heap - - cmp rax,rbx - jae no_smaller_heap - - cmp rbx,8000 - jbe no_smaller_heap - - jmp compact_gc -no_smaller_heap: - test qword ptr flags,4096 - jne pmark - - include amark.asm - - include amark_prefetch.asm - -compact_gc: - if THREAD - mov qword ptr zero_bits_before_mark_offset[r9],1 - mov qword ptr n_last_heap_free_bytes_offset[r9],0 - mov qword ptr n_free_words_after_mark_offset[r9],1000 - else - mov qword ptr zero_bits_before_mark,1 - mov qword ptr n_last_heap_free_bytes,0 - mov qword ptr n_free_words_after_mark,1000 - endif - -no_mark5: - - include acompact.asm - - if THREAD - mov rsi,qword ptr stack_top_offset[r9] - else - mov rsi,qword ptr stack_top - endif - - if THREAD - mov rbx,qword ptr heap_size_65_offset[r9] - else - mov rbx,qword ptr heap_size_65 - endif - shl rbx,6 - if THREAD - add rbx,qword ptr heap_p3_offset[r9] - else - add rbx,qword ptr heap_p3 - endif - - if THREAD - mov qword ptr heap_end_after_gc_offset[r9],rbx - else - mov qword ptr heap_end_after_gc,rbx - endif - - sub rbx,rdi - shr rbx,3 - - if THREAD - sub rbx,qword ptr n_allocated_words_offset[r9] - else - sub rbx,qword ptr n_allocated_words - endif - mov r15,rbx - jc out_of_memory_4_1 - - mov rax,rbx - shl rax,2 - add rax,rbx - shl rax,4 - if THREAD - cmp rax,qword ptr heap_size_offset[r9] - else - cmp rax,qword ptr heap_size - endif - jc out_of_memory_4_2 - - test byte ptr flags,64 - je no_mark_6 - - if THREAD - mov rax,qword ptr neg_heap_p3_offset[r9] - else - mov rax,qword ptr neg_heap_p3 - endif - add rax,rdi - if THREAD - mov rbx,qword ptr n_allocated_words_offset[r9] - else - mov rbx,qword ptr n_allocated_words - endif - lea rax,[rax+rbx*8] - - if THREAD - mov rbx,qword ptr heap_size_65_offset[r9] - else - mov rbx,qword ptr heap_size_65 - endif - shl rbx,6 - - imul qword ptr heap_size_multiple - shrd rax,rdx,8 - shr rdx,8 - jne no_small_heap2 - - and rax,-4 - - cmp rax,8000 - jae not_too_small2 - mov rax,8000 -not_too_small2: - mov rcx,rbx - sub rcx,rax - jb no_small_heap2 - - if THREAD - sub qword ptr heap_end_after_gc_offset[r9],rcx - else - sub qword ptr heap_end_after_gc,rcx - endif - shr rcx,3 - sub r15,rcx - - mov rbx,rax - -no_small_heap2: - shr rbx,3 - if THREAD - mov qword ptr bit_vector_size_offset[r9],rbx - else - mov qword ptr bit_vector_size,rbx - endif - -no_mark_6: - jmp no_copy_garbage_collection - -no_copy_garbage_collection: - call add_compact_garbage_collect_time - - mov rax,rdi - if THREAD - sub rax,qword ptr heap_p3_offset[r9] - else - sub rax,qword ptr heap_p3 - endif - - add qword ptr total_compact_gc_bytes,rax - - mov rax,rdi - if THREAD - sub rax,qword ptr heap_p3_offset[r9] - mov rbx,qword ptr n_allocated_words_offset[r9] - else - sub rax,qword ptr heap_p3 - mov rbx,qword ptr n_allocated_words - endif - lea rax,[rax+rbx*8] - - lea rcx,heap_use_after_compact_gc_string_1 - jmp end_garbage_collect - - if 0 - public clean_exception_handler_ - -clean_exception_handler_: - - jmp clean_exception_handler_ - endif - if 0 - mov rax,qword ptr [rcx] - cmp dword ptr [rax],0c00000fdh - je stack_overflow_exception - - cmp dword ptr [rax],80000001h - je guard_page_or_access_violation_exception - - cmp dword ptr [rax] ,0c0000005h - je guard_page_or_access_violation_exception - -no_stack_overflow_exception: - mov rax,0 - ret - -guard_page_or_access_violation_exception: - mov rax,qword ptr 16[rax] - and rax,-4096 - cmp qword ptr a_stack_guard_page,rax - jne no_stack_overflow_exception - - cmp qword ptr a_stack_guard_page,0 - je no_stack_overflow_exception - -stack_overflow_exception: - mov rax,qword ptr 8[rcx] - mov qword ptr (0F8h)[rax],offset stack_overflow - - mov rax,-1 - ret - endif - -stack_overflow: - call add_execute_time - - mov rbp,offset stack_overflow_string - jmp print_error - -IO_error: - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - - mov rbx,rcx - ifdef LINUX - lea rdi,IO_error_string - else - sub rsp,32 - lea rcx,IO_error_string - endif - call ew_print_string - - ifdef LINUX - mov rdi,rbx - else - mov rcx,rbx - endif - call ew_print_string - - ifdef LINUX - lea rdi,new_line_string - else - lea rcx,new_line_string - endif - call ew_print_string - - mov rsp,rbp - if THREAD - mov r9,rbx - endif - - jmp halt - -print_error: - ifdef LINUX - mov rdi,rbp - else - mov rcx,rbp - endif - mov rbp,rsp - and rsp,-16 - if THREAD - mov rbx,r9 - endif - call ew_print_string - mov rsp,rbp - if THREAD - mov r9,rbx - endif - -halt: - if THREAD - mov rsp,halt_sp_offset[r9] - else - mov rsp,halt_sp - endif - - ifdef PROFILE - call write_profile_stack - endif - - mov qword ptr execution_aborted,1 - - cmp qword ptr dll_initialised,0 - ifdef LINUX - je exit_ - else - je exit - endif - ifdef LINUX - cmp dword ptr return_code,0 - else - cmp qword ptr return_code,0 - endif - jne return_code_set - ifdef LINUX - mov dword ptr return_code,-1 - else - mov qword ptr return_code,-1 - endif -return_code_set: - ifdef LINUX - mov edi,dword ptr return_code - and rsp,-16 - call exit - else - push qword ptr return_code - call (ExitProcess) - endif - jmp return_code_set - -e__system__eaind: -__eaind: -eval_fill: - mov [rsi],rcx - add rsi,8 - mov rcx,rdx - call qword ptr [rdx] - mov rdx,rcx - mov rcx,(-8)[rsi] - sub rsi,8 - - mov rbp,[rdx] - mov [rcx],rbp - mov rbp,8[rdx] - mov 8[rcx],rbp - mov rbp,16[rdx] - mov 16[rcx],rbp - ret - - align (1 shl 2) - lea rax,e__system__eaind - jmp rax - ifdef LINUX -; pc relative lea instruction is one byte longer - db 0,0 - else - db 0,0,0 - endif - dd e__system__dind - dd -2 -e__system__nind: -__indirection: - mov rdx,8[rcx] - mov rax,[rdx] - test al,2 - - je eval_fill2 - - mov [rcx],rax - mov rbp,8[rdx] - mov 8[rcx],rbp - mov rbp,16[rdx] - mov 16[rcx],rbp - ret - -eval_fill2: - if THREAD - lea rbp,__cycle__in__spine - mov qword ptr [rcx],rbp - else - lea r9,__cycle__in__spine - mov qword ptr [rcx],r9 - endif - mov qword ptr [rsi],rcx - - test byte ptr flags,64 - je __cycle__in__spine - - add rsi,8 - mov rcx,rdx - call rax - mov rdx,rcx - mov rcx,qword ptr (-8)[rsi] - sub rsi,8 - - mov rbp,[rdx] - mov [rcx],rbp - mov rbp,8[rdx] - mov 8[rcx],rbp - mov rbp,16[rdx] - mov 16[rcx],rbp - ret - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_0: - mov qword ptr [rdx],offset __indirection - mov 8[rdx],rcx - jmp rbp - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_1: - mov qword ptr [rdx],offset __indirection - mov rax,8[rdx] - mov 8[rdx],rcx - mov rdx,rax - jmp rbp - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_2: - mov qword ptr [rdx],offset __indirection - mov r8,8[rdx] - mov 8[rdx],rcx - mov rdx,16[rdx] - jmp rbp - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_3: - mov qword ptr [rdx],offset __indirection - mov r8,8[rdx] - mov 8[rdx],rcx - mov [rsi],rcx - mov rcx,24[rdx] - add rsi,8 - mov rdx,16[rdx] - jmp rbp - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_4: - mov qword ptr [rdx],offset __indirection - mov r8,8[rdx] - mov 8[rdx],rcx - mov [rsi],rcx - mov rbx,32[rdx] - mov 8[rsi],rbx - mov rcx,24[rdx] - add rsi,16 - mov rdx,16[rdx] - jmp rbp - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_5: - mov qword ptr [rdx],offset __indirection - mov r8,8[rdx] - mov [rsi],rcx - mov 8[rdx],rcx - mov rbx,40[rdx] - mov 8[rsi],rbx - mov rbx,32[rdx] - mov 16[rsi],rbx - mov rcx,24[rdx] - add rsi,24 - mov rdx,16[rdx] - jmp rbp - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_6: - mov qword ptr [rdx],offset __indirection - mov r8,8[rdx] - mov [rsi],rcx - mov 8[rdx],rcx - mov rbx,48[rdx] - mov 8[rsi],rbx - mov rbx,40[rdx] - mov 16[rsi],rbx - mov rbx,32[rdx] - mov 24[rsi],rbx - mov rcx,24[rdx] - add rsi,32 - mov rdx,16[rdx] - jmp rbp - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_7: - mov rax,0 - mov rbx,40 -eval_upd_n: - mov qword ptr [rdx],offset __indirection - mov r8,8[rdx] - mov [rsi],rcx - mov 8[rdx],rcx - add rdx,rbx - mov rbx,16[rdx ] - mov 8[rsi],rbx - mov rbx,8[rdx] - mov 16[rsi],rbx - mov rbx,[rdx] - mov 24[rsi],rbx - add rsi,32 - -eval_upd_n_lp: - mov rbx,(-8)[rdx] - sub rdx,8 - mov [rsi],rbx - add rsi,8 - sub rax,1 - jnc eval_upd_n_lp - - mov rcx,(-8)[rdx] - mov rdx,(-16)[rdx ] - jmp rbp - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_8: - mov rax,1 - mov rbx,48 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_9: - mov rax,2 - mov rbx,56 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_10: - mov rax,3 - mov rbx,64 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_11: - mov rax,4 - mov rbx,72 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_12: - mov rax,5 - mov rbx,80 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_13: - mov rax,6 - mov rbx,88 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_14: - mov rax,7 - mov rbx,96 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_15: - mov rax,8 - mov rbx,104 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_16: - mov rax,9 - mov rbx,112 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_17: - mov rax,10 - mov rbx,120 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_18: - mov rax,11 - mov rbx,128 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_19: - mov rax,12 - mov rbx,136 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_20: - mov rax,13 - mov rbx,144 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_21: - mov rax,14 - mov rbx,152 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_22: - mov rax,15 - mov rbx,160 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_23: - mov rax,16 - mov rbx,168 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_24: - mov rax,17 - mov rbx,176 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_25: - mov rax,18 - mov rbx,184 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_26: - mov rax,19 - mov rbx,192 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_27: - mov rax,20 - mov rbx,200 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_28: - mov rax,21 - mov rbx,208 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_29: - mov rax,22 - mov rbx,216 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_30: - mov rax,23 - mov rbx,224 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_31: - mov rax,24 - mov rbx,232 - jmp eval_upd_n - - ifdef PROFILE - call profile_n - mov rbp,rax - endif -eval_upd_32: - mov rax,25 - mov rbx,240 - jmp eval_upd_n - -; -; STRINGS -; - -catAC: - mov rax,8[rcx] - mov rbx,8[rdx] - lea rbp,16+7[rax+rbx] - shr rbp,3 - sub r15,rbp - jl gc_3 -gc_r_3: - add rcx,16 - add rdx,16 - -; fill_node - - mov r8,rdi - mov qword ptr [rdi],offset __STRING__+2 - -; store length - - lea rbp,[rax+rbx] - mov 8[rdi],rbp - add rdi,16 - -; copy string 1 - - lea rbp,7[rbx] - shr rbp,3 - add rbx,rdi - - xchg rcx,rbp - xchg rsi,rdx - cld - rep movsq - mov rsi,rdx - mov rcx,rbp - - mov rdi,rbx - -; copy_string 2 - -cat_string_6: - mov rbp,rax - shr rbp,3 - je cat_string_9 - -cat_string_7: - mov rbx,[rcx] - add rcx,8 - mov [rdi],rbx - add rdi,8 - dec rbp - jne cat_string_7 - -cat_string_9: - test al,4 - je cat_string_10 - mov ebx,dword ptr [rcx] - add rcx,4 - mov dword ptr [rdi],ebx - add rdi,4 -cat_string_10: - test al,2 - je cat_string_11 - mov bx,word ptr [rcx] - add rcx,2 - mov word ptr [rdi],bx - add rdi,2 -cat_string_11: - test al,1 - je cat_string_12 - mov bl,byte ptr [rcx] - mov byte ptr [rdi],bl - inc rdi -cat_string_12: - - mov rcx,r8 -; align heap pointer - add rdi,7 - and rdi,-8 - ret - -gc_3: call collect_2 - jmp gc_r_3 - -empty_string: - mov rcx,offset zero_length_string - ret - -sliceAC: - mov rbp,8[rcx] - test rbx,rbx - jns slice_string_1 - xor rbx,rbx -slice_string_1: - cmp rbx,rbp - jge empty_string - cmp rax,rbx - jl empty_string - inc rax - cmp rax,rbp - jle slice_string_2 - mov rax,rbp -slice_string_2: - sub rax,rbx - - lea rbp,(16+7)[rax] - shr rbp,3 - - sub r15,rbp - jl gc_4 -r_gc_4: - sub rbp,2 - lea rdx,16[rcx+rbx] - - mov qword ptr [rdi],offset __STRING__+2 - mov 8[rdi],rax - -; copy part of string - mov rcx,rbp - mov rbp,rdi - add rdi,16 - - xchg rsi,rdx - cld - rep movsq - mov rsi,rdx - mov rcx,rbp - ret - -gc_4: - mov rbp,rdx - call collect_1 - lea rbp,(16+7)[rax] - shr rbp,3 - jmp r_gc_4 - -updateAC: - mov rbp,8[rcx] - cmp rbx,rbp - jae update_string_error - - add rbp,16+7 - shr rbp,3 - - sub r15,rbp - jl gc_5 -r_gc_5: - mov rbp,8[rcx] - add rbp,7 - shr rbp,3 - - mov rdx,rcx - mov r8,rdi - mov qword ptr [rdi],offset __STRING__+2 - mov rcx,8[rdx] - add rdx,16 - mov 8[rdi],rcx - add rdi,16 - - add rbx,rdi - - mov rcx,rbp - xchg rsi,rdx - cld - rep movsq - mov rsi,rdx - - mov byte ptr [rbx],al - mov rcx,r8 - ret - -gc_5: call collect_1 - jmp r_gc_5 - -update_string_error: - mov rbp,offset high_index_string - test rax,rax - jns update_string_error_2 - mov rbp,offset low_index_string -update_string_error_2: - jmp print_error - -eqAC: - mov rax,8[rcx] - cmp rax,8[rdx] - jne equal_string_ne - add rcx,16 - add rdx,16 - mov rbx,rax - and rbx,7 - shr rax,3 - je equal_string_d -equal_string_1: - mov rbp,[rcx] - cmp rbp,[rdx] - jne equal_string_ne - add rcx,8 - add rdx,8 - dec rax - jne equal_string_1 -equal_string_d: - test bl,4 - je equal_string_w - mov eax,dword ptr [rcx] - cmp eax,dword ptr [rdx] - jne equal_string_ne - add rcx,4 - add rdx,4 -equal_string_w: - test bl,2 - je equal_string_b - mov ax,word ptr [rcx] - cmp ax,word ptr [rdx] - jne equal_string_ne - add rcx,2 - add rdx,2 -equal_string_b: - test bl,1 - je equal_string_eq - mov bl,byte ptr [rcx] - cmp bl,byte ptr [rdx] - jne equal_string_ne -equal_string_eq: - mov rax,1 - ret -equal_string_ne: - xor rax,rax - ret - -cmpAC: - mov rbx,8[rcx] - mov rbp,8[rdx] - add rcx,16 - add rdx,16 - cmp rbp,rbx - jb cmp_string_less - ja cmp_string_more - xor rax,rax - jmp cmp_string_chars -cmp_string_more: - mov rax,1 - jmp cmp_string_chars -cmp_string_less: - mov rax,-1 - mov rbx,rbp - jmp cmp_string_chars - -cmp_string_1: - mov rbp,[rdx] - cmp rbp,[rcx] - jne cmp_string_ne_q - add rdx,8 - add rcx,8 -cmp_string_chars: - sub rbx,8 - jnc cmp_string_1 -cmp_string_d: - test bl,4 - je cmp_string_w - mov ebp,dword ptr [rdx] - cmp ebp,dword ptr [rcx] - jne cmp_string_ne_d - add rdx,4 - add rcx,4 -cmp_string_w: - test bl,2 - je cmp_string_b - mov bpl,byte ptr [rdx] - cmp bpl,byte ptr [rcx] - jne cmp_string_ne - mov bpl,byte ptr 1[rdx] - cmp bpl,byte ptr 1[rcx] - jne cmp_string_ne - add rdx,2 - add rcx,2 -cmp_string_b: - test bl,1 - je cmp_string_eq - mov bl,byte ptr [rdx] - cmp bl,byte ptr [rcx] - jne cmp_string_ne -cmp_string_eq: - ret -cmp_string_ne_d: - mov r10d,[rcx] - bswap ebp - bswap r10d - cmp ebp,r10d - jmp cmp_string_ne -cmp_string_ne_q: - mov r10,[rcx] - bswap rbp - bswap r10 - cmp rbp,r10 -cmp_string_ne: - ja cmp_string_r1 - mov rax,-1 - ret -cmp_string_r1: - mov rax,1 - ret - -string_to_string_node: - mov rax,qword ptr [rcx] - add rcx,8 - - lea rbx,16+7[rax] - shr rbx,3 - - sub r15,rbx - jl string_to_string_node_gc - -string_to_string_node_r: - sub rbx,2 - mov qword ptr [rdi],offset __STRING__+2 - mov qword ptr 8[rdi],rax - mov rbp,rdi - add rdi,16 - jmp string_to_string_node_4 - -string_to_string_node_2: - mov rax,qword ptr [rcx] - add rcx,8 - mov qword ptr [rdi],rax - add rdi,8 -string_to_string_node_4: - sub rbx,1 - jge string_to_string_node_2 - - mov rcx,rbp - ret - -string_to_string_node_gc: - push rcx - call collect_0 - pop rcx - jmp string_to_string_node_r - - -int_array_to_node: - mov rax,qword ptr -16[rcx] - lea rbx,3[rax] - sub r15,rbx - jl int_array_to_node_gc - -int_array_to_node_r: - mov qword ptr [rdi],offset __ARRAY__+2 - mov rdx,rcx - mov qword ptr 8[rdi],rax - mov rcx,rdi - mov qword ptr 16[rdi],offset dINT+2 - add rdi,24 - jmp int_or_real_array_to_node_4 - -int_or_real_array_to_node_2: - mov rbx,qword ptr [rdx] - add rdx,8 - mov qword ptr [rdi],rbx - add rdi,8 -int_or_real_array_to_node_4: - sub rax,1 - jge int_or_real_array_to_node_2 - - ret - -int_array_to_node_gc: - push rcx - call collect_0 - pop rcx - jmp int_array_to_node_r - - -real_array_to_node: - mov rax,qword ptr -16[rcx] - lea rbx,3[rax] - sub r15,rbx - jl real_array_to_node_gc - -real_array_to_node_r: - mov qword ptr [rdi],offset __ARRAY__+2 - mov rdx,rcx - mov qword ptr 8[rdi],rax - mov rcx,rdi - mov qword ptr 16[rdi],offset REAL+2 - add rdi,24 - jmp int_or_real_array_to_node_4 - -real_array_to_node_gc: - push rcx - call collect_0 - pop rcx - jmp real_array_to_node_r - - - align (1 shl 2) - dd 3 -_c3: jmp __cycle__in__spine - align (1 shl 2) - - dd 4 -_c4: jmp __cycle__in__spine - align (1 shl 2) - dd 5 -_c5: jmp __cycle__in__spine - align (1 shl 2) - dd 6 -_c6: jmp __cycle__in__spine - align (1 shl 2) - dd 7 -_c7: jmp __cycle__in__spine - align (1 shl 2) - dd 8 -_c8: jmp __cycle__in__spine - align (1 shl 2) - dd 9 -_c9: jmp __cycle__in__spine - align (1 shl 2) - dd 10 -_c10: jmp __cycle__in__spine - align (1 shl 2) - dd 11 -_c11: jmp __cycle__in__spine - align (1 shl 2) - dd 12 -_c12: jmp __cycle__in__spine - align (1 shl 2) - dd 13 -_c13: jmp __cycle__in__spine - align (1 shl 2) - dd 14 -_c14: jmp __cycle__in__spine - align (1 shl 2) - dd 15 -_c15: jmp __cycle__in__spine - align (1 shl 2) - dd 16 -_c16: jmp __cycle__in__spine - align (1 shl 2) - dd 17 -_c17: jmp __cycle__in__spine - align (1 shl 2) - dd 18 -_c18: jmp __cycle__in__spine - align (1 shl 2) - dd 19 -_c19: jmp __cycle__in__spine - align (1 shl 2) - dd 20 -_c20: jmp __cycle__in__spine - align (1 shl 2) - dd 21 -_c21: jmp __cycle__in__spine - align (1 shl 2) - dd 22 -_c22: jmp __cycle__in__spine - align (1 shl 2) - dd 23 -_c23: jmp __cycle__in__spine - align (1 shl 2) - dd 24 -_c24: jmp __cycle__in__spine - align (1 shl 2) - dd 25 -_c25: jmp __cycle__in__spine - align (1 shl 2) - dd 26 -_c26: jmp __cycle__in__spine - align (1 shl 2) - dd 27 -_c27: jmp __cycle__in__spine - align (1 shl 2) - dd 28 -_c28: jmp __cycle__in__spine - align (1 shl 2) - dd 29 -_c29: jmp __cycle__in__spine - align (1 shl 2) - dd 30 -_c30: jmp __cycle__in__spine - align (1 shl 2) - dd 31 -_c31: jmp __cycle__in__spine - align (1 shl 2) - dd 32 -_c32: jmp __cycle__in__spine - -; -; ARRAYS -; - -_create_arrayB: - mov rbx,rax - add rax,24+7 - shr rax,3 - sub r15,rax - jge no_collect_4574 - call collect_0 -no_collect_4574: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rbx - mov qword ptr 16[rdi],offset BOOL+2 - lea rdi,[rdi+rax*8] - ret - -_create_arrayC: - mov rbx,rax - add rax,16+7 - shr rax,3 - sub r15,rax - jge no_collect_4573 - call collect_0 -no_collect_4573: - mov rcx,rdi - mov qword ptr [rdi],offset __STRING__+2 - mov qword ptr 8[rdi],rbx - lea rdi,[rdi+rax*8] - ret - -_create_arrayI: - lea rbp,3[rax] - sub r15,rbp - jge no_collect_4572 - call collect_0 -no_collect_4572: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rax - lea rbp,dINT+2 - mov qword ptr 16[rdi],rbp - lea rdi,24[rdi+rax*8] - ret - -_create_arrayI32: - mov rbx,rax - add rax,6+1 - shr rax,1 - sub r15,rax - jge no_collect_3572 - call collect_0 -no_collect_3572: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rbx - mov qword ptr 16[rdi],offset INT32+2 - lea rdi,[rdi+rax*8] - ret - -_create_arrayR: - lea rbp,3[rax] - sub r15,rbp - jge no_collect_4580 - call collect_0 -no_collect_4580: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rax - mov qword ptr 16[rdi],offset REAL+2 - lea rdi,24[rdi+rax*8] - ret - -_create_arrayR32: - mov rbx,rax - add rax,6+1 - shr rax,1 - sub r15,rax - jge no_collect_3580 - call collect_0 -no_collect_3580: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rax - mov qword ptr 16[rdi],offset REAL32+2 - lea rdi,[rdi+rax*8] - ret - -; rax : number of elements, rbx: element descriptor -; r10 : element size, r11 : element a size, rcx :a_element-> rcx : array - -_create_r_array: - mov rbp,rax - imul rbp,r10 - add rbp,3 - sub r15,rbp - jge no_collect_4586 - call collect_1 -no_collect_4586: - mov qword ptr [rdi],offset __ARRAY__+2 - mov rdx,rcx - mov qword ptr 8[rdi],rax - mov rcx,rdi - mov qword ptr 16[rdi],rbx - add rdi,24 - - test r11,r11 - je _create_r_array_0 - sub r11,2 - jc _create_r_array_1 - je _create_r_array_2 - sub r11,2 - jc _create_r_array_3 - je _create_r_array_4 - jmp _create_r_array_5 - -_create_r_array_0: - imul r10,rax - lea rdi,[rdi+r10*8] - ret - -_create_r_array_1: - shl r10,3 - jmp _st_fillr1_array -_fillr1_array: - mov qword ptr [rdi],rdx - add rdi,r10 -_st_fillr1_array: - sub rax,1 - jnc _fillr1_array - ret - -_create_r_array_2: - shl r10,3 - jmp _st_fillr2_array -_fillr2_array: - mov qword ptr [rdi],rdx - mov qword ptr 8[rdi],rdx - add rdi,r10 -_st_fillr2_array: - sub rax,1 - jnc _fillr2_array - ret - -_create_r_array_3: - shl r10,3 - jmp _st_fillr3_array -_fillr3_array: - mov qword ptr [rdi],rdx - mov qword ptr 8[rdi],rdx - mov qword ptr 16[rdi],rdx - add rdi,r10 -_st_fillr3_array: - sub rax,1 - jnc _fillr3_array - ret - -_create_r_array_4: - shl r10,3 - jmp _st_fillr4_array -_fillr4_array: - mov qword ptr [rdi],rdx - mov qword ptr 8[rdi],rdx - mov qword ptr 16[rdi],rdx - mov qword ptr 24[rdi],rdx - add rdi,r10 -_st_fillr4_array: - sub rax,1 - jnc _fillr4_array - ret - -_create_r_array_5: - sub r10,4 - sub r10,r11 - sub r11,1 - shl r10,3 - jmp _st_fillr5_array - -_fillr5_array: - mov qword ptr [rdi],rdx - mov qword ptr 8[rdi],rdx - mov qword ptr 16[rdi],rdx - mov qword ptr 24[rdi],rdx - add rdi,32 - - mov rbx,r11 -_copy_elem_5_lp: - mov qword ptr [rdi],rdx - add rdi,8 - sub rbx,1 - jnc _copy_elem_5_lp - - add rdi,r10 -_st_fillr5_array: - sub rax,1 - jnc _fillr5_array - - ret - -create_arrayB: - mov r10,rbx - add rbx,24+7 - shr rbx,3 - sub r15,rbx - jge no_collect_4575 - call collect_0 -no_collect_4575: - mov rbp,rax - sub rbx,3 - shl rbp,8 - or rax,rbp - mov rbp,rax - shl rbp,16 - or rax,rbp - mov rbp,rax - shl rbp,32 - or rax,rbp - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],r10 - mov qword ptr 16[rdi],offset BOOL+2 - add rdi,24 - jmp create_arrayBCI - -create_arrayC: - mov r10,rbx - add rbx,16+7 - shr rbx,3 - sub r15,rbx - jge no_collect_4578 - call collect_0 -no_collect_4578: - mov rbp,rax - sub rbx,2 - shl rbp,8 - or rax,rbp - mov rbp,rax - shl rbp,16 - or rax,rbp - mov rbp,rax - shl rbp,32 - or rax,rbp - mov rcx,rdi - mov qword ptr [rdi],offset __STRING__+2 - mov qword ptr 8[rdi],r10 - add rdi,16 - jmp create_arrayBCI - -create_arrayI32: - mov r10,rbx - add rbx,6+1 - shr rbx,1 - sub r15,rbx - jge no_collect_3577 - call collect_0 -no_collect_3577: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],r10 - mov qword ptr 16[rdi],offset INT32+2 - add rdi,24 - - sub rbx,3 - - mov ebp,eax - shl rax,32 - or rax,rbp - jmp create_arrayBCI - -create_arrayI: - lea rbp,3[rbx] - sub r15,rbp - jge no_collect_4577 - call collect_0 -no_collect_4577: - mov rcx,rdi - lea rbp,__ARRAY__+2 - mov qword ptr [rdi],rbp - mov qword ptr 8[rdi],rbx - lea rbp,dINT+2 - mov qword ptr 16[rdi],rbp - add rdi,24 -create_arrayBCI: - mov rdx,rbx - shr rbx,1 - test dl,1 - je st_filli_array - - mov qword ptr [rdi],rax - add rdi,8 - jmp st_filli_array - -filli_array: - mov qword ptr [rdi],rax - mov qword ptr 8[rdi],rax - add rdi,16 -st_filli_array: - sub rbx,1 - jnc filli_array - - ret - -create_arrayR32: - cvtsd2ss xmm0,xmm0 - movss dword ptr (-8)[rsp],xmm0 - mov r10,rax - add rax,6+1 - shr rax,1 - mov ebx,dword ptr (-8)[rsp] - sub r15,rax - jge no_collect_3579 - call collect_0 -no_collect_3579: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],r10 - mov qword ptr 16[rdi],offset REAL32+2 - add rdi,24 - - sub rax,3 - - mov edx,ebx - shl rbx,32 - or rbx,rdx - jmp st_fillr_array - -create_arrayR: - movsd qword ptr (-8)[rsp],xmm0 - lea rbp,3[rax] - - mov rbx,qword ptr (-8)[rsp] - - sub r15,rbp - jge no_collect_4579 - call collect_0 -no_collect_4579: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rax - mov qword ptr 16[rdi],offset REAL+2 - add rdi,24 - jmp st_fillr_array -fillr_array: - mov qword ptr [rdi],rbx - add rdi,8 -st_fillr_array: - sub rax,1 - jnc fillr_array - - ret - -create_array: - lea rbp,3[rax] - sub r15,rbp - jge no_collect_4576 - call collect_1 -no_collect_4576: - mov rbx,rcx - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rax - mov qword ptr 16[rdi],0 - add rdi,24 - - jmp fillr1_array - - - - -; in rax: number of elements, rbx: element descriptor -; r10 : element size, r11 : element a size -> rcx : array - -create_R_array: - sub r10,2 - jc create_R_array_1 - je create_R_array_2 - sub r10,2 - jc create_R_array_3 - je create_R_array_4 - jmp create_R_array_5 - -create_R_array_1: - lea rbp,3[rax] - sub r15,rbp - jge no_collect_4581 - call collect_0 -no_collect_4581: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rax - mov qword ptr 16[rdi],rbx - add rdi,24 - - test r11,r11 - je r_array_1_b - - mov rbx,qword ptr (-8)[rsi] - jmp fillr1_array - -r_array_1_b: - mov rbx,qword ptr 8[rsp] - -fillr1_array: - mov rdx,rax - shr rax,1 - test dl,1 - je st_fillr1_array_1 - - mov qword ptr [rdi],rbx - add rdi,8 - jmp st_fillr1_array_1 - -fillr1_array_lp: - mov qword ptr [rdi],rbx - mov qword ptr 8[rdi],rbx - add rdi,16 -st_fillr1_array_1: - sub rax,1 - jnc fillr1_array_lp - - ret - -create_R_array_2: - lea rbp,3[rax*2] - sub r15,rbp - jge no_collect_4582 - call collect_0 -no_collect_4582: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rax - mov qword ptr 16[rdi],rbx - add rdi,24 - - sub r11,1 - jc r_array_2_bb - je r_array_2_ab -r_array_2_aa: - mov rbx,qword ptr (-8)[rsi] - mov rbp,qword ptr (-16)[rsi] - jmp st_fillr2_array -r_array_2_ab: - mov rbx,qword ptr (-8)[rsi] - mov rbp,qword ptr 8[rsp] - jmp st_fillr2_array -r_array_2_bb: - mov rbx,qword ptr 8[rsp] - mov rbp,qword ptr 16[rsp] - jmp st_fillr2_array - -fillr2_array_1: - mov qword ptr [rdi],rbx - mov qword ptr 8[rdi],rbp - add rdi,16 -st_fillr2_array: - sub rax,1 - jnc fillr2_array_1 - - ret - -create_R_array_3: - lea rbp,3[rax+rax*2] - sub r15,rbp - jge no_collect_4583 - call collect_0 -no_collect_4583: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rax - mov qword ptr 16[rdi],rbx - add rdi,24 - - pop rdx - mov r12,rsp - - test r11,r11 - je r_array_3 - - lea r13,0[r11*8] - mov rbp,rsi - sub rbp,r13 - - sub r11,1 - -copy_a_to_b_lp3: - push [rbp] - add rbp,8 - sub r11,1 - jnc copy_a_to_b_lp3 - -r_array_3: - mov rbx,qword ptr [rsp] - mov r13,qword ptr 8[rsp] - mov rbp,qword ptr 16[rsp] - - mov rsp,r12 - push rdx - - jmp st_fillr3_array - -fillr3_array_1: - mov qword ptr [rdi],rbx - mov qword ptr 8[rdi],r13 - mov qword ptr 16[rdi],rbp - add rdi,24 -st_fillr3_array: - sub rax,1 - jnc fillr3_array_1 - - ret - -create_R_array_4: - lea rbp,3[rax+4] - sub r15,rbp - jge no_collect_4584 - call collect_0 -no_collect_4584: - mov rcx,rdi - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rax - mov qword ptr 16[rdi],rbx - add rdi,24 - - pop rdx - mov r12,rsp - - test r11,r11 - je r_array_4 - - lea r13,0[r11*8] - mov rbp,rsi - sub rbp,r13 - sub r11,1 - -copy_a_to_b_lp4: - push [rbp] - add rbp,8 - sub r11,1 - jnc copy_a_to_b_lp4 - -r_array_4: - mov rbx,qword ptr [rsp] - mov r13,qword ptr 8[rsp] - mov r14,qword ptr 16[rsp] - mov rbp,qword ptr 24[rsp] - - mov rsp,r12 - push rdx - - jmp st_fillr4_array - -fillr4_array: - mov qword ptr [rdi],rbx - mov qword ptr 8[rdi],r13 - mov qword ptr 16[rdi],r14 - mov qword ptr 24[rdi],rbp - add rdi,32 -st_fillr4_array: - sub rax,1 - jnc fillr4_array - - ret - -create_R_array_5: - lea r12,4[r10] - mov rbp,rax - imul rbp,r12 - add rbp,3 - sub r15,rbp - jge no_collect_4585 - call collect_0 -no_collect_4585: - mov qword ptr [rdi],offset __ARRAY__+2 - mov qword ptr 8[rdi],rax - mov qword ptr 16[rdi],rbx - mov rcx,rdi - add rdi,24 - - pop rdx - mov r12,rsp - - test r11,r11 - je r_array_5 - - lea r13,0[r11*8] - mov rbp,rsi - sub rbp,r13 - sub r11,1 - -copy_a_to_b_lp5: - push [rbp] - add rbp,8 - sub r11,1 - jnc copy_a_to_b_lp5 - -r_array_5: - mov r13,qword ptr [rsp] - mov r14,qword ptr 8[rsp] - if THREAD - lea rbx,32[rsp+r10*8] - endif - mov r8,qword ptr 16[rsp] - if THREAD - mov r10,qword ptr 24[rsp] - else - mov r9,qword ptr 24[rsp] - endif - add rsp,32 - - ife THREAD - sub r10,1 - endif - jmp st_fillr5_array - -fillr5_array_1: - mov qword ptr [rdi],r13 - mov qword ptr 8[rdi],r14 - - mov r11,rsp - ife THREAD - mov rbx,r10 - endif - - mov qword ptr 16[rdi],r8 - if THREAD - mov qword ptr 24[rdi],r10 - else - mov qword ptr 24[rdi],r9 - endif - add rdi,32 - -copy_elem_lp5: - mov rbp,qword ptr [r11] - add r11,8 - mov qword ptr [rdi],rbp - add rdi,8 - if THREAD - cmp r11,rbx - jne copy_elem_lp5 - else - sub rbx,1 - jnc copy_elem_lp5 - endif - -st_fillr5_array: - sub rax,1 - jnc fillr5_array_1 - - mov rsp,r12 - jmp rdx - - ifndef NEW_DESCRIPTORS -yet_args_needed: -; for more than 4 arguments - mov r10,[rdx] - movzx rax,word ptr (-2)[r10] - add rax,3 - sub r15,rax - jl gc_1 -gc_r_1: sub rax,3+1+4 - mov rbx,8[rdx] - add r10,8 - mov rdx,16[rdx] - mov rbp,rdi - mov r8,[rdx] - mov [rdi],r8 - mov r8,8[rdx] - mov 8[rdi],r8 - mov r8,16[rdx] - mov 16[rdi],r8 - add rdx,24 - add rdi,24 - -cp_a: mov r8,[rdx] - add rdx,8 - mov [rdi],r8 - add rdi,8 - sub rax,1 - jge cp_a - - mov [rdi],rcx - mov 8[rdi],r10 - lea rcx,8[rdi] - mov 16[rdi],rbx - mov 24[rdi],rbp - add rdi,32 - ret - -gc_1: - call collect_2 - jmp gc_r_1 - -yet_args_needed_0: - sub r15,2 - jl gc_20 -gc_r_20: - mov 8[rdi],rcx - mov rax,[rdx] - mov rcx,rdi - add rax,8 - mov [rdi],rax - add rdi,16 - ret - -gc_20: - call collect_2 - jmp gc_r_20 - -yet_args_needed_1: - sub r15,3 - jl gc_21 -gc_r_21: - mov 16[rdi],rcx - mov rax,[rdx] - mov rcx,rdi - add rax,8 - mov [rdi],rax - mov rbx,8[rdx] - mov 8[rdi],rbx - add rdi,24 - ret - -gc_21: - call collect_2 - jmp gc_r_21 - -yet_args_needed_2: - sub r15,5 - jl gc_22 -gc_r_22: - mov rax,[rdx] - mov 8[rdi],rcx - add rax,8 - mov rbp,8[rdx] - mov 16[rdi],rax - lea rcx,16[rdi] - mov 24[rdi],rbp - mov rbp,16[rdx] - mov [rdi],rbp - mov 32[rdi],rdi - add rdi,40 - ret - -gc_22: - call collect_2 - jmp gc_r_22 - -yet_args_needed_3: - sub r15,6 - jl gc_23 -gc_r_23: - mov rax,[rdx] - mov 16[rdi],rcx - add rax,8 - mov rbp,8[rdx] - mov 24[rdi],rax - mov rdx,16[rdx] - mov 32[rdi],rbp - mov rbp,[rdx] - mov 40[rdi],rdi - mov [rdi],rbp - mov rbp,8[rdx] - lea rcx,24[rdi] - mov 8[rdi],rbp - add rdi,48 - ret - -gc_23: - call collect_2 - jmp gc_r_23 - -yet_args_needed_4: - sub r15,7 - jl gc_24 -gc_r_24: - mov rax,[rdx] - mov 24[rdi],rcx - add rax,8 - mov rbp,8[rdx] - mov 32[rdi],rax - mov rdx,16[rdx] - mov 40[rdi],rbp - mov rbp,[rdx] - mov 48[rdi],rdi - mov [rdi],rbp - mov rbp,8[rdx] - lea rcx,32[rdi] - mov 8[rdi],rbp - mov rbp,16[rdx ] - mov 16[rdi],rbp - add rdi,56 - ret - -gc_24: - call collect_2 - jmp gc_r_24 - endif - -repl_args_b: - test rax,rax - jle repl_args_b_1 - - dec rax - je repl_args_b_4 - - mov rdx,16[rcx] - sub rbx,2 - jne repl_args_b_2 - - mov [rsi],rdx - add rsi,8 - jmp repl_args_b_4 - -repl_args_b_2: - lea rdx,[rdx+rax*8] - -repl_args_b_3: - mov rbp,(-8)[rdx] - sub rdx,8 - mov [rsi],rbp - add rsi,8 - dec rax - jne repl_args_b_3 - -repl_args_b_4: - mov rbp,8[rcx] - mov [rsi],rbp - add rsi,8 -repl_args_b_1: - ret - -push_arg_b: - cmp rbx,2 - jb push_arg_b_1 - jne push_arg_b_2 - cmp rbx,rax - je push_arg_b_1 -push_arg_b_2: - mov rcx,16[rcx] - sub rbx,2 -push_arg_b_1: - mov rcx,[rcx+rbx*8] - ret - -del_args: - mov rbx,[rcx] - sub rbx,rax - movsx rax,word ptr (-2)[rbx] - sub rax,2 - jge del_args_2 - - mov [rdx],rbx - mov rbp,8[rcx] - mov 8[rdx],rbp - mov rbp,16[rcx] - mov 16[rdx],rbp - ret - -del_args_2: - jne del_args_3 - - mov [rdx],rbx - mov rbp,8[rcx] - mov 8[rdx],rbp - mov rbp,16[rcx] - mov rbp,[rbp] - mov 16[rdx],rbp - ret - -del_args_3: - sub r15,rax - jl del_args_gc -del_args_r_gc: - mov [rdx],rbx - mov 16[rdx],rdi - mov rbp,8[rcx] - mov rcx,16[rcx] - mov 8[rdx],rbp - -del_args_copy_args: - mov rbp,[rcx] - add rcx,8 - mov [rdi],rbp - add rdi,8 - sub rax,1 - jg del_args_copy_args - - ret - -del_args_gc: - call collect_2 - jmp del_args_r_gc - - ifdef USE_LIBM -cos_real: - mov rbp,rsp - and rsp,-16 - mov r13,rsi - mov r14,rdi - call cos - mov rsp,rbp - mov rsi,r13 - mov rdi,r14 - ret - -sin_real: - mov rbp,rsp - and rsp,-16 - mov r13,rsi - mov r14,rdi - call sin - mov rsp,rbp - mov rsi,r13 - mov rdi,r14 - ret - -tan_real: - mov rbp,rsp - and rsp,-16 - mov r13,rsi - mov r14,rdi - call tan - mov rsp,rbp - mov rsi,r13 - mov rdi,r14 - ret - -atan_real: - mov rbp,rsp - and rsp,-16 - mov r13,rsi - mov r14,rdi - call atan - mov rsp,rbp - mov rsi,r13 - mov rdi,r14 - ret - -asin_real: -acos_real: -ln_real: -log10_real: -exp_real: -pow_real: -exp2_real_: -_c_log10: -_c_pow: -_c_entier: - int 3 - ret - endif - -entier_real: - cvttsd2si rax,xmm0 - ucomisd xmm0,qword ptr real_0_0 - jb entier_real_m - ret - -entier_real_m: - movsd qword ptr (-8)[rsp],xmm0 - mov rcx,qword ptr (-8)[rsp] - mov rbx,rcx - shr rcx,52 - cmp rcx,0bffh - jb entier_real_m_small - cmp rcx,0bffh+52 - jae entier_real_m_large - sub rcx,0bffh-12 - shl rbx,cl - je entier_m_exact -entier_real_m_small: - sub rax,1 -entier_real_m_large: -entier_m_exact: - ret - -r_to_i_real: - cvtsd2si rax,xmm0 - ret - - public getheapend - -getheapend: - lea rbx,[rdi+r15*8] - if THREAD - mov rax,heap_end_after_gc_offset[r9] - else - mov rax,heap_end_after_gc - endif - ret - -_TEXT ends - - include ..\areals.asm - - ifdef PROFILE - ifdef TRACE - include ..\atrace.asm - else - include ..\aprofile.asm - endif - endif - - ifdef NEW_DESCRIPTORS - include aap.asm - endif - - ifdef THREAD - include athread.asm - endif - - end - + +; File: astartup.asm +; Author: John van Groningen +; Machine: amd64 + +_TEXT segment para 'CODE' +_TEXT ends +_DATA segment para 'DATA' +_DATA ends + + d2 equ r10 + d3 equ r11 + d4 equ r12 + d5 equ r13 + + d3d equ r11d + d4d equ r12d + + d2b equ r10b + + ifdef LINUX + .intel_syntax noprefix + endif + + THREAD equ 1 + + ifndef LINUX + extrn convert_real_to_string:near + endif + ifndef LINUX + extrn write_heap:near + endif + extrn return_code:near + extrn execution_aborted:near + extrn e____system__kFinalizerGCTemp:near + extrn e____system__kFinalizer:near + + ifdef LINUX + .globl times + .globl exit + else + extrn GetTickCount:near + extrn ExitProcess:near + endif + if THREAD + extrn TlsAlloc:near + endif + + ifdef USE_LIBM + extrn cos:near + extrn sin:near + extrn tan:near + extrn atan:near + endif + +NEW_DESCRIPTORS = 1 + + _DATA segment + align (1 shl 3) + + ife THREAD +semi_space_size dq 0 + +heap_p1 dq 0 +heap_p2 dq 0 +heap_p3 dq 0 +neg_heap_p3 dq 0 +end_heap_p3 dq 0 + +neg_heap_vector_plus_4 dq 0 + +heap_size_64_65 dq 0 +heap_vector dq 0 +stack_top dq 0 +end_vector dq 0 + +heap_size_257 dq 0 +heap_copied_vector dq 0 + +heap_end_after_gc dq 0 +extra_heap dq 0 +extra_heap_size dq 0 +stack_p dq 0 +halt_sp dq 0 + +n_allocated_words dq 0 + endif + + if THREAD + public tlsp_tls_index +tlsp_tls_index dq 0 + endif + +last_time dq 0 +execute_time dq 0 +garbage_collect_time dq 0 +IO_time dq 0 + +compact_garbage_collect_time dq 0 +mark_compact_garbage_collect_time dq 0 +total_gc_bytes dq 0 +total_compact_gc_bytes dq 0 + + ife THREAD + public saved_heap_p +saved_heap_p label ptr + dq 0 + dq 0 + + public saved_a_stack_p +saved_a_stack_p dq 0 + + public end_a_stack +end_a_stack dq 0 + + public int_to_real_scratch +int_to_real_scratch dq 0 + endif + +heap_end_write_heap dq 0 +d3_flag_write_heap dq 0 + + ife THREAD +heap2_begin_and_end label ptr + dq 0 + dq 0 + endif + + public a_stack_guard_page +a_stack_guard_page dq 0 + + public profile_stack_pointer +profile_stack_pointer dq 0 + +dll_initialised dq 0 + ife THREAD + public end_b_stack +end_b_stack dq 0 + endif +basic_only dq 0 + ife THREAD +heap_size_65 dq 0 +heap_copied_vector_size dq 0 +heap_end_after_copy_gc dq 0 +heap_mbp dq 0 +heap_p dq 0 +stack_mbp dq 0 + +bit_counter label ptr + dq 0 +bit_vector_p label ptr + dq 0 +zero_bits_before_mark label ptr + dq 1 +n_free_words_after_mark label ptr + dq 1000 +n_last_heap_free_bytes label ptr + dq 0 +lazy_array_list label ptr + dq 0 +n_marked_words label ptr + dq 0 +end_stack label ptr + dq 0 + +bit_vector_size label ptr + dq 0 + endif + + if THREAD + + comm main_thread_local_storage:512 + +heap_p1_offset = 0 +heap_p2_offset = 8 +heap_p3_offset = 16 + +saved_heap_p_offset = 24 +saved_r15_offset = 32 +saved_a_stack_p_offset = 40 + +heap_vector_offset = 48 +end_vector_offset = 56 ; temp +neg_heap_vector_plus_4_offset = 64 ; temp + +heap_size_64_65_offset = 72 ; temp +heap_size_257_offset = 80 + +heap_copied_vector_offset = 88 + +heap_end_after_gc_offset = 96 + +extra_heap_offset = 104 +extra_heap_size_offset = 112 + +stack_top_offset = 120 ; temp +stack_p_offset = 128 + +halt_sp_offset = 136 + +n_allocated_words_offset = 144 ; temp + +heap2_begin_and_end_offset = 152 +heap_copied_vector_size_offset = 168 +heap_end_after_copy_gc_offset = 176 +heap_mbp_offset = 184 +heap_p_offset = 192 +stack_mbp_offset = 200 +bit_counter_offset = 208 +bit_vector_p_offset = 216 +bit_vector_size_offset = 224 +zero_bits_before_mark_offset = 232 +n_free_words_after_mark_offset = 240 +n_last_heap_free_bytes_offset = 248 +n_marked_words_offset = 256 ; temp +end_stack_offset = 264 ; temp +lazy_array_list_offset = 272 ; temp +heap_size_offset = 280 +heap_size_65_offset = 288 +a_stack_size_offset = 296 +garbage_collect_flag_offset = 304 + +semi_space_size_offset = 312 ; temp +neg_heap_p3_offset = 320 ; temp +end_heap_p3_offset = 328 ; temp + + endif + +caf_list label ptr + dq 0 + public caf_listp +caf_listp label ptr + dq 0 + +zero_length_string label ptr + dq __STRING__+2 + dq 0 +true_string label ptr + dq __STRING__+2 + dq 4 +true_c_string label ptr + db "True" + db 0,0,0,0 +false_string label ptr + dq __STRING__+2 + dq 5 +false_c_string label ptr + db "False" + db 0,0,0 +file_c_string label ptr + db "File" + db 0,0,0,0 + ife THREAD +garbage_collect_flag label ptr + db 0 + db 0,0,0 + align (1 shl 3) + endif + + comm sprintf_buffer:32 + +out_of_memory_string_1 label ptr + db "Not enough memory to allocate heap and stack" + db 10,0 +printf_int_string label ptr + db "%d" + db 0 +printf_real_string label ptr + db "%.15g" + db 0 +printf_string_string label ptr + db "%s" + db 0 +printf_char_string label ptr + db "%c" + db 0 +garbage_collect_string_1 label ptr + db "A stack: " + db 0 +garbage_collect_string_2 label ptr + db " bytes. BC stack: " + db 0 +garbage_collect_string_3 label ptr + db " bytes." + db 10,0 +heap_use_after_gc_string_1 label ptr + db "Heap use after garbage collection: " + db 0 +heap_use_after_compact_gc_string_1 label ptr + db "Heap use after compacting garbage collection: " + db 0 +heap_use_after_gc_string_2 label ptr + db " Bytes." + db 10,0 +stack_overflow_string label ptr + db "Stack overflow." + db 10,0 +out_of_memory_string_4 label ptr + db "Heap full." + db 10,0 +time_string_1 label ptr + db "Execution: " + db 0 +time_string_2 label ptr + db " Garbage collection: " + db 0 +time_string_3 label ptr + db " " + db 0 +time_string_4 label ptr + db " Total: " + db 0 +high_index_string label ptr + db "Index too high in UPDATE string." + db 10,0 +low_index_string label ptr + db "Index negative in UPDATE string." + db 10,0 +IO_error_string label ptr + db "IO error: " + db 0 +new_line_string label ptr + db 10,0 +sprintf_time_string label ptr + db "%d.%02d" + db 0 +marked_gc_string_1 label ptr + db "Marked: " + db 0 + if THREAD +tls_alloc_error_string label ptr + db "Could not allocate thread local storage index" + db 10,0 + endif + + ifdef PROFILE + align 8 +m_system: + dd 6 + db "System" + db 0 + db 0 + + dd m_system +garbage_collector_name: + dq 0 + db "garbage_collector" + db 0 + align 8 + endif + + align 16 + public sign_real_mask +sign_real_mask label ptr + dq 8000000000000000h,8000000000000000h + public abs_real_mask +abs_real_mask label ptr + dq 7fffffffffffffffh,7fffffffffffffffh + + align (1 shl 3) +NAN_real label ptr + dd 0ffffffffh,7fffffffh +one_real label ptr + dd 00000000h,3ff00000h +zero_real label ptr + dd 00000000h,00000000h + + align (1 shl 2) +bit_set_table label ptr + dd 00000001h,00000002h,00000004h,00000008h + dd 00000010h,00000020h,00000040h,00000080h + dd 00000100h,00000200h,00000400h,00000800h + dd 00001000h,00002000h,00004000h,00008000h + dd 00010000h,00020000h,00040000h,00080000h + dd 00100000h,00200000h,00400000h,00800000h + dd 01000000h,02000000h,04000000h,08000000h + dd 10000000h,20000000h,40000000h,80000000h + dd 0 +bit_set_table2 label ptr + dd 00000001h,0,00000002h,0,00000004h,0,00000008h,0 + dd 00000010h,0,00000020h,0,00000040h,0,00000080h,0 + dd 00000100h,0,00000200h,0,00000400h,0,00000800h,0 + dd 00001000h,0,00002000h,0,00004000h,0,00008000h,0 + dd 00010000h,0,00020000h,0,00040000h,0,00080000h,0 + dd 00100000h,0,00200000h,0,00400000h,0,00800000h,0 + dd 01000000h,0,02000000h,0,04000000h,0,08000000h,0 + dd 10000000h,0,20000000h,0,40000000h,0,80000000h,0 + dd 0,0 +bit_clear_table label ptr + dd 0fffffffeh,0fffffffdh,0fffffffbh,0fffffff7h + dd 0ffffffefh,0ffffffdfh,0ffffffbfh,0ffffff7fh + dd 0fffffeffh,0fffffdffh,0fffffbffh,0fffff7ffh + dd 0ffffefffh,0ffffdfffh,0ffffbfffh,0ffff7fffh + dd 0fffeffffh,0fffdffffh,0fffbffffh,0fff7ffffh + dd 0ffefffffh,0ffdfffffh,0ffbfffffh,0ff7fffffh + dd 0feffffffh,0fdffffffh,0fbffffffh,0f7ffffffh + dd 0efffffffh,0dfffffffh,0bfffffffh,7fffffffh + dd 0ffffffffh +bit_clear_table2 label ptr + dd 0fffffffeh,-1,0fffffffdh,-1,0fffffffbh,-1,0fffffff7h,-1 + dd 0ffffffefh,-1,0ffffffdfh,-1,0ffffffbfh,-1,0ffffff7fh,-1 + dd 0fffffeffh,-1,0fffffdffh,-1,0fffffbffh,-1,0fffff7ffh,-1 + dd 0ffffefffh,-1,0ffffdfffh,-1,0ffffbfffh,-1,0ffff7fffh,-1 + dd 0fffeffffh,-1,0fffdffffh,-1,0fffbffffh,-1,0fff7ffffh,-1 + dd 0ffefffffh,-1,0ffdfffffh,-1,0ffbfffffh,-1,0ff7fffffh,-1 + dd 0feffffffh,-1,0fdffffffh,-1,0fbffffffh,-1,0f7ffffffh,-1 + dd 0efffffffh,-1,0dfffffffh,-1,0bfffffffh,-1,7fffffffh,-1 + dd 0ffffffffh,-1 +first_one_bit_table label ptr + db -1,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + db 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 + + align(1 shl 2) + comm sprintf_time_buffer:20 + + align(1 shl 3) + +; public small_integers + comm small_integers:33*16 +; public static_characters + comm static_characters:256*16 + +; extrn clean_exception_handler:near +; public clean_unwind_info +;clean_unwind_info: +; DD 000000009H +; DD imagerel(clean_exception_handler) + +_DATA ends + _TEXT segment + + public abc_main + public print + public print_char + public print_int + public print_real + public print__string__ + public print__chars__sc + public print_sc + public print_symbol + public print_symbol_sc + public printD + public DtoAC + public push_t_r_args + public push_a_r_args + public halt + public dump + + public catAC + public sliceAC + public updateAC + public eqAC + public cmpAC + + public string_to_string_node + public int_array_to_node + public real_array_to_node + + public _create_arrayB + public _create_arrayC + public _create_arrayI + public _create_arrayI32 + public _create_arrayR + public _create_arrayR32 + public _create_r_array + public create_array + public create_arrayB + public create_arrayC + public create_arrayI + public create_arrayI32 + public create_arrayR + public create_arrayR32 + public create_R_array + + public BtoAC + public ItoAC + public RtoAC + public eqD + + public collect_0 + public collect_1 + public collect_2 + public collect_3 + + public yet_args_needed + public yet_args_needed_0 + public yet_args_needed_1 + public yet_args_needed_2 + public yet_args_needed_3 + public yet_args_needed_4 + + public _c3,_c4,_c5,_c6,_c7,_c8,_c9,_c10,_c11,_c12 + public _c13,_c14,_c15,_c16,_c17,_c18,_c19,_c20,_c21,_c22 + public _c23,_c24,_c25,_c26,_c27,_c28,_c29,_c30,_c31,_c32 + + public e__system__nind + public e__system__eaind +; old names of the previous two labels for compatibility, remove later + public __indirection,__eaind + extrn e__system__dind:near + public eval_fill + + public eval_upd_0,eval_upd_1,eval_upd_2,eval_upd_3,eval_upd_4 + public eval_upd_5,eval_upd_6,eval_upd_7,eval_upd_8,eval_upd_9 + public eval_upd_10,eval_upd_11,eval_upd_12,eval_upd_13,eval_upd_14 + public eval_upd_15,eval_upd_16,eval_upd_17,eval_upd_18,eval_upd_19 + public eval_upd_20,eval_upd_21,eval_upd_22,eval_upd_23,eval_upd_24 + public eval_upd_25,eval_upd_26,eval_upd_27,eval_upd_28,eval_upd_29 + public eval_upd_30,eval_upd_31,eval_upd_32 + + public repl_args_b + public push_arg_b + public del_args + + public add_IO_time + public add_execute_time + public IO_error + public stack_overflow + + public out_of_memory_4 + public print_error + + ifdef LINUX + .globl __start + else + extrn _start:near + endif + + ifdef PROFILE +; extrn init_profiler:near +; extrn profile_n:near +; extrn profile_s:near +; extrn profile_r:near +; extrn write_profile_information:near +; extrn write_profile_stack:near + endif + + ifdef USE_LIBM + public cos_real + public sin_real + public tan_real + public asin_real + public acos_real + public atan_real + public ln_real + public log10_real + public exp_real + public pow_real + endif + public entier_real + public r_to_i_real + ifdef USE_LIBM + public _c_pow + public _c_log10 + public _c_entier + endif + + public __driver + +; from system.abc: + extrn dINT:near + extrn INT32:near + extrn CHAR:near + extrn BOOL:near + extrn REAL:near + extrn REAL32:near + extrn FILE:near + extrn __STRING__:near + extrn __ARRAY__:near + extrn __cycle__in__spine:near + extrn __print__graph:near + extrn __eval__to__nf:near + +; from wcon.c: + extrn w_print_char:near + extrn w_print_string:near + extrn w_print_text:near + extrn w_print_int:near + extrn w_print_real:near + + extrn ew_print_char:near + extrn ew_print_text:near + extrn ew_print_string:near + extrn ew_print_int:near + extrn ew_print_real:near + + extrn ab_stack_size:near + extrn heap_size:near + extrn flags:near + +; from standard c library: + + ifndef LINUX + extrn allocate_memory:near + ife THREAD + extrn allocate_memory_with_guard_page_at_end:near + endif + extrn free_memory:near + endif + + extrn heap_size_multiple:near + extrn initial_heap_size:near + + extrn min_write_heap_size:near + + extrn __Nil:near +; public finalizer_list + comm finalizer_list:qword +; public free_finalizer_list + comm free_finalizer_list:qword + +abc_main: + push rbx + push rcx + push rdx + push rbp + push rsi + push rdi + + call init_clean + test rax,rax + jne init_error + + call init_timer + + if THREAD + mov halt_sp_offset[r9],rsp + else + mov halt_sp,rsp + endif + + ifdef PROFILE + call init_profiler + endif + + ifdef LINUX + call __start + +exit_: + else + call _start + +exit: + endif + + call exit_clean + +init_error: + pop rdi + pop rsi + pop rbp + pop rdx + pop rcx + pop rbx + + ifdef LINUX + mov eax,dword ptr return_code + jne return_code_set_1 + mov eax,-1 +return_code_set_1: + endif + ret + + + public DllMain +DllMain: + cmp edx,1 + je DLL_PROCESS_ATTACH + jb DLL_PROCESS_DETACH + ret + +DLL_PROCESS_ATTACH: + push rbx + push rbp + push rsi + push rdi + ifndef LINUX + db 49h + push rsp + db 49h + push rbp + db 49h + push rsi + db 49h + push rdi + else + push r12 + push r13 + push r14 + push r15 + endif + mov qword ptr dll_initialised,1 + + call init_clean + test rax,rax + jne init_dll_error + + call init_timer + + if THREAD + mov halt_sp_offset[r9],rsp + else + mov halt_sp,rsp + endif + + ifdef PROFILE + call init_profiler + endif + + if THREAD + mov qword ptr saved_heap_p_offset[r9],rdi + mov qword ptr saved_r15_offset[r9],r15 + mov qword ptr saved_a_stack_p_offset[r9],rsi + else + mov qword ptr saved_heap_p,rdi + mov qword ptr saved_heap_p+8,r15 + mov saved_a_stack_p,rsi + endif + + mov rax,1 + jmp exit_dll_init + +init_dll_error: + xor rax,rax + jmp exit_dll_init + +DLL_PROCESS_DETACH: + push rbx + push rbp + push rsi + push rdi + ifndef LINUX + db 49h + push rsp + db 49h + push rbp + db 49h + push rsi + db 49h + push rdi + else + push r12 + push r13 + push r14 + push r15 + endif + + if THREAD + mov rdi,qword ptr saved_heap_p_offset[r9] + mov r15,qword ptr saved_r15_offset[r9] + mov rsi,qword ptr saved_a_stack_p_offset[r9] + else + mov rdi,qword ptr saved_heap_p + mov r15,qword ptr saved_heap_p+8 + mov rsi,saved_a_stack_p + endif + + call exit_clean + +exit_dll_init: + ifndef LINUX + db 49h + pop rdi + db 49h + pop rsi + db 49h + pop rbp + db 49h + pop rsp + else + pop r15 + pop r14 + pop r13 + pop r12 + endif + pop rdi + pop rsi + pop rbp + pop rbx + ret + +init_clean: + if THREAD + ifdef LINUX + sub rsp,8 + + mov rdi,rsp + sub rsi,rsi + + mov rbp,rsp + and rsp,-16 + call pthread_key_create + mov rsp,rbp + + lea r9,main_thread_local_storage + + test eax,eax + jne tls_alloc_error + + mov rdi,qword ptr [rsp] + mov rsi,r9 + + mov qword ptr tlsp_tls_index,rdi + + mov rbp,rsp + and rsp,-16 + call pthread_setspecific + mov rsp,rbp + + lea r9,main_thread_local_storage + + test eax,eax + jne tls_alloc_error + + add rsp,8 + + lea r9,main_thread_local_storage + else + sub rsp,32 + call TlsAlloc + add rsp,32 + + cmp rax,64 + jae tls_alloc_error + + mov qword ptr tlsp_tls_index,rax + + lea r9,main_thread_local_storage + + mov qword ptr gs:[1480h+rax*8],r9 + endif + endif + + lea rax,128[rsp] + sub rsp,32+8 + + ife THREAD + sub rax,qword ptr ab_stack_size + mov end_b_stack,rax + endif + mov rax,qword ptr flags + and rax,1 + mov basic_only,rax + +; call allow_prefetch_for_athlon + + mov rax,qword ptr heap_size + if THREAD + mov heap_size_offset[r9],rax + endif + sub rax,7 + xor rdx,rdx + mov rbx,65 + div rbx + if THREAD + mov qword ptr heap_size_65_offset[r9],rax + + mov rax,qword ptr heap_size_offset[r9] + else + mov qword ptr heap_size_65,rax + + mov rax,qword ptr heap_size + endif + + sub rax,7 + xor rdx,rdx + mov rbx,257 + div rbx + if THREAD + mov heap_size_257_offset[r9],rax + else + mov heap_size_257,rax + endif + add rax,7 + and rax,-8 + if THREAD + mov qword ptr heap_copied_vector_size_offset[r9],rax + mov qword ptr heap_end_after_copy_gc_offset[r9],0 + + mov rax,qword ptr heap_size_offset[r9] + else + mov qword ptr heap_copied_vector_size,rax + mov qword ptr heap_end_after_copy_gc,0 + + mov rax,qword ptr heap_size + endif + add rax,7 + and rax,-8 + if THREAD + mov qword ptr heap_size_offset[r9],rax + else + mov qword ptr heap_size,rax + endif + add rax,7 + + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov rdi,rax + call malloc + else + mov rcx,rax + call allocate_memory + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + + test rax,rax + je no_memory_2 + + if THREAD + mov heap_mbp_offset[r9],rax + else + mov heap_mbp,rax + endif + lea rdi,7[rax] + and rdi,-8 + if THREAD + mov heap_p_offset[r9],rdi + else + mov heap_p,rdi + endif + + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r14,rdi + mov rdi,qword ptr ab_stack_size + if THREAD + mov qword ptr a_stack_size_offset[r9],rdi + endif + add rdi,7 + call malloc + mov rdi,r14 + else + mov rcx,qword ptr ab_stack_size + if THREAD + mov qword ptr a_stack_size_offset[r9],rcx + endif + add rcx,7 + if THREAD + call allocate_memory + else + call allocate_memory_with_guard_page_at_end + endif + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + + test rax,rax + je no_memory_3 + + if THREAD + mov stack_mbp_offset[r9],rax + + add rax,qword ptr a_stack_size_offset[r9] + else + mov stack_mbp,rax + + add rax,qword ptr ab_stack_size + endif + add rax,7+4095 + and rax,-4096 + mov qword ptr a_stack_guard_page,rax + if THREAD + sub rax,qword ptr a_stack_size_offset[r9] + else + sub rax,qword ptr ab_stack_size + endif + + add rax,7 + and rax,-8 + + mov rsi,rax + if THREAD + mov stack_p_offset[r9],rax + else + mov stack_p,rax + endif + ife THREAD + add rax,qword ptr ab_stack_size + sub rax,64 + mov qword ptr end_a_stack,rax + endif + lea rcx,small_integers + xor rax,rax + lea rbx,(dINT+2) + +make_small_integers_lp: + mov [rcx],rbx + mov 8[rcx],rax + inc rax + add rcx,16 + cmp rax,33 + jne make_small_integers_lp + + lea rcx,static_characters + xor rax,rax + lea rbx,(CHAR+2) + +make_static_characters_lp: + mov [rcx],rbx + mov 8[rcx],rax + inc rax + add rcx,16 + cmp rax,256 + jne make_static_characters_lp + + lea rcx,(caf_list+8) + mov qword ptr caf_listp,rcx + + lea rcx,__Nil-8 + mov qword ptr finalizer_list,rcx + mov qword ptr free_finalizer_list,rcx + + if THREAD + mov heap_p1_offset[r9],rdi + + mov rbp,qword ptr heap_size_257_offset[r9] + else + mov heap_p1,rdi + + mov rbp,qword ptr heap_size_257 + endif + shl rbp,4 + lea rax,[rdi+rbp*8] + if THREAD + mov heap_copied_vector_offset[r9],rax + add rax,heap_copied_vector_size_offset[r9] + mov heap_p2_offset[r9],rax + + mov byte ptr garbage_collect_flag_offset[r9],0 + else + mov heap_copied_vector,rax + add rax,heap_copied_vector_size + mov heap_p2,rax + + mov byte ptr garbage_collect_flag,0 + endif + + test byte ptr flags,64 + je no_mark1 + + if THREAD + mov rax,qword ptr heap_size_65_offset[r9] + mov qword ptr heap_vector_offset[r9],rdi + else + mov rax,qword ptr heap_size_65 + mov qword ptr heap_vector,rdi + endif + add rdi,rax + + add rdi,7 + and rdi,-8 + + if THREAD + mov qword ptr heap_p3_offset[r9],rdi + else + mov qword ptr heap_p3,rdi + endif + lea rbp,[rax*8] + if THREAD + mov byte ptr garbage_collect_flag_offset [r9],-1 + else + mov byte ptr garbage_collect_flag,-1 + endif + +no_mark1: + mov rax,qword ptr initial_heap_size + + mov rbx,4000 + test byte ptr flags,64 + jne no_mark9 + add rbx,rbx +no_mark9: + + cmp rax,rbx + jle too_large_or_too_small + shr rax,3 + cmp rax,rbp + jge too_large_or_too_small + mov rbp,rax +too_large_or_too_small: + + lea rax,[rdi+rbp*8] + if THREAD + mov heap_end_after_gc_offset[r9],rax + else + mov heap_end_after_gc,rax + endif + + test byte ptr flags,64 + je no_mark2 + if THREAD + mov qword ptr bit_vector_size_offset[r9],rbp + else + mov qword ptr bit_vector_size,rbp + endif +no_mark2: + + mov r15,rbp + + add rsp,32+8 + xor rax,rax + ret + + if THREAD +tls_alloc_error: + mov rbp,rsp + and rsp,-16 + ifdef LINUX + lea rdi,tls_alloc_error_string + else + lea rcx,tls_alloc_error_string + endif + call ew_print_string + mov rsp,rbp + + add rsp,8 + mov rax,1 + ret + endif + +no_memory_2: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + lea rdi,out_of_memory_string_1 + else + lea rcx,out_of_memory_string_1 + endif + call ew_print_string + mov rsp,rbp + + mov qword ptr execution_aborted,1 + + add rsp,32 + if THREAD + mov r9,rbx + endif + mov rax,1 + ret + +no_memory_3: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + lea rdi,out_of_memory_string_1 + else + lea ecx,out_of_memory_string_1 + endif + call ew_print_string + + mov qword ptr execution_aborted,1 + + if THREAD + mov r9,rbx + endif + + ifdef LINUX + if THREAD + mov rdi,heap_mbp_offset[r9] + else + mov rdi,heap_mbp + endif + call free + else + if THREAD + mov rcx,heap_mbp_offset[r9] + else + mov rcx,heap_mbp + endif + call free_memory + endif + + mov rsp,rbp + if THREAD + mov r9,rbx + endif + add rsp,32 + mov rax,1 + ret + +exit_clean: + call add_execute_time + + mov rax,qword ptr flags + test al,8 + je no_print_execution_time + + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifndef LINUX + sub rsp,32 + endif + + ifdef LINUX + lea rdi,time_string_1 + else + lea rcx,time_string_1 + endif + call ew_print_string + + mov rax,execute_time + call print_time + + ifdef LINUX + lea rdi,time_string_2 + else + lea rcx,time_string_2 + endif + call ew_print_string + + mov rax,garbage_collect_time + ifdef MEASURE_GC + else + add rax,mark_compact_garbage_collect_time + add rax,compact_garbage_collect_time + endif + call print_time + + ifdef MEASURE_GC + + ifdef LINUX + lea rdi,time_string_3 + else + lea rcx,time_string_3 + endif + call ew_print_string + + mov rax,mark_compact_garbage_collect_time + call print_time + + ifdef LINUX + lea rdi,time_string_3 + else + lea rcx,time_string_3 + endif + call ew_print_string + + mov rax,compact_garbage_collect_time + call print_time + + endif + + ifdef LINUX + lea rdi,time_string_4 + else + lea rcx,time_string_4 + endif + call ew_print_string + + mov rax,execute_time + add rax,garbage_collect_time + add rax,IO_time + + add rax,mark_compact_garbage_collect_time + add rax,compact_garbage_collect_time + + call print_time + + ifdef LINUX + mov rdi,10 + else + mov rcx,10 + endif + call ew_print_char + + ifdef MEASURE_GC + + ifdef LINUX + mov rdi,total_gc_bytes + else + mov rcx,total_gc_bytes + endif + call ew_print_int + + ifdef LINUX + mov rdi,32 + else + mov rcx,32 + endif + call ew_print_char + + ifdef LINUX + mov rdi,total_compact_gc_bytes + else + mov rcx,total_compact_gc_bytes + endif + call ew_print_int + + ifdef LINUX + mov rdi,32 + else + mov rcx,32 + endif + call ew_print_char + + mov rax,1000 + cvtsi2sd xmm1,rax + cvtsi2sd xmm0,qword ptr garbage_collect_time + divsd xmm0,xmm1 + call ew_print_real + + ifdef LINUX + mov rdi,32 + else + mov rcx,32 + endif + call ew_print_char + + mov rax,1000 + cvtsi2sd xmm1,rax + cvtsi2sd xmm0,qword ptr mark_compact_garbage_collect_time + divsd xmm0,xmm1 + call ew_print_real + + ifdef LINUX + mov rdi,32 + else + mov rcx,32 + endif + call ew_print_char + + mov rax,1000 + cvtsi2sd xmm1,rax + cvtsi2sd xmm0,qword ptr compact_garbage_collect_time + divsd xmm0,xmm1 + call ew_print_real + + ifdef LINUX + mov rdi,10 + else + mov rcx,10 + endif + call ew_print_char + + mov rax,1000 + cvtsi2sd xmm1,rax + cvtsi2sd xmm2,qword ptr garbage_collect_time + divsd xmm2,xmm1 + mov rax,qword ptr total_gc_bytes + cvtsi2sd xmm0,rax + divsd xmm0,xmm2 + call ew_print_real + + ifdef LINUX + mov rdi,32 + else + mov rcx,32 + endif + call ew_print_char + + mov rax,1000 + cvtsi2sd xmm1,rax + cvtsi2sd xmm2,qword ptr mark_compact_garbage_collect_time + divsd xmm2,xmm1 + mov rax,qword ptr total_compact_gc_bytes + cvtsi2sd xmm0,rax + divsd xmm0,xmm2 + call ew_print_real + + ifdef LINUX + mov rdi,32 + else + mov rcx,32 + endif + call ew_print_char + + mov rax,1000 + cvtsi2sd xmm1,rax + cvtsi2sd xmm2,qword ptr compact_garbage_collect_time + divsd xmm2,xmm1 + mov rax,qword ptr total_compact_gc_bytes + cvtsi2sd xmm0,rax + divsd xmm0,xmm2 + call ew_print_real + + ifdef LINUX + mov rdi,32 + else + mov rcx,32 + endif + call ew_print_char + + mov rax,1000 + cvtsi2sd xmm1,rax + cvtsi2sd xmm2,qword ptr mark_compact_garbage_collect_time + cvtsi2sd xmm3,qword ptr compact_garbage_collect_time + addsd xmm2,xmm3 + divsd xmm2,xmm1 + mov rax,qword ptr total_compact_gc_bytes + cvtsi2sd xmm0,rax + divsd xmm0,xmm2 + call ew_print_real + + ifdef LINUX + mov rdi,10 + else + mov rcx,10 + endif + call ew_print_char + + endif + + mov rsp,rbp + if THREAD + mov r9,rbx + endif + +no_print_execution_time: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + if THREAD + mov rdi,stack_mbp_offset[r9] + else + mov rdi,stack_mbp + endif + call free + if THREAD + mov r9,rbx + endif + + if THREAD + mov rdi,heap_mbp_offset[r9] + else + mov rdi,heap_mbp + endif + call free + else + if THREAD + mov rcx,stack_mbp_offset[r9] + else + mov rcx,stack_mbp + endif + sub rsp,32 + call free_memory + if THREAD + mov r9,rbx + endif + + if THREAD + mov rcx,heap_mbp_offset[r9] + else + mov rcx,heap_mbp + endif + call free_memory + add rsp,32 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + + ifdef PROFILE + ifndef TRACE + call write_profile_information + endif + endif + + ret + +__driver: + mov rbp,qword ptr flags + test rbp,16 + je __print__graph + jmp __eval__to__nf + +print_time: + push rbp + if THREAD + mov r14,r9 + push rbx + endif + + xor rdx,rdx + mov rbx,1000 + div rbx + mov rcx,rax + mov rax,rdx + xor rdx,rdx + mov rbx,10 + div rbx + + push rax + + mov rbp,rsp + and rsp,-16 + ifdef LINUX + mov rdi,rcx + else + sub rsp,32 + endif + call ew_print_int + mov rsp,rbp + + lea rcx,sprintf_time_buffer + + xor rdx,rdx + mov rbx,10 + +; movb $'.',(%rcx) + mov byte ptr [rcx],46 + + pop rax + + div rbx + add rax,48 + add rdx,48 + mov byte ptr 1[rcx],al + mov byte ptr 2[rcx],dl + + mov rbp,rsp + and rsp,-16 + ifdef LINUX + mov rsi,3 + mov rdi,rcx + else + mov rdx,3 + sub rsp,32 + endif + call ew_print_text + mov rsp,rbp + + if THREAD + pop rbx + mov r9,r14 + endif + pop rbp + ret + +print_sc: + mov rbp,basic_only + test rbp,rbp + jne end_print + +print: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + mov rdi,rax + else + mov rcx,rax + sub rsp,32 + endif + call w_print_string + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + +end_print: + ret + +dump: + call print + jmp halt + +printD: test al,2 + jne printD_ + + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + + lea rdi,4[rax] + mov esi,0[rax] + else + lea rcx,4[rax] + mov edx,dword ptr [rax] + sub rsp,32 + endif + call w_print_text + ifdef LINUX + mov rsi,r13 + mov rsi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + ret + +DtoAC_record: + ifdef NEW_DESCRIPTORS + movsxd rbp,dword ptr (-6)[rax] + else + movsx rbp,dword ptr (-4)[rbp] + endif + jmp DtoAC_string_a2 + +DtoAC: test al,2 + jne DtoAC_ + + mov rbp,rax + jmp DtoAC_string_a2 + +DtoAC_: + ifdef NEW_DESCRIPTORS + cmp word ptr (-2)[rax],256 + jae DtoAC_record + + movzx rbx,word ptr [rax] + lea rbp,10[rax+rbx] + else + lea rbp,(-2)[rax] + movsx rbx,word ptr [rbp] + cmp rbx,256 + jae DtoAC_record + + shl rbx,3 + sub rbp,rbx + + movzx rbx,word ptr (-2)[rbp] + lea rbp,4[rbp+rbx*8] + endif + +DtoAC_string_a2: + mov eax,dword ptr [rbp] + lea rcx,4[rbp] + jmp build_string + +print_symbol: + xor rbx,rbx + jmp print_symbol_2 + +print_symbol_sc: + mov rbx,basic_only +print_symbol_2: + mov rax,[rcx] + + cmp rax,offset dINT+2 + je print_int_node + + cmp rax,offset CHAR+2 + je print_char_denotation + + cmp rax,offset BOOL+2 + je print_bool + + cmp rax,offset REAL+2 + je print_real_node + + test rbx,rbx + jne end_print_symbol + +printD_: + ifdef NEW_DESCRIPTORS + cmp word ptr (-2)[rax],256 + jae print_record + + movzx rbx,word ptr [rax] + lea rbp,10[rax+rbx] + jmp print_string_a2 + +print_record: + movsxd rbp,dword ptr (-6)[rax] + jmp print_string_a2 + else + lea rbp,(-2)[rax] + movsx rbx,word ptr [rbp] + cmp rbx,256 + jae print_record + + shl rbx,3 + sub rbp,rbx + + movzx rbx,word ptr (-2)[rbp] + lea rbp,4[rbp+rbx*8] + jmp print_string_a2 + +print_record: + mov ebp,(-4)[rbp] + jmp print_string_a2 + endif + +end_print_symbol: + ret + +print_int_node: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + mov rdi,8[rcx] + else + sub rsp,32 + mov rcx,8[rcx] + endif + call w_print_int + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + ret + +print_int: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + mov rdi,rax + else + mov rcx,rax + sub rsp,32 + endif + call w_print_int + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + ret + +print_char_denotation: + test rbx,rbx + jne print_char_node + + mov rbp,rsp + and rsp,-16 + if THREAD + mov r14,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + else + sub rsp,32 + endif + mov rbx,8[rcx] + + ifdef LINUX + mov rdi,0x27 + else + mov rcx,27h + endif + call w_print_char + + ifdef LINUX + mov rdi,rbx + else + mov rcx,rbx + endif + call w_print_char + + ifdef LINUX + mov rdi,0x27 + else + mov rcx,27h + endif + call w_print_char + + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,r14 + endif + ret + +print_char_node: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + + mov rdi,8[rcx] +else + mov rcx,8[rcx] + sub rsp,32 + endif + call w_print_char + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + ret + +print_char: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + + mov rdi,rax + else + mov rcx,rax + sub rsp,32 + endif + call w_print_char + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + ret + +print_bool: + movsx rcx,byte ptr 8[rcx] + test rcx,rcx + je print_false + +print_true: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + lea rdi,true_c_string + else + lea rcx,true_c_string + sub rsp,32 + endif + call w_print_string + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + ret + +print_false: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + lea rdi,false_c_string + else + lea rcx,false_c_string + sub rsp,32 + endif + call w_print_string + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + ret + +print_real_node: + movlpd xmm0,qword ptr 8[rcx] +print_real: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + else + sub rsp,32 + endif + call w_print_real + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + ret + +print_string_a2: + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + lea rdi,4[rbp] + mov esi,0[rbp] + mov rbp,rsp + and rsp,-16 + else + lea rcx,4[rbp] + mov edx,0[rbp] + mov rbp,rsp + and rsp,-16 + sub rsp,32 + endif + call w_print_text + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + ret + +print__chars__sc: + mov rbp,basic_only + test rbp,rbp + jne no_print_chars + +print__string__: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + mov rsi,8[rcx] + lea rdi,16[rcx] + else + mov rdx,8[rcx] + lea rcx,16[rcx] + sub rsp,32 + endif + call w_print_text + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif +no_print_chars: + ret + +push_a_r_args: + push rdi + + mov rdx,qword ptr 16[rcx] + sub rdx,2 + movzx rdi,word ptr [rdx] + sub rdi,256 + movzx rbx,word ptr 2[rdx] + add rdx,4 + push rdx + + mov rdx,rdi + sub rdx,rbx + + shl rax,3 + lea rcx,24[rcx+rbx*8] + dec rdi +mul_array_size_lp: + add rcx,rax + sub rdi,1 + jnc mul_array_size_lp + + lea rdi,[rcx+rdx*8] + jmp push_a_elements +push_a_elements_lp: + mov rax,qword ptr (-8)[rcx] + sub rcx,8 + mov qword ptr [rsi],rax + add rsi,8 +push_a_elements: + sub rbx,1 + jnc push_a_elements_lp + + mov rcx,rdi + pop rax + pop rdi + + pop rbp + jmp push_b_elements +push_b_elements_lp: + push (-8)[rcx] + sub rcx,8 +push_b_elements: + sub rdx,1 + jnc push_b_elements_lp + + jmp rbp + +push_t_r_args: + pop rbp + + mov rdx,qword ptr [rcx] + add rcx,8 + sub rdx,2 + movzx rax,word ptr [rdx] + sub rax,256 + movzx rbx,word ptr 2[rdx] + add rdx,4 + + mov qword ptr [rsi],rdx + mov qword ptr 8[rsi],rbx + + sub rbx,rax + neg rbx + + lea rdx,[rcx+rax*8] + cmp rax,2 + jbe small_record + mov rdx,qword ptr 8[rcx] + lea rdx,(-8)[rdx+rax*8] +small_record: + jmp push_r_b_elements + +push_r_b_elements_lp: + dec rax + jne not_first_arg_b + + push [rcx] + jmp push_r_b_elements +not_first_arg_b: + push (-8)[rdx] + sub rdx,8 +push_r_b_elements: + sub rbx,1 + jnc push_r_b_elements_lp + + mov rbx,qword ptr 8[rsi] + push rbp + push [rsi] + jmp push_r_a_elements + +push_r_a_elements_lp: + dec rax + jne not_first_arg_a + + mov rbp,qword ptr [rcx] + mov qword ptr [rsi],rbp + add rsi,8 + jmp push_r_a_elements +not_first_arg_a: + mov rbp,qword ptr (-8)[rdx] + sub rdx,8 + mov qword ptr [rsi],rbp + add rsi,8 +push_r_a_elements: + sub rbx,1 + jnc push_r_a_elements_lp + + pop rax + ret + +BtoAC: + test al,al + je BtoAC_false +BtoAC_true: + mov rcx,offset true_string + ret +BtoAC_false: + mov rcx,offset false_string + ret + +RtoAC: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + lea rsi,printf_real_string + lea rdi,sprintf_buffer + mov rax,1 + call sprintf + mov rsi,r13 + mov rdi,r14 + else + lea rdx,sprintf_buffer + sub rsp,32 + call convert_real_to_string + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + jmp return_sprintf_buffer + +ItoAC: + mov rcx,offset sprintf_buffer + call int_to_string + + mov rax,rcx + sub rax,offset sprintf_buffer + + jmp sprintf_buffer_to_string + + public convert_int_to_string +convert_int_to_string: + push rbp + push rbx + mov rax,rdx + call int_to_string + mov rax,rcx + pop rbx + pop rbp + ret + +int_to_string: + test rax,rax + jns no_minus + mov byte ptr [rcx],45 + inc rcx + neg rax +no_minus: + mov rbp,rcx + + je zero_digit + +calculate_digits: + cmp rax,10 + jb last_digit + + mov rdx,0cccccccccccccccdh + mov rbx,rax + + mul rdx + + mov rax,rdx + and rdx,-8 + add rbx,48 + + shr rax,3 + sub rbx,rdx + shr rdx,2 + + sub rbx,rdx + mov byte ptr [rcx],bl + + inc rcx + jmp calculate_digits + +last_digit: + test rax,rax + je no_zero +zero_digit: + add rax,48 + mov byte ptr [rcx],al + inc rcx +no_zero: + mov rdx,rcx + +reverse_digits: + dec rdx + cmp rbp,rdx + jae end_reverse_digits + mov bl,byte ptr [rbp] + mov al,byte ptr [rdx] + mov byte ptr [rdx],bl + mov byte ptr [rbp],al + inc rbp + jmp reverse_digits + +end_reverse_digits: + mov byte ptr [rcx],0 + ret + +return_sprintf_buffer: + mov rax,offset sprintf_buffer-1 +skip_characters: + inc rax + cmp byte ptr [rax],0 + jne skip_characters + + sub rax,offset sprintf_buffer + +sprintf_buffer_to_string: + mov rcx,offset sprintf_buffer +build_string: + + lea rbx,16+7[rax] + shr rbx,3 + + sub r15,rbx + jge D_to_S_no_gc + + push rcx + call collect_0 + pop rcx + +D_to_S_no_gc: + if THREAD + lea rbp,__STRING__+2 + sub rbx,2 + mov qword ptr [rdi],rbp + mov 8[rdi],rax + mov rbp,rdi + else + sub rbx,2 + mov rbp,rdi + lea r9,__STRING__+2 + mov qword ptr [rdi],r9 + mov 8[rdi],rax + endif + add rdi,16 + jmp D_to_S_cp_str_2 + +D_to_S_cp_str_1: + mov rax,[rcx] + add rcx,8 + mov [rdi],rax + add rdi,8 +D_to_S_cp_str_2: + sub rbx,1 + jnc D_to_S_cp_str_1 + + mov rcx,rbp + ret + +eqD: mov rax,[rcx] + cmp rax,[rdx] + jne eqD_false + + cmp rax,offset dINT+2 + je eqD_INT + cmp rax,offset CHAR+2 + je eqD_CHAR + cmp rax ,offset BOOL+2 + je eqD_BOOL + cmp rax ,offset REAL+2 + je eqD_REAL + + mov rax ,1 + ret + +eqD_CHAR: +eqD_INT: + mov rbx,8[rcx] + xor rax,rax + cmp rbx,8[rdx] + sete al + ret + +eqD_BOOL: + mov bl,byte ptr 8[rcx] + xor rax,rax + cmp bl,byte ptr 8[rdx] + sete al + ret + +eqD_REAL: + movlpd xmm0,qword ptr 8[rcx] + comisd xmm0,qword ptr 8[rdx] + fnstsw ax + and ah,68 + xor ah,64 + sete al + and rax,1 + ret + +eqD_false: + xor rax ,rax + ret +; +; the timer +; + + +init_timer: + mov rbp,rsp + and rsp,-16 + sub rsp,32 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + mov rdi,rsp + call times + mov rsi,r13 + mov rdi,r14 + mov eax,[rsp] + imul eax,10 + else + call GetTickCount + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + + mov last_time,rax + xor rax,rax + mov execute_time,rax + mov garbage_collect_time,rax + mov IO_time,rax + + mov mark_compact_garbage_collect_time,rax + mov compact_garbage_collect_time,rax + + ret + +get_time_diff: + mov rbp,rsp + and rsp,-16 + sub rsp,32 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + mov rdi,rsp + call times + mov rsi,r13 + mov rdi,r14 + mov eax,[rsp] + imul eax,10 + else + call GetTickCount + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + + lea rcx,last_time + mov rdx,[rcx] + mov [rcx],rax + sub rax,rdx + ret + +add_execute_time: + call get_time_diff + lea rcx,execute_time + +add_time: + add rax,[rcx] + mov [rcx],rax + ret + +add_garbage_collect_time: + call get_time_diff + mov rcx,offset garbage_collect_time + jmp add_time + +add_IO_time: + call get_time_diff + mov rcx,offset IO_time + jmp add_time + +add_mark_compact_garbage_collect_time: + call get_time_diff + mov rcx,offset mark_compact_garbage_collect_time + jmp add_time + +add_compact_garbage_collect_time: + call get_time_diff + mov rcx,offset compact_garbage_collect_time + jmp add_time +; +; the garbage collector +; + +collect_3: + ifdef PROFILE + lea rbp,garbage_collector_name + call profile_s + endif + mov [rsi],rcx + mov 8[rsi],rdx + mov 16[rsi],r8 + add rsi,24 + call collect_0_ + mov r8,(-8)[rsi] + mov rdx,(-16)[rsi] + mov rcx,(-24)[rsi] + sub rsi,24 + ifdef PROFILE + jmp profile_r + else + ret + endif + +collect_2: + ifdef PROFILE + lea rbp,garbage_collector_name + call profile_s + endif + mov [rsi],rcx + mov 8[rsi],rdx + add rsi,16 + call collect_0_ + mov rdx,(-8)[rsi] + mov rcx,(-16)[rsi] + sub rsi,16 + ifdef PROFILE + jmp profile_r + else + ret + endif + +collect_1: + ifdef PROFILE + lea rbp,garbage_collector_name + call profile_s + endif + mov [rsi],rcx + add rsi,8 + call collect_0_ + mov rcx,(-8)[rsi] + sub rsi,8 + ifdef PROFILE + jmp profile_r + else + ret + endif + +collect_0: + ifdef PROFILE + lea rbp,garbage_collector_name + call profile_s + endif + call collect_0_ + ifdef PROFILE + jmp profile_r + else + ret + endif + +collect_0_: + mov rbp,rdi + + push rax + push rbx + + if THREAD + mov rbx,qword ptr heap_end_after_gc_offset[r9] + else + mov rbx,qword ptr heap_end_after_gc + endif + sub rbx,rdi + + shr rbx,3 + sub rbx,r15 + if THREAD + mov qword ptr n_allocated_words_offset[r9],rbx + else + mov qword ptr n_allocated_words,rbx + endif + + test byte ptr flags,64 + je no_mark3 + + if THREAD + mov rbp,qword ptr bit_counter_offset[r9] + else + mov rbp,qword ptr bit_counter + endif + test rbp,rbp + je no_scan + + push rsi + mov rsi,rbx + + xor rbx,rbx + if THREAD + mov rcx,qword ptr bit_vector_p_offset[r9] + else + mov rcx,qword ptr bit_vector_p + 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 dword ptr (-4)[rcx],ebx + mov rax,rcx + 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 rbp,(-4)[rdx] + if THREAD + sub rbp,qword ptr heap_vector_offset[r9] + else + sub rbp,qword ptr heap_vector + endif + shl rbp,6 + if THREAD + mov rdi,qword ptr heap_p3_offset[r9] + else + mov rdi,qword ptr heap_p3 + endif + add rdi,rbp + + lea rbp,[rdi+rax*8] + if THREAD + mov qword ptr heap_end_after_gc_offset[r9],rbp + else + mov qword ptr heap_end_after_gc,rbp + endif + + mov r15,rax + sub r15,rsi + + pop rsi + pop rbx + pop rax + ret + +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: + pop rsi + if THREAD + mov qword ptr bit_counter_offset[r9],rbp + else + mov qword ptr bit_counter,rbp + endif + +no_scan: + +no_mark3: + if THREAD + movsx rax,byte ptr garbage_collect_flag_offset[r9] + else + movsx rax,byte ptr garbage_collect_flag + endif + test rax,rax + jle collect + + sub rax,2 + if THREAD + mov byte ptr garbage_collect_flag_offset[r9],al + + mov rbp,qword ptr extra_heap_size_offset[r9] + else + mov byte ptr garbage_collect_flag,al + + mov rbp,qword ptr extra_heap_size + endif + cmp rbx,rbp + ja collect + + if THREAD + mov rdi,qword ptr extra_heap_offset[r9] + else + mov rdi,qword ptr extra_heap + endif + + mov r15,rbp + + lea rbp,[rdi+rbp*8] + if THREAD + mov qword ptr heap_end_after_gc_offset[r9],rbp + else + mov qword ptr heap_end_after_gc,rbp + endif + + sub r15,rbx + + pop rbx + pop rax + ret + +collect: + ifdef LINUX + sub rsp,104 + else + sub rsp,88 + endif + mov 32[rsp],r10 + mov 24[rsp],r11 + mov 16[rsp],r12 + mov 8[rsp],r13 + mov [rsp],r14 + movsd 40[rsp],xmm0 + movsd 48[rsp],xmm1 + movsd 56[rsp],xmm2 + movsd 64[rsp],xmm3 + movsd 72[rsp],xmm4 + movsd 80[rsp],xmm5 + ifdef LINUX + movsd 88[rsp],xmm6 + movsd 96[rsp],xmm7 + endif + + call add_execute_time + + test qword ptr flags,4 + je no_print_stack_sizes + + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov r13,rsi + mov r14,rdi + else + sub rsp,32 + endif + + if 0 + ifdef LINUX + mov rdi,qword ptr 64[rsp] + else + mov rcx,qword ptr 96[rsp] + endif + call ew_print_int + + ifdef LINUX + mov rdi,32 + else + mov rcx,32 + endif + call ew_print_char + endif + + ifdef LINUX + lea rdi,garbage_collect_string_1 + else + lea rcx,garbage_collect_string_1 + endif + call ew_print_string + + ifdef LINUX + mov rdi,r13 + if THREAD + mov r9,rbx + sub rdi,stack_p_offset[r9] + else + sub rdi,stack_p + endif + else + mov rcx,rsi + if THREAD + mov r9,rbx + sub rcx,stack_p_offset[r9] + else + sub rcx,stack_p + endif + endif + call ew_print_int + + ifdef LINUX + lea rdi,garbage_collect_string_2 + else + lea rcx,garbage_collect_string_2 + endif + call ew_print_string + + ifdef LINUX + if THREAD + mov r9,rbx + mov rdi,halt_sp_offset[r9] + else + mov rdi,halt_sp + endif + sub rdi,rsp + else + if THREAD + mov r9,rbx + mov rcx,halt_sp_offset[r9] + else + mov rcx,halt_sp + endif + sub rcx,rsp + endif + call ew_print_int + + ifdef LINUX + lea rdi,garbage_collect_string_3 + else + lea rcx,garbage_collect_string_3 + endif + call ew_print_string + + ifdef LINUX + mov rsi,r13 + mov rdi,r14 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + +no_print_stack_sizes: + if THREAD + mov rax,stack_p_offset[r9] + add rax,qword ptr a_stack_size_offset[r9] + else + mov rax,stack_p + add rax,qword ptr ab_stack_size + endif + cmp rsi,rax + ja stack_overflow + + test byte ptr flags,64 + jne compacting_collector + + if THREAD + cmp byte ptr garbage_collect_flag_offset[r9],0 + else + cmp byte ptr garbage_collect_flag,0 + endif + jne compacting_collector + + if THREAD + mov rbp,heap_copied_vector_offset[r9] + + cmp qword ptr heap_end_after_copy_gc_offset[r9],0 + else + mov rbp,heap_copied_vector + + cmp qword ptr heap_end_after_copy_gc,0 + endif + + je zero_all + + mov rax,rdi + if THREAD + sub rax,qword ptr heap_p1_offset[r9] + else + sub rax,qword ptr heap_p1 + endif + add rax,127*8 + shr rax,9 + call zero_bit_vector + + if THREAD + mov rdx,qword ptr heap_end_after_copy_gc_offset[r9] + sub rdx,qword ptr heap_p1_offset[r9] + else + mov rdx,qword ptr heap_end_after_copy_gc + sub rdx,qword ptr heap_p1 + endif + shr rdx,7 + and rdx,-4 + + if THREAD + mov rbp,qword ptr heap_copied_vector_offset[r9] + mov rax,qword ptr heap_copied_vector_size_offset[r9] + else + mov rbp,qword ptr heap_copied_vector + mov rax,qword ptr heap_copied_vector_size + endif + add rbp,rdx + sub rax,rdx + shr rax,2 + + if THREAD + mov qword ptr heap_end_after_copy_gc_offset[r9],0 + else + mov qword ptr heap_end_after_copy_gc,0 + endif + + call zero_bit_vector + jmp end_zero_bit_vector + +zero_all: + if THREAD + mov rax,heap_copied_vector_size_offset[r9] + else + mov rax,heap_copied_vector_size + endif + shr rax,2 + call zero_bit_vector + +end_zero_bit_vector: + + include acopy.asm + + if THREAD + mov qword ptr heap2_begin_and_end_offset[r9],rsi + else + mov qword ptr heap2_begin_and_end,rsi + endif + mov r15,rsi + sub r15,rdi + + if THREAD + mov rax,heap_size_257_offset[r9] + else + mov rax,heap_size_257 + endif + shl rax,7 + sub rax,r15 + add qword ptr total_gc_bytes,rax + + shr r15,3 + + pop rsi + + call add_garbage_collect_time + + if THREAD + sub r15,qword ptr n_allocated_words_offset[r9] + else + sub r15,qword ptr n_allocated_words + endif + jc switch_to_mark_scan + + lea rax,[r15+r15*4] + shl rax,6 + if THREAD + mov rbx,qword ptr heap_size_offset[r9] + else + mov rbx,qword ptr heap_size + endif + mov rcx,rbx + shl rbx,2 + add rbx,rcx + add rbx,rbx + add rbx,rcx + cmp rax,rbx + jnc no_mark_scan + +switch_to_mark_scan: + if THREAD + mov rax,qword ptr heap_size_65_offset[r9] + else + mov rax,qword ptr heap_size_65 + endif + shl rax,6 + if THREAD + mov rbx,qword ptr heap_p_offset[r9] + + mov rcx,qword ptr heap_p1_offset[r9] + cmp rcx,qword ptr heap_p2_offset[r9] + else + mov rbx,qword ptr heap_p + + mov rcx,qword ptr heap_p1 + cmp rcx,qword ptr heap_p2 + endif + jc vector_at_begin + +vector_at_end: + if THREAD + mov qword ptr heap_p3_offset[r9],rbx + else + mov qword ptr heap_p3,rbx + endif + add rbx,rax + if THREAD + mov qword ptr heap_vector_offset[r9],rbx + + mov rax,qword ptr heap_p1_offset[r9] + mov qword ptr extra_heap_offset[r9],rax + else + mov qword ptr heap_vector,rbx + + mov rax,qword ptr heap_p1 + mov qword ptr extra_heap,rax + endif + sub rbx,rax + shr rbx,3 + if THREAD + mov qword ptr extra_heap_size_offset[r9],rbx + else + mov qword ptr extra_heap_size,rbx + endif + jmp switch_to_mark_scan_2 + +vector_at_begin: + if THREAD + mov qword ptr heap_vector_offset[r9],rbx + add rbx,qword ptr heap_size_offset[r9] + else + mov qword ptr heap_vector,rbx + add rbx,qword ptr heap_size + endif + sub rbx,rax + if THREAD + mov qword ptr heap_p3_offset[r9],rbx + else + mov qword ptr heap_p3,rbx + endif + + if THREAD + mov qword ptr extra_heap_offset[r9],rbx + mov rcx,qword ptr heap_p2_offset[r9] + else + mov qword ptr extra_heap,rbx + mov rcx,qword ptr heap_p2 + endif + sub rcx,rbx + shr rcx,3 + if THREAD + mov qword ptr extra_heap_size_offset[r9],rcx + else + mov qword ptr extra_heap_size,rcx + endif + +switch_to_mark_scan_2: + if THREAD + mov rax,heap_size_257_offset[r9] + else + mov rax,heap_size_257 + endif + shl rax,7-3 + sub rax,r15 + shl rax,3 + + if THREAD + mov byte ptr garbage_collect_flag_offset[r9],1 + else + mov byte ptr garbage_collect_flag,1 + endif + + lea rcx,heap_use_after_gc_string_1 + + test r15,r15 + jns end_garbage_collect + + if THREAD + mov byte ptr garbage_collect_flag_offset[r9],-1 + + mov rbx,qword ptr extra_heap_size_offset[r9] + else + mov byte ptr garbage_collect_flag,-1 + + mov rbx,qword ptr extra_heap_size + endif + mov r15,rbx + if THREAD + sub r15,qword ptr n_allocated_words_offset[r9] + else + sub r15,qword ptr n_allocated_words + endif + js out_of_memory_4_3 + + if THREAD + mov rdi,qword ptr extra_heap_offset[r9] + else + mov rdi,qword ptr extra_heap + endif + shl rbx,3 + add rbx,rdi + if THREAD + mov qword ptr heap_end_after_gc_offset[r9],rbx + else + mov qword ptr heap_end_after_gc,rbx + endif + + mov qword ptr heap_end_write_heap,rdi + + mov qword ptr d3_flag_write_heap,1 + jmp end_garbage_collect_ + +no_mark_scan: +; exchange the semi_spaces + if THREAD + mov rax,heap_p1_offset[r9] + mov rbx,heap_p2_offset[r9] + mov heap_p2_offset[r9],rax + mov heap_p1_offset[r9],rbx + + mov rax,heap_size_257_offset[r9] + else + mov rax,heap_p1 + mov rbx,heap_p2 + mov heap_p2,rax + mov heap_p1,rbx + + mov rax,heap_size_257 + endif + shl rax,7-3 + mov rbx,rax + sub rax,r15 + + mov rcx,rax + imul qword ptr heap_size_multiple + shrd rax,rdx,9 + shr rdx,9 + jne no_small_heap1 + + cmp rax,4000 + jge not_too_small1 + mov rax,4000 +not_too_small1: + sub rbx,rax + jb no_small_heap1 + + sub r15,rbx + shl rbx,3 + if THREAD + mov rbp,qword ptr heap_end_after_gc_offset[r9] + mov qword ptr heap_end_after_copy_gc_offset[r9],rbp + else + mov rbp,qword ptr heap_end_after_gc + mov qword ptr heap_end_after_copy_gc,rbp + endif + sub rbp,rbx + if THREAD + mov qword ptr heap_end_after_gc_offset[r9],rbp + else + mov qword ptr heap_end_after_gc,rbp + endif + +no_small_heap1: + mov rax,rcx + shl rax,3 + + lea rcx,heap_use_after_gc_string_1 + +end_garbage_collect: + + mov qword ptr heap_end_write_heap,rdi + mov qword ptr d3_flag_write_heap,0 + +end_garbage_collect_: + test qword ptr flags,2 + je no_heap_use_message + + push rax + + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + + ifdef LINUX + mov r13,rsi + mov r14,rdi + + mov rdi,rcx + else + sub rsp,32 + endif + call ew_print_string + + ifdef LINUX + mov rdi,[rbp] + else + mov rcx,[rbp] + endif + call ew_print_int + + 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 + else + add rsp,32 + endif + mov rsp,rbp + if THREAD + mov r9,rbx + endif + + pop rax + +no_heap_use_message: + call call_finalizers + + test byte ptr flags,32 + je no_write_heap + + cmp rax,qword ptr min_write_heap_size + jb no_write_heap + + push rcx + push rdx + push rbp + push rsi + push rdi + + sub rsp,128 + + mov rax,qword ptr d3_flag_write_heap + test rax,rax + jne copy_to_compact_with_alloc_in_extra_heap + + if THREAD + movsx rax,byte ptr garbage_collect_flag_offset[r9] + + mov rcx,qword ptr heap2_begin_and_end_offset[r9] + mov rdx,qword ptr (heap2_begin_and_end_offset+8)[r9] + + lea rbx,heap_p1_offset[r9] + else + movsx rax,byte ptr garbage_collect_flag + + mov rcx,qword ptr heap2_begin_and_end + mov rdx,qword ptr (heap2_begin_and_end+8) + + mov rbx,offset heap_p1 + endif + + test rax,rax + je gc0 + + if THREAD + lea rbx,heap_p2_offset[r9] + else + mov rbx,offset heap_p2 + endif + jg gc1 + + if THREAD + lea rbx,heap_p3_offset[r9] + else + mov rbx,offset heap_p3 + endif + xor rcx,rcx + xor rdx,rdx + +gc0: +gc1: + mov rbx,qword ptr [rbx] + + mov rax,rsp + + mov qword ptr [rax],rbx + mov qword ptr 8[rax],rdi + + mov qword ptr 16[rax],rcx + mov qword ptr 24[rax],rdx + + if THREAD + mov rbx ,qword ptr stack_p_offset[r9] + else + mov rbx ,qword ptr stack_p + endif + mov qword ptr 32[rax],rbx + + mov qword ptr 40[rax],rsi + mov qword ptr 48[rax],0 + mov qword ptr 56[rax],0 + + mov qword ptr 64[rax],offset small_integers + mov qword ptr 72[rax],offset static_characters + + mov qword ptr 80[rax],offset dINT+2 + mov qword ptr 88[rax],offset CHAR+2 + mov qword ptr 96[rax],offset REAL+2 + mov qword ptr 104[rax],offset BOOL+2 + mov qword ptr 112[rax],offset __STRING__+2 + mov qword ptr 120[rax],offset __ARRAY__+2 + + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + ifdef LINUX + mov rdi,rax + else + mov rcx,rax + sub rsp,32 + endif + ifndef LINUX + call write_heap + endif + mov rsp,rbp + add rsp,128 + if THREAD + mov r9,rbx + endif + + pop rdi + pop rsi + pop rbp + pop rdx + pop rcx +no_write_heap: + +restore_registers_after_gc_and_return: + mov r10,32[rsp] + mov r11,24[rsp] + mov r12,16[rsp] + mov r13,8[rsp] + mov r14,[rsp] + movlpd xmm0,40[rsp] + movlpd xmm1,48[rsp] + movlpd xmm2,56[rsp] + movlpd xmm3,64[rsp] + movlpd xmm4,72[rsp] + movlpd xmm5,80[rsp] + ifdef LINUX + movlpd xmm6,88[rsp] + movlpd xmm7,96[rsp] + add rsp,104 + else + add rsp,88 + endif + pop rbx + pop rax + ret + +call_finalizers: + mov rax,qword ptr free_finalizer_list + +call_finalizers_lp: + if THREAD + lea rbx,__Nil-8 + cmp rax,rbx + else + lea r9,__Nil-8 + cmp rax,r9 + endif + je end_call_finalizers + push 8[rax] + mov rbx,qword ptr 16[rax] + push 8[rbx] + call qword ptr [rbx] + add rsp,8 + pop rax + jmp call_finalizers_lp +end_call_finalizers: + + if THREAD + lea rbx,__Nil-8 + mov qword ptr free_finalizer_list,rbx + else + lea r9,__Nil-8 + mov qword ptr free_finalizer_list,r9 + endif + ret + +copy_to_compact_with_alloc_in_extra_heap: + if THREAD + mov rcx,qword ptr heap2_begin_and_end_offset[r9] + mov rdx,qword ptr (heap2_begin_and_end_offset+8)[r9] + lea rbx,heap_p2_offset[r9] + else + mov rcx,qword ptr heap2_begin_and_end + mov rdx,qword ptr (heap2_begin_and_end+8) + mov rbx,offset heap_p2 + endif + jmp gc1 + +allow_prefetch_for_athlon: + test qword ptr flags,4096 + jne no_prefetch_flag + + xor rax,rax + cpuid + test rax,rax + jz disable_prefetch_flag + + ifdef LINUX + cmp rbx,'A'+('u'*0x100)+('t'*0x10000)+('h'*0x1000000) + jne disable_prefetch_flag + cmp rdx,'e'+('n'*0x100)+('t'*0x10000)+('i'*0x1000000) + jne disable_prefetch_flag + cmp rcx,'c'+('A'*0x100)+('M'*0x10000)+('D'*0x1000000) + jne disable_prefetch_flag + else + cmp rbx,'A'+('u' shl 8)+('t' shl 16)+('h' shl 24) + jne disable_prefetch_flag + cmp rdx,'e'+('n' shl 8)+('t' shl 16)+('i' shl 24) + jne disable_prefetch_flag + cmp rcx,'c'+('A' shl 8)+('M' shl 16)+('D' shl 24) + jne disable_prefetch_flag + endif + +; mov rax,1 +; cpuid +; and rax,0f00h +; cmp rax,600h +; je keep_prefetch_flag + + ret + +disable_prefetch_flag: + and qword ptr flags,-4097 +keep_prefetch_flag: +no_prefetch_flag: + ret + +out_of_memory_4_3: +out_of_memory_4_2: +out_of_memory_4_1: +out_of_memory_4: + call add_garbage_collect_time + + mov rbp,offset out_of_memory_string_4 + jmp print_error + +zero_bit_vector: + xor rdx,rdx + test al,1 + je zero_bits1_1 + mov dword ptr [rbp],edx + add rbp,4 +zero_bits1_1: + shr rax,1 + + mov rbx,rax + shr rax,1 + test bl,1 + je zero_bits1_5 + + sub rbp,8 + jmp zero_bits1_2 + +zero_bits1_4: + mov dword ptr [rbp],edx + mov dword ptr 4[rbp],edx +zero_bits1_2: + mov dword ptr 8[rbp],edx + mov dword ptr 12[rbp],edx + add rbp,16 +zero_bits1_5: + sub rax,1 + jae zero_bits1_4 + ret + +reorder: + push rsi + push rbp + + mov rbp,rax + shl rbp,3 + mov rsi,rbx + shl rsi,3 + add rcx,rsi + sub rdx,rbp + + push rsi + push rbp + push rbx + push rax + jmp st_reorder_lp + +reorder_lp: + mov rbp,qword ptr [rcx] + mov rsi,qword ptr (-8)[rdx] + mov qword ptr (-8)[rdx],rbp + sub rdx,8 + mov qword ptr [rcx],rsi + add rcx,8 + + dec rax + jne next_b_in_element + mov rax,qword ptr [rsp] + add rcx,qword ptr 24[rsp] +next_b_in_element: + dec rbx + jne next_a_in_element + mov rbx,qword ptr 8[rsp] + sub rdx,qword ptr 16[rsp] +next_a_in_element: +st_reorder_lp: + cmp rdx,rcx + ja reorder_lp + + pop rax + pop rbx + add rsp,16 + pop rbp + pop rsi + ret + +; +; the sliding compacting garbage collector +; + +compacting_collector: +; zero all mark bits + + if THREAD + mov rax,qword ptr heap_p3_offset[r9] + else + mov rax,qword ptr heap_p3 + endif + neg rax + if THREAD + mov qword ptr neg_heap_p3_offset[r9],rax + + mov qword ptr stack_top_offset[r9],rsi + + mov rdi,qword ptr heap_vector_offset[r9] + else + mov qword ptr neg_heap_p3,rax + + mov qword ptr stack_top,rsi + + mov rdi,qword ptr heap_vector + endif + + test byte ptr flags,64 + je no_mark4 + + if THREAD + cmp qword ptr zero_bits_before_mark_offset[r9],0 + else + cmp qword ptr zero_bits_before_mark,0 + endif + je no_zero_bits + + if THREAD + mov qword ptr zero_bits_before_mark_offset[r9],0 + else + mov qword ptr zero_bits_before_mark,0 + endif + +no_mark4: + mov rbp,rdi + if THREAD + mov rax,qword ptr heap_size_65_offset[r9] + else + mov rax,qword ptr heap_size_65 + endif + add rax,3 + shr rax,2 + + xor rbx,rbx + + test al,1 + je zero_bits_1 + mov dword ptr [rbp],ebx + add rbp,4 +zero_bits_1: + mov rcx,rax + shr rax,2 + + test cl,2 + je zero_bits_5 + + sub rbp,8 + jmp zero_bits_2 + +zero_bits_4: + mov dword ptr [rbp],ebx + mov dword ptr 4[rbp],ebx +zero_bits_2: + mov dword ptr 8[rbp],ebx + mov dword ptr 12[rbp],ebx + add rbp,16 +zero_bits_5: + sub rax,1 + jnc zero_bits_4 + + test byte ptr flags,64 + je no_mark5 + +no_zero_bits: + if THREAD + mov rax,qword ptr n_last_heap_free_bytes_offset[r9] + mov rbx,qword ptr n_free_words_after_mark_offset[r9] + else + mov rax,qword ptr n_last_heap_free_bytes + mov rbx,qword ptr n_free_words_after_mark + endif + shl rbx,3 + + mov rbp,rbx + shl rbp,3 + add rbp,rbx + shr rbp,2 + + cmp rax,rbp + jg compact_gc + + if THREAD + mov rbx,qword ptr bit_vector_size_offset[r9] + else + mov rbx,qword ptr bit_vector_size + endif + shl rbx,3 + + sub rax,rbx + neg rax + + imul qword ptr heap_size_multiple + shrd rax,rdx,7 + shr rdx,7 + jne no_smaller_heap + + cmp rax,rbx + jae no_smaller_heap + + cmp rbx,8000 + jbe no_smaller_heap + + jmp compact_gc +no_smaller_heap: + test qword ptr flags,4096 + jne pmark + + include amark.asm + + include amark_prefetch.asm + +compact_gc: + if THREAD + mov qword ptr zero_bits_before_mark_offset[r9],1 + mov qword ptr n_last_heap_free_bytes_offset[r9],0 + mov qword ptr n_free_words_after_mark_offset[r9],1000 + else + mov qword ptr zero_bits_before_mark,1 + mov qword ptr n_last_heap_free_bytes,0 + mov qword ptr n_free_words_after_mark,1000 + endif + +no_mark5: + + include acompact.asm + + if THREAD + mov rsi,qword ptr stack_top_offset[r9] + else + mov rsi,qword ptr stack_top + endif + + if THREAD + mov rbx,qword ptr heap_size_65_offset[r9] + else + mov rbx,qword ptr heap_size_65 + endif + shl rbx,6 + if THREAD + add rbx,qword ptr heap_p3_offset[r9] + else + add rbx,qword ptr heap_p3 + endif + + if THREAD + mov qword ptr heap_end_after_gc_offset[r9],rbx + else + mov qword ptr heap_end_after_gc,rbx + endif + + sub rbx,rdi + shr rbx,3 + + if THREAD + sub rbx,qword ptr n_allocated_words_offset[r9] + else + sub rbx,qword ptr n_allocated_words + endif + mov r15,rbx + jc out_of_memory_4_1 + + mov rax,rbx + shl rax,2 + add rax,rbx + shl rax,4 + if THREAD + cmp rax,qword ptr heap_size_offset[r9] + else + cmp rax,qword ptr heap_size + endif + jc out_of_memory_4_2 + + test byte ptr flags,64 + je no_mark_6 + + if THREAD + mov rax,qword ptr neg_heap_p3_offset[r9] + else + mov rax,qword ptr neg_heap_p3 + endif + add rax,rdi + if THREAD + mov rbx,qword ptr n_allocated_words_offset[r9] + else + mov rbx,qword ptr n_allocated_words + endif + lea rax,[rax+rbx*8] + + if THREAD + mov rbx,qword ptr heap_size_65_offset[r9] + else + mov rbx,qword ptr heap_size_65 + endif + shl rbx,6 + + imul qword ptr heap_size_multiple + shrd rax,rdx,8 + shr rdx,8 + jne no_small_heap2 + + and rax,-4 + + cmp rax,8000 + jae not_too_small2 + mov rax,8000 +not_too_small2: + mov rcx,rbx + sub rcx,rax + jb no_small_heap2 + + if THREAD + sub qword ptr heap_end_after_gc_offset[r9],rcx + else + sub qword ptr heap_end_after_gc,rcx + endif + shr rcx,3 + sub r15,rcx + + mov rbx,rax + +no_small_heap2: + shr rbx,3 + if THREAD + mov qword ptr bit_vector_size_offset[r9],rbx + else + mov qword ptr bit_vector_size,rbx + endif + +no_mark_6: + jmp no_copy_garbage_collection + +no_copy_garbage_collection: + call add_compact_garbage_collect_time + + mov rax,rdi + if THREAD + sub rax,qword ptr heap_p3_offset[r9] + else + sub rax,qword ptr heap_p3 + endif + + add qword ptr total_compact_gc_bytes,rax + + mov rax,rdi + if THREAD + sub rax,qword ptr heap_p3_offset[r9] + mov rbx,qword ptr n_allocated_words_offset[r9] + else + sub rax,qword ptr heap_p3 + mov rbx,qword ptr n_allocated_words + endif + lea rax,[rax+rbx*8] + + lea rcx,heap_use_after_compact_gc_string_1 + jmp end_garbage_collect + + if 0 + public clean_exception_handler_ + +clean_exception_handler_: + + jmp clean_exception_handler_ + endif + if 0 + mov rax,qword ptr [rcx] + cmp dword ptr [rax],0c00000fdh + je stack_overflow_exception + + cmp dword ptr [rax],80000001h + je guard_page_or_access_violation_exception + + cmp dword ptr [rax] ,0c0000005h + je guard_page_or_access_violation_exception + +no_stack_overflow_exception: + mov rax,0 + ret + +guard_page_or_access_violation_exception: + mov rax,qword ptr 16[rax] + and rax,-4096 + cmp qword ptr a_stack_guard_page,rax + jne no_stack_overflow_exception + + cmp qword ptr a_stack_guard_page,0 + je no_stack_overflow_exception + +stack_overflow_exception: + mov rax,qword ptr 8[rcx] + mov qword ptr (0F8h)[rax],offset stack_overflow + + mov rax,-1 + ret + endif + +stack_overflow: + call add_execute_time + + mov rbp,offset stack_overflow_string + jmp print_error + +IO_error: + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + + mov rbx,rcx + ifdef LINUX + lea rdi,IO_error_string + else + sub rsp,32 + lea rcx,IO_error_string + endif + call ew_print_string + + ifdef LINUX + mov rdi,rbx + else + mov rcx,rbx + endif + call ew_print_string + + ifdef LINUX + lea rdi,new_line_string + else + lea rcx,new_line_string + endif + call ew_print_string + + mov rsp,rbp + if THREAD + mov r9,rbx + endif + + jmp halt + +print_error: + ifdef LINUX + mov rdi,rbp + else + mov rcx,rbp + endif + mov rbp,rsp + and rsp,-16 + if THREAD + mov rbx,r9 + endif + call ew_print_string + mov rsp,rbp + if THREAD + mov r9,rbx + endif + +halt: + if THREAD + mov rsp,halt_sp_offset[r9] + else + mov rsp,halt_sp + endif + + ifdef PROFILE + call write_profile_stack + endif + + mov qword ptr execution_aborted,1 + + cmp qword ptr dll_initialised,0 + ifdef LINUX + je exit_ + else + je exit + endif + ifdef LINUX + cmp dword ptr return_code,0 + else + cmp qword ptr return_code,0 + endif + jne return_code_set + ifdef LINUX + mov dword ptr return_code,-1 + else + mov qword ptr return_code,-1 + endif +return_code_set: + ifdef LINUX + mov edi,dword ptr return_code + and rsp,-16 + call exit + else + push qword ptr return_code + call (ExitProcess) + endif + jmp return_code_set + +e__system__eaind: +__eaind: +eval_fill: + mov [rsi],rcx + add rsi,8 + mov rcx,rdx + call qword ptr [rdx] + mov rdx,rcx + mov rcx,(-8)[rsi] + sub rsi,8 + + mov rbp,[rdx] + mov [rcx],rbp + mov rbp,8[rdx] + mov 8[rcx],rbp + mov rbp,16[rdx] + mov 16[rcx],rbp + ret + + align (1 shl 2) + lea rax,e__system__eaind + jmp rax + ifdef LINUX +; pc relative lea instruction is one byte longer + db 0,0 + else + db 0,0,0 + endif + dd e__system__dind + dd -2 +e__system__nind: +__indirection: + mov rdx,8[rcx] + mov rax,[rdx] + test al,2 + + je eval_fill2 + + mov [rcx],rax + mov rbp,8[rdx] + mov 8[rcx],rbp + mov rbp,16[rdx] + mov 16[rcx],rbp + ret + +eval_fill2: + if THREAD + lea rbp,__cycle__in__spine + mov qword ptr [rcx],rbp + else + lea r9,__cycle__in__spine + mov qword ptr [rcx],r9 + endif + mov qword ptr [rsi],rcx + + test byte ptr flags,64 + je __cycle__in__spine + + add rsi,8 + mov rcx,rdx + call rax + mov rdx,rcx + mov rcx,qword ptr (-8)[rsi] + sub rsi,8 + + mov rbp,[rdx] + mov [rcx],rbp + mov rbp,8[rdx] + mov 8[rcx],rbp + mov rbp,16[rdx] + mov 16[rcx],rbp + ret + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_0: + mov qword ptr [rdx],offset __indirection + mov 8[rdx],rcx + jmp rbp + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_1: + mov qword ptr [rdx],offset __indirection + mov rax,8[rdx] + mov 8[rdx],rcx + mov rdx,rax + jmp rbp + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_2: + mov qword ptr [rdx],offset __indirection + mov r8,8[rdx] + mov 8[rdx],rcx + mov rdx,16[rdx] + jmp rbp + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_3: + mov qword ptr [rdx],offset __indirection + mov r8,8[rdx] + mov 8[rdx],rcx + mov [rsi],rcx + mov rcx,24[rdx] + add rsi,8 + mov rdx,16[rdx] + jmp rbp + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_4: + mov qword ptr [rdx],offset __indirection + mov r8,8[rdx] + mov 8[rdx],rcx + mov [rsi],rcx + mov rbx,32[rdx] + mov 8[rsi],rbx + mov rcx,24[rdx] + add rsi,16 + mov rdx,16[rdx] + jmp rbp + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_5: + mov qword ptr [rdx],offset __indirection + mov r8,8[rdx] + mov [rsi],rcx + mov 8[rdx],rcx + mov rbx,40[rdx] + mov 8[rsi],rbx + mov rbx,32[rdx] + mov 16[rsi],rbx + mov rcx,24[rdx] + add rsi,24 + mov rdx,16[rdx] + jmp rbp + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_6: + mov qword ptr [rdx],offset __indirection + mov r8,8[rdx] + mov [rsi],rcx + mov 8[rdx],rcx + mov rbx,48[rdx] + mov 8[rsi],rbx + mov rbx,40[rdx] + mov 16[rsi],rbx + mov rbx,32[rdx] + mov 24[rsi],rbx + mov rcx,24[rdx] + add rsi,32 + mov rdx,16[rdx] + jmp rbp + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_7: + mov rax,0 + mov rbx,40 +eval_upd_n: + mov qword ptr [rdx],offset __indirection + mov r8,8[rdx] + mov [rsi],rcx + mov 8[rdx],rcx + add rdx,rbx + mov rbx,16[rdx ] + mov 8[rsi],rbx + mov rbx,8[rdx] + mov 16[rsi],rbx + mov rbx,[rdx] + mov 24[rsi],rbx + add rsi,32 + +eval_upd_n_lp: + mov rbx,(-8)[rdx] + sub rdx,8 + mov [rsi],rbx + add rsi,8 + sub rax,1 + jnc eval_upd_n_lp + + mov rcx,(-8)[rdx] + mov rdx,(-16)[rdx ] + jmp rbp + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_8: + mov rax,1 + mov rbx,48 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_9: + mov rax,2 + mov rbx,56 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_10: + mov rax,3 + mov rbx,64 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_11: + mov rax,4 + mov rbx,72 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_12: + mov rax,5 + mov rbx,80 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_13: + mov rax,6 + mov rbx,88 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_14: + mov rax,7 + mov rbx,96 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_15: + mov rax,8 + mov rbx,104 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_16: + mov rax,9 + mov rbx,112 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_17: + mov rax,10 + mov rbx,120 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_18: + mov rax,11 + mov rbx,128 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_19: + mov rax,12 + mov rbx,136 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_20: + mov rax,13 + mov rbx,144 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_21: + mov rax,14 + mov rbx,152 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_22: + mov rax,15 + mov rbx,160 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_23: + mov rax,16 + mov rbx,168 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_24: + mov rax,17 + mov rbx,176 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_25: + mov rax,18 + mov rbx,184 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_26: + mov rax,19 + mov rbx,192 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_27: + mov rax,20 + mov rbx,200 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_28: + mov rax,21 + mov rbx,208 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_29: + mov rax,22 + mov rbx,216 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_30: + mov rax,23 + mov rbx,224 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_31: + mov rax,24 + mov rbx,232 + jmp eval_upd_n + + ifdef PROFILE + call profile_n + mov rbp,rax + endif +eval_upd_32: + mov rax,25 + mov rbx,240 + jmp eval_upd_n + +; +; STRINGS +; + +catAC: + mov rax,8[rcx] + mov rbx,8[rdx] + lea rbp,16+7[rax+rbx] + shr rbp,3 + sub r15,rbp + jl gc_3 +gc_r_3: + add rcx,16 + add rdx,16 + +; fill_node + + mov r8,rdi + mov qword ptr [rdi],offset __STRING__+2 + +; store length + + lea rbp,[rax+rbx] + mov 8[rdi],rbp + add rdi,16 + +; copy string 1 + + lea rbp,7[rbx] + shr rbp,3 + add rbx,rdi + + xchg rcx,rbp + xchg rsi,rdx + cld + rep movsq + mov rsi,rdx + mov rcx,rbp + + mov rdi,rbx + +; copy_string 2 + +cat_string_6: + mov rbp,rax + shr rbp,3 + je cat_string_9 + +cat_string_7: + mov rbx,[rcx] + add rcx,8 + mov [rdi],rbx + add rdi,8 + dec rbp + jne cat_string_7 + +cat_string_9: + test al,4 + je cat_string_10 + mov ebx,dword ptr [rcx] + add rcx,4 + mov dword ptr [rdi],ebx + add rdi,4 +cat_string_10: + test al,2 + je cat_string_11 + mov bx,word ptr [rcx] + add rcx,2 + mov word ptr [rdi],bx + add rdi,2 +cat_string_11: + test al,1 + je cat_string_12 + mov bl,byte ptr [rcx] + mov byte ptr [rdi],bl + inc rdi +cat_string_12: + + mov rcx,r8 +; align heap pointer + add rdi,7 + and rdi,-8 + ret + +gc_3: call collect_2 + jmp gc_r_3 + +empty_string: + mov rcx,offset zero_length_string + ret + +sliceAC: + mov rbp,8[rcx] + test rbx,rbx + jns slice_string_1 + xor rbx,rbx +slice_string_1: + cmp rbx,rbp + jge empty_string + cmp rax,rbx + jl empty_string + inc rax + cmp rax,rbp + jle slice_string_2 + mov rax,rbp +slice_string_2: + sub rax,rbx + + lea rbp,(16+7)[rax] + shr rbp,3 + + sub r15,rbp + jl gc_4 +r_gc_4: + sub rbp,2 + lea rdx,16[rcx+rbx] + + mov qword ptr [rdi],offset __STRING__+2 + mov 8[rdi],rax + +; copy part of string + mov rcx,rbp + mov rbp,rdi + add rdi,16 + + xchg rsi,rdx + cld + rep movsq + mov rsi,rdx + mov rcx,rbp + ret + +gc_4: + mov rbp,rdx + call collect_1 + lea rbp,(16+7)[rax] + shr rbp,3 + jmp r_gc_4 + +updateAC: + mov rbp,8[rcx] + cmp rbx,rbp + jae update_string_error + + add rbp,16+7 + shr rbp,3 + + sub r15,rbp + jl gc_5 +r_gc_5: + mov rbp,8[rcx] + add rbp,7 + shr rbp,3 + + mov rdx,rcx + mov r8,rdi + mov qword ptr [rdi],offset __STRING__+2 + mov rcx,8[rdx] + add rdx,16 + mov 8[rdi],rcx + add rdi,16 + + add rbx,rdi + + mov rcx,rbp + xchg rsi,rdx + cld + rep movsq + mov rsi,rdx + + mov byte ptr [rbx],al + mov rcx,r8 + ret + +gc_5: call collect_1 + jmp r_gc_5 + +update_string_error: + mov rbp,offset high_index_string + test rax,rax + jns update_string_error_2 + mov rbp,offset low_index_string +update_string_error_2: + jmp print_error + +eqAC: + mov rax,8[rcx] + cmp rax,8[rdx] + jne equal_string_ne + add rcx,16 + add rdx,16 + mov rbx,rax + and rbx,7 + shr rax,3 + je equal_string_d +equal_string_1: + mov rbp,[rcx] + cmp rbp,[rdx] + jne equal_string_ne + add rcx,8 + add rdx,8 + dec rax + jne equal_string_1 +equal_string_d: + test bl,4 + je equal_string_w + mov eax,dword ptr [rcx] + cmp eax,dword ptr [rdx] + jne equal_string_ne + add rcx,4 + add rdx,4 +equal_string_w: + test bl,2 + je equal_string_b + mov ax,word ptr [rcx] + cmp ax,word ptr [rdx] + jne equal_string_ne + add rcx,2 + add rdx,2 +equal_string_b: + test bl,1 + je equal_string_eq + mov bl,byte ptr [rcx] + cmp bl,byte ptr [rdx] + jne equal_string_ne +equal_string_eq: + mov rax,1 + ret +equal_string_ne: + xor rax,rax + ret + +cmpAC: + mov rbx,8[rcx] + mov rbp,8[rdx] + add rcx,16 + add rdx,16 + cmp rbp,rbx + jb cmp_string_less + ja cmp_string_more + xor rax,rax + jmp cmp_string_chars +cmp_string_more: + mov rax,1 + jmp cmp_string_chars +cmp_string_less: + mov rax,-1 + mov rbx,rbp + jmp cmp_string_chars + +cmp_string_1: + mov rbp,[rdx] + cmp rbp,[rcx] + jne cmp_string_ne_q + add rdx,8 + add rcx,8 +cmp_string_chars: + sub rbx,8 + jnc cmp_string_1 +cmp_string_d: + test bl,4 + je cmp_string_w + mov ebp,dword ptr [rdx] + cmp ebp,dword ptr [rcx] + jne cmp_string_ne_d + add rdx,4 + add rcx,4 +cmp_string_w: + test bl,2 + je cmp_string_b + mov bpl,byte ptr [rdx] + cmp bpl,byte ptr [rcx] + jne cmp_string_ne + mov bpl,byte ptr 1[rdx] + cmp bpl,byte ptr 1[rcx] + jne cmp_string_ne + add rdx,2 + add rcx,2 +cmp_string_b: + test bl,1 + je cmp_string_eq + mov bl,byte ptr [rdx] + cmp bl,byte ptr [rcx] + jne cmp_string_ne +cmp_string_eq: + ret +cmp_string_ne_d: + mov r10d,[rcx] + bswap ebp + bswap r10d + cmp ebp,r10d + jmp cmp_string_ne +cmp_string_ne_q: + mov r10,[rcx] + bswap rbp + bswap r10 + cmp rbp,r10 +cmp_string_ne: + ja cmp_string_r1 + mov rax,-1 + ret +cmp_string_r1: + mov rax,1 + ret + +string_to_string_node: + mov rax,qword ptr [rcx] + add rcx,8 + + lea rbx,16+7[rax] + shr rbx,3 + + sub r15,rbx + jl string_to_string_node_gc + +string_to_string_node_r: + sub rbx,2 + mov qword ptr [rdi],offset __STRING__+2 + mov qword ptr 8[rdi],rax + mov rbp,rdi + add rdi,16 + jmp string_to_string_node_4 + +string_to_string_node_2: + mov rax,qword ptr [rcx] + add rcx,8 + mov qword ptr [rdi],rax + add rdi,8 +string_to_string_node_4: + sub rbx,1 + jge string_to_string_node_2 + + mov rcx,rbp + ret + +string_to_string_node_gc: + push rcx + call collect_0 + pop rcx + jmp string_to_string_node_r + + +int_array_to_node: + mov rax,qword ptr -16[rcx] + lea rbx,3[rax] + sub r15,rbx + jl int_array_to_node_gc + +int_array_to_node_r: + mov qword ptr [rdi],offset __ARRAY__+2 + mov rdx,rcx + mov qword ptr 8[rdi],rax + mov rcx,rdi + mov qword ptr 16[rdi],offset dINT+2 + add rdi,24 + jmp int_or_real_array_to_node_4 + +int_or_real_array_to_node_2: + mov rbx,qword ptr [rdx] + add rdx,8 + mov qword ptr [rdi],rbx + add rdi,8 +int_or_real_array_to_node_4: + sub rax,1 + jge int_or_real_array_to_node_2 + + ret + +int_array_to_node_gc: + push rcx + call collect_0 + pop rcx + jmp int_array_to_node_r + + +real_array_to_node: + mov rax,qword ptr -16[rcx] + lea rbx,3[rax] + sub r15,rbx + jl real_array_to_node_gc + +real_array_to_node_r: + mov qword ptr [rdi],offset __ARRAY__+2 + mov rdx,rcx + mov qword ptr 8[rdi],rax + mov rcx,rdi + mov qword ptr 16[rdi],offset REAL+2 + add rdi,24 + jmp int_or_real_array_to_node_4 + +real_array_to_node_gc: + push rcx + call collect_0 + pop rcx + jmp real_array_to_node_r + + + align (1 shl 2) + dd 3 +_c3: jmp __cycle__in__spine + align (1 shl 2) + + dd 4 +_c4: jmp __cycle__in__spine + align (1 shl 2) + dd 5 +_c5: jmp __cycle__in__spine + align (1 shl 2) + dd 6 +_c6: jmp __cycle__in__spine + align (1 shl 2) + dd 7 +_c7: jmp __cycle__in__spine + align (1 shl 2) + dd 8 +_c8: jmp __cycle__in__spine + align (1 shl 2) + dd 9 +_c9: jmp __cycle__in__spine + align (1 shl 2) + dd 10 +_c10: jmp __cycle__in__spine + align (1 shl 2) + dd 11 +_c11: jmp __cycle__in__spine + align (1 shl 2) + dd 12 +_c12: jmp __cycle__in__spine + align (1 shl 2) + dd 13 +_c13: jmp __cycle__in__spine + align (1 shl 2) + dd 14 +_c14: jmp __cycle__in__spine + align (1 shl 2) + dd 15 +_c15: jmp __cycle__in__spine + align (1 shl 2) + dd 16 +_c16: jmp __cycle__in__spine + align (1 shl 2) + dd 17 +_c17: jmp __cycle__in__spine + align (1 shl 2) + dd 18 +_c18: jmp __cycle__in__spine + align (1 shl 2) + dd 19 +_c19: jmp __cycle__in__spine + align (1 shl 2) + dd 20 +_c20: jmp __cycle__in__spine + align (1 shl 2) + dd 21 +_c21: jmp __cycle__in__spine + align (1 shl 2) + dd 22 +_c22: jmp __cycle__in__spine + align (1 shl 2) + dd 23 +_c23: jmp __cycle__in__spine + align (1 shl 2) + dd 24 +_c24: jmp __cycle__in__spine + align (1 shl 2) + dd 25 +_c25: jmp __cycle__in__spine + align (1 shl 2) + dd 26 +_c26: jmp __cycle__in__spine + align (1 shl 2) + dd 27 +_c27: jmp __cycle__in__spine + align (1 shl 2) + dd 28 +_c28: jmp __cycle__in__spine + align (1 shl 2) + dd 29 +_c29: jmp __cycle__in__spine + align (1 shl 2) + dd 30 +_c30: jmp __cycle__in__spine + align (1 shl 2) + dd 31 +_c31: jmp __cycle__in__spine + align (1 shl 2) + dd 32 +_c32: jmp __cycle__in__spine + +; +; ARRAYS +; + +_create_arrayB: + mov rbx,rax + add rax,24+7 + shr rax,3 + sub r15,rax + jge no_collect_4574 + call collect_0 +no_collect_4574: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rbx + mov qword ptr 16[rdi],offset BOOL+2 + lea rdi,[rdi+rax*8] + ret + +_create_arrayC: + mov rbx,rax + add rax,16+7 + shr rax,3 + sub r15,rax + jge no_collect_4573 + call collect_0 +no_collect_4573: + mov rcx,rdi + mov qword ptr [rdi],offset __STRING__+2 + mov qword ptr 8[rdi],rbx + lea rdi,[rdi+rax*8] + ret + +_create_arrayI: + lea rbp,3[rax] + sub r15,rbp + jge no_collect_4572 + call collect_0 +no_collect_4572: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rax + lea rbp,dINT+2 + mov qword ptr 16[rdi],rbp + lea rdi,24[rdi+rax*8] + ret + +_create_arrayI32: + mov rbx,rax + add rax,6+1 + shr rax,1 + sub r15,rax + jge no_collect_3572 + call collect_0 +no_collect_3572: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rbx + mov qword ptr 16[rdi],offset INT32+2 + lea rdi,[rdi+rax*8] + ret + +_create_arrayR: + lea rbp,3[rax] + sub r15,rbp + jge no_collect_4580 + call collect_0 +no_collect_4580: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rax + mov qword ptr 16[rdi],offset REAL+2 + lea rdi,24[rdi+rax*8] + ret + +_create_arrayR32: + mov rbx,rax + add rax,6+1 + shr rax,1 + sub r15,rax + jge no_collect_3580 + call collect_0 +no_collect_3580: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rax + mov qword ptr 16[rdi],offset REAL32+2 + lea rdi,[rdi+rax*8] + ret + +; rax : number of elements, rbx: element descriptor +; r10 : element size, r11 : element a size, rcx :a_element-> rcx : array + +_create_r_array: + mov rbp,rax + imul rbp,r10 + add rbp,3 + sub r15,rbp + jge no_collect_4586 + call collect_1 +no_collect_4586: + mov qword ptr [rdi],offset __ARRAY__+2 + mov rdx,rcx + mov qword ptr 8[rdi],rax + mov rcx,rdi + mov qword ptr 16[rdi],rbx + add rdi,24 + + test r11,r11 + je _create_r_array_0 + sub r11,2 + jc _create_r_array_1 + je _create_r_array_2 + sub r11,2 + jc _create_r_array_3 + je _create_r_array_4 + jmp _create_r_array_5 + +_create_r_array_0: + imul r10,rax + lea rdi,[rdi+r10*8] + ret + +_create_r_array_1: + shl r10,3 + jmp _st_fillr1_array +_fillr1_array: + mov qword ptr [rdi],rdx + add rdi,r10 +_st_fillr1_array: + sub rax,1 + jnc _fillr1_array + ret + +_create_r_array_2: + shl r10,3 + jmp _st_fillr2_array +_fillr2_array: + mov qword ptr [rdi],rdx + mov qword ptr 8[rdi],rdx + add rdi,r10 +_st_fillr2_array: + sub rax,1 + jnc _fillr2_array + ret + +_create_r_array_3: + shl r10,3 + jmp _st_fillr3_array +_fillr3_array: + mov qword ptr [rdi],rdx + mov qword ptr 8[rdi],rdx + mov qword ptr 16[rdi],rdx + add rdi,r10 +_st_fillr3_array: + sub rax,1 + jnc _fillr3_array + ret + +_create_r_array_4: + shl r10,3 + jmp _st_fillr4_array +_fillr4_array: + mov qword ptr [rdi],rdx + mov qword ptr 8[rdi],rdx + mov qword ptr 16[rdi],rdx + mov qword ptr 24[rdi],rdx + add rdi,r10 +_st_fillr4_array: + sub rax,1 + jnc _fillr4_array + ret + +_create_r_array_5: + sub r10,4 + sub r10,r11 + sub r11,1 + shl r10,3 + jmp _st_fillr5_array + +_fillr5_array: + mov qword ptr [rdi],rdx + mov qword ptr 8[rdi],rdx + mov qword ptr 16[rdi],rdx + mov qword ptr 24[rdi],rdx + add rdi,32 + + mov rbx,r11 +_copy_elem_5_lp: + mov qword ptr [rdi],rdx + add rdi,8 + sub rbx,1 + jnc _copy_elem_5_lp + + add rdi,r10 +_st_fillr5_array: + sub rax,1 + jnc _fillr5_array + + ret + +create_arrayB: + mov r10,rbx + add rbx,24+7 + shr rbx,3 + sub r15,rbx + jge no_collect_4575 + call collect_0 +no_collect_4575: + mov rbp,rax + sub rbx,3 + shl rbp,8 + or rax,rbp + mov rbp,rax + shl rbp,16 + or rax,rbp + mov rbp,rax + shl rbp,32 + or rax,rbp + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],r10 + mov qword ptr 16[rdi],offset BOOL+2 + add rdi,24 + jmp create_arrayBCI + +create_arrayC: + mov r10,rbx + add rbx,16+7 + shr rbx,3 + sub r15,rbx + jge no_collect_4578 + call collect_0 +no_collect_4578: + mov rbp,rax + sub rbx,2 + shl rbp,8 + or rax,rbp + mov rbp,rax + shl rbp,16 + or rax,rbp + mov rbp,rax + shl rbp,32 + or rax,rbp + mov rcx,rdi + mov qword ptr [rdi],offset __STRING__+2 + mov qword ptr 8[rdi],r10 + add rdi,16 + jmp create_arrayBCI + +create_arrayI32: + mov r10,rbx + add rbx,6+1 + shr rbx,1 + sub r15,rbx + jge no_collect_3577 + call collect_0 +no_collect_3577: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],r10 + mov qword ptr 16[rdi],offset INT32+2 + add rdi,24 + + sub rbx,3 + + mov ebp,eax + shl rax,32 + or rax,rbp + jmp create_arrayBCI + +create_arrayI: + lea rbp,3[rbx] + sub r15,rbp + jge no_collect_4577 + call collect_0 +no_collect_4577: + mov rcx,rdi + lea rbp,__ARRAY__+2 + mov qword ptr [rdi],rbp + mov qword ptr 8[rdi],rbx + lea rbp,dINT+2 + mov qword ptr 16[rdi],rbp + add rdi,24 +create_arrayBCI: + mov rdx,rbx + shr rbx,1 + test dl,1 + je st_filli_array + + mov qword ptr [rdi],rax + add rdi,8 + jmp st_filli_array + +filli_array: + mov qword ptr [rdi],rax + mov qword ptr 8[rdi],rax + add rdi,16 +st_filli_array: + sub rbx,1 + jnc filli_array + + ret + +create_arrayR32: + cvtsd2ss xmm0,xmm0 + movss dword ptr (-8)[rsp],xmm0 + mov r10,rax + add rax,6+1 + shr rax,1 + mov ebx,dword ptr (-8)[rsp] + sub r15,rax + jge no_collect_3579 + call collect_0 +no_collect_3579: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],r10 + mov qword ptr 16[rdi],offset REAL32+2 + add rdi,24 + + sub rax,3 + + mov edx,ebx + shl rbx,32 + or rbx,rdx + jmp st_fillr_array + +create_arrayR: + movsd qword ptr (-8)[rsp],xmm0 + lea rbp,3[rax] + + mov rbx,qword ptr (-8)[rsp] + + sub r15,rbp + jge no_collect_4579 + call collect_0 +no_collect_4579: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rax + mov qword ptr 16[rdi],offset REAL+2 + add rdi,24 + jmp st_fillr_array +fillr_array: + mov qword ptr [rdi],rbx + add rdi,8 +st_fillr_array: + sub rax,1 + jnc fillr_array + + ret + +create_array: + lea rbp,3[rax] + sub r15,rbp + jge no_collect_4576 + call collect_1 +no_collect_4576: + mov rbx,rcx + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rax + mov qword ptr 16[rdi],0 + add rdi,24 + + jmp fillr1_array + + + + +; in rax: number of elements, rbx: element descriptor +; r10 : element size, r11 : element a size -> rcx : array + +create_R_array: + sub r10,2 + jc create_R_array_1 + je create_R_array_2 + sub r10,2 + jc create_R_array_3 + je create_R_array_4 + jmp create_R_array_5 + +create_R_array_1: + lea rbp,3[rax] + sub r15,rbp + jge no_collect_4581 + call collect_0 +no_collect_4581: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rax + mov qword ptr 16[rdi],rbx + add rdi,24 + + test r11,r11 + je r_array_1_b + + mov rbx,qword ptr (-8)[rsi] + jmp fillr1_array + +r_array_1_b: + mov rbx,qword ptr 8[rsp] + +fillr1_array: + mov rdx,rax + shr rax,1 + test dl,1 + je st_fillr1_array_1 + + mov qword ptr [rdi],rbx + add rdi,8 + jmp st_fillr1_array_1 + +fillr1_array_lp: + mov qword ptr [rdi],rbx + mov qword ptr 8[rdi],rbx + add rdi,16 +st_fillr1_array_1: + sub rax,1 + jnc fillr1_array_lp + + ret + +create_R_array_2: + lea rbp,3[rax*2] + sub r15,rbp + jge no_collect_4582 + call collect_0 +no_collect_4582: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rax + mov qword ptr 16[rdi],rbx + add rdi,24 + + sub r11,1 + jc r_array_2_bb + je r_array_2_ab +r_array_2_aa: + mov rbx,qword ptr (-8)[rsi] + mov rbp,qword ptr (-16)[rsi] + jmp st_fillr2_array +r_array_2_ab: + mov rbx,qword ptr (-8)[rsi] + mov rbp,qword ptr 8[rsp] + jmp st_fillr2_array +r_array_2_bb: + mov rbx,qword ptr 8[rsp] + mov rbp,qword ptr 16[rsp] + jmp st_fillr2_array + +fillr2_array_1: + mov qword ptr [rdi],rbx + mov qword ptr 8[rdi],rbp + add rdi,16 +st_fillr2_array: + sub rax,1 + jnc fillr2_array_1 + + ret + +create_R_array_3: + lea rbp,3[rax+rax*2] + sub r15,rbp + jge no_collect_4583 + call collect_0 +no_collect_4583: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rax + mov qword ptr 16[rdi],rbx + add rdi,24 + + pop rdx + mov r12,rsp + + test r11,r11 + je r_array_3 + + lea r13,0[r11*8] + mov rbp,rsi + sub rbp,r13 + + sub r11,1 + +copy_a_to_b_lp3: + push [rbp] + add rbp,8 + sub r11,1 + jnc copy_a_to_b_lp3 + +r_array_3: + mov rbx,qword ptr [rsp] + mov r13,qword ptr 8[rsp] + mov rbp,qword ptr 16[rsp] + + mov rsp,r12 + push rdx + + jmp st_fillr3_array + +fillr3_array_1: + mov qword ptr [rdi],rbx + mov qword ptr 8[rdi],r13 + mov qword ptr 16[rdi],rbp + add rdi,24 +st_fillr3_array: + sub rax,1 + jnc fillr3_array_1 + + ret + +create_R_array_4: + lea rbp,3[rax+4] + sub r15,rbp + jge no_collect_4584 + call collect_0 +no_collect_4584: + mov rcx,rdi + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rax + mov qword ptr 16[rdi],rbx + add rdi,24 + + pop rdx + mov r12,rsp + + test r11,r11 + je r_array_4 + + lea r13,0[r11*8] + mov rbp,rsi + sub rbp,r13 + sub r11,1 + +copy_a_to_b_lp4: + push [rbp] + add rbp,8 + sub r11,1 + jnc copy_a_to_b_lp4 + +r_array_4: + mov rbx,qword ptr [rsp] + mov r13,qword ptr 8[rsp] + mov r14,qword ptr 16[rsp] + mov rbp,qword ptr 24[rsp] + + mov rsp,r12 + push rdx + + jmp st_fillr4_array + +fillr4_array: + mov qword ptr [rdi],rbx + mov qword ptr 8[rdi],r13 + mov qword ptr 16[rdi],r14 + mov qword ptr 24[rdi],rbp + add rdi,32 +st_fillr4_array: + sub rax,1 + jnc fillr4_array + + ret + +create_R_array_5: + lea r12,4[r10] + mov rbp,rax + imul rbp,r12 + add rbp,3 + sub r15,rbp + jge no_collect_4585 + call collect_0 +no_collect_4585: + mov qword ptr [rdi],offset __ARRAY__+2 + mov qword ptr 8[rdi],rax + mov qword ptr 16[rdi],rbx + mov rcx,rdi + add rdi,24 + + pop rdx + mov r12,rsp + + test r11,r11 + je r_array_5 + + lea r13,0[r11*8] + mov rbp,rsi + sub rbp,r13 + sub r11,1 + +copy_a_to_b_lp5: + push [rbp] + add rbp,8 + sub r11,1 + jnc copy_a_to_b_lp5 + +r_array_5: + mov r13,qword ptr [rsp] + mov r14,qword ptr 8[rsp] + if THREAD + lea rbx,32[rsp+r10*8] + endif + mov r8,qword ptr 16[rsp] + if THREAD + mov r10,qword ptr 24[rsp] + else + mov r9,qword ptr 24[rsp] + endif + add rsp,32 + + ife THREAD + sub r10,1 + endif + jmp st_fillr5_array + +fillr5_array_1: + mov qword ptr [rdi],r13 + mov qword ptr 8[rdi],r14 + + mov r11,rsp + ife THREAD + mov rbx,r10 + endif + + mov qword ptr 16[rdi],r8 + if THREAD + mov qword ptr 24[rdi],r10 + else + mov qword ptr 24[rdi],r9 + endif + add rdi,32 + +copy_elem_lp5: + mov rbp,qword ptr [r11] + add r11,8 + mov qword ptr [rdi],rbp + add rdi,8 + if THREAD + cmp r11,rbx + jne copy_elem_lp5 + else + sub rbx,1 + jnc copy_elem_lp5 + endif + +st_fillr5_array: + sub rax,1 + jnc fillr5_array_1 + + mov rsp,r12 + jmp rdx + + ifndef NEW_DESCRIPTORS +yet_args_needed: +; for more than 4 arguments + mov r10,[rdx] + movzx rax,word ptr (-2)[r10] + add rax,3 + sub r15,rax + jl gc_1 +gc_r_1: sub rax,3+1+4 + mov rbx,8[rdx] + add r10,8 + mov rdx,16[rdx] + mov rbp,rdi + mov r8,[rdx] + mov [rdi],r8 + mov r8,8[rdx] + mov 8[rdi],r8 + mov r8,16[rdx] + mov 16[rdi],r8 + add rdx,24 + add rdi,24 + +cp_a: mov r8,[rdx] + add rdx,8 + mov [rdi],r8 + add rdi,8 + sub rax,1 + jge cp_a + + mov [rdi],rcx + mov 8[rdi],r10 + lea rcx,8[rdi] + mov 16[rdi],rbx + mov 24[rdi],rbp + add rdi,32 + ret + +gc_1: + call collect_2 + jmp gc_r_1 + +yet_args_needed_0: + sub r15,2 + jl gc_20 +gc_r_20: + mov 8[rdi],rcx + mov rax,[rdx] + mov rcx,rdi + add rax,8 + mov [rdi],rax + add rdi,16 + ret + +gc_20: + call collect_2 + jmp gc_r_20 + +yet_args_needed_1: + sub r15,3 + jl gc_21 +gc_r_21: + mov 16[rdi],rcx + mov rax,[rdx] + mov rcx,rdi + add rax,8 + mov [rdi],rax + mov rbx,8[rdx] + mov 8[rdi],rbx + add rdi,24 + ret + +gc_21: + call collect_2 + jmp gc_r_21 + +yet_args_needed_2: + sub r15,5 + jl gc_22 +gc_r_22: + mov rax,[rdx] + mov 8[rdi],rcx + add rax,8 + mov rbp,8[rdx] + mov 16[rdi],rax + lea rcx,16[rdi] + mov 24[rdi],rbp + mov rbp,16[rdx] + mov [rdi],rbp + mov 32[rdi],rdi + add rdi,40 + ret + +gc_22: + call collect_2 + jmp gc_r_22 + +yet_args_needed_3: + sub r15,6 + jl gc_23 +gc_r_23: + mov rax,[rdx] + mov 16[rdi],rcx + add rax,8 + mov rbp,8[rdx] + mov 24[rdi],rax + mov rdx,16[rdx] + mov 32[rdi],rbp + mov rbp,[rdx] + mov 40[rdi],rdi + mov [rdi],rbp + mov rbp,8[rdx] + lea rcx,24[rdi] + mov 8[rdi],rbp + add rdi,48 + ret + +gc_23: + call collect_2 + jmp gc_r_23 + +yet_args_needed_4: + sub r15,7 + jl gc_24 +gc_r_24: + mov rax,[rdx] + mov 24[rdi],rcx + add rax,8 + mov rbp,8[rdx] + mov 32[rdi],rax + mov rdx,16[rdx] + mov 40[rdi],rbp + mov rbp,[rdx] + mov 48[rdi],rdi + mov [rdi],rbp + mov rbp,8[rdx] + lea rcx,32[rdi] + mov 8[rdi],rbp + mov rbp,16[rdx ] + mov 16[rdi],rbp + add rdi,56 + ret + +gc_24: + call collect_2 + jmp gc_r_24 + endif + +repl_args_b: + test rax,rax + jle repl_args_b_1 + + dec rax + je repl_args_b_4 + + mov rdx,16[rcx] + sub rbx,2 + jne repl_args_b_2 + + mov [rsi],rdx + add rsi,8 + jmp repl_args_b_4 + +repl_args_b_2: + lea rdx,[rdx+rax*8] + +repl_args_b_3: + mov rbp,(-8)[rdx] + sub rdx,8 + mov [rsi],rbp + add rsi,8 + dec rax + jne repl_args_b_3 + +repl_args_b_4: + mov rbp,8[rcx] + mov [rsi],rbp + add rsi,8 +repl_args_b_1: + ret + +push_arg_b: + cmp rbx,2 + jb push_arg_b_1 + jne push_arg_b_2 + cmp rbx,rax + je push_arg_b_1 +push_arg_b_2: + mov rcx,16[rcx] + sub rbx,2 +push_arg_b_1: + mov rcx,[rcx+rbx*8] + ret + +del_args: + mov rbx,[rcx] + sub rbx,rax + movsx rax,word ptr (-2)[rbx] + sub rax,2 + jge del_args_2 + + mov [rdx],rbx + mov rbp,8[rcx] + mov 8[rdx],rbp + mov rbp,16[rcx] + mov 16[rdx],rbp + ret + +del_args_2: + jne del_args_3 + + mov [rdx],rbx + mov rbp,8[rcx] + mov 8[rdx],rbp + mov rbp,16[rcx] + mov rbp,[rbp] + mov 16[rdx],rbp + ret + +del_args_3: + sub r15,rax + jl del_args_gc +del_args_r_gc: + mov [rdx],rbx + mov 16[rdx],rdi + mov rbp,8[rcx] + mov rcx,16[rcx] + mov 8[rdx],rbp + +del_args_copy_args: + mov rbp,[rcx] + add rcx,8 + mov [rdi],rbp + add rdi,8 + sub rax,1 + jg del_args_copy_args + + ret + +del_args_gc: + call collect_2 + jmp del_args_r_gc + + ifdef USE_LIBM +cos_real: + mov rbp,rsp + and rsp,-16 + mov r13,rsi + mov r14,rdi + call cos + mov rsp,rbp + mov rsi,r13 + mov rdi,r14 + ret + +sin_real: + mov rbp,rsp + and rsp,-16 + mov r13,rsi + mov r14,rdi + call sin + mov rsp,rbp + mov rsi,r13 + mov rdi,r14 + ret + +tan_real: + mov rbp,rsp + and rsp,-16 + mov r13,rsi + mov r14,rdi + call tan + mov rsp,rbp + mov rsi,r13 + mov rdi,r14 + ret + +atan_real: + mov rbp,rsp + and rsp,-16 + mov r13,rsi + mov r14,rdi + call atan + mov rsp,rbp + mov rsi,r13 + mov rdi,r14 + ret + +asin_real: +acos_real: +ln_real: +log10_real: +exp_real: +pow_real: +exp2_real_: +_c_log10: +_c_pow: +_c_entier: + int 3 + ret + endif + +entier_real: + cvttsd2si rax,xmm0 + ucomisd xmm0,qword ptr real_0_0 + jb entier_real_m + ret + +entier_real_m: + movsd qword ptr (-8)[rsp],xmm0 + mov rcx,qword ptr (-8)[rsp] + mov rbx,rcx + shr rcx,52 + cmp rcx,0bffh + jb entier_real_m_small + cmp rcx,0bffh+52 + jae entier_real_m_large + sub rcx,0bffh-12 + shl rbx,cl + je entier_m_exact +entier_real_m_small: + sub rax,1 +entier_real_m_large: +entier_m_exact: + ret + +r_to_i_real: + cvtsd2si rax,xmm0 + ret + + public getheapend + +getheapend: + lea rbx,[rdi+r15*8] + if THREAD + mov rax,heap_end_after_gc_offset[r9] + else + mov rax,heap_end_after_gc + endif + ret + +_TEXT ends + + include ..\areals.asm + + ifdef PROFILE + ifdef TRACE + include ..\atrace.asm + else + include ..\aprofile.asm + endif + endif + + ifdef NEW_DESCRIPTORS + include aap.asm + endif + + ifdef THREAD + include athread.asm + endif + + end + diff --git a/thread/athread.asm b/thread/athread.asm index 38c5bef..fe14832 100644 --- a/thread/athread.asm +++ b/thread/athread.asm @@ -1,371 +1,371 @@ - -; File: athread.asm -; Author: John van Groningen -; Machine: amd64 - - _TEXT segment - - ifdef LINUX - else - extern GetProcessHeap:near - extern HeapAlloc:near - extern HeapFree:near - endif - - public clean_new_thread - -clean_new_thread: - ifdef LINUX - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - - sub rsp,24 - mov qword ptr 8[rsp],rdi - - mov rdi,768 - call malloc - - mov rbx,rax - - mov rdi,qword ptr tlsp_tls_index - mov rsi,rax - call pthread_setspecific - - mov r9,rbx - - mov rdi,qword ptr 8[rsp] - - mov rbx,qword ptr 8[rdi] - else - sub rsp,56 - mov qword ptr 32[rsp],rcx - - call GetProcessHeap - - mov rcx,rax - xor rdx,rdx - mov r8,512 - call HeapAlloc - - mov r9,rax - mov rax,qword ptr tlsp_tls_index - mov qword ptr gs:[1480h+rax*8],r9 - - mov rcx,qword ptr 32[rsp] - - mov rbx,qword ptr 8[rcx] - endif - test rbx,rbx - cmove rbx,qword ptr (main_thread_local_storage+heap_size_offset) - mov qword ptr heap_size_offset[r9],rbx - - ifdef LINUX - mov rbx,qword ptr 16[rdi] - else - mov rbx,qword ptr 16[rcx] - endif - test rbx,rbx - cmove rbx,qword ptr (main_thread_local_storage+a_stack_size_offset) - mov qword ptr a_stack_size_offset[r9],rbx - - call init_thread - - ifndef LINUX - mov rcx,qword ptr 32[rsp] - endif - - mov qword ptr saved_heap_p_offset[r9],rdi - mov qword ptr saved_r15_offset[r9],r15 - mov qword ptr saved_a_stack_p_offset[r9],rsi - - mov qword ptr halt_sp_offset[r9],rsp - - ifdef LINUX - mov rdi,qword ptr 8[rsp] - call qword ptr [rdi] - - mov rdi,qword ptr tlsp_tls_index - call pthread_getspecific - mov r9,rax - add rsp,24 - else - call qword ptr [rcx] - - mov r9,qword ptr tlsp_tls_index - mov r9,qword ptr gs:[1480h+r9*8] - add rsp,56 - endif - - jmp exit_thread - -init_thread: - lea rax,128[rsp] - sub rsp,32+8 - - mov rax,qword ptr heap_size_offset[r9] - sub rax,7 - xor rdx,rdx - mov rbx,65 - div rbx - mov qword ptr heap_size_65_offset[r9],rax - - mov rax,qword ptr heap_size_offset[r9] - sub rax,7 - xor rdx,rdx - mov rbx,257 - div rbx - - mov heap_size_257_offset[r9],rax - - add rax,7 - and rax,-8 - - mov qword ptr heap_copied_vector_size_offset[r9],rax - mov qword ptr heap_end_after_copy_gc_offset[r9],0 - - mov rax,qword ptr heap_size_offset[r9] - add rax,7 - and rax,-8 - mov qword ptr heap_size_offset[r9],rax - add rax,7 - - mov rbp,rsp - and rsp,-16 - - mov rbx,r9 - - ifdef LINUX - mov rdi,rax - call malloc - else - mov rcx,rax - call allocate_memory - endif - mov rsp,rbp - - mov r9,rbx - - test rax,rax - je init_thread_no_memory_2 - - mov heap_mbp_offset[r9],rax - - lea rdi,7[rax] - and rdi,-8 - - mov heap_p_offset[r9],rdi - - mov rbp,rsp - and rsp,-16 - - mov rbx,r9 - - ifdef LINUX - mov r14,rdi - mov rdi,qword ptr a_stack_size_offset[r9] - add rdi,7 - call malloc - mov rdi,r14 - else - mov rcx,qword ptr a_stack_size_offset[r9] - add rcx,7 - if 0 - call allocate_memory_with_guard_page_at_end - else - call allocate_memory - endif - endif - mov rsp,rbp - - mov r9,rbx - - test rax,rax - je init_thread_no_memory_3 - - mov stack_mbp_offset[r9],rax - - add rax,qword ptr a_stack_size_offset[r9] - add rax,7+4095 - and rax,-4096 -; mov qword ptr a_stack_guard_page,rax - sub rax,qword ptr a_stack_size_offset[r9] - - add rax,7 - and rax,-8 - - mov rsi,rax - - mov stack_p_offset[r9],rax - -; lea rcx,(caf_list+8) -; mov qword ptr caf_listp,rcx - -; lea rcx,__Nil-8 -; mov qword ptr finalizer_list,rcx -; mov qword ptr free_finalizer_list,rcx - - mov heap_p1_offset[r9],rdi - - mov rbp,qword ptr heap_size_257_offset[r9] - - shl rbp,4 - lea rax,[rdi+rbp*8] - - mov heap_copied_vector_offset[r9],rax - add rax,heap_copied_vector_size_offset[r9] - mov heap_p2_offset[r9],rax - - mov byte ptr garbage_collect_flag_offset[r9],0 - - test byte ptr flags,64 - je init_thread_no_mark1 - - mov rax,qword ptr heap_size_65_offset[r9] - - mov qword ptr heap_vector_offset[r9],rdi - - add rdi,rax - - add rdi,7 - and rdi,-8 - - mov qword ptr heap_p3_offset[r9],rdi - - lea rbp,[rax*8] - - mov byte ptr garbage_collect_flag_offset [r9],-1 - -init_thread_no_mark1: -; mov rax,qword ptr initial_heap_size - mov rax,qword ptr heap_size_offset[r9] - - mov rbx,4000 - test byte ptr flags,64 - jne init_thread_no_mark9 - add rbx,rbx -init_thread_no_mark9: - - cmp rax,rbx - jle init_thread_too_large_or_too_small - shr rax,3 - cmp rax,rbp - jge init_thread_too_large_or_too_small - mov rbp,rax -init_thread_too_large_or_too_small: - - lea rax,[rdi+rbp*8] - - mov heap_end_after_gc_offset[r9],rax - - test byte ptr flags,64 - je init_thread_no_mark2 - - mov qword ptr bit_vector_size_offset[r9],rbp - -init_thread_no_mark2: - mov qword ptr bit_counter_offset[r9],0 - mov qword ptr zero_bits_before_mark_offset[r9],0 - - mov r15,rbp - - add rsp,32+8 - xor rax,rax - ret - -init_thread_no_memory_2: - mov rax,1 - ret - -init_thread_no_memory_3: - mov rbp,rsp - and rsp,-16 - - mov rbx,r9 - - ifdef LINUX - mov rdi,heap_mbp_offset[r9] - call free - else - mov rcx,heap_mbp_offset[r9] - call free_memory - endif - - mov rsp,rbp - - mov r9,rbx - - add rsp,32 - - mov rax,1 - ret - - -exit_thread: - call add_execute_time - - mov rbp,rsp - and rsp,-16 - - mov rbx,r9 - - ifdef LINUX - mov rdi,stack_mbp_offset[r9] - call free - - mov r9,rbx - - mov rdi,heap_mbp_offset[r9] - call free - - mov rdi,r9 - call free - else - mov rcx,stack_mbp_offset[r9] - sub rsp,32 - call free_memory - - mov r9,rbx - - mov rcx,heap_mbp_offset[r9] - call free_memory - - call GetProcessHeap - - mov rcx,rax - xor rdx,rdx - mov r8,rbx - call HeapFree - - add rsp,32 - endif - - mov rsp,rbp - - ifdef LINUX - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - endif - - xor rax,rax - ret - -_TEXT ends - -; bit_counter_offset = 0 ? -; zero_bits_before_mark_offset = 1 =0 ? - -; a_stack_guard_page -; caf_list -; caf_listp -; finalizer_list -; free_finalizer_list -; initial_heap_size -; flags ? + +; File: athread.asm +; Author: John van Groningen +; Machine: amd64 + + _TEXT segment + + ifdef LINUX + else + extern GetProcessHeap:near + extern HeapAlloc:near + extern HeapFree:near + endif + + public clean_new_thread + +clean_new_thread: + ifdef LINUX + push rbx + push rbp + push r12 + push r13 + push r14 + push r15 + + sub rsp,24 + mov qword ptr 8[rsp],rdi + + mov rdi,768 + call malloc + + mov rbx,rax + + mov rdi,qword ptr tlsp_tls_index + mov rsi,rax + call pthread_setspecific + + mov r9,rbx + + mov rdi,qword ptr 8[rsp] + + mov rbx,qword ptr 8[rdi] + else + sub rsp,56 + mov qword ptr 32[rsp],rcx + + call GetProcessHeap + + mov rcx,rax + xor rdx,rdx + mov r8,512 + call HeapAlloc + + mov r9,rax + mov rax,qword ptr tlsp_tls_index + mov qword ptr gs:[1480h+rax*8],r9 + + mov rcx,qword ptr 32[rsp] + + mov rbx,qword ptr 8[rcx] + endif + test rbx,rbx + cmove rbx,qword ptr (main_thread_local_storage+heap_size_offset) + mov qword ptr heap_size_offset[r9],rbx + + ifdef LINUX + mov rbx,qword ptr 16[rdi] + else + mov rbx,qword ptr 16[rcx] + endif + test rbx,rbx + cmove rbx,qword ptr (main_thread_local_storage+a_stack_size_offset) + mov qword ptr a_stack_size_offset[r9],rbx + + call init_thread + + ifndef LINUX + mov rcx,qword ptr 32[rsp] + endif + + mov qword ptr saved_heap_p_offset[r9],rdi + mov qword ptr saved_r15_offset[r9],r15 + mov qword ptr saved_a_stack_p_offset[r9],rsi + + mov qword ptr halt_sp_offset[r9],rsp + + ifdef LINUX + mov rdi,qword ptr 8[rsp] + call qword ptr [rdi] + + mov rdi,qword ptr tlsp_tls_index + call pthread_getspecific + mov r9,rax + add rsp,24 + else + call qword ptr [rcx] + + mov r9,qword ptr tlsp_tls_index + mov r9,qword ptr gs:[1480h+r9*8] + add rsp,56 + endif + + jmp exit_thread + +init_thread: + lea rax,128[rsp] + sub rsp,32+8 + + mov rax,qword ptr heap_size_offset[r9] + sub rax,7 + xor rdx,rdx + mov rbx,65 + div rbx + mov qword ptr heap_size_65_offset[r9],rax + + mov rax,qword ptr heap_size_offset[r9] + sub rax,7 + xor rdx,rdx + mov rbx,257 + div rbx + + mov heap_size_257_offset[r9],rax + + add rax,7 + and rax,-8 + + mov qword ptr heap_copied_vector_size_offset[r9],rax + mov qword ptr heap_end_after_copy_gc_offset[r9],0 + + mov rax,qword ptr heap_size_offset[r9] + add rax,7 + and rax,-8 + mov qword ptr heap_size_offset[r9],rax + add rax,7 + + mov rbp,rsp + and rsp,-16 + + mov rbx,r9 + + ifdef LINUX + mov rdi,rax + call malloc + else + mov rcx,rax + call allocate_memory + endif + mov rsp,rbp + + mov r9,rbx + + test rax,rax + je init_thread_no_memory_2 + + mov heap_mbp_offset[r9],rax + + lea rdi,7[rax] + and rdi,-8 + + mov heap_p_offset[r9],rdi + + mov rbp,rsp + and rsp,-16 + + mov rbx,r9 + + ifdef LINUX + mov r14,rdi + mov rdi,qword ptr a_stack_size_offset[r9] + add rdi,7 + call malloc + mov rdi,r14 + else + mov rcx,qword ptr a_stack_size_offset[r9] + add rcx,7 + if 0 + call allocate_memory_with_guard_page_at_end + else + call allocate_memory + endif + endif + mov rsp,rbp + + mov r9,rbx + + test rax,rax + je init_thread_no_memory_3 + + mov stack_mbp_offset[r9],rax + + add rax,qword ptr a_stack_size_offset[r9] + add rax,7+4095 + and rax,-4096 +; mov qword ptr a_stack_guard_page,rax + sub rax,qword ptr a_stack_size_offset[r9] + + add rax,7 + and rax,-8 + + mov rsi,rax + + mov stack_p_offset[r9],rax + +; lea rcx,(caf_list+8) +; mov qword ptr caf_listp,rcx + +; lea rcx,__Nil-8 +; mov qword ptr finalizer_list,rcx +; mov qword ptr free_finalizer_list,rcx + + mov heap_p1_offset[r9],rdi + + mov rbp,qword ptr heap_size_257_offset[r9] + + shl rbp,4 + lea rax,[rdi+rbp*8] + + mov heap_copied_vector_offset[r9],rax + add rax,heap_copied_vector_size_offset[r9] + mov heap_p2_offset[r9],rax + + mov byte ptr garbage_collect_flag_offset[r9],0 + + test byte ptr flags,64 + je init_thread_no_mark1 + + mov rax,qword ptr heap_size_65_offset[r9] + + mov qword ptr heap_vector_offset[r9],rdi + + add rdi,rax + + add rdi,7 + and rdi,-8 + + mov qword ptr heap_p3_offset[r9],rdi + + lea rbp,[rax*8] + + mov byte ptr garbage_collect_flag_offset [r9],-1 + +init_thread_no_mark1: +; mov rax,qword ptr initial_heap_size + mov rax,qword ptr heap_size_offset[r9] + + mov rbx,4000 + test byte ptr flags,64 + jne init_thread_no_mark9 + add rbx,rbx +init_thread_no_mark9: + + cmp rax,rbx + jle init_thread_too_large_or_too_small + shr rax,3 + cmp rax,rbp + jge init_thread_too_large_or_too_small + mov rbp,rax +init_thread_too_large_or_too_small: + + lea rax,[rdi+rbp*8] + + mov heap_end_after_gc_offset[r9],rax + + test byte ptr flags,64 + je init_thread_no_mark2 + + mov qword ptr bit_vector_size_offset[r9],rbp + +init_thread_no_mark2: + mov qword ptr bit_counter_offset[r9],0 + mov qword ptr zero_bits_before_mark_offset[r9],0 + + mov r15,rbp + + add rsp,32+8 + xor rax,rax + ret + +init_thread_no_memory_2: + mov rax,1 + ret + +init_thread_no_memory_3: + mov rbp,rsp + and rsp,-16 + + mov rbx,r9 + + ifdef LINUX + mov rdi,heap_mbp_offset[r9] + call free + else + mov rcx,heap_mbp_offset[r9] + call free_memory + endif + + mov rsp,rbp + + mov r9,rbx + + add rsp,32 + + mov rax,1 + ret + + +exit_thread: + call add_execute_time + + mov rbp,rsp + and rsp,-16 + + mov rbx,r9 + + ifdef LINUX + mov rdi,stack_mbp_offset[r9] + call free + + mov r9,rbx + + mov rdi,heap_mbp_offset[r9] + call free + + mov rdi,r9 + call free + else + mov rcx,stack_mbp_offset[r9] + sub rsp,32 + call free_memory + + mov r9,rbx + + mov rcx,heap_mbp_offset[r9] + call free_memory + + call GetProcessHeap + + mov rcx,rax + xor rdx,rdx + mov r8,rbx + call HeapFree + + add rsp,32 + endif + + mov rsp,rbp + + ifdef LINUX + pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + pop rbx + endif + + xor rax,rax + ret + +_TEXT ends + +; bit_counter_offset = 0 ? +; zero_bits_before_mark_offset = 1 =0 ? + +; a_stack_guard_page +; caf_list +; caf_listp +; finalizer_list +; free_finalizer_list +; initial_heap_size +; flags ? -- cgit v1.2.3