.section .text .globl mul_digits .type mul_digits, @function #ifdef __x86_64__ # Multiply an array of 64 bit digits by *one* 64 bit digit, modifies the array in place mul_digits: movq %rdx, %rcx # rdx is reserved for mulq, use rcx as counter movq $0, %r12 # Overflow register loop: movq %rsi, %rax # Value to multiply in %rax mulq (%rdi) # Multiply, stored in %rdx:%rax (ie: we get TWO digits) # Add overflow from previous operation add %r12, %rax # Upper digit gets saved as next overflow movq %rdx, %r12 # Lower digit goes in current array position movq %rax, (%rdi) dec %rcx # Decrement counter jz end_loop # We are done # Move to next element in the array leaq 8(,%rdi,1), %rdi jmp loop # Repeat end_loop: end: movq %r12, %rax # Return overflow ret # We are done #else mul_digits: ret #endif