From 9d449c21acd52fd1a3c80cdd5c6e65bf0dfce32a Mon Sep 17 00:00:00 2001 From: "Guillermo J. Rozas" Date: Fri, 28 Aug 1987 18:51:09 +0000 Subject: [PATCH] Add with-register-copy-alias! for the benefit of machines with 3 operand instructions. --- v7/src/compiler/back/lapgn2.scm | 42 +++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/v7/src/compiler/back/lapgn2.scm b/v7/src/compiler/back/lapgn2.scm index b0b87f3c3..af6f50d3e 100644 --- a/v7/src/compiler/back/lapgn2.scm +++ b/v7/src/compiler/back/lapgn2.scm @@ -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)))))) +(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))))))))) + (define (add-pseudo-register-alias! register alias saved-into-home?) (set! *register-map* (add-pseudo-register-alias *register-map* register alias -- 2.25.1