aboutsummaryrefslogtreecommitdiff
path: root/include/listops.s
blob: eb8f6cfc597393aac38bb79284e1b5eef7021962 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

.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