Update of /project/movitz/cvsroot/movitz In directory common-lisp.net:/tmp/cvs-serv14532
Modified Files: compiler.lisp Log Message: Various rearrangements. No code produced by the compiler should change due to these changes.
Date: Tue Feb 3 13:02:59 2004 Author: ffjeld
Index: movitz/compiler.lisp diff -u movitz/compiler.lisp:1.8 movitz/compiler.lisp:1.9 --- movitz/compiler.lisp:1.8 Tue Feb 3 05:36:06 2004 +++ movitz/compiler.lisp Tue Feb 3 13:02:59 2004 @@ -8,7 +8,7 @@ ;;;; Created at: Wed Oct 25 12:30:49 2000 ;;;; Distribution: See the accompanying file COPYING. ;;;; -;;;; $Id: compiler.lisp,v 1.8 2004/02/03 10:36:06 ffjeld Exp $ +;;;; $Id: compiler.lisp,v 1.9 2004/02/03 18:02:59 ffjeld Exp $ ;;;; ;;;;------------------------------------------------------------------
@@ -207,22 +207,29 @@ (function-env (add-bindings-from-lambda-list lambda-list (make-local-movitz-environment funobj-env funobj - :type 'function-env - :declaration-context :funobj - :declarations declarations)))) + :type 'function-env + :declaration-context :funobj + :declarations declarations)))) (setf (movitz-funobj-name funobj) name (movitz-funobj-lambda-list funobj) (movitz-read (lambda-list-simplify lambda-list)) (funobj-env funobj) funobj-env (function-envs funobj) (list (cons 'muerte.cl::t function-env))) - (make-compiled-body-pass1 funobj function-env form top-level-p))) + (cond + #+ignore + ((and (= 1 (length (required-vars function-env))) + (= 1 (length (optional-vars function-env))) + (null (key-vars function-env)) + (null (rest-var function-env))) + (make-compiled-body-pass1-1req1opt funobj function-env form top-level-p)) + (t (make-compiled-body-pass1 funobj function-env form top-level-p)))))
(defun make-compiled-body-pass1 (funobj function-env form top-level-p) "Returns compiler-values, with the pass1 funobj as &final-form." - (multiple-value-bind (arg-init-code body-form need-normalized-ecx-p) - (make-function-arguments-init funobj function-env form) + (multiple-value-bind (arg-init-code need-normalized-ecx-p) + (make-function-arguments-init funobj function-env) (compiler-values-bind (&code body-code) (compiler-call #'compile-form - :form body-form + :form (make-special-funarg-shadowing function-env form) :funobj funobj :env function-env :top-level-p top-level-p @@ -475,6 +482,7 @@ (code3 (cdr (assoc 3 code-specs))) (codet (cdr (assoc 'muerte.cl::t code-specs)))) (assert codet () "A default numargs-case is required.") + ;; (format t "codet:~{~&~A~}" codet) (let ((combined-code (delete 'start-stack-frame-setup (append @@ -499,67 +507,74 @@ '(entry%3op (:movb 3 :cl))) ,@code3 not-three-args)) - codet)))) + (delete-if (lambda (x) + (or (and code1 (eq x 'entry%1op)) + (and code2 (eq x 'entry%2op)) + (and code3 (eq x 'entry%3op)))) + codet))))) ;; (warn "opt code: ~{~&~A~}" optimized-function-code) - (multiple-value-bind (code-vector code-symtab) - (ia-x86:proglist-encode :octet-vector :32-bit #x00000000 - (ia-x86:read-proglist (append combined-code - `((% bytes 8 0 0 0)))) - :symtab-lookup - (lambda (label) - (case label - (:nil-value (image-nil-word *image*)) - (t (let ((set (cdr (assoc label - (movitz-funobj-jumpers-map funobj))))) - (when set - (let ((pos (search set (movitz-funobj-const-list funobj) - :end2 (movitz-funobj-num-jumpers funobj)))) - (assert pos () - "Couldn't find for ~s set ~S in ~S." - label set (subseq (movitz-funobj-const-list funobj) - 0 (movitz-funobj-num-jumpers funobj))) - (* 4 pos)))))))) - (setf (movitz-funobj-symtab funobj) code-symtab) - (let ((code-length (- (length code-vector) 3))) - (assert (not (mismatch #(0 0 0) code-vector :start2 code-length)) () - "No space in code-vector was allocated for entry-points.") - (setf (fill-pointer code-vector) code-length) - ;; debug info - (setf (ldb (byte 1 5) (slot-value funobj 'debug-info)) - 1 #+ignore (if use-stack-frame-p 1 0)) - (let ((x (cdr (assoc 'start-stack-frame-setup code-symtab)))) - (cond - ((not x) - #+ignore (warn "No start-stack-frame-setup label for ~S." name)) - ((<= 0 x 30) - (setf (ldb (byte 5 0) (slot-value funobj 'debug-info)) x)) - (t (warn "Can't encode start-stack-frame-setup label ~D into debug-info for ~S." - x (movitz-funobj-name funobj))))) - (loop for ((entry-label slot-name) . rest) on '((entry%1op code-vector%1op) - (entry%2op code-vector%2op) - (entry%3op code-vector%3op)) - do (cond - ((assoc entry-label code-symtab) - (let ((offset (cdr (assoc entry-label code-symtab)))) - (setf (slot-value funobj slot-name) - (cons offset funobj)) - (vector-push offset code-vector))) - ((some (lambda (label) (assoc label code-symtab)) - (mapcar #'car rest)) - (vector-push 0 code-vector)))) - (setf (movitz-funobj-code-vector funobj) - (make-movitz-vector (length code-vector) - :fill-pointer code-length - :element-type 'movitz-code - :initial-contents code-vector - :flags '(:code-vector-p) - :alignment 16 - :alignment-offset 8))))))) + (assemble-funobj funobj combined-code)))) (loop for (sub-function-binding) on (sub-function-binding-usage funobj) by #'cddr do (complete-funobj (function-binding-funobj sub-function-binding))) funobj)
+(defun assemble-funobj (funobj combined-code) + (multiple-value-bind (code-vector code-symtab) + (ia-x86:proglist-encode :octet-vector :32-bit #x00000000 + (ia-x86:read-proglist (append combined-code + `((% bytes 8 0 0 0)))) + :symtab-lookup + (lambda (label) + (case label + (:nil-value (image-nil-word *image*)) + (t (let ((set (cdr (assoc label + (movitz-funobj-jumpers-map funobj))))) + (when set + (let ((pos (search set (movitz-funobj-const-list funobj) + :end2 (movitz-funobj-num-jumpers funobj)))) + (assert pos () + "Couldn't find for ~s set ~S in ~S." + label set (subseq (movitz-funobj-const-list funobj) + 0 (movitz-funobj-num-jumpers funobj))) + (* 4 pos)))))))) + (setf (movitz-funobj-symtab funobj) code-symtab) + (let ((code-length (- (length code-vector) 3))) + (assert (not (mismatch #(0 0 0) code-vector :start2 code-length)) () + "No space in code-vector was allocated for entry-points.") + (setf (fill-pointer code-vector) code-length) + ;; debug info + (setf (ldb (byte 1 5) (slot-value funobj 'debug-info)) + 1 #+ignore (if use-stack-frame-p 1 0)) + (let ((x (cdr (assoc 'start-stack-frame-setup code-symtab)))) + (cond + ((not x) + #+ignore (warn "No start-stack-frame-setup label for ~S." name)) + ((<= 0 x 30) + (setf (ldb (byte 5 0) (slot-value funobj 'debug-info)) x)) + (t (warn "Can't encode start-stack-frame-setup label ~D into debug-info for ~S." + x (movitz-funobj-name funobj))))) + (loop for ((entry-label slot-name) . rest) on '((entry%1op code-vector%1op) + (entry%2op code-vector%2op) + (entry%3op code-vector%3op)) + do (cond + ((assoc entry-label code-symtab) + (let ((offset (cdr (assoc entry-label code-symtab)))) + (setf (slot-value funobj slot-name) + (cons offset funobj)) + (vector-push offset code-vector))) + ((some (lambda (label) (assoc label code-symtab)) + (mapcar #'car rest)) + (vector-push 0 code-vector)))) + (setf (movitz-funobj-code-vector funobj) + (make-movitz-vector (length code-vector) + :fill-pointer code-length + :element-type 'movitz-code + :initial-contents code-vector + :flags '(:code-vector-p) + :alignment 16 + :alignment-offset 8))))) + #+ignore (defun make-compiled-function-body-default (form funobj env top-level-p) (make-compiled-body-pass2 (make-compiled-function-pass1 form funobj env top-level-p) @@ -915,6 +930,7 @@ :declaration-context :funobj)) (file-code (with-compilation-unit () + (add-bindings-from-lambda-list () function-env) (with-open-file (stream path :direction :input) (setf (funobj-env funobj) funobj-env) (loop for form = (with-movitz-syntax () @@ -3358,12 +3374,12 @@ `(:cmpb ,arg-count :cl)) (t `(:cmpl ,(dpb arg-count (byte 24 8) #x80) :ecx)))))))
-(defun make-function-arguments-init (funobj env function-body) +(defun make-function-arguments-init (funobj env) "The arugments-init is compiled before the function's body is. -Return arg-init-code, new function-body, need-normalized-ecx-p." +Return arg-init-code, need-normalized-ecx-p." (when (without-function-prelude-p env) (return-from make-function-arguments-init - (values nil function-body nil))) + (values nil nil))) (let ((need-normalized-ecx-p nil) (required-vars (required-vars env)) (optional-vars (optional-vars env)) @@ -3455,47 +3471,47 @@ ,not-present-label)) (t #+ignore (when (= 0 (function-argument-argnum binding)) (setf eax-optional-destructive-p t)) - `((:arg-cmp ,(function-argument-argnum binding)) - (:jbe ',not-present-label) - ,@(when supplied-p-var - `((:movl (:edi ,(global-constant-offset 't-symbol)) :eax) - (:store-lexical ,supplied-p-binding :eax - :type (eql ,(image-t-symbol *image*))))) - ,@(case (function-argument-argnum binding) - (0 `((:store-lexical ,binding :eax :type t))) - (1 `((:store-lexical ,binding :ebx :type t))) - (t (cond - (last-optional-p - `((:movl (:ebp ,(* 4 (- (1+ (function-argument-argnum binding)) - -1 (function-argument-argnum binding)))) - :eax) - (:store-lexical ,binding :eax :type t))) - (t (setq need-normalized-ecx-p t) - `((:movl (:ebp (:ecx 4) ,(* -4 (1- (function-argument-argnum binding)))) - :eax) - (:store-lexical ,binding :eax :type t)))))) - (:jmp ',optional-ok-label) - ,not-present-label - ,@(when supplied-p-var - `((:store-lexical ,supplied-p-binding :edi :type null))) - ,@(when (and (= 0 (function-argument-argnum binding)) - (not last-optional-p)) - `((:pushl :ebx))) ; protect ebx - ,@(if (optional-function-argument-init-form binding) - (append '((:pushl :ecx)) - (when (= 0 (function-argument-argnum binding)) - `((:pushl :ebx))) - init-code-edx - `((:store-lexical ,binding :edx :type t)) - (when (= 0 (function-argument-argnum binding)) - `((:popl :ebx))) - `((:popl :ecx))) - (progn (error "WEgewgew") - `((:store-lexical ,binding :edi :type null)))) - ,@(when (and (= 0 (function-argument-argnum binding)) - (not last-optional-p)) - `((:popl :ebx))) ; protect ebx - ,optional-ok-label))))) + `((:arg-cmp ,(function-argument-argnum binding)) + (:jbe ',not-present-label) + ,@(when supplied-p-var + `((:movl (:edi ,(global-constant-offset 't-symbol)) :eax) + (:store-lexical ,supplied-p-binding :eax + :type (eql ,(image-t-symbol *image*))))) + ,@(case (function-argument-argnum binding) + (0 `((:store-lexical ,binding :eax :type t))) + (1 `((:store-lexical ,binding :ebx :type t))) + (t (cond + (last-optional-p + `((:movl (:ebp ,(* 4 (- (1+ (function-argument-argnum binding)) + -1 (function-argument-argnum binding)))) + :eax) + (:store-lexical ,binding :eax :type t))) + (t (setq need-normalized-ecx-p t) + `((:movl (:ebp (:ecx 4) ,(* -4 (1- (function-argument-argnum binding)))) + :eax) + (:store-lexical ,binding :eax :type t)))))) + (:jmp ',optional-ok-label) + ,not-present-label + ,@(when supplied-p-var + `((:store-lexical ,supplied-p-binding :edi :type null))) + ,@(when (and (= 0 (function-argument-argnum binding)) + (not last-optional-p)) + `((:pushl :ebx))) ; protect ebx + ,@(if (optional-function-argument-init-form binding) + (append '((:pushl :ecx)) + (when (= 0 (function-argument-argnum binding)) + `((:pushl :ebx))) + init-code-edx + `((:store-lexical ,binding :edx :type t)) + (when (= 0 (function-argument-argnum binding)) + `((:popl :ebx))) + `((:popl :ecx))) + (progn (error "WEgewgew") + `((:store-lexical ,binding :edi :type null)))) + ,@(when (and (= 0 (function-argument-argnum binding)) + (not last-optional-p)) + `((:popl :ebx))) ; protect ebx + ,optional-ok-label))))) (when rest-var (let* ((rest-binding (movitz-binding rest-var env)) (rest-position (function-argument-argnum rest-binding))) @@ -3649,11 +3665,16 @@ `((:init-lexvar ,binding :init-with-register :eax :init-with-type t))))))) - ;; shadowing variables.. - (if (special-variable-shadows env) - `(muerte.cl::let ,(special-variable-shadows env) ,function-body) - function-body) need-normalized-ecx-p))) + +(defun make-special-funarg-shadowing (env function-body) + "" + (cond + ((without-function-prelude-p env) + function-body) + ((special-variable-shadows env) + `(muerte.cl::let ,(special-variable-shadows env) ,function-body)) + (t function-body)))
(defun make-compiled-function-postlude (funobj env use-stack-frame-p) (declare (ignore funobj env))