lama_byterun/runtime/printf.s

163 lines
3.3 KiB
ArmAsm
Raw Normal View History

2024-02-05 14:18:06 +01:00
.section .text
.global Lprintf
2024-02-06 15:39:33 +01:00
.extern Bprintf
2024-02-05 14:18:06 +01:00
.global Lfprintf
2024-02-06 15:39:33 +01:00
.extern Bfprintf
2024-02-05 14:18:06 +01:00
.global Lsprintf
2024-02-06 10:27:27 +01:00
.extern Bsprintf
.global Lfailure
.extern failure
2024-02-05 14:18:06 +01:00
.extern cnt_percentage_sign
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-02-06 15:39:33 +01:00
Lprintf_loop:
movq $0, %r12
cmpq %r11, %r12
2024-02-06 15:39:33 +01:00
jz Lprintf_continue
decq %r11
movq (%rax), %r10
testq $1, %r10
2024-02-06 15:39:33 +01:00
jz Lprintf_loop_end
# unbox value
sarq %r10
movq %r10, (%rax)
2024-02-06 15:39:33 +01:00
Lprintf_loop_end:
addq $8, %rax
2024-02-06 15:39:33 +01:00
jmp Lprintf_loop
Lprintf_continue:
popq %rsi
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
2024-02-06 15:39:33 +01:00
jmp Bprintf
2024-02-06 10:27:27 +01:00
Lfprintf:
# 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
Lfprintf_loop:
movq $0, %r12
cmpq %r11, %r12
jz Lfprintf_continue
decq %r11
movq (%rax), %r10
testq $1, %r10
jz Lfprintf_loop_end
# unbox value
sarq %r10
movq %r10, (%rax)
Lfprintf_loop_end:
addq $8, %rax
jmp Lfprintf_loop
Lfprintf_continue:
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
2024-02-06 15:39:33 +01:00
jmp Bfprintf
2024-02-06 10:27:27 +01:00
Lsprintf:
# 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
Lsprintf_loop:
movq $0, %r12
cmpq %r11, %r12
jz Lsprintf_continue
decq %r11
movq (%rax), %r10
testq $1, %r10
jz Lsprintf_loop_end
# unbox value
sarq %r10
movq %r10, (%rax)
Lsprintf_loop_end:
addq $8, %rax
jmp Lsprintf_loop
Lsprintf_continue:
popq %rsi
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
jmp Bsprintf
Lfailure:
# 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
Lfailure_loop:
movq $0, %r12
cmpq %r11, %r12
jz Lfailure_continue
decq %r11
movq (%rax), %r10
testq $1, %r10
jz Lfailure_loop_end
# unbox value
sarq %r10
movq %r10, (%rax)
Lfailure_loop_end:
addq $8, %rax
jmp Lfailure_loop
Lfailure_continue:
popq %rsi
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
jmp failure