From: Guillermo J. Rozas Date: Mon, 4 Dec 1989 15:34:40 +0000 (+0000) Subject: Add three operand utilities for Vax, RISC, etc. X-Git-Tag: 20090517-FFI~11639 X-Git-Url: https://birchwood-abbey.net/git?a=commitdiff_plain;h=cac7b120ffa0bedc59b173e05046fe06f190da74;p=mit-scheme.git Add three operand utilities for Vax, RISC, etc. Add copy-to-special-register. --- diff --git a/v7/src/compiler/back/lapgn2.scm b/v7/src/compiler/back/lapgn2.scm index 400d6e128..fe979b1f9 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.11 1989/10/26 07:35:00 cph Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/lapgn2.scm,v 1.12 1989/12/04 15:34:40 jinx Exp $ Copyright (c) 1987, 1988, 1989 Massachusetts Institute of Technology @@ -437,4 +437,47 @@ MIT in each case. |# (if-reusable alias) (rec1 (register-reference alias))) (lambda (source) - (rec2 source (register-reference (if-not)))))) \ No newline at end of file + (rec2 source (register-reference (if-not)))))) + +;;; Move a copy to a specific special register + +(define (copy-to-special-register source-register type special-register) + (let ((alias (register-alias source-register type))) + (cond (alias + (machine->machine-register alias special-register)) + ((not (dead-register? source-register)) + (delete-dead-registers!) + (machine->machine-register + (load-alias-register! source-register type) + special-register)) + ((not (register-saved-into-home? source-register)) + (error "copy-to-special-register: no valid copy" + source-register)) + (else + (reference->register-transfer + (pseudo-register-home source-register) + special-register))))) + +;;;; 2/3 Operand register allocation + +(define (with-copy-if-available source type if-win if-lose use-register!) + (reuse-pseudo-register-alias + source type + (lambda (reusable-alias) + (if-win (lambda () + (delete-machine-register! reusable-alias) + (delete-dead-registers!) + (use-register! reusable-alias) + (register-reference reusable-alias)))) + if-lose)) + +(define-integrable (with-register-copy-if-available + source type target if-win if-lose) + (with-copy-if-available source type if-win if-lose + (lambda (reusable-alias) + (add-pseudo-register-alias! target reusable-alias)))) + +(define-integrable (with-temporary-copy-if-available + source type if-win if-lose) + (with-copy-if-available source type if-win if-lose need-register!)) + \ No newline at end of file