summaryrefslogtreecommitdiff
path: root/thread
diff options
context:
space:
mode:
authorJohn van Groningen2012-03-14 11:22:02 +0000
committerJohn van Groningen2012-03-14 11:22:02 +0000
commit7d0fdbfba815324c5908a6c0db2b47be631b7ca0 (patch)
treecedb057337172b5b2a8ba859c1498ec9ca10ec15 /thread
parentadd thread safe version for 64 bit windows (diff)
fix newlines
Diffstat (limited to 'thread')
-rw-r--r--thread/aap.asm4804
-rw-r--r--thread/acompact.asm2750
-rw-r--r--thread/acompact_rmark.asm2262
-rw-r--r--thread/acompact_rmark_prefetch.asm2796
-rw-r--r--thread/acompact_rmarkr.asm2190
-rw-r--r--thread/acopy.asm2788
-rw-r--r--thread/afileIO3.asm2042
-rw-r--r--thread/amark.asm4312
-rw-r--r--thread/amark_prefetch.asm3928
-rw-r--r--thread/astartup.asm11712
-rw-r--r--thread/athread.asm742
11 files changed, 20163 insertions, 20163 deletions
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 ?