Add with-register-copy-alias! for the benefit of machines with 3
authorGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Fri, 28 Aug 1987 18:51:09 +0000 (18:51 +0000)
committerGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Fri, 28 Aug 1987 18:51:09 +0000 (18:51 +0000)
operand instructions.

v7/src/compiler/back/lapgn2.scm

index b0b87f3c348fb373af061d68ffce3154a17445d3..af6f50d3eb9aeb5a3daf39c27f5217d38d19a449 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/lapgn2.scm,v 1.3 1987/07/08 22:01:02 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/lapgn2.scm,v 1.4 1987/08/28 18:51:09 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -147,11 +147,45 @@ MIT in each case. |#
          (delete-dead-registers!)
          (let ((target (if-not)))
            (prefix-instructions!
-           (cond ((not alias) (home->register-transfer source target))
-                 ((= alias target) '())
-                 (else (register->register-transfer alias target))))
+            (cond ((not alias) (home->register-transfer source target))
+                  ((= alias target) '())
+                  (else (register->register-transfer alias target))))
            (register-reference target))))))
 \f
+(define (with-register-copy-alias! source type target rec1 rec2)
+  ;; REC1 is invoked if we are resuing an alias of source.
+  ;;      It already contains the data to operate on.
+  ;; REC2 is invoked if a `brand-new' alias for target has been allocated.
+  ;;      We must take care of moving the data ourselves.
+  ;; This procedure should be used when the copy is going to be transformed,
+  ;; and the machine has 3 operand instructions, which allow an
+  ;; implicit motion in the transformation operation.
+  ;; For example, on the DEC VAX it is cheaper to do
+  ;;   bicl3   op1,source,target
+  ;; than
+  ;;   movl    source,target
+  ;;   bicl2   op1,target
+  (let ((reusable-alias
+        (and (dead-register? source)
+             (register-alias source type))))
+    (if reusable-alias
+       (begin (delete-dead-registers!)
+              (add-pseudo-register-alias! target reusable-alias false)
+              (rec1 (register-reference reusable-alias)))
+       (let ((alias (if (machine-register? source)
+                        source
+                        (register-alias source false))))
+         (delete-dead-registers!)
+         (let ((target (allocate-alias-register! target type)))
+           (cond ((not alias)
+                  (rec2 (pseudo-register-home source)
+                        (register-reference target)))
+                 ((= alias target)
+                  (rec1 (register-reference target)))
+                 (else
+                  (rec2 (register-reference alias)
+                        (register-reference target)))))))))
+\f
 (define (add-pseudo-register-alias! register alias saved-into-home?)
   (set! *register-map*
        (add-pseudo-register-alias *register-map* register alias