Fix with-register-copy-alias! and register-copy-if-available to handle
authorGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Thu, 14 Feb 1991 18:44:48 +0000 (18:44 +0000)
committerGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Thu, 14 Feb 1991 18:44:48 +0000 (18:44 +0000)
machine registers as `source' as well as pseudo registers.
This is required by the new, smaller, rule set.

v7/src/compiler/back/lapgn2.scm

index e5a5814457342805fff2094e61da75e0bc395c21..a0494be9b892d47875342c70146d0b1c0dce9387 100644 (file)
@@ -1,8 +1,8 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/lapgn2.scm,v 1.18 1990/02/02 18:37:22 cph Rel $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/lapgn2.scm,v 1.19 1991/02/14 18:44:48 jinx Exp $
 
-Copyright (c) 1987, 1988, 1989, 1990 Massachusetts Institute of Technology
+Copyright (c) 1987, 1988, 1989, 1990, 1991 Massachusetts Institute of Technology
 
 This material was developed by the Scheme project at the Massachusetts
 Institute of Technology, Department of Electrical Engineering and
@@ -442,15 +442,22 @@ MIT in each case. |#
 ;;;      We must take care of moving the data ourselves.
 
 (define (with-register-copy-alias! source type target rec1 rec2)
-  (reuse-pseudo-register-alias! source type
-    (lambda (alias)
-      (delete-dead-registers!)
-      (add-pseudo-register-alias! target alias)
-      (rec1 (register-reference alias)))
-    (lambda ()
-      (let ((source (standard-register-reference source type true)))
-       (delete-dead-registers!)
-       (rec2 source (reference-target-alias! target type))))))
+  (if (and (machine-register? target)
+          (register-type? target type))
+      (let* ((source (standard-register-reference source type true))
+            (target (register-reference target)))
+       (rec2 source target))
+      (reuse-pseudo-register-alias! source type
+       (lambda (alias)
+        (delete-dead-registers!)
+        (if (machine-register? target)
+            (suffix-instructions! (register->register-transfer alias target))
+            (add-pseudo-register-alias! target alias))
+        (rec1 (register-reference alias)))
+       (lambda ()
+        (let ((source (standard-register-reference source type true)))
+          (delete-dead-registers!)
+          (rec2 source (reference-target-alias! target type)))))))
 
 (define (with-temporary-register-copy! source type rec1 rec2)
   (reuse-pseudo-register-alias! source type
@@ -462,14 +469,15 @@ MIT in each case. |#
            (reference-temporary-register! type)))))
 
 (define (register-copy-if-available source type target)
-  (reuse-pseudo-register-alias source type
-    (lambda (reusable-alias)
-      (lambda ()
-       (delete-register! reusable-alias)
-       (delete-dead-registers!)
-       (add-pseudo-register-alias! target reusable-alias)
-       (register-reference reusable-alias)))
-    (lambda () false)))
+  (and (not (machine-register? target))
+       (reuse-pseudo-register-alias source type
+       (lambda (reusable-alias)
+         (lambda ()
+           (delete-register! reusable-alias)
+           (delete-dead-registers!)
+           (add-pseudo-register-alias! target reusable-alias)
+           (register-reference reusable-alias)))
+       (lambda () false))))
 
 (define (temporary-copy-if-available source type)
   (reuse-pseudo-register-alias source type