aboutsummaryrefslogtreecommitdiffstats
path: root/src/x86_64/prelude.asm
blob: 05762b9926b919e1d0fd73123c8e36a900ede76b (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
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, STRING_INV_MASK
    and     rsi, rax
    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 fixnum?
    mov     rax, rdi
    and     rax, FIXNUM_MASK
    cmp     rax, FIXNUM_TAG
    jne     display_end
    call    printdln
display_end:
    ret