Many many changes.
authorChris Hanson <org/chris-hanson/cph>
Mon, 29 Aug 1988 22:49:54 +0000 (22:49 +0000)
committerChris Hanson <org/chris-hanson/cph>
Mon, 29 Aug 1988 22:49:54 +0000 (22:49 +0000)
v7/src/compiler/machines/bobcat/rules1.scm
v7/src/compiler/machines/bobcat/rules2.scm

index ebd445a0d2422c0d7cafea54d3ed0aa8cd7307c4..c9ff53e0c069a627f0a6120dd58ea6b3e9bac660 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/rules1.scm,v 4.13 1988/06/14 08:48:22 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/rules1.scm,v 4.14 1988/08/29 22:47:55 cph Exp $
 
 Copyright (c) 1988 Massachusetts Institute of Technology
 
@@ -40,7 +40,7 @@ MIT in each case. |#
 
 (define-rule statement
   (ASSIGN (REGISTER 15) (REGISTER (? source)))
-  (LAP (MOV L ,(coerce->any source) (A 7))))
+  (LAP (MOV L ,(standard-register-reference source false) (A 7))))
 
 (define-rule statement
   (ASSIGN (REGISTER 15) (OFFSET-ADDRESS (REGISTER (? source)) (? offset)))
@@ -64,56 +64,51 @@ MIT in each case. |#
   (QUALIFIER (pseudo-register? source))
   (LAP (LEA ,(indirect-reference! source offset) (A 4))))
 
-;;; The following rule always occurs immediately after an instruction
-;;; of the form
-;;;
-;;; (ASSIGN (REGISTER (? source)) (POST-INCREMENT (REGISTER 15) 1))
-;;;
-;;; in which case it could be implemented very efficiently using the
-;;; sequence
-;;;
-;;; (LAP (CLR (@A 7)) (MOV L (@A+ 7) (A 4)))
-;;;
-;;; but unfortunately we have no mechanism to take advantage of this.
-
 (define-rule statement
   (ASSIGN (REGISTER 12) (OBJECT->ADDRESS (REGISTER (? source))))
   (QUALIFIER (pseudo-register? source))
-  (reuse-pseudo-register-alias! source 'DATA
-    (lambda (reusable-alias)
-      (let ((source (register-reference reusable-alias)))
-       (LAP (AND L ,mask-reference ,source)
-            (MOV L ,source (A 4)))))
-    (lambda ()
-      (let ((temp (reference-temporary-register! 'DATA)))
-       (LAP (MOV L ,(coerce->any source) ,temp)
-            (AND L ,mask-reference ,temp)
-            (MOV L ,temp (A 4)))))))
+  (let ((temp (move-to-temporary-register! source 'DATA)))
+    (LAP (AND L ,mask-reference ,temp)
+        (MOV L ,temp (A 4)))))
+
+(define-rule statement
+  (ASSIGN (REGISTER 12) (OBJECT->ADDRESS (POST-INCREMENT (REGISTER 15) 1)))
+  (let ((temp (reference-temporary-register! 'DATA)))
+    (LAP (MOV L (@A+ 7) ,temp)
+        (AND L ,mask-reference ,temp)
+        (MOV L ,temp (A 4)))))
 \f
 ;;; All assignments to pseudo registers are required to delete the
-;;; dead registers BEFORE performing the assignment.  This is because
-;;; the register being assigned may be PSEUDO-REGISTER=? to one of the
-;;; dead registers, and thus would be flushed if the deletions
-;;; happened after the assignment.
+;;; dead registers BEFORE performing the assignment.  However, it is
+;;; necessary to derive the effective address of the source
+;;; expression(s) before deleting the dead registers.  Otherwise any
+;;; source expression containing dead registers might refer to aliases
+;;; which have been reused.
 
 (define-rule statement
   (ASSIGN (REGISTER (? target)) (OFFSET-ADDRESS (REGISTER (? source)) (? n)))
-  (QUALIFIER (pseudo-register? target))
+  (QUALIFIER (and (pseudo-register? target) (machine-register? source)))
+  (let ((source (indirect-reference! source n)))
+    (delete-dead-registers!)
+    (LAP (LEA ,source ,(reference-target-alias! target 'ADDRESS)))))
+
+(define-rule statement
+  (ASSIGN (REGISTER (? target)) (OFFSET-ADDRESS (REGISTER (? source)) (? n)))
+  (QUALIFIER (and (pseudo-register? target) (pseudo-register? source)))
   (reuse-pseudo-register-alias! source 'DATA
     (lambda (reusable-alias)
-      (add-pseudo-register-alias! target reusable-alias false)
+      (delete-dead-registers!)
+      (add-pseudo-register-alias! target reusable-alias)
       (increment-machine-register reusable-alias n))
     (lambda ()
       (let ((source (indirect-reference! source n)))
        (delete-dead-registers!)
-       (LAP (LEA ,source
-                 ,(register-reference
-                   (allocate-alias-register! target 'ADDRESS))))))))
+       (LAP (LEA ,source ,(reference-target-alias! target 'ADDRESS)))))))
 
 (define-rule statement
   (ASSIGN (REGISTER (? target)) (CONSTANT (? source)))
   (QUALIFIER (pseudo-register? target))
-  (LAP ,(load-constant source (coerce->any target))))
+  (LAP ,(load-constant source (standard-target-reference target))))
 
 (define-rule statement
   (ASSIGN (REGISTER (? target)) (VARIABLE-CACHE (? name)))
@@ -121,8 +116,7 @@ MIT in each case. |#
   (delete-dead-registers!)
   (LAP (MOV L
            (@PCR ,(free-reference-label name))
-           ,(register-reference
-             (allocate-alias-register! target 'ADDRESS)))))
+           ,(reference-target-alias! target 'ADDRESS))))
 
 (define-rule statement
   (ASSIGN (REGISTER (? target)) (ASSIGNMENT-CACHE (? name)))
@@ -130,8 +124,7 @@ MIT in each case. |#
   (delete-dead-registers!)
   (LAP (MOV L
            (@PCR ,(free-assignment-label name))
-           ,(register-reference
-             (allocate-alias-register! target 'ADDRESS)))))
+           ,(reference-target-alias! target 'ADDRESS))))
 
 (define-rule statement
   (ASSIGN (REGISTER (? target)) (REGISTER (? source)))
@@ -146,41 +139,20 @@ MIT in each case. |#
     (LAP (RO L L (& 8) ,target))))
 
 (define-rule statement
-  (ASSIGN (REGISTER (? target)) (OBJECT->ADDRESS (CONSTANT (? source))))
-  (QUALIFIER (pseudo-register? target))
-  (let ((target (reference-assignment-alias! target 'DATA)))
-    (LAP ,(load-constant source target)
-        (AND L ,mask-reference ,target))))
-
-(define-rule statement
-  (ASSIGN (REGISTER (? target)) (OBJECT->ADDRESS (REGISTER (? source))))
-  (QUALIFIER (pseudo-register? target))
-  (let ((target (move-to-alias-register! source 'DATA target)))
-    (LAP (AND L ,mask-reference ,target))))
-
-(define-rule statement
-  (ASSIGN (REGISTER (? target))
-         (OBJECT->ADDRESS (OFFSET (REGISTER (? address)) (? offset))))
-  (QUALIFIER (pseudo-register? target))
-  (let ((source (indirect-reference! address offset)))
-    (delete-dead-registers!)
-    (let ((target-ref
-          (register-reference (allocate-alias-register! target 'DATA))))
-      (LAP (MOV L ,source ,target-ref)))))
-
-(define-rule statement
-  (ASSIGN (REGISTER (? target)) (OBJECT->DATUM (CONSTANT (? datum))))
+  (ASSIGN (REGISTER (? target)) (OBJECT->DATUM (CONSTANT (? constant))))
   (QUALIFIER (pseudo-register? target))
   (delete-dead-registers!)
-  (let ((target-ref
-        (register-reference (allocate-alias-register! target 'DATA))))
-    (load-constant-datum datum target-ref)))
+  (let ((target (reference-target-alias! target 'DATA)))
+    (if (non-pointer-object? constant)
+       (LAP ,(load-non-pointer 0 (object-datum constant) target))
+       (LAP ,(load-constant constant target)
+            (AND L ,mask-reference ,target)))))
 
 (define-rule statement
   (ASSIGN (REGISTER (? target)) (OBJECT->DATUM (REGISTER (? source))))
   (QUALIFIER (pseudo-register? target))
-  (let ((target-ref (move-to-alias-register! source 'DATA target)))
-    (LAP ,(scheme-object->datum target-ref))))
+  (let ((target (move-to-alias-register! source 'DATA target)))
+    (LAP (AND L ,mask-reference ,target))))
 
 (define-rule statement
   (ASSIGN (REGISTER (? target))
@@ -188,72 +160,61 @@ MIT in each case. |#
   (QUALIFIER (pseudo-register? target))
   (let ((source (indirect-reference! address offset)))
     (delete-dead-registers!)
-    (let ((target-ref
-          (register-reference (allocate-alias-register! target 'DATA))))
-      (LAP (MOV L ,source ,target-ref)
-          ,(scheme-object->datum target-ref)))))
+    (let ((target (reference-target-alias! target 'DATA)))
+      (LAP (MOV L ,source ,target)
+          (AND L ,mask-reference ,target)))))
 
 (define-rule statement
-  (ASSIGN (REGISTER (? target)) (OBJECT->FIXNUM (CONSTANT (? datum))))
+  (ASSIGN (REGISTER (? target)) (OBJECT->ADDRESS (CONSTANT (? constant))))
   (QUALIFIER (pseudo-register? target))
   (delete-dead-registers!)
-  (let ((target-ref
-        (register-reference (allocate-alias-register! target 'DATA))))
-    (load-fixnum-constant datum target-ref)))
+  (let ((target (reference-target-alias! target 'DATA)))
+    (if (non-pointer-object? constant)
+       (LAP ,(load-non-pointer 0 (object-datum constant) target))
+       (LAP ,(load-constant constant target)
+            (AND L ,mask-reference ,target)))))
 
 (define-rule statement
-  (ASSIGN (REGISTER (? target)) (OBJECT->FIXNUM (REGISTER (? source))))
+  (ASSIGN (REGISTER (? target)) (OBJECT->ADDRESS (REGISTER (? source))))
   (QUALIFIER (pseudo-register? target))
-  (let ((target-ref (move-to-alias-register! source 'DATA target)))
-    (LAP ,(remove-type-from-fixnum target-ref))))
+  (let ((target (move-to-alias-register! source 'DATA target)))
+    (LAP (AND L ,mask-reference ,target))))
 
 (define-rule statement
   (ASSIGN (REGISTER (? target))
-         (OBJECT->FIXNUM (OFFSET (REGISTER (? address)) (? offset))))
+         (OBJECT->ADDRESS (OFFSET (REGISTER (? address)) (? offset))))
   (QUALIFIER (pseudo-register? target))
   (let ((source (indirect-reference! address offset)))
     (delete-dead-registers!)
-    (let ((target-ref
-          (register-reference (allocate-alias-register! target 'DATA))))
-      (LAP (MOV L ,source ,target-ref)
-          ,(remove-type-from-fixnum target-ref)))))
+    (let ((target (reference-target-alias! target 'DATA)))
+      (LAP (MOV L ,source ,target)
+          (AND L ,mask-reference ,target)))))
 \f
 (define-rule statement
   (ASSIGN (REGISTER (? target)) (OFFSET (REGISTER (? address)) (? offset)))
   (QUALIFIER (pseudo-register? target))
   (let ((source (indirect-reference! address offset)))
-    (delete-dead-registers!)
-    ;; The fact that the target register here is a data register is a
-    ;; heuristic that works reasonably well since if the value is a
-    ;; pointer, we will probably want to dereference it, which
-    ;; requires that we first mask it.
-    (LAP (MOV L
-             ,source
-             ,(register-reference
-               (allocate-alias-register! target 'DATA))))))
+    (LAP (MOV L ,source ,(standard-target-reference target)))))
 
 (define-rule statement
   (ASSIGN (REGISTER (? target)) (POST-INCREMENT (REGISTER 15) 1))
   (QUALIFIER (pseudo-register? target))
-  (delete-dead-registers!)
-  (LAP (MOV L
-           (@A+ 7)
-           ,(register-reference
-             (allocate-alias-register! target 'DATA)))))
+  (LAP (MOV L (@A+ 7) ,(standard-target-reference target))))
 
 (define-rule statement
   (ASSIGN (REGISTER (? target))
          (CONS-POINTER (CONSTANT (? type)) (REGISTER (? datum))))
-  (QUALIFIER (pseudo-register? target))
-  (let ((datum (coerce->any datum)))
-    (delete-dead-registers!)
-    (let ((target* (coerce->any target)))
-      (if (register-effective-address? target*)
-         (LAP (MOV L ,datum ,reg:temp)
-              (MOV B (& ,type) ,reg:temp)
-              (MOV L ,reg:temp ,target*))
-         (LAP (MOV L ,datum ,target*)
-              (MOV B (& ,type) ,target*))))))
+  (QUALIFIER (and (pseudo-register? target) (machine-register? datum)))
+  (let ((target (reference-target-alias! target 'DATA)))
+    (LAP (MOV L ,(register-reference datum) ,target)
+        (OR L (& ,(make-non-pointer-literal type 0)) ,target))))
+
+(define-rule statement
+  (ASSIGN (REGISTER (? target))
+         (CONS-POINTER (CONSTANT (? type)) (REGISTER (? datum))))
+  (QUALIFIER (and (pseudo-register? target) (pseudo-register? datum)))
+  (let ((target (move-to-alias-register! datum 'DATA target)))
+    (LAP (OR L (& ,(make-non-pointer-literal type 0)) ,target))))
 
 (define-rule statement
   (ASSIGN (REGISTER (? target))
@@ -261,129 +222,48 @@ MIT in each case. |#
   (QUALIFIER (pseudo-register? target))
   (let ((temp (reference-temporary-register! 'ADDRESS)))
     (delete-dead-registers!)
-    (let ((target* (coerce->any target)))
-      (if (register-effective-address? target*)
-         (LAP
-          (LEA (@PCR ,(rtl-procedure/external-label (label->object label)))
-               ,temp)
-          (MOV L ,temp ,reg:temp)
-          (MOV B (& ,type) ,reg:temp)
-          (MOV L ,reg:temp ,target*))
-         (LAP
-          (LEA (@PCR ,(rtl-procedure/external-label (label->object label)))
+    (let ((target (reference-target-alias! target 'DATA)))
+      (LAP (LEA (@PCR ,(rtl-procedure/external-label (label->object label)))
                ,temp)
-          (MOV L ,temp ,target*)
-          (MOV B (& ,type) ,target*))))))
-\f
-(define-rule statement
-  (ASSIGN (REGISTER (? target)) (FIXNUM->OBJECT (REGISTER (? source))))
-  (QUALIFIER (pseudo-register? target))
-  (let ((target-ref (move-to-alias-register! source 'DATA target)))
-    (LAP ,(put-type-in-ea (ucode-type fixnum) target-ref))))
-
-(define-rule statement
-  (ASSIGN (REGISTER (? target))
-         (FIXNUM->OBJECT
-           (FIXNUM-2-ARGS (? operator) (? operand1) (? operand2))))
-  (QUALIFIER (pseudo-register? target))
-  (let ((temp-reg (allocate-temporary-register! 'DATA)))
-    (let ((operation
-          (LAP ,@(fixnum-do-2-args! operator operand1 operand2 temp-reg)
-               ,@(put-type-in-ea (ucode-type fixnum) temp-reg))))
-      (delete-dead-registers!)
-      (add-pseudo-register-alias! target temp-reg false)
-      operation)))
+          (MOV L ,temp ,target)
+          (OR L (& ,(make-non-pointer-literal type 0)) ,target)))))
 
 (define-rule statement
-  (ASSIGN (REGISTER (? target))
-         (FIXNUM->OBJECT
-          (FIXNUM-1-ARG (? operator) (? operand))))
+  (ASSIGN (REGISTER (? target)) (OBJECT->FIXNUM (CONSTANT (? constant))))
   (QUALIFIER (pseudo-register? target))
-  (let ((temp-reg (allocate-temporary-register! 'DATA)))
-    (let ((operation
-          (LAP ,@(fixnum-do-1-arg! operator operand temp-reg)
-               ,@(put-type-in-ea (ucode-type fixnum) temp-reg))))
-      (delete-dead-registers!)
-      (add-pseudo-register-alias! target temp-reg false)
-      operation)))
-
-(define-rule statement
-  (ASSIGN (REGISTER (? target))
-         (FIXNUM-2-ARGS (? operator) (? operand1) (? operand2)))
-  (QUALIFIER (pseudo-register? target))
-  (let ((temp-reg (allocate-temporary-register! 'DATA)))
-    (let ((operation
-          (LAP ,@(fixnum-do-2-args! operator operand1 operand2 temp-reg))))
-      (delete-dead-registers!)
-      (add-pseudo-register-alias! target temp-reg false)
-      operation)))
+  (delete-dead-registers!)
+  (load-fixnum-constant constant (reference-target-alias! target 'DATA)))
 
 (define-rule statement
-  (ASSIGN (REGISTER (? target))
-         (FIXNUM-1-ARG (? operator) (? operand)))
+  (ASSIGN (REGISTER (? target)) (OBJECT->FIXNUM (REGISTER (? source))))
   (QUALIFIER (pseudo-register? target))
-  (let ((temp-reg (allocate-temporary-register! 'DATA)))
-    (let ((operation
-          (LAP ,@(fixnum-do-1-arg! operator operand temp-reg))))
-      (delete-dead-registers!)
-      (add-pseudo-register-alias! target temp-reg false)
-      operation)))
-\f
-;;;; CHAR->ASCII/BYTE-OFFSET
+  (reuse-alias-deleting-dead-registers! source 'DATA
+    (lambda (alias)
+      (add-pseudo-register-alias! target alias)
+      (let ((reference (register-reference alias)))
+       (object->fixnum reference reference)))
+    (lambda (source)
+      (object->fixnum source (reference-target-alias! target 'DATA)))))
 
 (define-rule statement
   (ASSIGN (REGISTER (? target))
-         (CHAR->ASCII (OFFSET (REGISTER (? address)) (? offset))))
-  (QUALIFIER (pseudo-register? target))
-  (byte-offset->register (indirect-char/ascii-reference! address offset)
-                        (indirect-register address)
-                        target))
-
-(define-rule statement
-  (ASSIGN (REGISTER (? target)) (CHAR->ASCII (REGISTER (? source))))
+         (OBJECT->FIXNUM (OFFSET (REGISTER (? address)) (? offset))))
   (QUALIFIER (pseudo-register? target))
-  (let ((machine-register (if (machine-register? source)
-                             source
-                             (register-alias source false))))
-    (if machine-register
-       (let ((source-ref (register-reference machine-register)))
-         (delete-dead-registers!)
-         (let ((target-ref
-                (register-reference (allocate-alias-register! target 'DATA))))
-           (LAP (BFEXTU ,source-ref (& 24) (& 8) ,target-ref))))
-       (byte-offset->register
-        (indirect-char/ascii-reference! regnum:regs-pointer
-                                        (pseudo-register-offset source))
-        (indirect-register regnum:regs-pointer)
-        target))))
-
-(define-rule statement
-  (ASSIGN (BYTE-OFFSET (REGISTER (? address)) (? offset))
-         (CHAR->ASCII (REGISTER (? source))))
-  (let ((source (coerce->any/byte-reference source)))
-    (let ((target (indirect-byte-reference! address offset)))
-      (LAP (MOV B ,source ,target)))))
-
-(define-rule statement
-  (ASSIGN (BYTE-OFFSET (REGISTER (? address)) (? offset))
-         (CHAR->ASCII (CONSTANT (? character))))
-  (LAP (MOV B (& ,(char->signed-8-bit-immediate character))
-           ,(indirect-byte-reference! address offset))))
+  (let ((source (indirect-reference! address offset)))
+    (delete-dead-registers!)
+    (object->fixnum source (reference-target-alias! target 'DATA))))
 
 (define-rule statement
-  (ASSIGN (REGISTER (? target))
-         (BYTE-OFFSET (REGISTER (? address)) (? offset)))
+  (ASSIGN (REGISTER (? target)) (FIXNUM->OBJECT (REGISTER (? source))))
   (QUALIFIER (pseudo-register? target))
-  (byte-offset->register (indirect-byte-reference! address offset)
-                        (indirect-register address)
-                        target))
+  (fixnum->object (move-to-alias-register! source 'DATA target)))
 
 (define-rule statement
-  (ASSIGN (BYTE-OFFSET (REGISTER (? target)) (? target-offset))
-         (CHAR->ASCII (OFFSET (REGISTER (? source)) (? source-offset))))
-  (let ((source (indirect-char/ascii-reference! source source-offset)))
-    (LAP (MOV B ,source ,(indirect-byte-reference! target target-offset)))))
-
+  (ASSIGN (OFFSET (REGISTER (? a)) (? n))
+         (FIXNUM->OBJECT (REGISTER (? source))))
+  (let ((target (indirect-reference! a n)))
+    (LAP (MOV L ,(standard-register-reference source false) ,target)
+        ,@(fixnum->object target))))
 \f
 ;;;; Transfers to Memory
 
@@ -403,28 +283,26 @@ MIT in each case. |#
   (ASSIGN (OFFSET (REGISTER (? a)) (? n))
          (REGISTER (? r)))
   (LAP (MOV L
-           ,(coerce->any r)
+           ,(standard-register-reference r false)
            ,(indirect-reference! a n))))
 
 (define-rule statement
   (ASSIGN (OFFSET (REGISTER (? a)) (? n))
          (POST-INCREMENT (REGISTER 15) 1))
-  (LAP (MOV L
-           (@A+ 7)
-           ,(indirect-reference! a n))))
+  (LAP (MOV L (@A+ 7) ,(indirect-reference! a n))))
 
 (define-rule statement
-  (ASSIGN (OFFSET (REGISTER (? a)) (? n))
-         (CONS-POINTER (CONSTANT (? type)) (REGISTER (? r))))
-  (let ((target (indirect-reference! a n)))
-    (LAP (MOV L ,(coerce->any r) ,target)
+  (ASSIGN (OFFSET (REGISTER (? address)) (? offset))
+         (CONS-POINTER (CONSTANT (? type)) (REGISTER (? datum))))
+  (let ((target (indirect-reference! address offset)))
+    (LAP (MOV L ,(standard-register-reference datum 'DATA) ,target)
         (MOV B (& ,type) ,target))))
 
 (define-rule statement
-  (ASSIGN (OFFSET (REGISTER (? a)) (? n))
+  (ASSIGN (OFFSET (REGISTER (? address)) (? offset))
          (CONS-POINTER (CONSTANT (? type)) (ENTRY:PROCEDURE (? label))))
-  (let* ((target (indirect-reference! a n))
-        (temp (reference-temporary-register! 'ADDRESS)))
+  (let ((temp (reference-temporary-register! 'ADDRESS))
+       (target (indirect-reference! address offset)))
     (LAP (LEA (@PCR ,(rtl-procedure/external-label (label->object label)))
              ,temp)
         (MOV L ,temp ,target)
@@ -434,33 +312,7 @@ MIT in each case. |#
   (ASSIGN (OFFSET (REGISTER (? a0)) (? n0))
          (OFFSET (REGISTER (? a1)) (? n1)))
   (let ((source (indirect-reference! a1 n1)))
-    (LAP (MOV L
-             ,source
-             ,(indirect-reference! a0 n0)))))
-
-(define-rule statement
-  (ASSIGN (OFFSET (REGISTER (? a)) (? n))
-         (FIXNUM->OBJECT (REGISTER (? r))))
-  (let ((target (indirect-reference! a n)))
-    (LAP (MOV L ,(coerce->any r) ,target)
-        ,@(put-type-in-ea (ucode-type fixnum) target))))
-
-(define-rule statement
-  (ASSIGN (OFFSET (REGISTER (? a)) (? n))
-         (FIXNUM-2-ARGS (? operator) (? operand1) (? operand2)))
-  (let ((temp-reg (allocate-temporary-register! 'DATA))
-       (target-ref (indirect-reference! a n)))
-    (LAP ,@(fixnum-do-2-args! operator operand1 operand2 temp-reg)
-        (MOV L ,(register-reference temp-reg) ,target-ref))))
-
-
-(define-rule statement
-  (ASSIGN (OFFSET (REGISTER (? a)) (? n))
-         (FIXNUM-1-ARG (? operator) (? operand)))
-  (let ((temp-reg (allocate-temporary-register! 'DATA))
-       (target-ref (indirect-reference! a n)))
-    (LAP ,@(fixnum-do-1-arg! operator operand temp-reg)
-        (MOV L ,(register-reference temp-reg) ,target-ref))))
+    (LAP (MOV L ,source ,(indirect-reference! a0 n0)))))
 \f
 ;;;; Consing
 
@@ -479,7 +331,7 @@ MIT in each case. |#
 
 (define-rule statement
   (ASSIGN (POST-INCREMENT (REGISTER 13) 1) (REGISTER (? r)))
-  (LAP (MOV L ,(coerce->any r) (@A+ 5))))
+  (LAP (MOV L ,(standard-register-reference r false) (@A+ 5))))
 
 (define-rule statement
   (ASSIGN (POST-INCREMENT (REGISTER 13) 1) (OFFSET (REGISTER (? r)) (? n)))
@@ -488,26 +340,11 @@ MIT in each case. |#
 (define-rule statement
   (ASSIGN (POST-INCREMENT (REGISTER 13) 1)
          (FIXNUM->OBJECT (REGISTER (? r))))
-  (LAP (MOV L ,(coerce->any r) (@A+ 5))
-       ,@(put-type-in-ea (ucode-type fixnum) (INST-EA (@A 5)))))
-
-(define-rule statement
-  (ASSIGN (POST-INCREMENT (REGISTER 13) 1)
-         (FIXNUM-2-ARGS (? operator) (? operand1) (? operand2)))
-  (let ((temp-reg (allocate-temporary-register! 'DATA)))
-    (LAP ,@(fixnum-do-2-args! operator operand1 operand2 temp-reg)
-        (MOV L ,(register-reference temp-reg) (@A+ 5)))))
-
-(define-rule statement
-  (ASSIGN (POST-INCREMENT (REGISTER 13) 1)
-         (FIXNUM-1-ARG (? operator) (? operand)))
-  (let ((temp-reg (allocate-temporary-register! 'DATA)))
-    (LAP ,@(fixnum-do-1-arg! operator operand temp-reg)
-        (MOV L ,(register-reference temp-reg) (@A+ 5)))))
-
-;; This pops the top of stack into the heap
+  (LAP (MOV L ,(standard-register-reference r false) (@A+ 5))
+       ,@(fixnum->object  (INST-EA (@A 5)))))
 
 (define-rule statement
+  ;; This pops the top of stack into the heap
   (ASSIGN (POST-INCREMENT (REGISTER 13) 1) (POST-INCREMENT (REGISTER 15) 1))
   (LAP (MOV L (@A+ 7) (@A+ 5))))
 \f
@@ -523,12 +360,12 @@ MIT in each case. |#
 
 (define-rule statement
   (ASSIGN (PRE-INCREMENT (REGISTER 15) -1) (REGISTER (? r)))
-  (LAP (MOV L ,(coerce->any r) (@-A 7))))
+  (LAP (MOV L ,(standard-register-reference r false) (@-A 7))))
 
 (define-rule statement
   (ASSIGN (PRE-INCREMENT (REGISTER 15) -1)
-         (CONS-POINTER (CONSTANT (? type)) (REGISTER (? r))))
-  (LAP (MOV L ,(coerce->any r) (@-A 7))
+         (CONS-POINTER (CONSTANT (? type)) (REGISTER (? datum))))
+  (LAP (MOV L ,(standard-register-reference datum 'DATA) (@-A 7))
        (MOV B (& ,type) (@A 7))))
 
 (define-rule statement
@@ -549,19 +386,170 @@ MIT in each case. |#
 (define-rule statement
   (ASSIGN (PRE-INCREMENT (REGISTER 15) -1)
          (FIXNUM->OBJECT (REGISTER (? r))))
-  (LAP (MOV L ,(coerce->any r) (@-A 7))
-       ,@(put-type-in-ea (ucode-type fixnum) (INST-EA (@A 7)))))
+  (LAP (MOV L ,(standard-register-reference r false) (@-A 7))
+       ,@(fixnum->object (INST-EA (@A 7)))))
+\f
+;;;; Fixnum Operations
+
+(define-rule statement
+  (ASSIGN (? target) (FIXNUM-1-ARG (? operator) (REGISTER (? source))))
+  (QUALIFIER (and (fixnum-operation-target? target) (pseudo-register? source)))
+  (reuse-and-load-fixnum-target! target
+                                source
+                                (fixnum-1-arg/operate operator)))
+
+(define-rule statement
+  (ASSIGN (? target)
+         (FIXNUM-2-ARGS (? operator)
+                        (REGISTER (? source))
+                        (OBJECT->FIXNUM (CONSTANT (? constant)))))
+  (QUALIFIER (and (fixnum-operation-target? target) (pseudo-register? source)))
+  (fixnum-2-args/register*constant operator target source constant))
+
+(define-rule statement
+  (ASSIGN (? target)
+         (FIXNUM-2-ARGS (? operator)
+                        (OBJECT->FIXNUM (CONSTANT (? constant)))
+                        (REGISTER (? source))))
+  (QUALIFIER (and (fixnum-operation-target? target) (pseudo-register? source)))
+  (if (fixnum-2-args/commutative? operator)
+      (fixnum-2-args/register*constant operator target source constant)
+      (fixnum-2-args/constant*register operator target constant source)))
+
+(define (fixnum-2-args/register*constant operator target source constant)
+  (reuse-and-load-fixnum-target! target source
+    (lambda (target)
+      ((fixnum-2-args/operate-constant operator) target constant))))
+
+(define (fixnum-2-args/constant*register operator target constant source)
+  (let ((operate-on-target
+        (lambda (target)
+          (LAP ,@(load-fixnum-constant constant target)
+               ,@((fixnum-2-args/operate operator)
+                  target
+                  (if (eq? operator 'MULTIPLY-FIXNUM)
+                      (standard-multiply-source source)
+                      (standard-register-reference source 'DATA)))))))
+    (reuse-fixnum-target! target
+      (lambda (target)
+       (operate-on-target (reference-target-alias! target 'DATA)))
+      operate-on-target)))
+\f
+(define-rule statement
+  (ASSIGN (? target)
+         (FIXNUM-2-ARGS (? operator)
+                        (REGISTER (? source1))
+                        (REGISTER (? source2))))
+  (QUALIFIER (and (fixnum-operation-target? target)
+                 (pseudo-register? source1)
+                 (pseudo-register? source2)))
+  (let ((worst-case
+        (lambda (target source1 source2)
+          (LAP (MOV L ,source1 ,target)
+               ,@((fixnum-2-args/operate operator) target source2))))
+       (source-reference
+        (if (eq? operator 'MULTIPLY-FIXNUM)
+            standard-multiply-source
+            (lambda (source) (standard-register-reference source 'DATA)))))
+    (reuse-fixnum-target! target
+      (lambda (target)
+       (reuse-pseudo-register-alias! source1 'DATA
+         (lambda (alias)
+           (let ((source2 (source-reference source2)))
+             (delete-dead-registers!)
+             (add-pseudo-register-alias! target alias)
+             ((fixnum-2-args/operate operator) (register-reference alias)
+                                               source2)))
+         (lambda ()
+           (let ((new-target-alias!
+                  (lambda (source1 source2)
+                    (delete-dead-registers!)
+                    (worst-case (reference-target-alias! target 'DATA)
+                                source1
+                                source2))))
+             (reuse-pseudo-register-alias source2 'DATA
+               (lambda (alias)
+                 (let ((source1 (source-reference source1))
+                       (source2 (register-reference alias)))
+                   (let ((use-source2-alias!
+                          (lambda ()
+                            (delete-machine-register! alias)
+                            (delete-dead-registers!)
+                            (add-pseudo-register-alias! target alias)
+                            ((fixnum-2-args/operate operator) source2
+                                                              source1))))
+                     (cond ((fixnum-2-args/commutative? operator)
+                            (use-source2-alias!))
+                           ((effective-address/data-register? source1)
+                            (LAP (EXG ,source2 ,source1)
+                                 ,@(use-source2-alias!)))
+                           (else
+                            (new-target-alias! source1 source2))))))
+               (lambda ()
+                 (new-target-alias!
+                  (standard-register-reference source1 'DATA)
+                  (source-reference source2))))))))      (lambda (target)
+       (worst-case target
+                   (standard-register-reference source1 'DATA)
+                   (source-reference source2))))))
+
+(define (standard-multiply-source register)
+  (let ((alias (register-alias register 'DATA)))
+    (cond (alias
+          (register-reference alias))
+         ((register-saved-into-home? register)
+          (pseudo-register-home register))
+         (else
+          (reference-alias-register! register 'DATA)))))       
+\f
+;;;; CHAR->ASCII/BYTE-OFFSET
 
 (define-rule statement
-  (ASSIGN (PRE-INCREMENT (REGISTER 15) -1) 
-         (FIXNUM-2-ARGS (? operator) (? operand1) (? operand2)))
-  (let ((temp-reg (allocate-temporary-register! 'DATA)))
-    (LAP ,@(fixnum-do-2-args! operator operand1 operand2 temp-reg)
-        (MOV L ,(register-reference temp-reg) (@-A 7)))))
+  (ASSIGN (REGISTER (? target))
+         (CHAR->ASCII (OFFSET (REGISTER (? address)) (? offset))))
+  (QUALIFIER (pseudo-register? target))
+  (byte-offset->register (indirect-char/ascii-reference! address offset)
+                        (indirect-register address)
+                        target))
 
 (define-rule statement
-  (ASSIGN (PRE-INCREMENT (REGISTER 15) -1) 
-         (FIXNUM-1-ARG (? operator) (? operand)))
-  (let ((temp-reg (allocate-temporary-register! 'DATA)))
-    (LAP ,@(fixnum-do-1-arg! operator operand temp-reg)
-        (MOV L ,(register-reference temp-reg) (@-A 7)))))
+  (ASSIGN (REGISTER (? target)) (CHAR->ASCII (REGISTER (? source))))
+  (QUALIFIER (pseudo-register? target))
+  (let ((source-reference (machine-register-reference source false)))
+    (if source-reference
+       (begin
+         (delete-dead-registers!)
+         (LAP (BFEXTU ,source-reference (& 24) (& 8)
+                      ,(reference-target-alias! target 'DATA))))
+       (byte-offset->register
+        (indirect-char/ascii-reference! regnum:regs-pointer
+                                        (pseudo-register-offset source))
+        (indirect-register regnum:regs-pointer)
+        target))))
+
+(define-rule statement
+  (ASSIGN (BYTE-OFFSET (REGISTER (? address)) (? offset))
+         (CHAR->ASCII (REGISTER (? source))))
+  (let ((source (coerce->any/byte-reference source)))
+    (let ((target (indirect-byte-reference! address offset)))
+      (LAP (MOV B ,source ,target)))))
+
+(define-rule statement
+  (ASSIGN (BYTE-OFFSET (REGISTER (? address)) (? offset))
+         (CHAR->ASCII (CONSTANT (? character))))
+  (LAP (MOV B (& ,(char->signed-8-bit-immediate character))
+           ,(indirect-byte-reference! address offset))))
+
+(define-rule statement
+  (ASSIGN (REGISTER (? target))
+         (BYTE-OFFSET (REGISTER (? address)) (? offset)))
+  (QUALIFIER (pseudo-register? target))
+  (byte-offset->register (indirect-byte-reference! address offset)
+                        (indirect-register address)
+                        target))
+
+(define-rule statement
+  (ASSIGN (BYTE-OFFSET (REGISTER (? target)) (? target-offset))
+         (CHAR->ASCII (OFFSET (REGISTER (? source)) (? source-offset))))
+  (let ((source (indirect-char/ascii-reference! source source-offset)))
+    (LAP (MOV B ,source ,(indirect-byte-reference! target target-offset)))))
\ No newline at end of file
index 909ae421a4975bf7080e63033f0f1dcf6dcf968f..bf866b5015d0a11ab8ee857af569d8d665a88b77 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/rules2.scm,v 4.4 1988/06/14 08:48:37 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/rules2.scm,v 4.5 1988/08/29 22:49:54 cph Exp $
 
 Copyright (c) 1988 Massachusetts Institute of Technology
 
@@ -36,26 +36,84 @@ MIT in each case. |#
 
 (declare (usual-integrations))
 \f
-;;;; Predicates
-
+(define (predicate/memory-operand? expression)
+  (or (rtl:offset? expression)
+      (and (rtl:post-increment? expression)
+          (interpreter-stack-pointer?
+           (rtl:post-increment-register expression)))))
+
+(define (predicate/memory-operand-reference expression)
+  (case (rtl:expression-type expression)
+    ((OFFSET) (offset->indirect-reference! expression))
+    ((POST-INCREMENT) (INST-EA (@A+ 7)))
+    (else (error "Illegal memory operand" expression))))
+
+(define (compare/register*register register-1 register-2 cc)
+  (let ((finish
+        (lambda (reference-1 reference-2 cc)
+          (set-standard-branches! cc)
+          (LAP (CMP L ,reference-2 ,reference-1)))))
+    (let ((finish-1
+          (lambda (alias)
+            (finish (register-reference alias)
+                    (standard-register-reference register-2 'DATA)
+                    cc)))
+         (finish-2
+          (lambda (alias)
+            (finish (register-reference alias)
+                    (standard-register-reference register-1 'DATA)
+                    (invert-cc-noncommutative cc)))))
+      (let ((try-type
+            (lambda (type continue)
+              (let ((alias (register-alias register-1 type)))
+                (if alias
+                    (finish-1 alias)
+                    (let ((alias (register-alias register-2 type)))
+                      (if alias
+                          (finish-2 alias)
+                          (continue))))))))
+       (try-type 'DATA
+         (lambda ()
+           (try-type 'ADDRESS
+             (lambda ()
+               (if (dead-register? register-1)
+                   (finish-2 (load-alias-register! register-2 'DATA))
+                   (finish-1 (load-alias-register! register-1 'DATA)))))))))))
+
+(define (compare/register*memory register memory cc)
+  (let ((reference (standard-register-reference register 'DATA)))
+    (if (effective-address/register? reference)
+       (begin
+         (set-standard-branches! cc)
+         (LAP (CMP L ,memory ,reference)))
+       (compare/memory*memory reference memory cc))))
+
+(define (compare/memory*memory memory-1 memory-2 cc)
+  (set-standard-branches! cc)
+  (let ((temp (reference-temporary-register! 'DATA)))
+    (LAP (MOV L ,memory-1 ,temp)
+        (CMP L ,memory-2 ,temp))))
+\f
 (define-rule predicate
   (TRUE-TEST (REGISTER (? register)))
   (set-standard-branches! 'NE)
-  (LAP ,(test-non-pointer (ucode-type false) 0 (coerce->any register))))
+  (LAP ,(test-non-pointer (ucode-type false)
+                         0
+                         (standard-register-reference register false))))
 
 (define-rule predicate
-  (TRUE-TEST (OFFSET (REGISTER (? register)) (? offset)))
+  (TRUE-TEST (? memory))
+  (QUALIFIER (predicate/memory-operand? memory))
   (set-standard-branches! 'NE)
-  (LAP ,(test-non-pointer (ucode-type false) 0
-                         (indirect-reference! register offset))))
+  (LAP ,(test-non-pointer (ucode-type false)
+                         0
+                         (predicate/memory-operand-reference memory))))
 
 (define-rule predicate
   (TYPE-TEST (REGISTER (? register)) (? type))
   (QUALIFIER (pseudo-register? register))
   (set-standard-branches! 'EQ)
-  (LAP ,(test-byte
-        type
-        (register-reference (load-alias-register! register 'DATA)))))
+  (LAP ,(test-byte type (reference-alias-register! register 'DATA))))
 
 (define-rule predicate
   (TYPE-TEST (OBJECT->TYPE (REGISTER (? register))) (? type))
@@ -66,284 +124,200 @@ MIT in each case. |#
         ,(test-byte type reference))))
 
 (define-rule predicate
-  (TYPE-TEST (OBJECT->TYPE (OFFSET (REGISTER (? register)) (? offset)))
-            (? type))
+  (TYPE-TEST (OBJECT->TYPE (? memory)) (? type))
+  (QUALIFIER (predicate/memory-operand? memory))
   (set-standard-branches! 'EQ)
-  (LAP ,(test-byte type (indirect-reference! register offset))))
+  (LAP ,(test-byte type (predicate/memory-operand-reference memory))))
 
 (define-rule predicate
   (UNASSIGNED-TEST (REGISTER (? register)))
   (set-standard-branches! 'EQ)
-  (LAP ,(test-non-pointer (ucode-type unassigned) 0
-                         (coerce->any register))))
+  (LAP ,(test-non-pointer (ucode-type unassigned)
+                         0
+                         (standard-register-reference register 'DATA))))
 
 (define-rule predicate
-  (UNASSIGNED-TEST (OFFSET (REGISTER (? register)) (? offset)))
+  (UNASSIGNED-TEST (? memory))
+  (QUALIFIER (predicate/memory-operand? memory))
   (set-standard-branches! 'EQ)
-  (LAP ,(test-non-pointer (ucode-type unassigned) 0
-                         (indirect-reference! register offset))))
-\f
-(define (eq-test/constant*register constant register)
-  (set-standard-branches! 'EQ)
-  (if (non-pointer-object? constant)
-      (LAP ,(test-non-pointer (object-type constant)
-                             (object-datum constant)
-                             (coerce->any register)))
-      (LAP (CMP L (@PCR ,(constant->label constant))
-               ,(coerce->machine-register register)))))
-
-(define (eq-test/constant*memory constant memory-reference)
-  (set-standard-branches! 'EQ)
-  (if (non-pointer-object? constant)
-      (LAP ,(test-non-pointer (object-type constant)
-                             (object-datum constant)
-                             memory-reference))
-      (let ((temp (reference-temporary-register! false)))
-       (LAP (MOV L ,memory-reference ,temp)
-            (CMP L (@PCR ,(constant->label constant))
-                 ,temp)))))
-
-(define (eq-test/register*register register-1 register-2)
-  (set-standard-branches! 'EQ)
-  (let ((finish
-        (lambda (register-1 register-2)
-          (LAP (CMP L ,(coerce->any register-2)
-                    ,(coerce->machine-register register-1))))))
-    (if (or (and (not (register-has-alias? register-1 'DATA))
-                (register-has-alias? register-2 'DATA))
-           (and (not (register-has-alias? register-1 'ADDRESS))
-                (register-has-alias? register-2 'ADDRESS)))
-       (finish register-2 register-1)
-       (finish register-1 register-2))))
-
-(define (eq-test/register*memory register memory-reference)
-  (set-standard-branches! 'EQ)
-  (LAP (CMP L ,memory-reference
-           ,(coerce->machine-register register))))
-
-(define (eq-test/memory*memory register-1 offset-1 register-2 offset-2)
-  (set-standard-branches! 'EQ)
-  (let ((temp (reference-temporary-register! false)))
-    (let ((finish
-          (lambda (register-1 offset-1 register-2 offset-2)
-            (LAP (MOV L ,(indirect-reference! register-1 offset-1)
-                      ,temp)
-                 (CMP L ,(indirect-reference! register-2 offset-2)
-                      ,temp)))))
-      (if (or (and (not (register-has-alias? register-1 'ADDRESS))
-                  (register-has-alias? register-2 'ADDRESS))
-             (and (not (register-has-alias? register-1 'DATA))
-                  (register-has-alias? register-2 'DATA)))
-         (finish register-2 offset-2 register-1 offset-1)
-         (finish register-1 offset-1 register-2 offset-2)))))
-\f
-(define-rule predicate
-  (EQ-TEST (REGISTER (? register)) (CONSTANT (? constant)))
-  (eq-test/constant*register constant register))
-
-(define-rule predicate
-  (EQ-TEST (CONSTANT (? constant)) (REGISTER (? register)))
-  (eq-test/constant*register constant register))
+  (LAP ,(test-non-pointer (ucode-type unassigned)
+                         0
+                         (predicate/memory-operand-reference memory))))
 
 (define-rule predicate
-  (EQ-TEST (OFFSET (REGISTER (? register)) (? offset)) (CONSTANT (? constant)))
-  (eq-test/constant*memory constant (indirect-reference! register offset)))
-
-(define-rule predicate
-  (EQ-TEST (CONSTANT (? constant)) (OFFSET (REGISTER (? register)) (? offset)))
-  (eq-test/constant*memory constant (indirect-reference! register offset)))
-
-(define-rule predicate
-  (EQ-TEST (CONSTANT (? constant)) (POST-INCREMENT (REGISTER 15) 1))
-  (eq-test/constant*memory constant (INST-EA (@A+ 7))))
-
-(define-rule predicate
-  (EQ-TEST (POST-INCREMENT (REGISTER 15) 1) (CONSTANT (? constant)))
-  (eq-test/constant*memory constant (INST-EA (@A+ 7))))
-
+  (OVERFLOW-TEST)
+  (set-standard-branches! 'VS))
+\f
 (define-rule predicate
   (EQ-TEST (REGISTER (? register-1)) (REGISTER (? register-2)))
-  (eq-test/register*register register-1 register-2))
+  (QUALIFIER (and (pseudo-register? register-1)
+                 (pseudo-register? register-2)))
+  (compare/register*register register-1 register-2 'EQ))
 
 (define-rule predicate
-  (EQ-TEST (OFFSET (REGISTER (? register-1)) (? offset-1))
-          (REGISTER (? register-2)))
-  (eq-test/register*memory register-2
-                          (indirect-reference! register-1 offset-1)))
+  (EQ-TEST (REGISTER (? register)) (? memory))
+  (QUALIFIER (and (predicate/memory-operand? memory)
+                 (pseudo-register? register)))
+  (compare/register*memory register
+                          (predicate/memory-operand-reference memory)
+                          'EQ))
 
 (define-rule predicate
-  (EQ-TEST (REGISTER (? register-1))
-          (OFFSET (REGISTER (? register-2)) (? offset-2)))
-  (eq-test/register*memory register-1
-                          (indirect-reference! register-2 offset-2)))
+  (EQ-TEST (? memory) (REGISTER (? register)))
+  (QUALIFIER (and (predicate/memory-operand? memory)
+                 (pseudo-register? register)))
+  (compare/register*memory register
+                          (predicate/memory-operand-reference memory)
+                          'EQ))
 
 (define-rule predicate
-  (EQ-TEST (POST-INCREMENT (REGISTER 15) 1) (REGISTER (? register)))
-  (eq-test/register*memory register (INST-EA (@A+ 7))))
+  (EQ-TEST (? memory-1) (? memory-2))
+  (QUALIFIER (and (predicate/memory-operand? memory-1)
+                 (predicate/memory-operand? memory-2)))
+  (compare/memory*memory (predicate/memory-operand-reference memory-1)
+                        (predicate/memory-operand-reference memory-2)
+                        'EQ))
 
-(define-rule predicate
-  (EQ-TEST (REGISTER (? register)) (POST-INCREMENT (REGISTER 15) 1))
-  (eq-test/register*memory register (INST-EA (@A+ 7))))
-
-(define-rule predicate
-  (EQ-TEST (OFFSET (REGISTER (? register-1)) (? offset-1))
-          (OFFSET (REGISTER (? register-2)) (? offset-2)))
-  (eq-test/memory*memory register-1 offset-1 register-2 offset-2))
-
-\f
-;;; fixnum predicates
-
-(define (fixnum-pred/register*register register-1 register-2 cc)
-  (let ((finish
-        (lambda (register-1 register-2 maybe-invert)
-          (set-standard-branches! (maybe-invert cc))
-          (LAP (CMP L ,(coerce->any register-1)
-                    ,(coerce->machine-register register-2))))))
-    (if (or (and (not (register-has-alias? register-1 'DATA))
-                (register-has-alias? register-2 'DATA))
-           (and (not (register-has-alias? register-1 'ADDRESS))
-                (register-has-alias? register-2 'ADDRESS)))
-       (finish register-2 register-1 invert-cc)
-       (finish register-1 register-2 (lambda (x) x)))))
-
-(define (fixnum-pred/constant*register constant register cc)
-  (set-standard-branches! cc)
+(define (eq-test/constant*register constant register)
   (if (non-pointer-object? constant)
-      (LAP (CMPI L (& ,(object-datum constant)) ,(coerce->any register)))
-      (LAP (CMP L (@PCR ,(constant->label constant))
-               ,(coerce->machine-register register)))))
-
-(define (fixnum-pred/constant*memory constant memory-reference cc)
-  (set-standard-branches! cc)
+      (begin
+       (set-standard-branches! 'EQ)
+       (LAP ,(test-non-pointer (object-type constant)
+                               (object-datum constant)
+                               (standard-register-reference register 'DATA))))
+      (compare/register*memory register
+                              (INST-EA (@PCR ,(constant->label constant)))
+                              'EQ)))
+
+(define (eq-test/constant*memory constant memory)
   (if (non-pointer-object? constant)
-      (LAP (CMPI L (& ,(object-datum constant)) ,memory-reference))
-      (let ((temp (reference-temporary-register! false)))
-       (LAP (MOV L ,memory-reference ,temp)
-            (CMP L (@PCR ,(constant->label constant))
-                 ,temp)))))
-
-(define (fixnum-pred/register*memory register memory-reference cc)
-  (set-standard-branches! cc)
-  (LAP (CMP L ,memory-reference
-           ,(coerce->machine-register register))))
-
-(define (fixnum-pred/memory*memory register-1 offset-1 register-2 offset-2 cc)
-  (let ((temp (reference-temporary-register! false)))
-    (let ((finish
-          (lambda (register-1 offset-1 register-2 offset-2 maybe-invert)
-            (set-standard-branches! (maybe-invert cc))
-            (LAP (MOV L ,(indirect-reference! register-1 offset-1)
-                      ,temp)
-                 (CMP L ,(indirect-reference! register-2 offset-2)
-                      ,temp)))))
-      (if (or (and (not (register-has-alias? register-1 'ADDRESS))
-                  (register-has-alias? register-2 'ADDRESS))
-             (and (not (register-has-alias? register-1 'DATA))
-                  (register-has-alias? register-2 'DATA)))
-         (finish register-2 offset-2 register-1 offset-1 invert-cc)
-         (finish register-1 offset-1 register-2 offset-2 (lambda (x) x))))))
-
-\f
+      (begin
+       (set-standard-branches! 'EQ)
+       (LAP ,(test-non-pointer (object-type constant)
+                               (object-datum constant)
+                               memory)))
+      (compare/memory*memory memory
+                            (INST-EA (@PCR ,(constant->label constant)))
+                            'EQ)))
 
 (define-rule predicate
-  (FIXNUM-PRED-2-ARGS (? predicate)
-                     (REGISTER (? register-1)) (REGISTER (? register-2)))
-  (fixnum-pred/register*register register-2 register-1
-                                (fixnum-pred->cc predicate)))
-
-(define-rule predicate
-  (FIXNUM-PRED-2-ARGS (? predicate)
-                     (REGISTER (? register)) (CONSTANT (? constant)))
-  (fixnum-pred/constant*register constant register
-                                (fixnum-pred->cc predicate)))
+  (EQ-TEST (CONSTANT (? constant)) (REGISTER (? register)))
+  (QUALIFIER (pseudo-register? register))
+  (eq-test/constant*register constant register))
 
 (define-rule predicate
-  (FIXNUM-PRED-2-ARGS (? predicate)
-                     (CONSTANT (? constant)) (REGISTER (? register)))
-  (fixnum-pred/constant*register constant register
-                                (invert-cc (fixnum-pred->cc predicate))))
+  (EQ-TEST (REGISTER (? register)) (CONSTANT (? constant)))
+  (QUALIFIER (pseudo-register? register))
+  (eq-test/constant*register constant register))
 
 (define-rule predicate
-  (FIXNUM-PRED-2-ARGS (? predicate)
-                     (OFFSET (REGISTER (? register)) (? offset))
-                     (CONSTANT (? constant)))
-  (fixnum-pred/constant*memory constant (indirect-reference! register offset)
-                              (fixnum-pred->cc predicate)))
+  (EQ-TEST (CONSTANT (? constant)) (? memory))
+  (QUALIFIER (predicate/memory-operand? memory))
+  (eq-test/constant*memory constant
+                          (predicate/memory-operand-reference memory)))
 
 (define-rule predicate
-  (FIXNUM-PRED-2-ARGS (? predicate)
-                     (CONSTANT (? constant))
-                     (OFFSET (REGISTER (? register)) (? offset)))
-  (fixnum-pred/constant*memory constant (indirect-reference! register offset)
-                              (invert-cc (fixnum-pred->cc predicate))))
+  (EQ-TEST (? memory) (CONSTANT (? constant)))
+  (QUALIFIER (predicate/memory-operand? memory))
+  (eq-test/constant*memory constant
+                          (predicate/memory-operand-reference memory)))
+\f
+;;;; Fixnum Predicates
 
 (define-rule predicate
-  (FIXNUM-PRED-2-ARGS (? predicate)
-                     (CONSTANT (? constant))
-                     (POST-INCREMENT (REGISTER 15) 1))
-  (fixnum-pred/constant*memory constant (INST-EA (@A+ 7))
-                              (invert-cc (fixnum-pred->cc predicate))))
+  (FIXNUM-PRED-1-ARG (? predicate) (REGISTER (? register)))
+  (QUALIFIER (pseudo-register? register))
+  (set-standard-branches! (fixnum-predicate->cc predicate))
+  (test-fixnum (standard-register-reference register 'DATA)))
 
 (define-rule predicate
-  (FIXNUM-PRED-2-ARGS (? predicate)
-                     (POST-INCREMENT (REGISTER 15) 1) (CONSTANT (? constant)))
-  (fixnum-pred/constant*memory constant (INST-EA (@A+ 7))
-                              (fixnum-pred->cc predicate)))
+  (FIXNUM-PRED-1-ARG (? predicate) (? memory))
+  (QUALIFIER (predicate/memory-operand? memory))
+  (set-standard-branches! (fixnum-predicate->cc predicate))
+  (test-fixnum (predicate/memory-operand-reference memory)))
 
 (define-rule predicate
   (FIXNUM-PRED-2-ARGS (? predicate)
-                     (OFFSET (REGISTER (? register-1)) (? offset-1))
+                     (REGISTER (? register-1))
                      (REGISTER (? register-2)))
-  (fixnum-pred/register*memory register-2
-                              (indirect-reference! register-1 offset-1)
-                              (invert-cc (fixnum-pred->cc predicate))))
+  (QUALIFIER (and (pseudo-register? register-1)
+                 (pseudo-register? register-2)))
+  (compare/register*register register-1
+                            register-2
+                            (fixnum-predicate->cc predicate)))
+
+(define-rule predicate
+  (FIXNUM-PRED-2-ARGS (? predicate) (REGISTER (? register)) (? memory))
+  (QUALIFIER (and (predicate/memory-operand? memory)
+                 (pseudo-register? register)))
+  (compare/register*memory register
+                          (predicate/memory-operand-reference memory)
+                          (fixnum-predicate->cc predicate)))
+
+(define-rule predicate
+  (FIXNUM-PRED-2-ARGS (? predicate) (? memory) (REGISTER (? register)))
+  (QUALIFIER (and (predicate/memory-operand? memory)
+                 (pseudo-register? register)))
+  (compare/register*memory
+   register
+   (predicate/memory-operand-reference memory)
+   (invert-cc-noncommutative (fixnum-predicate->cc predicate))))
+
+(define-rule predicate
+  (FIXNUM-PRED-2-ARGS (? predicate) (? memory-1) (? memory-2))
+  (QUALIFIER (and (predicate/memory-operand? memory-1)
+                 (predicate/memory-operand? memory-2)))
+  (compare/memory*memory (predicate/memory-operand-reference memory-1)
+                        (predicate/memory-operand-reference memory-2)
+                        (fixnum-predicate->cc predicate)))
+\f
+(define (fixnum-predicate/register*constant register constant cc)
+  (set-standard-branches! cc)
+  (guarantee-signed-fixnum constant)
+  (let ((reference (standard-register-reference register 'DATA)))
+    (if (effective-address/register? reference)
+       (LAP (CMP L (& ,constant) ,reference))
+       (LAP (CMPI L (& ,constant) ,reference)))))
 
 (define-rule predicate
   (FIXNUM-PRED-2-ARGS (? predicate)
-                     (REGISTER (? register-1))
-                     (OFFSET (REGISTER (? register-2)) (? offset-2)))
-  (fixnum-pred/register*memory register-1
-                          (indirect-reference! register-2 offset-2)
-                          (fixnum-pred->cc predicate)))
+                     (REGISTER (? register))
+                     (OBJECT->FIXNUM (CONSTANT (? constant))))
+  (QUALIFIER (pseudo-register? register))
+  (fixnum-predicate/register*constant register
+                                     constant
+                                     (fixnum-predicate->cc predicate)))
 
 (define-rule predicate
   (FIXNUM-PRED-2-ARGS (? predicate)
-                     (POST-INCREMENT (REGISTER 15) 1) (REGISTER (? register)))
-  (fixnum-pred/register*memory register (INST-EA (@A+ 7))
-                              (invert-cc (fixnum-pred->cc predicate))))
+                     (OBJECT->FIXNUM (CONSTANT (? constant)))
+                     (REGISTER (? register)))
+  (QUALIFIER (pseudo-register? register))
+  (fixnum-predicate/register*constant
+   register
+   constant
+   (invert-cc-noncommutative (fixnum-predicate->cc predicate))))
 
-(define-rule predicate
-  (FIXNUM-PRED-2-ARGS (? predicate)
-                     (REGISTER (? register)) (POST-INCREMENT (REGISTER 15) 1))
-  (fixnum-pred/register*memory register (INST-EA (@A+ 7))
-                              (fixnum-pred->cc predicate)))
+(define (fixnum-predicate/memory*constant memory constant cc)
+  (set-standard-branches! cc)
+  (guarantee-signed-fixnum constant)
+  (LAP (CMPI L (& ,constant) ,memory)))
 
 (define-rule predicate
   (FIXNUM-PRED-2-ARGS (? predicate)
-                     (OFFSET (REGISTER (? register-1)) (? offset-1))
-                     (OFFSET (REGISTER (? register-2)) (? offset-2)))
-  (fixnum-pred/memory*memory register-1 offset-1 register-2 offset-2
-                            (fixnum-pred->cc predicate)))
-
-\f
-(define-rule predicate
-  (FIXNUM-PRED-1-ARG (? predicate) (REGISTER (? register)))
-  (set-standard-branches! (fixnum-pred->cc predicate))
-  (test-fixnum (coerce->any register)))
+                     (? memory)
+                     (OBJECT->FIXNUM (CONSTANT (? constant))))
+  (QUALIFIER (predicate/memory-operand? memory))
+  (fixnum-predicate/memory*constant (predicate/memory-operand-reference memory)
+                                   constant
+                                   (fixnum-predicate->cc predicate)))
 
 (define-rule predicate
-  (FIXNUM-PRED-1-ARG (? predicate) (CONSTANT (? constant)))
-  (set-standard-branches! (fixnum-pred->cc predicate))
-    (if (non-pointer-object? constant)
-      (test-fixnum (INST-EA (& ,(object-datum constant))))
-      (test-fixnum (INST-EA (@PCR ,(constant->label constant))))))
-
-(define-rule predicate
-  (FIXNUM-PRED-1-ARG (? predicate) (POST-INCREMENT (REGISTER 15) 1))
-  (set-standard-branches! (fixnum-pred->cc predicate))
-  (test-fixnum (INST-EA (@A+ 7))))
-
-(define-rule predicate
-  (FIXNUM-PRED-1-ARG (? predicate) (OFFSET (REGISTER (? register)) (? offset)))
-  (set-standard-branches! (fixnum-pred->cc predicate))
-  (test-fixnum (indirect-reference! offset register)))
+  (FIXNUM-PRED-2-ARGS (? predicate)
+                     (OBJECT->FIXNUM (CONSTANT (? constant)))
+                     (? memory))
+  (QUALIFIER (predicate/memory-operand? memory))
+  (fixnum-predicate/memory*constant
+   (predicate/memory-operand-reference memory)
+   constant
+   (invert-cc-noncommutative (fixnum-predicate->cc predicate))))
\ No newline at end of file