.section .text
.globl sub_digits
.type sub_digits, @function
# Subtract two arrays of 64 bit digits, with carry, modifying the first argument
# Address at first argument %rdi is array to add and modify
# Address at second %rsi will be added (not modified)
# Third argument is counter of number of digits
# Result in %rax is the final result in the carry flag
# Exploits the fact that inc and dec do not affect the carry flag
sub_digits:
subq $0, %rax # Reset the carry/borrow flag
loop:
movq (%rsi), %rax # Temporarily store digit from second array
sbbq %rax, (%rdi) # Subtract digits in second and first array, store in first
dec %rdx # Decrement counter
jz end_loop # We are done
# Move to next element in the first array
leaq 8(,%rdi,1), %rdi
# Move to next element in the second array
leaq 8(,%rsi,1), %rsi
jmp loop # Repeat
end_loop:
movq $0, %rax
jnc end
movq $1, %rax
end:
ret # We are done