The C equivalent of this program was 2.5 times slower even with -O2. Compilers really are stupid.
.global _main
.align 2
#define BASEREG x17
.data
chars:
.quad 4
.quad 'A'
.quad 'B'
.quad 'C'
.quad 'D'
.text
_main:
// Standard macOS ARM64 stack frame
stp x29, x30, [sp, #-16]!
mov x29, sp
mov BASEREG, x29
// print_char('A')
;mov x0, #'A'
;bl _print_char
b print_arr
// Return 0
mov w0, #0
// Restore frame
ldp x29, x30, [sp], #16
ret
print_arr:
adrp x1, chars@PAGE
ldr x0, [x1, 8]
bl _print_char
adrp x1, chars@PAGE
ldr x0, [x1, 8]
sub sp, sp, #64
mov x0, x1
mov x1, sp
bl cpy_arr
b exit_syscall
cpy_arr:
// Create stack frame
stp x29, x30, [sp, #-16]!
mov x29, sp
;mov x0, #'A'
;bl _print_char
ldr x2, [x0]
1:
ldr x3, [x0, x2]
str x3, [x1, x2]
sub x2, x2, #1
cmp x2, 0
b.gt 1b
ldr x0, [x1, #8]
bl _print_char
// Restore frame
ldp x29, x30, [sp], #16
ret
ret