[movitz-cvs] CVS movitz

ffjeld ffjeld at common-lisp.net
Mon Feb 4 21:03:33 UTC 2008


Update of /project/movitz/cvsroot/movitz
In directory clnet:/tmp/cvs-serv32450

Modified Files:
	asm.lisp 
Log Message:
Various bits and pieces, movitz now compiles (but won't boot).


--- /project/movitz/cvsroot/movitz/asm.lisp	2008/02/04 12:00:36	1.9
+++ /project/movitz/cvsroot/movitz/asm.lisp	2008/02/04 21:03:32	1.10
@@ -6,7 +6,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: asm.lisp,v 1.9 2008/02/04 12:00:36 ffjeld Exp $
+;;;; $Id: asm.lisp,v 1.10 2008/02/04 21:03:32 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -20,6 +20,7 @@
 	   #:indirect-operand-p
 	   #:indirect-operand
 	   #:register-operand
+	   #:resolve-operand
 	   #:unresolved-symbol
 	   #:retry-symbol-resolve
 	   #:pc-relative-operand
@@ -36,20 +37,32 @@
 (defvar *symtab* nil "Current symbol table.")
 (defvar *instruction-compute-extra-prefix-map* nil)
 (defvar *position-independent-p* t)
-(defvar *sub-program-instructions* '(:jmp :ret)
+(defvar *sub-program-instructions* '(:jmp :ret :iretd)
   "Instruction operators after which to insert sub-programs.")
 
 (defvar *anonymous-sub-program-identities* nil)
 
+(defun quotep (x)
+  "Is x a symbol (in any package) named 'quote'?"
+  ;; This is required because of Movitz package-fiddling.
+  (and (symbolp x)
+       (string= x 'quote)))
+
 (deftype simple-symbol-reference ()
-  '(cons (eql quote) (cons symbol null)))
+  '(cons (satisfies quotep) (cons symbol null)))
 
 (deftype sub-program-operand ()
-  '(cons (eql quote)
+  '(cons (satisfies quotep)
     (cons
      (cons (eql :sub-program))
      null)))
 
+(deftype funcall-operand ()
+  '(cons (satisfies quotep)
+    (cons
+     (cons (eql :funcall))
+     null)))
+
 (deftype symbol-reference ()
   '(or simple-symbol-reference sub-program-operand))
 
@@ -64,7 +77,6 @@
 		 (car (push (cons operand (gensym "sub-program-"))
 			    *anonymous-sub-program-identities*)))))))
 
-
 (defun sub-program-program (operand)
   (cddadr operand))
 
@@ -75,8 +87,14 @@
     (sub-program-operand
      (sub-program-label expr))))
 
+(defun funcall-operand-operator (operand)
+  (cadadr operand))
+
+(defun funcall-operand-operands (operand)
+  (cddadr operand))
+
 (deftype immediate-operand ()
-  '(or integer symbol-reference))
+  '(or integer symbol-reference funcall-operand))
 
 (defun immediate-p (expr)
   (typep expr 'immediate-operand))
@@ -88,7 +106,7 @@
   (typep operand 'register-operand))
 
 (deftype indirect-operand ()
-  '(and cons (not (cons (eql quote)))))
+  '(and cons (not (cons (satisfies quotep)))))
 
 (defun indirect-operand-p (operand)
   (typep operand 'indirect-operand))
@@ -107,6 +125,21 @@
 	     (format s "Unresolved symbol ~S." (unresolved-symbol c)))))
 
 
+
+(defun resolve-operand (operand)
+  (etypecase operand
+    (integer
+     operand)
+    (symbol-reference
+     (let ((s (symbol-reference-symbol operand)))
+       (loop (with-simple-restart (retry-symbol-resolve "Retry resolving ~S." s)
+	       (return (cdr (or (assoc s *symtab*)
+				(error 'unresolved-symbol 
+				       :symbol s))))))))
+    (funcall-operand
+     (apply (funcall-operand-operator operand)
+	    (mapcar #'resolve-operand
+		    (funcall-operand-operands operand))))))
 ;;;;;;;;;;;;
 
 
@@ -121,7 +154,7 @@
 	(sub-programs nil))
     (flet ((process-instruction (instruction)
 	     (etypecase instruction
-	       (symbol
+	       ((or symbol integer)
 		(let ((previous-definition (assoc instruction *symtab*)))
 		  (cond
 		    ((null previous-definition)
@@ -139,24 +172,24 @@
 		    ((member previous-definition corrections)
 		     (cond
 		       ((> *pc* (cdr previous-definition))
-			;; 			  (warn "correcting ~S from ~D to ~D" instruction (cdr previous-definition) *pc*)
+;; 			(warn "correcting ~S from ~D to ~D" instruction (cdr previous-definition) *pc*)
 			(setf (cdr previous-definition) *pc*)
 			(push previous-definition new-corrections))
 		       ((< *pc* (cdr previous-definition))
-			;; 			  (warn "Definition for ~S shrunk from ~S to ~S (corrections: ~{~D~}."
-			;; 				instruction
-			;; 				(cdr previous-definition)
-			;; 				*pc*
-			;; 				corrections)
-			;; 			  (warn "prg: ~{~%~A~}" proglist)
-			;; 			  (warn "Definition for ~S shrunk from ~S to ~S."
-			;; 				instruction
-			;; 				(cdr previous-definition)
-			;; 				*pc*)
-			;; 			  (break "Definition for ~S shrunk from ~S to ~S."
-			;; 				 instruction
-			;; 				 (cdr previous-definition)
-			;; 				 *pc*)
+;; 			(warn "Definition for ~S shrunk from ~S to ~S (corrections: ~{~D~}."
+;; 			      instruction
+;; 			      (cdr previous-definition)
+;; 			      *pc*
+;; 			      corrections)
+;; 			(warn "prg: ~{~%~A~}" proglist)
+;; 			(warn "Definition for ~S shrunk from ~S to ~S."
+;; 			      instruction
+;; 			      (cdr previous-definition)
+;; 			      *pc*)
+;; 			  (break "Definition for ~S shrunk from ~S to ~S."
+;; 				 instruction
+;; 				 (cdr previous-definition)
+;; 				 *pc*)
 			(setf (cdr previous-definition) *pc*)
 			(push previous-definition new-corrections))))
 		    (t (error "Label ~S doubly defined. Old value: ~S, new value: ~S"
@@ -168,7 +201,7 @@
 		(let ((code (handler-bind
 				((unresolved-symbol (lambda (c)
 						      (let ((a (cons (unresolved-symbol c) *pc*)))
-							;; 							  (warn "assuming ~S for ~S" (unresolved-symbol c) *pc*)
+;; 							(warn "assuming ~S for ~S" (unresolved-symbol c) *pc*)
 							(push a assumptions)
 							(push a *symtab*)
 							(invoke-restart 'retry-symbol-resolve)))))




More information about the Movitz-cvs mailing list