summaryrefslogtreecommitdiffstats
path: root/src/util.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.S')
-rw-r--r--src/util.S190
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