Try not to generate instructions that depend on the order in
authorChris Hanson <org/chris-hanson/cph>
Mon, 5 Jan 1987 02:04:25 +0000 (02:04 +0000)
committerChris Hanson <org/chris-hanson/cph>
Mon, 5 Jan 1987 02:04:25 +0000 (02:04 +0000)
which effective address evaluation occurs.

v7/src/compiler/machines/bobcat/lapgen.scm

index 6a2598a6f14fb8069cd4ea4aeb2e29e7a7beeb6c..99c71d0550474b418143c82ef67644ea8008d6b4 100644 (file)
@@ -37,7 +37,7 @@
 
 ;;;; RTL Rules for 68020
 
-;;; $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/lapgen.scm,v 1.144 1987/01/01 19:41:39 cph Exp $
+;;; $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/lapgen.scm,v 1.145 1987/01/05 02:04:25 cph Exp $
 
 (declare (usual-integrations))
 (using-syntax (access lap-generator-syntax-table compiler-package)
 
 (define-rule statement
   (ASSIGN (PRE-INCREMENT (REGISTER 15) -1) (OFFSET (REGISTER (? r)) (? n)))
-  `((MOVE L ,(indirect-reference! r n) (@-A 7))))
+  ;; Prevent probabilistic screws when the MOVE instruction's source
+  ;; operand is evaluated after the destination operand.
+  (if (= r 15)
+      (let ((temporary
+            (register-reference (allocate-temporary-register! false))))
+       `((MOVE L ,(indirect-reference! r n) ,temporary)
+         (MOVE L ,temporary (@-A 7))))
+      `((MOVE L ,(indirect-reference! r n) (@-A 7)))))
 
 (define-rule statement
   (ASSIGN (PRE-INCREMENT (REGISTER 15) -1)
 (define (generate-invocation-prefix:move-frame-up frame-size how-far)
   (cond ((or (zero? frame-size) (zero? how-far)) '())
        ((= frame-size 1)
-        `((MOVE L (@A+ 7) ,(offset-reference a7 (-1+ how-far)))))
+        `((MOVE L (@A 7) ,(offset-reference a7 how-far))
+          ,@(increment-anl 7 how-far))
+        #|`((MOVE L (@A+ 7) ,(offset-reference a7 (-1+ how-far)))
+          ,@(increment-anl 7 (-1+ how-far)))|#)
        ((= frame-size 2)
-        (if (= how-far 1)
-            `((MOVE L ,(offset-reference a7 1) ,(offset-reference a7 2))
+        `((MOVE L (@A 7) ,(offset-reference a7 how-far))
+          (MOVE L (@AO 7 4) ,(offset-reference a7 (1+ how-far)))
+          ,@(increment-anl 7 how-far))
+        #|(if (= how-far 1)
+            `((MOVE L (@AO 7 4) (@AO 7 8))
               (MOVE L (@A+ 7) (@A 7)))
             (let ((i `(MOVE L (@A+ 7) ,(offset-reference a7 (-1+ how-far)))))
-              `(,i ,i ,@(increment-anl 7 (- how-far 2))))))
+              `(,i ,i ,@(increment-anl 7 (- how-far 2)))))|#)
        (else
         (let ((temp-0 (allocate-temporary-register! 'ADDRESS))
               (temp-1 (allocate-temporary-register! 'ADDRESS)))