[movitz-cvs] CVS update: movitz/losp/muerte/primitive-functions.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Wed Apr 14 17:54:52 UTC 2004
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv31456
Modified Files:
primitive-functions.lisp
Log Message:
Inlined dynamic-find-binding into dynamic-load and dynamic-store. I
expect the stack discipline to state that a primitive-function can't
call another primitive-function (in general).
Date: Wed Apr 14 13:54:51 2004
Author: ffjeld
Index: movitz/losp/muerte/primitive-functions.lisp
diff -u movitz/losp/muerte/primitive-functions.lisp:1.9 movitz/losp/muerte/primitive-functions.lisp:1.10
--- movitz/losp/muerte/primitive-functions.lisp:1.9 Tue Apr 13 09:28:31 2004
+++ movitz/losp/muerte/primitive-functions.lisp Wed Apr 14 13:54:51 2004
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Created at: Tue Oct 2 21:02:18 2001
;;;;
-;;;; $Id: primitive-functions.lisp,v 1.9 2004/04/13 13:28:31 ffjeld Exp $
+;;;; $Id: primitive-functions.lisp,v 1.10 2004/04/14 17:54:51 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -214,7 +214,8 @@
(define-primitive-function dynamic-find-binding (symbol)
"Search the stack for a dynamic binding of SYMBOL.
On success, return Carry=1, and the address of the
- binding in EAX. On failure, return Carry=0 and EAX unmodified."
+ binding in EAX. On failure, return Carry=0 and EAX unmodified.
+ Preserves EBX."
(with-inline-assembly (:returns :eax)
(:locally (:movl (:edi (:edi-offset dynamic-env)) :ecx))
(:jecxz 'fail)
@@ -241,16 +242,29 @@
(define-primitive-function dynamic-load (symbol)
"Load the dynamic value of SYMBOL into EAX."
(with-inline-assembly (:returns :multiple-values)
- (:call-global-constant dynamic-find-binding)
- (:movl :eax :edx)
- (:jnc 'no-binding)
- (:movl (:eax) :eax)
+ (:locally (:movl (:edi (:edi-offset dynamic-env)) :ecx))
+ (:jecxz 'no-stack-binding)
+ (:cmpl :eax (:ecx))
+ (:je 'success)
+ (:locally (:movl (:edi (:edi-offset stack-top)) :edx))
+ search-loop
+ (:cmpl :edx (:ecx 12))
+ (:jnc '(:sub-program () (:int 97)))
+ (:movl (:ecx 12) :ecx) ; parent
+ (:jecxz 'no-stack-binding)
+ (:cmpl :eax (:ecx)) ; compare name
+ (:jne 'search-loop)
+ ;; fall through on success
+ success
+ (:movl :eax :edx) ; Keep symbol in case it's unbound.
+ (:movl (:ecx 8) :eax)
(:globally (:cmpl (:edi (:edi-offset unbound-value)) :eax))
(:je '(:sub-program (unbound) (:int 99)))
(:ret)
- no-binding
- ;; take the global value of SYMBOL.
- (:movl (:eax #.(bt:slot-offset 'movitz::movitz-symbol 'movitz::value)) :eax)
+ no-stack-binding
+ ;; take the global value of SYMBOL, compare it against unbond-value
+ (:movl :eax :edx) ; Keep symbol in case it's unbound.
+ (:movl (:eax #.(bt:slot-offset 'movitz:movitz-symbol 'movitz::value)) :eax)
(:globally (:cmpl (:edi (:edi-offset unbound-value)) :eax))
(:je '(:sub-program (unbound) (:int 99)))
(:ret)))
@@ -258,26 +272,25 @@
(define-primitive-function dynamic-store (symbol value)
"Store VALUE (ebx) in the dynamic binding of SYMBOL (eax)."
(with-inline-assembly (:returns :multiple-values)
- (:pushl :ebx) ; Save VALUE for later.
- (:call-global-constant dynamic-find-binding)
- (:jnc 'no-binding)
- (:popl :ebx) ; Load back VALUE from stack.
+ (:locally (:movl (:edi (:edi-offset dynamic-env)) :ecx))
+ (:jecxz 'no-binding)
+ (:cmpl :eax (:ecx))
+ (:je 'success)
+ (:locally (:movl (:edi (:edi-offset stack-top)) :edx))
+ search-loop
+ (:cmpl :edx (:ecx 12))
+ (:jnc '(:sub-program () (:int 97)))
+ (:movl (:ecx 12) :ecx) ; parent
+ (:jecxz 'no-binding)
+ (:cmpl :eax (:ecx)) ; compare name
+ (:jne 'search-loop)
+ ;; fall through on success
+ success
+ (:leal (:ecx 8) :eax) ; location of binding value cell
(:movl :ebx (:eax)) ; Store VALUE in binding.
(:ret)
no-binding
- (:popl :ebx) ; Load back VALUE from stack.
(:movl :ebx (:eax #.(bt:slot-offset 'movitz::movitz-symbol 'movitz::value)))
- (:ret)))
-
-(define-primitive-function dynamic-boundp (symbol)
- "Return NIL iff SYMBOL is not dynamically bound."
- (with-inline-assembly (:returns :multiple-values)
- (:call-global-constant dynamic-find-binding)
- (:jnc 'no-binding)
- (:globally (:movl (:edi (:edi-offset t-symbol)) :eax))
- (:ret)
- no-binding
- (:movl :edi :eax)
(:ret)))
(define-primitive-function keyword-search ()
More information about the Movitz-cvs
mailing list