Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv16271
Modified Files:
primitive-functions.lisp
Log Message:
Various minor fixes.
Date: Wed Apr 21 11:08:36 2004
Author: ffjeld
Index: movitz/losp/muerte/primitive-functions.lisp
diff -u movitz/losp/muerte/primitive-functions.lisp:1.15 movitz/losp/muerte/primitive-functions.lisp:1.16
--- movitz/losp/muerte/primitive-functions.lisp:1.15 Mon Apr 19 15:49:11 2004
+++ movitz/losp/muerte/primitive-functions.lisp Wed Apr 21 11:08:36 2004
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef(a)acm.org>
;;;; Created at: Tue Oct 2 21:02:18 2001
;;;;
-;;;; $Id: primitive-functions.lisp,v 1.15 2004/04/19 19:49:11 ffjeld Exp $
+;;;; $Id: primitive-functions.lisp,v 1.16 2004/04/21 15:08:36 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -30,33 +30,29 @@
"Call a function with 1 argument"
(with-inline-assembly (:returns :nothing)
(:movb 1 :cl)
- (:jmp (:esi -6))))
+ (:jmp (:esi #.(bt:slot-offset 'movitz:movitz-funobj 'movitz:code-vector)))))
(define-primitive-function trampoline-funcall%2op ()
"Call a function with 2 arguments"
(with-inline-assembly (:returns :nothing)
(:movb 2 :cl)
- (:jmp (:esi -6))))
+ (:jmp (:esi #.(bt:slot-offset 'movitz:movitz-funobj 'movitz:code-vector)))))
(define-primitive-function trampoline-funcall%3op ()
"Call a function with 3 arguments"
(with-inline-assembly (:returns :nothing)
-;;; (:xorl :ecx :ecx)
-;;; (:movb 2 :cl)
(:movb 3 :cl)
- (:jmp (:esi -6))))
+ (:jmp (:esi #.(bt:slot-offset 'movitz:movitz-funobj 'movitz:code-vector)))))
(define-primitive-function trampoline-cl-dispatch-1or2 ()
"Jump to the entry-point designated by :cl, which must be 1 or 2."
(with-inline-assembly (:returns :nothing)
- (:cmpb 1 :cl)
- (:jne 'not-one)
- (:jmp (:esi #.(bt:slot-offset 'movitz:movitz-funobj 'movitz:code-vector%1op)))
- not-one
- (:cmpb 2 :cl)
- (:jne 'not-two)
- (:jmp (:esi #.(bt:slot-offset 'movitz:movitz-funobj 'movitz:code-vector%2op)))
- not-two
+ (:subb 1 :cl) ; 1 or 2 => 0 or 1
+ (:testb #xfe :cl)
+ (:jnz 'mismatch)
+ (:jmp (:esi (:ecx 4) #.(bt:slot-offset 'movitz:movitz-funobj 'movitz:code-vector%1op)))
+ mismatch
+ (:addb 1 :cl)
(:int 100)))
(define-primitive-function no-code-vector ()
@@ -246,10 +242,7 @@
(: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
@@ -277,10 +270,7 @@
(: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
@@ -555,7 +545,8 @@
(define-primitive-function fast-class-of-tag3 ()
"Return the class of a tag3 object."
(with-inline-assembly (:returns :multiple-values)
- (:int 64)
+ (:globally (:movl (:edi (:edi-offset classes)) :eax))
+ (:movl (:eax #.(movitz::class-object-offset 'illegal-object)) :eax)
(:ret)))
(define-primitive-function fast-class-of-character ()
@@ -572,10 +563,14 @@
(define-primitive-function fast-class-of-null ()
"Return the class of a nil object."
(with-inline-assembly (:returns :multiple-values)
+ (:globally (:movl (:edi (:edi-offset classes)) :ebx))
(:cmpl :edi :eax)
- (:jne '(:sub-program () (:int 64)))
- (:globally (:movl (:edi (:edi-offset classes)) :eax))
- (:movl (:eax #.(movitz::class-object-offset 'null)) :eax)
+ (:je 'null)
+ (:movl (:ebx #.(movitz::class-object-offset 'illegal-object)) :eax)
+ (:jmp 'not-null)
+ null
+ (:movl (:ebx #.(movitz::class-object-offset 'null)) :eax)
+ not-null
(:ret)))
(define-primitive-function fast-class-of-other ()
@@ -626,13 +621,7 @@
(find-class 'fixnum))
(basic-restart
(find-class 'basic-restart))
- (tag6
- (error "Don't know the class of ~Z with other-type #x~X."
- object (with-inline-assembly (:returns :untagged-fixnum-ecx)
- (:compile-form (:result-mode :eax) object)
- (:movzxb (:eax -2) :ecx))))
- (t (error "Don't know the class of the word ~Z!" object)
- (find-class t))))
+ (t (find-class 'illegal-object))))
(define-primitive-function push-current-values ()
"Push all current return-values on the stack. And, return number