lama_byterun/runtime/printf.s

165 lines
3.4 KiB
ArmAsm
Raw Normal View History

2024-02-07 12:12:46 +01:00
.data
2024-02-05 14:18:06 +01:00
2024-04-09 22:46:48 +03:00
.global _Lprintf
.extern _Bprintf
2024-02-05 14:18:06 +01:00
2024-04-09 22:46:48 +03:00
.global _Lfprintf
.extern _Bfprintf
2024-02-05 14:18:06 +01:00
2024-04-09 22:46:48 +03:00
.global _Lsprintf
.extern _Bsprintf
2024-02-06 10:27:27 +01:00
2024-04-09 22:46:48 +03:00
.global _Lfailure
.extern _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-04-09 22:46:48 +03:00
_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-04-09 22:46:48 +03:00
_Lprintf_loop:
movq $0, %r12
cmpq %r11, %r12
2024-04-09 22:46:48 +03:00
jz _Lprintf_continue
decq %r11
movq (%rax), %r10
testq $1, %r10
2024-04-09 22:46:48 +03:00
jz _Lprintf_loop_end
# unbox value
sarq %r10
movq %r10, (%rax)
2024-04-09 22:46:48 +03:00
_Lprintf_loop_end:
addq $8, %rax
2024-04-09 22:46:48 +03:00
jmp _Lprintf_loop
_Lprintf_continue:
popq %rsi
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
jmp _Bprintf
2024-04-09 22:46:48 +03:00
_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-04-09 22:46:48 +03:00
_Lfprintf_loop:
2024-02-06 10:27:27 +01:00
movq $0, %r12
cmpq %r11, %r12
2024-04-09 22:46:48 +03:00
jz _Lfprintf_continue
2024-02-06 10:27:27 +01:00
decq %r11
movq (%rax), %r10
testq $1, %r10
2024-04-09 22:46:48 +03:00
jz _Lfprintf_loop_end
2024-02-06 10:27:27 +01:00
# unbox value
sarq %r10
movq %r10, (%rax)
2024-04-09 22:46:48 +03:00
_Lfprintf_loop_end:
2024-02-06 10:27:27 +01:00
addq $8, %rax
2024-04-09 22:46:48 +03:00
jmp _Lfprintf_loop
_Lfprintf_continue:
2024-02-06 10:27:27 +01:00
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
jmp _Bfprintf
2024-02-06 10:27:27 +01:00
2024-04-09 22:46:48 +03:00
_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-04-09 22:46:48 +03:00
_Lsprintf_loop:
2024-02-06 10:27:27 +01:00
movq $0, %r12
cmpq %r11, %r12
2024-04-09 22:46:48 +03:00
jz _Lsprintf_continue
2024-02-06 10:27:27 +01:00
decq %r11
movq (%rax), %r10
testq $1, %r10
2024-04-09 22:46:48 +03:00
jz _Lsprintf_loop_end
2024-02-06 10:27:27 +01:00
# unbox value
sarq %r10
movq %r10, (%rax)
2024-04-09 22:46:48 +03:00
_Lsprintf_loop_end:
2024-02-06 10:27:27 +01:00
addq $8, %rax
2024-04-09 22:46:48 +03:00
jmp _Lsprintf_loop
_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
jmp _Bsprintf
2024-02-06 10:27:27 +01:00
2024-04-09 22:46:48 +03:00
_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-04-09 22:46:48 +03:00
_Lfailure_loop:
2024-02-06 10:27:27 +01:00
movq $0, %r12
cmpq %r11, %r12
2024-04-09 22:46:48 +03:00
jz _Lfailure_continue
2024-02-06 10:27:27 +01:00
decq %r11
movq (%rax), %r10
testq $1, %r10
2024-04-09 22:46:48 +03:00
jz _Lfailure_loop_end
2024-02-06 10:27:27 +01:00
# unbox value
sarq %r10
movq %r10, (%rax)
2024-04-09 22:46:48 +03:00
_Lfailure_loop_end:
2024-02-06 10:27:27 +01:00
addq $8, %rax
2024-04-09 22:46:48 +03:00
jmp _Lfailure_loop
_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
jmp _failure