[movitz-cvs] CVS movitz/losp/muerte
ffjeld
ffjeld at common-lisp.net
Fri Apr 13 23:19:58 UTC 2007
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory clnet:/tmp/cvs-serv11775
Modified Files:
memref.lisp
Log Message:
Improve (setf memref-int) somewhat.
--- /project/movitz/cvsroot/movitz/losp/muerte/memref.lisp 2005/08/24 07:30:14 1.48
+++ /project/movitz/cvsroot/movitz/losp/muerte/memref.lisp 2007/04/13 23:19:57 1.49
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Created at: Tue Mar 6 21:25:49 2001
;;;;
-;;;; $Id: memref.lisp,v 1.48 2005/08/24 07:30:14 ffjeld Exp $
+;;;; $Id: memref.lisp,v 1.49 2007/04/13 23:19:57 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -1043,19 +1043,22 @@
(:shrl ,movitz::+movitz-fixnum-shift+ :ecx)
(,prefixes :movl :eax (:ecx :ebx))))
(:unsigned-byte8
- `(with-inline-assembly (:returns :nothing)
- (:compile-form (:result-mode :push) ,address)
- (:compile-form (:result-mode :push) ,index)
- (:compile-form (:result-mode :push) ,offset)
- (:compile-form (:result-mode :eax) ,value)
- (:popl :edx) ; offset
- (:popl :ebx) ; index
- (:popl :ecx) ; address
- (:shll ,(- 8 movitz::+movitz-fixnum-shift+) :eax)
- (:addl :ebx :ecx)
- (:addl :edx :ecx)
- (:shrl ,movitz::+movitz-fixnum-shift+ :ecx)
- (,prefixes :movb :ah (:ecx))))
+ (let ((address-var (gensym "memref-int-address-"))
+ (index-var (gensym "memref-int-index-var-"))
+ (offset-var (gensym "memref-int-offset-var-"))
+ (value-var (gensym "memref-int-value-var-")))
+ `(let ((,value-var ,value)
+ (,address-var ,address)
+ (,offset-var (+ ,index ,offset)))
+ (with-inline-assembly (:returns :nothing)
+ (:load-lexical (:lexical-binding ,address-var) :ecx)
+ (:load-lexical (:lexical-binding ,offset-var) :edx)
+ (:load-lexical (:lexical-binding ,value-var) :eax)
+ (:shll ,(- 8 movitz::+movitz-fixnum-shift+) :eax)
+ (:addl :edx :ecx)
+ (:shrl ,movitz::+movitz-fixnum-shift+ :ecx)
+ (,prefixes :movb :ah (:ecx)))
+ ,value-var)))
(:unsigned-byte16
(cond
((eq 0 offset)
@@ -1102,22 +1105,28 @@
(defun (setf memref-int)
(value address &key (offset 0) (index 0) (type :unsigned-byte32) (physicalp t))
(cond
- (physicalp
- (ecase type
- (:unsigned-byte8
- (setf (memref-int address :offset offset :index index :type :unsigned-byte8)
- value))
- (:unsigned-byte16
- (setf (memref-int address :offset offset :index index :type :unsigned-byte16)
- value))))
- ((not physicalp)
- (ecase type
- (:unsigned-byte8
- (setf (memref-int address :offset offset :index index :type :unsigned-byte8 :physicalp nil)
- value))
- (:unsigned-byte16
- (setf (memref-int address :offset offset :index index :type :unsigned-byte16 :physicalp nil)
- value))))))
+ (physicalp
+ (ecase type
+ (:unsigned-byte8
+ (setf (memref-int address :offset offset :index index :type :unsigned-byte8)
+ value))
+ (:unsigned-byte16
+ (setf (memref-int address :offset offset :index index :type :unsigned-byte16)
+ value))
+ (:unsigned-byte32
+ (setf (memref-int address :offset offset :index index :type :unsigned-byte32)
+ value))))
+ ((not physicalp)
+ (ecase type
+ (:unsigned-byte8
+ (setf (memref-int address :offset offset :index index :type :unsigned-byte8 :physicalp nil)
+ value))
+ (:unsigned-byte16
+ (setf (memref-int address :offset offset :index index :type :unsigned-byte16 :physicalp nil)
+ value))
+ (:unsigned-byte32
+ (setf (memref-int address :offset offset :index index :type :unsigned-byte32 :physicalp nil)
+ value))))))
(defun memcopy (object-1 object-2 offset index-1 index-2 count type)
(ecase type
More information about the Movitz-cvs
mailing list