36 lines
825 B
ArmAsm
36 lines
825 B
ArmAsm
# bedir t karaabalı
|
||
# 2025
|
||
# collatz problem
|
||
|
||
.text
|
||
# void collatz_len_and_peek(uint64_t x, uint64_t *steps, uint64_t *peek)
|
||
.global collatz_len_and_peek
|
||
collatz_len_and_peek:
|
||
# Collatz problem implementation
|
||
# x -> rdi, steps -> rsi, peak -> rdx
|
||
|
||
movq $0, (%rsi) # *steps=0
|
||
movq %rdi, (%rdx) # *peak = x
|
||
movq %rdi, %r8 # r8(n) (caller-saved) = x
|
||
|
||
.loop:
|
||
cmpq $1, %r8 # while (n != 1)
|
||
je .done
|
||
testq $1, %r8 # 1 and n
|
||
jz .even
|
||
# odd case
|
||
leaq (%r8, %r8, 2), %r8 # n *= 3 -> lea base + index * scale
|
||
addq $1,%r8 # n += 1
|
||
jmp .next_step
|
||
.even:
|
||
shrq $1, %r8 # n /= 2
|
||
.next_step:
|
||
cmpq (%rdx), %r8 # if (n > *peek) n - *peek
|
||
jle .next
|
||
movq %r8, (%rdx) # *peek = n
|
||
.next:
|
||
addq $1, (%rsi) # (*steps)++
|
||
jmp .loop
|
||
.done:
|
||
ret
|