This might help: divide an arbint by a uint64
authorDavid Gow <[email protected]>
Sat, 5 Jul 2014 16:32:16 +0000 (00:32 +0800)
committerDavid Gow <[email protected]>
Sat, 5 Jul 2014 16:32:16 +0000 (00:32 +0800)
src/div_digits_asm.s [new file with mode: 0644]

diff --git a/src/div_digits_asm.s b/src/div_digits_asm.s
new file mode 100644 (file)
index 0000000..b11dd92
--- /dev/null
@@ -0,0 +1,28 @@
+.section .text
+.globl div_digits
+.type div_digits, @function
+
+# div_digits(digits, div, size, res, rem)
+# divides an arbint in digits by uint64 div into res with remainder rem
+# Either res or rem may alias digits
+# digits = rdi, div = rsx, size = rdx, res = rcx, rem = r8
+div_digits:
+       movq %rdx, %r9
+       leaq -8(%rdi,%r9,8), %rdi       # We want to point to the end of the buffer (LSB)
+       leaq -8(%rcx,%r9,8), %rcx       # We want to point to the end of the buffer (LSB)
+       leaq -8(%r8,%r9,8), %r8         # We want to point to the end of the buffer (LSB)
+       movq $0, %rdx
+loop:
+       movq (%rdi), %rax
+       divq %rsi                       # rdx:rax/rsi => rax, rdx:rax%rsi => rdx
+       movq %rax, (%rcx)
+       movq %rdx, (%r8)
+       dec %r9
+       leaq -8(%rdi), %rdi
+       leaq -8(%rcx), %rcx
+       leaq -8(%r8), %r8
+       jnz loop
+end:
+       ret
+       
+       

UCC git Repository :: git.ucc.asn.au