Collatz_problem/collatz.S
2025-08-26 06:11:33 +03:00

36 lines
825 B
ArmAsm
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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