aboutsummaryrefslogtreecommitdiff
path: root/sum.s
blob: 4cc709fd2a5e1624310b00d6da6340d546edede5 (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
41
42
43


.include "include/uskel.s"

.include "include/data.s"
.include "include/io.s"
.include "include/intops.s"

.primop1 sumn
	needs_alloc $0110

	mov 010(%rsi), %rax
	test %rax, %rax
	jz sumn_zero

	dec %rax
	thunkto %r10, $INT_code, %rax
	thunkto %r10, $sumn, $1, %r10
	thunkto %r10, $plus, $2, %rsi, %r10 #TODO try the other way?
	primop1_cont_indirect %r10

	sumn_zero:
	primop1_ret_int $0

# || -> cont
.thunkcode main
	needs_alloc $0160
	# push a new integer
	thunkto %r11, $INT_code, $10000000

	# push the plus
	thunkto %r11, $sumn, $1, %r11

	# push the print
	thunkto %r11, $print, $1, %r11

	# push a cont thunk for main_exit
	thunkto %rsi, $main_exit, $0

	# evaluate into main_exit
	enter %r11

.include "include/main_exit.s"