[movitz-cvs] CVS update: movitz/losp/muerte/primitive-functions.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Mon May 24 14:58:56 UTC 2004
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv24737
Modified Files:
primitive-functions.lisp
Log Message:
Starting to add some bignum support.
Date: Mon May 24 10:58:56 2004
Author: ffjeld
Index: movitz/losp/muerte/primitive-functions.lisp
diff -u movitz/losp/muerte/primitive-functions.lisp:1.17 movitz/losp/muerte/primitive-functions.lisp:1.18
--- movitz/losp/muerte/primitive-functions.lisp:1.17 Fri May 21 05:41:11 2004
+++ movitz/losp/muerte/primitive-functions.lisp Mon May 24 10:58:56 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.17 2004/05/21 09:41:11 ffjeld Exp $
+;;;; $Id: primitive-functions.lisp,v 1.18 2004/05/24 14:58:56 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -441,8 +441,8 @@
(defun malloc-initialize (buffer-start buffer-size)
"BUFFER-START: the (fixnum) 4K address. BUFFER-SIZE: The size in 4K units."
- (check-type buffer-start integer)
- (check-type buffer-size integer)
+ (check-type buffer-start fixnum)
+ (check-type buffer-size fixnum)
(with-inline-assembly (:returns :nothing)
(:compile-form (:result-mode :eax) buffer-start)
(:shll #.(cl:- 12 movitz::+movitz-fixnum-shift+) :eax)
@@ -504,6 +504,17 @@
return-ok
(:ret)))
+
+(define-primitive-function normalize-u32-ecx ()
+ "Make u32 in ECX into a fixnum or bignum."
+ (with-inline-assembly (:returns :multiple-values)
+ (:cmpl #.movitz:+movitz-most-positive-fixnum+ :ecx)
+ (:ja 'not-fixnum)
+ (:leal ((:ecx #.movitz:+movitz-fixnum-factor+)) :eax)
+ (:ret)
+ not-fixnum
+ (:int 107))) ; not implemented by default!
+
;;;;
(define-primitive-function fast-class-of-even-fixnum ()
@@ -566,32 +577,42 @@
(:globally (:movl (:edi (:edi-offset classes)) :ebx))
(:cmpl :edi :eax)
(:je 'null)
- (:movl (:ebx #.(movitz::class-object-offset 'illegal-object)) :eax)
+ (:movl (:ebx #.(movitz:class-object-offset 'illegal-object)) :eax)
(:jmp 'not-null)
null
- (:movl (:ebx #.(movitz::class-object-offset 'null)) :eax)
+ (:movl (:ebx #.(movitz:class-object-offset 'null)) :eax)
not-null
(:ret)))
(define-primitive-function fast-class-of-other ()
"Return the class of an other object."
- (with-inline-assembly (:returns :multiple-values)
- (:movl (:eax #.movitz:+other-type-offset+) :ecx)
- (:cmpb #.(movitz::tag :std-instance) :cl)
- (:jne 'not-std-instance)
- (:movl (:eax #.(bt:slot-offset 'movitz::movitz-std-instance 'movitz::class)) :eax)
- (:ret)
- not-std-instance
- (:cmpw #.(cl:+ (movitz::tag :funobj)
- (cl:ash (bt:enum-value 'movitz::movitz-funobj-type :generic-function) 8))
- :cx)
- (:jne 'not-std-gf-instance)
- (:movl (:eax #.(bt:slot-offset 'movitz::movitz-funobj-standard-gf 'movitz::standard-gf-class))
- :eax)
- (:ret)
- not-std-gf-instance
- (:globally (:movl (:edi (:edi-offset complicated-class-of)) :esi))
- (:jmp (:esi #.(bt:slot-offset 'movitz::movitz-funobj 'movitz::code-vector%1op)))))
+ (macrolet
+ ((do-it ()
+ `(with-inline-assembly (:returns :multiple-values)
+ (:movl (:eax ,movitz:+other-type-offset+) :ecx)
+ (:cmpb ,(movitz:tag :std-instance) :cl)
+ (:jne 'not-std-instance)
+ (:movl (:eax ,(bt:slot-offset 'movitz::movitz-std-instance 'movitz::class)) :eax)
+ (:ret)
+ not-std-instance
+ (:cmpw ,(+ (movitz:tag :funobj)
+ (ash (bt:enum-value 'movitz::movitz-funobj-type :generic-function) 8))
+ :cx)
+ (:jne 'not-std-gf-instance)
+ (:movl (:eax ,(bt:slot-offset 'movitz::movitz-funobj-standard-gf
+ 'movitz::standard-gf-class))
+ :eax)
+ (:ret)
+ not-std-gf-instance
+ (:globally (:movl (:edi (:edi-offset classes)) :ebx))
+ (:cmpb ,(movitz:tag :bignum) :cl)
+ (:jne 'not-bignum)
+ (:movl (:ebx ,(movitz:class-object-offset 'integer)) :eax)
+ (:ret)
+ not-bignum
+ (:globally (:movl (:edi (:edi-offset complicated-class-of)) :esi))
+ (:jmp (:esi ,(bt:slot-offset 'movitz::movitz-funobj 'movitz::code-vector%1op))))))
+ (do-it)))
(defun complicated-class-of (object)
(typecase object
More information about the Movitz-cvs
mailing list