41 lines
		
	
	
		
			735 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			735 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| 
 | |
| .ifndef _listops_s_file
 | |
| _listops_s_file:
 | |
| 
 | |
| .include "include/primops.s"
 | |
| 
 | |
| # | n | list | -> cont
 | |
| .primop2 list_int_index
 | |
| 	mov 010(%rsi), %rdx # the list constructor id, must be 1
 | |
| 	cmp $1, %rdx
 | |
| 	jne list_int_index_not_found
 | |
| 
 | |
| 	mov 020(%rbp), %rcx
 | |
| 	mov 010(%rcx), %rcx
 | |
| 	test %rcx, %rcx
 | |
| 	jz list_int_index_found #we are taking 0, all happy, return it
 | |
| 
 | |
| 	#more probably we need to continue, make replacement thunks
 | |
| 	sub $1, %rcx
 | |
| 	pushq %rcx
 | |
| 	pushq $INT_code
 | |
| 	mov %rsp, %r11
 | |
| 
 | |
| 	pushq 030(%rsi) # tail
 | |
| 	push %r11
 | |
| 	pushq $2
 | |
| 	pushq $list_int_index
 | |
| 	mov %rsp, %r11
 | |
| 
 | |
| 	primop2_cont_indirect %r11
 | |
| 
 | |
| list_int_index_not_found:
 | |
| 	movq 0, %rax #fault
 | |
| 
 | |
| list_int_index_found:
 | |
| 	mov 020(%rsi), %rax #head
 | |
| 	primop2_cont_indirect %rax
 | |
| 	
 | |
| 
 | |
| .endif # _listops_s_file
 |