aboutsummaryrefslogtreecommitdiffstats
path: root/src/x86_64/prelude.asm
blob: 81a26335c54c21971d6405d753d63bb57d80d65d (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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
section .text
printdln:
    sar     rdi, FIXNUM_SHIFT
    sub     rsp, 40
    mov     BYTE [rsp+31], 10
    test    rdi, rdi
    jne     .L2
    mov     BYTE [rsp+30], 48
    mov     eax, 30
    mov     r8d, 2
.L3:
    lea     rsi, [rsp+rax]
    mov     rdx, r8
    mov     rdi, 1
    mov     rax, 1
    syscall
    add     rsp, 40
    ret
.L2:
    mov     r10d, 1
    js      .L12
.L4:
    mov     r8d, 1
    lea     r9, [rsp+31]
    mov     rsi, -3689348814741910323
.L5:
    mov     rax, rdi
    mov     rcx, r9
    mul     rsi
    sub     rcx, r8
    shr     rdx, 3
    lea     rax, [rdx+rdx*4]
    add     rax, rax
    sub     rdi, rax
    mov     rax, r8
    add     r8, 1
    add     edi, 48
    mov     BYTE [rcx], dil
    mov     rdi, rdx
    test    rdx, rdx
    jne     .L5
    cmp     r10d, -1
    jne     .L10
    not     r8
    mov     BYTE [rsp+32+r8], 45
    lea     r8, [rax+2]
.L10:
    mov     eax, 32
    sub     rax, r8
    jmp     .L3
.L12:
    neg     rdi
    mov     r10d, -1
    jmp     .L4
    ret

printbool:
    shr     rdi, BOOL_SHIFT
    cmp     rdi, 0
    je      print_false
    mov     rsi, true_str ; addr
    mov     rdx,  5       ; number of bytes
    jmp     bool_write
print_false:
    mov     rsi, false_str ; addr
    mov     rdx,  6        ; number of bytes

bool_write:
    mov     rax, 1
    mov     rdi, 1
    syscall
    ret

printstring:
    mov     rsi, rdi
    mov     rax, PTR_MASK
    and     rsi, rax
    mov     rdx, [rsi]
    add     rsi, 8
    mov     rax, 1
    mov     rdi, 1
    syscall
    ret

printlambda:
    mov     rsi, lambda_str
    mov     rdx, [rsi]
    add     rsi, 8
    mov     rax, 1
    mov     rdi, 1
    syscall
    ret

display:
    ;; is nil?
    mov     rax, rdi
    cmp     rax, NIL_VAL
    je      display_end

    ;; is boolean?
    mov     rax, rdi
    and     rax, BOOL_MASK
    cmp     rax, BOOL_TAG
    jne     not_bool
    call    printbool
    ret
not_bool:

    ;; is string?
    mov     rax, rdi
    and     rax, STRING_MASK
    cmp     rax, STRING_TAG
    jne     not_string
    call    printstring
    ret
not_string:

    ;; is lambda?
    mov     rax, rdi
    and     rax, LAMBDA_MASK
    cmp     rax, LAMBDA_TAG
    jne     not_lambda
    call    printlambda
    ret
not_lambda:

    ;; is fixnum?
    mov     rax, rdi
    and     rax, FIXNUM_MASK
    cmp     rax, FIXNUM_TAG
    jne     display_end
    call    printdln
display_end:
    ret