[movitz-cvs] CVS update: movitz/losp/muerte/bignums.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Wed Sep 22 16:22:45 UTC 2004
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv6775
Modified Files:
bignums.lisp
Log Message:
Various fixes for stack discipline.
Date: Wed Sep 22 18:22:45 2004
Author: ffjeld
Index: movitz/losp/muerte/bignums.lisp
diff -u movitz/losp/muerte/bignums.lisp:1.9 movitz/losp/muerte/bignums.lisp:1.10
--- movitz/losp/muerte/bignums.lisp:1.9 Tue Sep 21 16:24:03 2004
+++ movitz/losp/muerte/bignums.lisp Wed Sep 22 18:22:45 2004
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Created at: Sat Jul 17 19:42:57 2004
;;;;
-;;;; $Id: bignums.lisp,v 1.9 2004/09/21 14:24:03 ffjeld Exp $
+;;;; $Id: bignums.lisp,v 1.10 2004/09/22 16:22:45 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -64,18 +64,7 @@
(defun copy-bignum (old)
(check-type old bignum)
- (%shallow-copy-object old (1+ (%bignum-bigits old)))
- #+ignore
- (let* ((length (%bignum-bigits old))
- (new (malloc-non-pointer-words (1+ length))))
- (with-inline-assembly (:returns :eax)
- (:compile-two-forms (:eax :ebx) new old)
- (:compile-form (:result-mode :edx) length)
- copy-bignum-loop
- (:movl (:ebx :edx (:offset movitz-bignum type)) :ecx)
- (:movl :ecx (:eax :edx (:offset movitz-bignum type)))
- (:subl 4 :edx)
- (:jnc 'copy-bignum-loop))))
+ (%shallow-copy-object old (1+ (%bignum-bigits old))))
(defun %make-bignum (bigits)
(assert (plusp bigits))
@@ -381,27 +370,29 @@
(:compile-form (:result-mode :ecx) short-shift)
(:shrl ,movitz:+movitz-fixnum-shift+ :ecx)
(:jz 'done)
- (:xorl :edx :edx) ; counter
- (:movw (:ebx (:offset movitz-bignum length)) :dx)
- (:subl 4 :edx)
+ (:xorl :esi :esi) ; counter
+ (:movw (:ebx (:offset movitz-bignum length)) :si)
+ (:subl 4 :esi)
(:jz 'shift-short-lsb)
(:xorl :eax :eax)
(:std)
;; Overflow check
- (:movl (:ebx :edx (:offset movitz-bignum bigit0))
+ (:movl (:ebx :esi (:offset movitz-bignum bigit0))
:eax)
- (:xorl :esi :esi)
- (:shldl :cl :eax :esi)
+ (:xorl :edx :edx)
+ (:shldl :cl :eax :edx)
(jnz 'overflow)
shift-short-loop
- (:movl (:ebx :edx (:offset movitz-bignum bigit0 -4))
+ (:int 32)
+ (:movl (:ebx :esi (:offset movitz-bignum bigit0 -4))
:eax)
- (:shldl :cl :eax (:ebx :edx (:offset movitz-bignum bigit0)))
- (:subl 4 :edx)
+ (:shldl :cl :eax (:ebx :esi (:offset movitz-bignum bigit0)))
+ (:subl 4 :esi)
(:jnz 'shift-short-loop)
- (:movl (:ebp -4) :esi)
+ (:movl :edi :edx)
(:movl :edi :eax) ; Safe EAX
(:cld)
+ (:movl (:ebp -4) :esi)
shift-short-lsb
(:shll :cl (:ebx (:offset movitz-bignum bigit0)))
done
@@ -428,7 +419,6 @@
(:xorl :edx :edx) ; Initial carry
(:std) ; Make EAX, EDX non-GC-roots.
multiply-loop
- (:movl :esi (#x1000000))
(:movl (:ebx :esi (:offset movitz-bignum bigit0))
:eax)
(:movl :edx :ecx) ; Save carry in ECX
@@ -459,9 +449,9 @@
(:compile-two-forms (:ebx :ecx) bignum divisor)
(:xorl :edx :edx) ; hi-digit
(:sarl ,movitz:+movitz-fixnum-shift+ :ecx)
- (:std)
- (:xorl :esi :esi)
+ (:xorl :esi :esi) ; ESI is counter by 4
(:movw (:ebx (:offset movitz-bignum length)) :si)
+ (:std)
divide-loop
(:movl (:ebx :esi (:offset movitz-bignum bigit0 -4))
:eax) ; lo-digit
More information about the Movitz-cvs
mailing list