diff options
author | John van Groningen | 2006-09-05 14:50:23 +0000 |
---|---|---|
committer | John van Groningen | 2006-09-05 14:50:23 +0000 |
commit | bf3b063304643135af78b31a6e3eaaa88be55c82 (patch) | |
tree | a7364ff6983f023e4961af740cc0f14fceb28ae4 /acompact_rmark.asm | |
parent | add call to write_heap (diff) |
mark using pointer reversal ifthe stack becomes too large
in the mark phase of the compacting collector
Diffstat (limited to 'acompact_rmark.asm')
-rw-r--r-- | acompact_rmark.asm | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/acompact_rmark.asm b/acompact_rmark.asm index d173b59..b3b1221 100644 --- a/acompact_rmark.asm +++ b/acompact_rmark.asm @@ -68,6 +68,9 @@ rmark_hnf_2: mov qword ptr 8[rsp],rbx mov qword ptr [rsp],rax + cmp rsp,qword ptr end_stack + jb rmark_using_reversal + rmark_node: mov rax,qword ptr neg_heap_p3 add rax,rcx @@ -118,6 +121,9 @@ rmark_no_reverse: rmark_hnf_3: mov rdx,qword ptr 8[rcx] rmark_hnf_3_: + cmp rsp,qword ptr end_stack + jb rmark_using_reversal_ + mov rax,qword ptr neg_heap_p3 add rax,rdx @@ -289,6 +295,9 @@ rmark_not_yet_linked_ab: jmp rmark_hnf_1 rmark_record_3_aab: + cmp rsp,qword ptr end_stack + jb rmark_using_reversal_ + mov rax,qword ptr neg_heap_p3 add rax,rdx @@ -418,7 +427,7 @@ rmark_large_tuple_or_record: and d3,31*8 shr rbx,8 mov d3d,dword ptr (bit_clear_table2)[d3] - and dword ptr [rdi+rbx*4],d3d + and dword ptr [rdi+rbx*4],d3d movzx eax,word ptr 4[rax] mov rbx,qword ptr pointer_compare_address @@ -432,14 +441,14 @@ rmark_large_tuple_or_record: je rmark_tuple_selector_node_2 mov rcx,qword ptr (-24)[d2+rax] - mov qword ptr [rsi],rcx - mov qword ptr [rdx],rcx + 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 + mov qword ptr [rsi],rcx + mov qword ptr [rdx],rcx jmp rmark_node_d1 else rmark_small_tuple_or_record: @@ -480,7 +489,7 @@ rmark_record_selector_node_1: and rbp,31 mov ebp,dword ptr (bit_set_table)[rbp*4] mov ebx,dword ptr [rdi+rbx*4] - and rbx,rbp + and rbx,rbp jne rmark_hnf_1 mov rbx,qword ptr [rdx] @@ -511,7 +520,7 @@ rmark_small_tuple_or_record: mov eax,(-8)[rax] - mov d3,rbx + mov d3,rbx and d3,31*8 shr rbx,8 mov d3d,dword ptr (bit_clear_table2)[d3] @@ -664,6 +673,7 @@ rmark_next_node: cmp rcx,1 ja rmark_node +rmark_next_node_: end_rmark_nodes: ret @@ -694,7 +704,11 @@ rmark_push_lazy_args: mov rsi,rcx mov rcx,qword ptr [rcx] - jmp rmark_node + + cmp rsp,qword ptr end_stack + jae rmark_node + + jmp rmark_using_reversal rmark_closure_with_unboxed_arguments: ; (a_size+b_size)+(b_size<<8) @@ -796,6 +810,9 @@ rmark_no_normal_hnf_0: test rax,rax je rmark_b_array + cmp rsp,qword ptr end_stack + jb rmark_array_using_reversal + sub rax,256 cmp rdx,rax mov rbx,rdx @@ -841,6 +858,9 @@ rmark_a_record_array: jmp rmark_lr_array rmark_lazy_array: + cmp rsp,qword ptr end_stack + jb rmark_array_using_reversal + mov rax,qword ptr 8[rcx] add rcx,16 |