Update of /project/movitz/cvsroot/movitz
In directory common-lisp.net:/tmp/cvs-serv13376
Modified Files:
compiler.lisp
Log Message:
Be more restrictive about when to allow not setting up a stack-frame
for a function.
Use EDX rather than ECX for temporary holding the value of optional-p
in 1req1opt prelude.
Make the optimizer also optimize e.g. (:pushl (:ebp -8)) into
(:pushl :eax) at the start of functions, not just similar :movl
instructions.
Date: Mon Aug 9 06:38:20 2004
Author: ffjeld
Index: movitz/compiler.lisp
diff -u movitz/compiler.lisp:1.89 movitz/compiler.lisp:1.90
--- movitz/compiler.lisp:1.89 Sat Aug 7 04:10:19 2004
+++ movitz/compiler.lisp Mon Aug 9 06:38:20 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.89 2004/08/07 11:10:19 ffjeld Exp $
+;;;; $Id: compiler.lisp,v 1.90 2004/08/09 13:38:20 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -715,10 +715,7 @@
(stack-frame-size (frame-map-size (frame-map function-env)))
(use-stack-frame-p (or (plusp stack-frame-size)
(tree-search resolved-code
- '(:ebp :esp :call :leave))))
- (optional-stack-frame-p (tree-search resolved-optional-code
- '(:ebp :esp :call :leave))))
- (assert (not optional-stack-frame-p))
+ '(:pushl :popl :ebp :esp :call :leave)))))
(let* ((function-code
(let* ((req-binding (movitz-binding (first (required-vars function-env))
function-env nil))
@@ -735,13 +732,13 @@
(unless (eql nil opt-location)
resolved-optional-code)
(when optp-location
- `((:movl :edi :ecx)
- (:jmp 'optp-into-ecx-ok)))
+ `((:movl :edi :edx)
+ (:jmp 'optp-into-edx-ok)))
'(entry%2op)
(when optp-location
`((,*compiler-global-segment-prefix*
- :movl (:edi ,(global-constant-offset 't-symbol)) :ecx)
- optp-into-ecx-ok))
+ :movl (:edi ,(global-constant-offset 't-symbol)) :edx)
+ optp-into-edx-ok))
(when use-stack-frame-p
+enter-stack-frame-code+)
'(start-stack-frame-setup)
@@ -769,7 +766,7 @@
())
((= optp-location (1+ stack-setup-pre))
(incf stack-setup-pre 1)
- `((:pushl :ecx)))
+ `((:pushl :edx)))
(t (error "Can't deal with optional-p at ~S, after (~S ~S)."
optp-location req-location opt-location)))
(make-stack-setup-code (- stack-frame-size stack-setup-pre))
@@ -1824,6 +1821,16 @@
(explain nil "load ~S already in ~S."
i old-reg)
`(:movl ,old-reg ,(twop-dst i))))
+ ((and (instruction-is i :pushl)
+ (stack-frame-operand (idst i))
+ (assoc (stack-frame-operand (idst i))
+ frame-map))
+ (let ((old-reg
+ (cdr (assoc (stack-frame-operand (idst i))
+ frame-map))))
+ (explain nil "push ~S already in ~S."
+ i old-reg)
+ `(:pushl ,old-reg)))
(t i))))
(unless (eq new-i i)
(setf mod-p t))