[movitz-cvs] CVS update: movitz/losp/muerte/bignums.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Tue Sep 21 13:06:47 UTC 2004


Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv17883

Modified Files:
	bignums.lisp 
Log Message:
Re-worked the atomically protocol. There is now one run-time-context
field, atomically-continuation, whose semantics is slightly different
from the old atomically-status and atomically-esp.

Date: Tue Sep 21 15:06:46 2004
Author: ffjeld

Index: movitz/losp/muerte/bignums.lisp
diff -u movitz/losp/muerte/bignums.lisp:1.7 movitz/losp/muerte/bignums.lisp:1.8
--- movitz/losp/muerte/bignums.lisp:1.7	Wed Sep 15 12:22:59 2004
+++ movitz/losp/muerte/bignums.lisp	Tue Sep 21 15:06: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.7 2004/09/15 10:22:59 ffjeld Exp $
+;;;; $Id: bignums.lisp,v 1.8 2004/09/21 13:06:45 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -102,8 +102,7 @@
   (check-type delta fixnum)
   (macrolet
       ((do-it ()
-	 `(with-inline-assembly (:returns :eax :labels (retry-not-size1
-							not-size1
+	 `(with-inline-assembly (:returns :eax :labels (not-size1
 							copy-bignum-loop
 							add-bignum-loop
 							add-bignum-done
@@ -111,25 +110,33 @@
 							pfix-pbig-done))
 	    (:compile-two-forms (:eax :ebx) bignum delta)
 	    (:testl :ebx :ebx)
-	    (:jz 'pfix-pbig-done)
+	    (:jz 'pfix-pbig-done)	; EBX=0 => nothing to do.
 	    (:movzxw (:eax (:offset movitz-bignum length)) :ecx)
 	    (:cmpl ,movitz:+movitz-fixnum-factor+ :ecx)
 	    (:jne 'not-size1)
 	    (:compile-form (:result-mode :ecx) delta)
 	    (:shrl ,movitz:+movitz-fixnum-shift+ :ecx)
 	    (:addl (:eax (:offset movitz-bignum bigit0)) :ecx)
-	    (:jc 'retry-not-size1)
+	    (:jc 'not-size1)
 	    (:call-local-pf box-u32-ecx)
 	    (:jmp 'pfix-pbig-done)
-	   retry-not-size1
+
+	   not-size1
+	    ;; Set up atomically continuation.
+	    (:declare-label-set restart-jumper (restart-addition))
+	    (:locally (:pushl (:edi (:edi-offset :dynamic-env))))
+	    (:pushl 'restart-jumper)
+	    ;; ..this allows us to detect recursive atomicallies.
+	    (:locally (:pushl (:edi (:edi-offset :atomically-continuation))))
+	    (:pushl :ebp)
+	   restart-addition
+
+	    (:movl (:esp) :ebp)
 	    (:compile-form (:result-mode :eax) bignum)
 	    (:movzxw (:eax (:offset movitz-bignum length)) :ecx)
-	   not-size1
-	    (:declare-label-set retry-jumper (retry-not-size1))
-	    (:locally (:movl :esp (:edi (:edi-offset atomically-esp))))
-	    (:locally (:movl '(:funcall ,(movitz::atomically-status-jumper-fn t :esp)
-			       'retry-jumper)
-			     (:edi (:edi-offset atomically-status))))
+
+	    (:locally (:movl :esp (:edi (:edi-offset :atomically-continuation))))
+	    ;; Now inside atomically section.
 	    (:leal ((:ecx 1) ,(* 2 movitz:+movitz-fixnum-factor+))
 		   :eax)		; Number of words
 	    (:call-local-pf get-cons-pointer)
@@ -162,9 +169,10 @@
 	    (:addl ,movitz:+movitz-fixnum-factor+ :ecx)
 	   no-expansion
 	    (:call-local-pf cons-commit)
-	    (:locally (:movl ,(bt:enum-value 'movitz::atomically-status :inactive)
-			     (:edi (:edi-offset atomically-status))))
-		   
+	    ;; Exit atomically block.
+	    (:locally (:movl 0 (:edi (:edi-offset atomically-continuation))))
+	    (:leal (:esp 16) :esp)
+	    
 	   pfix-pbig-done)))
     (do-it)))
 





More information about the Movitz-cvs mailing list