summaryrefslogtreecommitdiffstats
path: root/src/util.S
blob: 447f66c77a638b4fa128ec3287536ed00202c0e8 (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include "abi.inc"
#include "defs.inc"

        .text

FUNC cepis__strndup
        PROLOGUE 24
        mov     %rdi, %r12
        mov     %rsi, %r13
        lea     1(%r13), %rdi
        call    malloc@PLT
        test    %rax, %rax
        jz      .Lstrndup_out
        mov     %rax, %rbx
        test    %r13, %r13
        jz      .Lstrndup_term
        mov     %rbx, %rdi
        mov     %r12, %rsi
        mov     %r13, %rdx
        call    memcpy@PLT
.Lstrndup_term:
        movb    $0, (%rbx, %r13, 1)
        mov     %rbx, %rax
.Lstrndup_out:
        EPILOGUE
        ret
ENDFUNC cepis__strndup

FUNC cepis__strdup
        PROLOGUE 8
        test    %rdi, %rdi
        jz      .Lstrdup_null
        mov     %rdi, %rbx
        call    strlen@PLT
        mov     %rbx, %rdi
        mov     %rax, %rsi
        call    cepis__strndup
        EPILOGUE
        ret
.Lstrdup_null:
        xor     %eax, %eax
        EPILOGUE
        ret
ENDFUNC cepis__strdup

FUNC cepis__empty
        PROLOGUE 8
        lea     .Lempty_str(%rip), %rdi
        xor     %esi, %esi
        call    cepis__strndup
        EPILOGUE
        ret
ENDFUNC cepis__empty

FUNC cepis__buf_reserve
        PROLOGUE 24
        mov     %rdi, %rbx
        mov     B_LEN(%rbx), %rax
        add     %rsi, %rax
        add     $1, %rax
        cmp     B_CAP(%rbx), %rax
        jbe     .Lreserve_ok
        mov     %rax, %r12
        mov     B_CAP(%rbx), %r13
        test    %r13, %r13
        jnz     .Lreserve_grow
        mov     $64, %r13
.Lreserve_grow:
        cmp     %r12, %r13
        jae     .Lreserve_alloc
        shl     $1, %r13
        jmp     .Lreserve_grow
.Lreserve_alloc:
        mov     B_DATA(%rbx), %rdi
        mov     %r13, %rsi
        call    realloc@PLT
        test    %rax, %rax
        jz      .Lreserve_fail
        mov     %rax, B_DATA(%rbx)
        mov     %r13, B_CAP(%rbx)
.Lreserve_ok:
        xor     %eax, %eax
        EPILOGUE
        ret
.Lreserve_fail:
        mov     $-1, %eax
        EPILOGUE
        ret
ENDFUNC cepis__buf_reserve

FUNC cepis__buf_append
        PROLOGUE 24
        mov     %rdi, %rbx
        mov     %rsi, %r12
        mov     %rdx, %r13
        mov     %rbx, %rdi
        mov     %r13, %rsi
        call    cepis__buf_reserve
        test    %eax, %eax
        jnz     .Lappend_fail
        test    %r13, %r13
        jz      .Lappend_term
        mov     B_DATA(%rbx), %rdi
        add     B_LEN(%rbx), %rdi
        mov     %r12, %rsi
        mov     %r13, %rdx
        call    memcpy@PLT
.Lappend_term:
        add     %r13, B_LEN(%rbx)
        mov     B_DATA(%rbx), %rax
        mov     B_LEN(%rbx), %rcx
        movb    $0, (%rax, %rcx, 1)
        xor     %eax, %eax
        EPILOGUE
        ret
.Lappend_fail:
        mov     $-1, %eax
        EPILOGUE
        ret
ENDFUNC cepis__buf_append

FUNC cepis__buf_appendc
        PROLOGUE 24
        mov     %esi, %eax
        movb    %al, LOCAL0(%rbp)
        lea     LOCAL0(%rbp), %rsi
        mov     $1, %rdx
        call    cepis__buf_append
        EPILOGUE
        ret
ENDFUNC cepis__buf_appendc

FUNC cepis__buf_appendz
        PROLOGUE 24
        test    %rsi, %rsi
        jz      .Lappendz_ok
        mov     %rdi, %rbx
        mov     %rsi, %r12
        mov     %rsi, %rdi
        call    strlen@PLT
        mov     %rbx, %rdi
        mov     %r12, %rsi
        mov     %rax, %rdx
        call    cepis__buf_append
        EPILOGUE
        ret
.Lappendz_ok:
        xor     %eax, %eax
        EPILOGUE
        ret
ENDFUNC cepis__buf_appendz

FUNC cepis__buf_reset
        movq    $0, B_LEN(%rdi)
        mov     B_DATA(%rdi), %rax
        test    %rax, %rax
        jz      .Lreset_out
        movb    $0, (%rax)
.Lreset_out:
        ret
ENDFUNC cepis__buf_reset

FUNC cepis__buf_free
        PROLOGUE 8
        mov     %rdi, %rbx
        mov     B_DATA(%rbx), %rdi
        test    %rdi, %rdi
        jz      .Lbfree_zero
        call    free@PLT
.Lbfree_zero:
        movq    $0, B_DATA(%rbx)
        movq    $0, B_LEN(%rbx)
        movq    $0, B_CAP(%rbx)
        EPILOGUE
        ret
ENDFUNC cepis__buf_free

FUNC cepis__buf_take
        mov     B_DATA(%rdi), %rax
        movq    $0, B_DATA(%rdi)
        movq    $0, B_LEN(%rdi)
        movq    $0, B_CAP(%rdi)
        ret
ENDFUNC cepis__buf_take

        .section .rodata
.Lempty_str:
        .byte   0

        .section .note.GNU-stack,"",@progbits