[movitz-cvs] CVS update: movitz/losp/muerte/functions.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Mon Aug 16 15:28:07 UTC 2004
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv30595
Modified Files:
functions.lisp
Log Message:
Fixed funobj-code-vector%{1,2,3}op to not assume code-vectors are all
#x100 bytes long, and to be somewhat resistant to GC activiy.
Date: Mon Aug 16 08:28:07 2004
Author: ffjeld
Index: movitz/losp/muerte/functions.lisp
diff -u movitz/losp/muerte/functions.lisp:1.17 movitz/losp/muerte/functions.lisp:1.18
--- movitz/losp/muerte/functions.lisp:1.17 Tue Jul 20 05:58:34 2004
+++ movitz/losp/muerte/functions.lisp Mon Aug 16 08:28:07 2004
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Created at: Tue Mar 12 22:58:54 2002
;;;;
-;;;; $Id: functions.lisp,v 1.17 2004/07/20 12:58:34 ffjeld Exp $
+;;;; $Id: functions.lisp,v 1.18 2004/08/16 15:28:07 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -115,24 +115,31 @@
as that vector."
(check-type funobj function)
(with-inline-assembly (:returns :eax)
- (:compile-form (:result-mode :eax) funobj)
- (:movl (:eax #.(bt::slot-offset 'movitz:movitz-funobj 'movitz:code-vector)) :ebx) ; EBX = code-vector
- (:movl (:eax #.(bt::slot-offset 'movitz:movitz-funobj 'movitz:code-vector%1op)) :eax) ; EAX = code-vector%1op
- ;; determine if EAX is a pointer into EBX
- (:cmpl :ebx :eax)
+ retry
+ (:declare-label-set retry-jumper (retry))
+ (:locally (:movl '(:funcall #.(movitz::atomically-status-jumper-fn t)
+ 'retry-jumper)
+ (:edi (:edi-offset atomically-status))))
+ (:compile-form (:result-mode :ebx) funobj)
+ (:movl (:ebx (:offset movitz-funobj code-vector)) :eax) ; EAX = code-vector
+ (:movl (:ebx (:offset movitz-funobj code-vector%1op)) :ecx)
+ ;; determine if ECX is a pointer into EBX
+ (:subl :eax :ecx)
(:jl 'return-vector)
- (:andb #xf8 :bl)
- (:addl #x100 :ebx)
- (:cmpl :ebx :eax)
+ (:leal ((:ecx #.movitz:+movitz-fixnum-factor+)) :ecx)
+ (:cmpl (:ebx (:offset movitz-basic-vector num-elements)) :ecx)
(:jg 'return-vector)
;; return the integer offset EAX-EBX
- (:subl #x100 :ebx)
- (:subl :ebx :eax)
- (:shll #.movitz:+movitz-fixnum-shift+ :eax)
+ (:movl :ecx :eax)
(:jmp 'done)
- return-vector
- (:subl 2 :eax)
- done)) ; this cell stores word+2
+ return-vector
+ (:testl 7 (:ebx (:offset movitz-funobj code-vector%1op)))
+ (:jnz '(:sub-program () (:int 63)))
+ (:movl #xfffffffe :eax)
+ (:addl (:ebx (:offset movitz-funobj code-vector%1op)) :eax)
+ done
+ (:locally (:movl #.(bt:enum-value 'movitz::atomically-status :inactive)
+ (:edi (:edi-offset atomically-status)))))) ; this cell stores word+2
(defun (setf funobj-code-vector%1op) (code-vector funobj)
(check-type funobj function)
@@ -160,24 +167,31 @@
as that vector."
(check-type funobj function)
(with-inline-assembly (:returns :eax)
- (:compile-form (:result-mode :eax) funobj)
- (:movl (:eax #.(bt::slot-offset 'movitz:movitz-funobj 'movitz:code-vector)) :ebx) ; EBX = code-vector
- (:movl (:eax #.(bt::slot-offset 'movitz:movitz-funobj 'movitz:code-vector%2op)) :eax) ; EAX = code-vector%1op
- ;; determine if EAX is a pointer into EBX
- (:cmpl :ebx :eax)
+ retry
+ (:declare-label-set retry-jumper (retry))
+ (:locally (:movl '(:funcall #.(movitz::atomically-status-jumper-fn t)
+ 'retry-jumper)
+ (:edi (:edi-offset atomically-status))))
+ (:compile-form (:result-mode :ebx) funobj)
+ (:movl (:ebx (:offset movitz-funobj code-vector)) :eax) ; EAX = code-vector
+ (:movl (:ebx (:offset movitz-funobj code-vector%2op)) :ecx)
+ ;; determine if ECX is a pointer into EBX
+ (:subl :eax :ecx)
(:jl 'return-vector)
- (:andb #xf8 :bl)
- (:addl #x100 :ebx)
- (:cmpl :ebx :eax)
+ (:leal ((:ecx #.movitz:+movitz-fixnum-factor+)) :ecx)
+ (:cmpl (:ebx (:offset movitz-basic-vector num-elements)) :ecx)
(:jg 'return-vector)
;; return the integer offset EAX-EBX
- (:subl #x100 :ebx)
- (:subl :ebx :eax)
- (:shll #.movitz:+movitz-fixnum-shift+ :eax)
+ (:movl :ecx :eax)
(:jmp 'done)
- return-vector
- (:subl 2 :eax)
- done))
+ return-vector
+ (:testl 7 (:ebx (:offset movitz-funobj code-vector%2op)))
+ (:jnz '(:sub-program () (:int 63)))
+ (:movl #xfffffffe :eax)
+ (:addl (:ebx (:offset movitz-funobj code-vector%2op)) :eax)
+ done
+ (:locally (:movl #.(bt:enum-value 'movitz::atomically-status :inactive)
+ (:edi (:edi-offset atomically-status))))))
(defun (setf funobj-code-vector%2op) (code-vector funobj)
(check-type funobj function)
@@ -205,24 +219,31 @@
as that vector."
(check-type funobj function)
(with-inline-assembly (:returns :eax)
- (:compile-form (:result-mode :eax) funobj)
- (:movl (:eax #.(bt::slot-offset 'movitz:movitz-funobj 'movitz:code-vector)) :ebx) ; EBX = code-vector
- (:movl (:eax #.(bt::slot-offset 'movitz:movitz-funobj 'movitz:code-vector%3op)) :eax) ; EAX = code-vector%1op
- ;; determine if EAX is a pointer into EBX
- (:cmpl :ebx :eax)
+ retry
+ (:declare-label-set retry-jumper (retry))
+ (:locally (:movl '(:funcall #.(movitz::atomically-status-jumper-fn t)
+ 'retry-jumper)
+ (:edi (:edi-offset atomically-status))))
+ (:compile-form (:result-mode :ebx) funobj)
+ (:movl (:ebx (:offset movitz-funobj code-vector)) :eax) ; EAX = code-vector
+ (:movl (:ebx (:offset movitz-funobj code-vector%3op)) :ecx)
+ ;; determine if ECX is a pointer into EBX
+ (:subl :eax :ecx)
(:jl 'return-vector)
- (:andb #xf8 :bl)
- (:addl #x100 :ebx)
- (:cmpl :ebx :eax)
+ (:leal ((:ecx #.movitz:+movitz-fixnum-factor+)) :ecx)
+ (:cmpl (:ebx (:offset movitz-basic-vector num-elements)) :ecx)
(:jg 'return-vector)
;; return the integer offset EAX-EBX
- (:subl #x100 :ebx)
- (:subl :ebx :eax)
- (:shll #.movitz:+movitz-fixnum-shift+ :eax)
+ (:movl :ecx :eax)
(:jmp 'done)
- return-vector
- (:subl 2 :eax)
- done))
+ return-vector
+ (:testl 7 (:ebx (:offset movitz-funobj code-vector%3op)))
+ (:jnz '(:sub-program () (:int 63)))
+ (:movl #xfffffffe :eax)
+ (:addl (:ebx (:offset movitz-funobj code-vector%3op)) :eax)
+ done
+ (:locally (:movl #.(bt:enum-value 'movitz::atomically-status :inactive)
+ (:edi (:edi-offset atomically-status))))))
(defun (setf funobj-code-vector%3op) (code-vector funobj)
(check-type funobj function)
More information about the Movitz-cvs
mailing list