[movitz-cvs] CVS update: ia-x86/read.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Thu Sep 2 09:03:08 UTC 2004


Update of /project/movitz/cvsroot/ia-x86
In directory common-lisp.net:/tmp/cvs-serv12514

Modified Files:
	read.lisp 
Log Message:
Added a protocol for adding "extra" prefixes (such as NOPs) to
instructions as they are inserted in a code-stream. This is needed for
Movitz to be able to align call instructions such that
return-addresses are distinguisable from immediate values, which is
required by stack discipline.

Date: Thu Sep  2 11:02:59 2004
Author: ffjeld

Index: ia-x86/read.lisp
diff -u ia-x86/read.lisp:1.6 ia-x86/read.lisp:1.7
--- ia-x86/read.lisp:1.6	Tue Aug 10 12:12:57 2004
+++ ia-x86/read.lisp	Thu Sep  2 11:02:58 2004
@@ -9,7 +9,7 @@
 ;;;; Created at:    Mon Jul 31 13:54:27 2000
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: read.lisp,v 1.6 2004/08/10 10:12:57 ffjeld Exp $
+;;;; $Id: read.lisp,v 1.7 2004/09/02 09:02:58 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -44,6 +44,8 @@
 ;;;       absexpr ::= <label> | <number> | append-prg
 ;;;    append-prg ::= program
 ;;;
+;;;        prefix ::= <segment-override> | (:size <size>)
+;;;
 ;;;
 ;;; Instructions are recognized by symbol-name, so there should be no
 ;;; need to worry about packages etc.
@@ -206,25 +208,34 @@
    (t (error "Can't read operand ~S" spec))))
 
 (defun read-prefixes (prefix-spec)
-  (loop for p in prefix-spec
-      with user-size = nil
+  (loop with user-size = nil with user-finalizer = nil
+      for p in prefix-spec
       if (symbolp p)
       collect (let ((ps (find-symbol (symbol-name p) '#:ia-x86)))
 		(if (decode-set +prefix-opcode-map+ ps :errorp nil)
 		    ps
 		  (error "No such prefix: ~A" p)))
       into prefixes
-      else if (integerp p)
-      do (setf user-size p)
-      finally (return (values prefixes user-size))))
+      else do
+	   (check-type p list)
+	   (ecase (car p)
+	     (:size
+	      (let ((size (second p)))
+		(check-type size integer)
+		(setf user-size size)))
+	     (:finalize			; XXX
+	      (let ((finalizer (second p)))
+		(check-type finalizer symbol "a function name")
+		(setf user-finalizer finalizer))))
+      finally (return (values prefixes user-size user-finalizer))))
 	      
 (defvar *find-instruction-cache* (make-hash-table :test #'eq))
 
 (defun read-instruction (sexpr)
   "Parse a list into an assembly instruction."
-  (let (prefix-list user-size instr-name operand-list)
+  (let (prefix-list user-size user-finalizer instr-name operand-list)
     (if (listp (first sexpr))
-	(setf (values prefix-list user-size) (read-prefixes (first sexpr))
+	(setf (values prefix-list user-size user-finalizer) (read-prefixes (first sexpr))
 	      instr-name (second sexpr)
 	      operand-list (nthcdr 2 sexpr))
       (setf prefix-list nil
@@ -244,9 +255,10 @@
 				(unless instr-symbol-status
 				  (error "No instruction named ~A." (string instr-name)))
 				instr-symbol)))
-	   'prefixes prefix-list
-	   'user-size user-size
-	   'operands (mapcar #'read-operand operand-list))))))
+	   :prefixes prefix-list
+	   :user-size user-size
+	   :user-finalizer user-finalizer
+	   :operands (mapcar #'read-operand operand-list))))))
       
 
 (defun inline-data-p (expr)
@@ -303,4 +315,4 @@
 
 
 (defmacro asm (&rest spec)
-  `(instruction-encode (read-instruction ',spec)))
+  `(instruction-encode (read-instruction ',spec) nil))





More information about the Movitz-cvs mailing list