diff options
| author | Murilo Ijanc <[email protected]> | 2026-07-26 12:56:51 -0300 |
|---|---|---|
| committer | Murilo Ijanc <[email protected]> | 2026-07-26 12:56:59 -0300 |
| commit | b7b08a7d29d84de187dd8a55e0c94de66b07a572 (patch) | |
| tree | 7e55661d3eca3cf3b16aada6e87eabee68802fb9 /src/util.S | |
| download | asm-b7b08a7d29d84de187dd8a55e0c94de66b07a572.tar.gz | |
Initial importv0.1.0
Diffstat (limited to 'src/util.S')
| -rw-r--r-- | src/util.S | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/src/util.S b/src/util.S new file mode 100644 index 0000000..447f66c --- /dev/null +++ b/src/util.S @@ -0,0 +1,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 |