lama_byterun/runtime/printf.S

170 lines
3.8 KiB
ArmAsm
Raw Permalink Normal View History

2024-07-01 11:37:41 +02:00
#ifdef __linux__
#define PREFIXED(name) name
#elif defined(__APPLE__)
#define PREFIXED(name) _##name
#endif
2024-02-07 12:12:46 +01:00
.data
2024-02-05 14:18:06 +01:00
2024-07-01 11:37:41 +02:00
.global PREFIXED(Lprintf)
.extern PREFIXED(Bprintf)
2024-02-05 14:18:06 +01:00
2024-07-01 11:37:41 +02:00
.global PREFIXED(Lfprintf)
.extern PREFIXED(Bfprintf)
2024-02-05 14:18:06 +01:00
2024-07-01 11:37:41 +02:00
.global PREFIXED(Lsprintf)
.extern PREFIXED(Bsprintf)
2024-02-06 10:27:27 +01:00
2024-07-01 11:37:41 +02:00
.global PREFIXED(Lfailure)
.extern PREFIXED(failure)
2024-02-05 14:18:06 +01:00
2024-02-07 12:12:46 +01:00
.extern cnt_percentage_sign
.text
2024-02-05 14:18:06 +01:00
2024-07-01 11:37:41 +02:00
PREFIXED(Lprintf):
# save return address
popq %r14
pushq %r9
pushq %r8
pushq %rcx
pushq %rdx
pushq %rsi
movq %rsp, %rax
# rdi --- format string
# r11 --- number of arguments except format string
2024-07-01 11:37:41 +02:00
PREFIXED(Lprintf_loop):
movq $0, %r12
cmpq %r11, %r12
2024-07-01 11:37:41 +02:00
jz PREFIXED(Lprintf_continue)
decq %r11
movq (%rax), %r10
testq $1, %r10
2024-07-01 11:37:41 +02:00
jz PREFIXED(Lprintf_loop_end)
# unbox value
sarq %r10
movq %r10, (%rax)
2024-07-01 11:37:41 +02:00
PREFIXED(Lprintf_loop_end):
addq $8, %rax
2024-07-01 11:37:41 +02:00
jmp PREFIXED(Lprintf_loop)
PREFIXED(Lprintf_continue):
popq %rsi
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
2024-07-01 11:37:41 +02:00
jmp PREFIXED(Bprintf)
2024-07-01 11:37:41 +02:00
PREFIXED(Lfprintf):
2024-02-06 10:27:27 +01:00
# save return address
popq %r14
pushq %r9
pushq %r8
pushq %rcx
pushq %rdx
movq %rsp, %rax
# rdi --- FILE*
# rsi --- format string
# r11 --- number of arguments except format string
2024-07-01 11:37:41 +02:00
PREFIXED(Lfprintf_loop):
2024-02-06 10:27:27 +01:00
movq $0, %r12
cmpq %r11, %r12
2024-07-01 11:37:41 +02:00
jz PREFIXED(Lfprintf_continue)
2024-02-06 10:27:27 +01:00
decq %r11
movq (%rax), %r10
testq $1, %r10
2024-07-01 11:37:41 +02:00
jz PREFIXED(Lfprintf_loop_end)
2024-02-06 10:27:27 +01:00
# unbox value
sarq %r10
movq %r10, (%rax)
2024-07-01 11:37:41 +02:00
PREFIXED(Lfprintf_loop_end):
2024-02-06 10:27:27 +01:00
addq $8, %rax
2024-07-01 11:37:41 +02:00
jmp PREFIXED(Lfprintf_loop)
PREFIXED(Lfprintf_continue):
2024-02-06 10:27:27 +01:00
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
2024-07-01 11:37:41 +02:00
jmp PREFIXED(Bfprintf)
2024-02-06 10:27:27 +01:00
2024-07-01 11:37:41 +02:00
PREFIXED(Lsprintf):
2024-02-06 10:27:27 +01:00
# save return address
popq %r14
pushq %r9
pushq %r8
pushq %rcx
pushq %rdx
pushq %rsi
movq %rsp, %rax
# rdi --- format string
# r11 --- number of arguments except format string
2024-07-01 11:37:41 +02:00
PREFIXED(Lsprintf_loop):
2024-02-06 10:27:27 +01:00
movq $0, %r12
cmpq %r11, %r12
2024-07-01 11:37:41 +02:00
jz PREFIXED(Lsprintf_continue)
2024-02-06 10:27:27 +01:00
decq %r11
movq (%rax), %r10
testq $1, %r10
2024-07-01 11:37:41 +02:00
jz PREFIXED(Lsprintf_loop_end)
2024-02-06 10:27:27 +01:00
# unbox value
sarq %r10
movq %r10, (%rax)
2024-07-01 11:37:41 +02:00
PREFIXED(Lsprintf_loop_end):
2024-02-06 10:27:27 +01:00
addq $8, %rax
2024-07-01 11:37:41 +02:00
jmp PREFIXED(Lsprintf_loop)
PREFIXED(Lsprintf_continue):
2024-02-06 10:27:27 +01:00
popq %rsi
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
2024-07-01 11:37:41 +02:00
jmp PREFIXED(Bsprintf)
2024-02-06 10:27:27 +01:00
2024-07-01 11:37:41 +02:00
PREFIXED(Lfailure):
2024-02-06 10:27:27 +01:00
# save return address
popq %r14
pushq %r9
pushq %r8
pushq %rcx
pushq %rdx
pushq %rsi
movq %rsp, %rax
# rdi --- format string
# r11 --- number of arguments except format string
2024-07-01 11:37:41 +02:00
PREFIXED(Lfailure_loop):
2024-02-06 10:27:27 +01:00
movq $0, %r12
cmpq %r11, %r12
2024-07-01 11:37:41 +02:00
jz PREFIXED(Lfailure_continue)
2024-02-06 10:27:27 +01:00
decq %r11
movq (%rax), %r10
testq $1, %r10
2024-07-01 11:37:41 +02:00
jz PREFIXED(Lfailure_loop_end)
2024-02-06 10:27:27 +01:00
# unbox value
sarq %r10
movq %r10, (%rax)
2024-07-01 11:37:41 +02:00
PREFIXED(Lfailure_loop_end):
2024-02-06 10:27:27 +01:00
addq $8, %rax
2024-07-01 11:37:41 +02:00
jmp PREFIXED(Lfailure_loop)
PREFIXED(Lfailure_continue):
2024-02-06 10:27:27 +01:00
popq %rsi
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
2024-07-01 11:37:41 +02:00
jmp PREFIXED(failure)