summaryrefslogblamecommitdiff
path: root/acompact_rmarkr.asm
blob: 9e68886be9ad9ac291cd9fab59bd396c66bc3dd6 (plain) (tree)























                                       


                                  
                                                  
      










                                    
                                           
                       
                                               




                                             


                                      
                                                   
      



























                                         
                                           



                        


                                      
                                                   
      













































                                           
                                           



                        


                                      
                                                   
      











                                         
                                           





                        


                                      
                                                   
      

















                                         
                                           



                        


                                      
                                                   
      











                                         
                                           





                        


                                      
                                                   
      

















                                         
                                           



                        


                                      
                                                   
      





































                                           
                                           



                                 


                                      
                                                     
      









                                         
                                           










                                             


                                        
                                                    
      













                                            
                                           






                       


                                        
                                                    
      





                                         
                                           


                                 


                                       
                                       
       


                        


                                      
                                                     
      
                                         

                                       
                                   
      




                                                      
          
                                  
                                      
                                                        
      




                                   
          
                                  
                                      
                                                        
      


                                   
                                           
































                                                        


                                        
                                                    
      













                                            
                                           




                       


                                        
                                                    
      




                                         
                                           


                                 


                                      
                             
      


                        


                                      
                                                     
      
                                          

                                       
                                   
      





                                                      


                                      
                                                        
      












                                            


                                        
                                                    
      












                                               
                                           





                        


                                      
                                                   
      





                                         


                                      
                             
      

                      

                                       
                                   
       








                                                    

                                       
                                   
       









                                                    

                                           
                                       
       

















































































                                                      


                           
                                 
      
                            


                           
                                 
      


                                      
                                           



                        


                                      
                                                     
      












                                             
                                           



                        
                                     
                                      
     
                                                     
      

                                          
          
                                    
                       
                                         
      

                                             
                                           





                                   


                                      
                                                     
      

                                         
          
                                       
                       
                                          
      

                                             
                                




































                                        
                                           



                        


                                      
                                                 
      















                                         
                                           





                        


                                        
                                                    
      
















































































































































































































































                                                        
                                         







                                    
                                      


                                 
                                      
                                
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
 ifdef PIC
	lea	r9,__ARRAY__+2+0
	mov	qword ptr [rcx],r9
 else
	mov	qword ptr [rcx],offset __ARRAY__+2
 endif
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:
	mov	rax,qword ptr neg_heap_p3+0
	add	rax,rcx

	cmp	rax,qword ptr heap_size_64_65+0
	jnc	rmarkr_next_node_after_static

	mov	rbx,rax
	and	rax,31*8
	shr	rbx,8

 ifdef PIC
	lea	r9,bit_set_table2+0
	mov	eax,dword ptr [r9+rax]
 else
	mov	eax,dword ptr (bit_set_table2)[rax]
 endif
	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]

	mov	rax,qword ptr neg_heap_p3+0
	add	rax,rdx

	mov	rbx,rax
	and	rax,31*8
	shr	rbx,8
 ifdef PIC
	lea	r9,bit_set_table2+0
	mov	eax,dword ptr [r9+rax]
 else
	mov	eax,dword ptr (bit_set_table2)[rax]
 endif
	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

	mov	rax,qword ptr neg_heap_p3+0
	add	rax,rdx

	mov	rbp,rax
	and	rax,31*8
	shr	rbp,8
 ifdef PIC
	lea	r9,bit_set_table2+0
	mov	eax,dword ptr [r9+rax]
 else
	mov	eax,dword ptr (bit_set_table2)[rax]
 endif
	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

	mov	rax,qword ptr neg_heap_p3+0
	add	rax,rcx

	add	rax,2*8

	mov	rbp,rax 
	and	rax,31*8
	shr	rbp,8
 ifdef PIC
	lea	r9,bit_set_table2+0
	mov	eax,dword ptr [r9+rax]
 else
	mov	eax,dword ptr (bit_set_table2)[rax]
 endif
	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]

	mov	rax,qword ptr neg_heap_p3+0
	add	rax,rdx

	mov	rbp,rax
	and	rax,31*8
	shr	rbp,8
 ifdef PIC
	lea	r9,bit_set_table2+0
	mov	eax,dword ptr [r9+rax]
 else
	mov	eax,dword ptr (bit_set_table2)[rax]
 endif
	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

	mov	rax,qword ptr neg_heap_p3+0
	add	rax,rcx

	add	rax,8

	mov	rbp,rax
	and	rax,31*8
	shr	rbp,8
 ifdef PIC
	lea	r9,bit_set_table2+0
	mov	eax,dword ptr [r9+rax]
 else
	mov	eax,dword ptr (bit_set_table2)[rax]
 endif
	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]

	mov	rax,qword ptr neg_heap_p3+0
	add	rax,rdx 

	mov	rbp,rax
	and	rax,31*8
	shr	rbp,8
 ifdef PIC
	lea	r9,bit_set_table2+0
	mov	eax,dword ptr [r9+rax]
 else
	mov	eax,dword ptr (bit_set_table2)[rax]
 endif
	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:
	mov	rbx,qword ptr neg_heap_p3+0
	lea	rbx,(-8)[rcx+rbx]

	mov	rax,rbx
	and	rax,31*8
	shr	rbx,8
 ifdef PIC
	lea	r9,bit_clear_table2+0
	mov	eax,dword ptr [r9+rax]
 else
	mov	eax,dword ptr (bit_clear_table2)[rax]
 endif
	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]

	mov	rbx,qword ptr neg_heap_p3+0
	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

 ifdef PIC
	lea	r9,bit_set_table+0
	mov	eax,dword ptr [r9+rax*4]
 else
	mov	eax,dword ptr (bit_set_table)[rax*4]
 endif
	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]
	add	rbx,qword ptr neg_heap_p3+0
	shr	rbx,3

	push	rax
	mov	rax,rbx

	shr	rbx,5
	and	rax,31

 ifdef PIC
	lea	r9,bit_set_table+0
	mov	eax,dword ptr [r9+rax*4]
 else
	mov	eax,dword ptr (bit_set_table)[rax*4]
 endif
	mov	ebx,dword ptr [rdi+rbx*4]
	and	rbx,rax

	pop	rax
	jne	rmarkr_hnf_1

 ifdef NEW_DESCRIPTORS
	mov	rbx,qword ptr neg_heap_p3+0
	lea	rbx,(-8)[rcx+rbx]

	push	rcx

  ifdef PIC
	movsxd	rcx,dword ptr (-8)[rax]
	add	rax,rcx
  else
	mov	eax,dword ptr (-8)[rax]
  endif

	mov	rcx,rbx
	and	rcx,31*8
	shr	rbx,8
 ifdef PIC
	lea	r9,bit_clear_table2+0
	mov	ecx,dword ptr [r9+rcx]
 else
	mov	ecx,dword ptr (bit_clear_table2)[rcx]
 endif
	and	dword ptr [rdi+rbx*4],ecx

 ifdef PIC
	movzx	eax,word ptr (4-8)[rax]
 else
	movzx	eax,word ptr 4[rax]
 endif
	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
 ifdef PIC
	lea	r9,__indirection+0
	mov	qword ptr (-8)[rdx],r9
 else
	mov	qword ptr (-8)[rdx],offset __indirection
 endif
	mov	qword ptr [rdx],rcx
	jmp	rmarkr_node

rmarkr_tuple_selector_node_2:
	mov	rcx,qword ptr [rdx]
	pop	rdx
 ifdef PIC
	lea	r9,__indirection+0
	mov	qword ptr (-8)[rdx],r9
 else
	mov	qword ptr (-8)[rdx],offset __indirection
 endif
	mov	qword ptr [rdx],rcx
	jmp	rmarkr_node
 else
rmarkr_small_tuple_or_record:
	mov	rbx,qword ptr neg_heap_p3+0

	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

 ifdef PIC
	lea	r9,bit_set_table+0
	mov	eax,dword ptr [r9+rax*4]
 else
	mov	eax,dword ptr (bit_set_table)[rax*4]
 endif
	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]
	add	rbx,qword ptr neg_heap_p3+0
	shr	rbx,3

	push	rax
	mov	rax,rbx
	shr	rbx,5
	and	rax,31
 ifdef PIC
	lea	r9,bit_set_table+0
	mov	eax,dword ptr [r9+rax*4]
 else
	mov	eax,dword ptr (bit_set_table)[rax*4]
 endif
	mov	ebx,dword ptr [rdi+rbx*4]
	and	rbx,rax
	pop	rax
	jne	rmarkr_hnf_1

rmarkr_small_tuple_or_record:
	mov	rbx,qword ptr neg_heap_p3+0
	lea	rbx,(-8)[rcx+rbx]

	push	rcx

 ifdef PIC
	movsxd	rcx,dword ptr(-8)[rax]
	add	rax,rcx
 else
	mov	eax,(-8)[rax]
 endif

	mov	rcx,rbx
	and	rcx,31*8
	shr	rbx,8
 ifdef PIC
	lea	r9,bit_clear_table2+0
	mov	ecx,dword ptr [r9+rcx]
 else
	mov	ecx,dword ptr (bit_clear_table2)[rcx]
 endif
	and	dword ptr [rdi+rbx*4],ecx 

 ifdef PIC
	movzx	eax,word ptr (4-8)[rax]
 else
	movzx	eax,word ptr 4[rax]
 endif
	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
 ifdef PIC
	lea	r9,__indirection+0
	mov	qword ptr (-8)[rdx],r9
 else
	mov	qword ptr (-8)[rdx],offset __indirection
 endif
	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

 ifdef PIC
	lea	r9,bit_set_table+0
	mov	eax,dword ptr [r9+rax*4]
 else
	mov	eax,dword ptr (bit_set_table)[rax*4]
 endif
	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]
	add	rbx,qword ptr neg_heap_p3+0

	push	rax
	mov	rax,rbx

	shr	rbx,8
	and	rax,31*8

 ifdef PIC
	lea	r9,bit_set_table2+0
	mov	eax,dword ptr [r9+rax]
 else
	mov	eax,dword ptr (bit_set_table2)[rax]
 endif
	mov	ebx,dword ptr [rdi+rbx*4]
	and	rbx,rax

	pop	rax
	jne	rmarkr_hnf_1

rmarkr_select_from_small_record:
 ifdef PIC
	movsxd	rbx,dword ptr(-8)[rax]
	add	rax,rbx
 else
	mov	eax,(-8)[rax]
 endif
	sub	rcx,8

 ifdef NEW_DESCRIPTORS
  ifdef PIC
	movzx	ebx,word ptr (4-8)[rax]
  else
	movzx	ebx,word ptr 4[rax]
  endif
	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

  ifdef PIC
	movzx	ebx,word ptr (6-8)[rax]
  else
	movzx	ebx,word ptr 6[rax]
  endif
	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:

  ifdef PIC
	mov	rax,qword ptr ((-8)-8)[rbx]
  else
	mov	rax,qword ptr (-8)[rbx]
  endif
	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:
 ifdef PIC
	lea	r9,dINT+2+0
	cmp	rax,r9
 else
	cmp	rax,offset dINT+2
 endif
	je	rmarkr_int_3

 ifdef PIC
	lea	r9,CHAR+2+0
	cmp	rax,r9
 else
	cmp	rax,offset CHAR+2
 endif
 	je	rmarkr_char_3

	jb	rmarkr_no_normal_hnf_0

	mov	rbx,qword ptr neg_heap_p3+0
	add	rbx,rcx

	mov	rcx,rbx
	and	rcx,31*8
	shr	rbx,8
 ifdef PIC
	lea	r9,bit_clear_table2+0
	mov	ecx,dword ptr [r9+rcx]
 else
	mov	ecx,dword ptr (bit_clear_table2)[rcx]
 endif
	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

	mov	rbx,qword ptr neg_heap_p3+0
	add	rbx,rcx

	mov	rcx,rbx
	and	rcx,31*8
	shr	rbx,8
 ifdef PIC
	lea	r9,bit_clear_table2+0
	mov	ecx,dword ptr [r9+rcx]
 else
	mov	ecx,dword ptr (bit_clear_table2)[rcx]
 endif
	shl	rbp,4
	and	dword ptr [rdi+rbx*4],ecx 

 ifdef PIC
	lea	rcx,small_integers+0
	add	rcx,rbp
 else
	lea	rcx,(small_integers)[rbp]
 endif
	jmp	rmarkr_next_node_after_static

rmarkr_char_3:
	mov	rbx,qword ptr neg_heap_p3+0

	movzx	rax,byte ptr 8[rcx]
	add	rbx,rcx

	mov	rbp,rbx
	and	rbp,31*8
	shr	rbx,8
 ifdef PIC
	lea	r9,bit_clear_table2+0
	mov	ebp,dword ptr [r9+rbp]
 else
	mov	ebp,dword ptr (bit_clear_table2)[rbp]
 endif
	and	dword ptr [rdi+rbx*4],ebp

	shl	rax,4
 ifdef PIC
	lea	rcx,static_characters+0
	add	rcx,rax
 else
	lea	rcx,static_characters[rax]
 endif
	jmp	rmarkr_next_node_after_static

rmarkr_no_normal_hnf_0:
	lea	r9,__ARRAY__+2+0
	cmp	rax,r9
	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:
	mov	rax,qword ptr neg_heap_p3+0
	add	rax,rcx
	add	rax,8
	mov	rbp,rax
	and	rax,31*8
	shr	rbp,8
 ifdef PIC
	lea	r9,bit_set_table2+0
	mov	eax,dword ptr [r9+rax]
 else
	mov	eax,dword ptr bit_set_table2[rax]
 endif
	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:
	mov	rbx,qword ptr neg_heap_p3+0
	add	rbx,rcx 
	shr	rbx,3
	add	rbx,rax 

	mov	rdx,rbx
	and	rbx,31
	shr	rdx,5
 ifdef PIC
	lea	r9,bit_set_table+0
	mov	ebx,dword ptr [r9+rbx*4]
 else
	mov	ebx,dword ptr (bit_set_table)[rbx*4]
 endif
	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:
	cmp	rsp,qword ptr end_stack+0
	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+0,4096
	je	rmark_next_node_
	jmp	rmarkp_next_node_

rmarkr_end:
	test	qword ptr flags+0,4096
	je	rmark_next_node
	jmp	rmarkp_next_node