Multiple value changes. Block->context changes.
authorChris Hanson <org/chris-hanson/cph>
Mon, 12 Dec 1988 21:52:46 +0000 (21:52 +0000)
committerChris Hanson <org/chris-hanson/cph>
Mon, 12 Dec 1988 21:52:46 +0000 (21:52 +0000)
v7/src/compiler/rtlgen/rgrval.scm

index 636c5190d08c3df2c53edfb53ed56b92dc3a7420..e24baaffaa47314b14a1d48a0ee41ccbf89e5a7b 100644 (file)
@@ -1,9 +1,9 @@
 d3 1
 a4 1
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgrval.scm,v 4.11 1988/11/08 11:14:49 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgrval.scm,v 4.12 1988/12/12 21:52:46 cph Exp $
 #| -*-Scheme-*-
 Copyright (c) 1988 Massachusetts Institute of Technology
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgrval.scm,v 4.11 1988/11/08 11:14:49 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgrval.scm,v 4.12 1988/12/12 21:52:46 cph Exp $
 
 Copyright (c) 1988, 1990 Massachusetts Institute of Technology
 
@@ -36,272 +36,65 @@ promotional, or sales literature without prior written consent from
 
 ;;;; RTL Generation: RValues
 ;;; package: (compiler rtl-generator generate/rvalue)
-(package (generate/rvalue load-closure-environment make-ic-cons)
 
-(define-export (generate/rvalue operand offset scfg*cfg->cfg! generator)
-  (transmit-values (generate/rvalue* operand offset)
+(declare (usual-integrations))
 \f
 (define (generate/rvalue operand scfg*cfg->cfg! generator)
   (with-values (lambda () (generate/rvalue* operand))
-(define (generate/rvalue* operand offset)
-  ((method-table-lookup rvalue-methods (tagged-vector/index operand))
-   operand
-   offset))
+    (lambda (prefix expression)
+      (scfg*cfg->cfg! prefix (generator expression)))))
 
 (define (generate/rvalue* operand)
   ((method-table-lookup rvalue-methods (tagged-vector/index operand)) operand))
 
 (define rvalue-methods
-  (return-2 (make-null-cfg) expression))
+  (make-method-table rvalue-types false))
 
 (define-integrable (expression-value/simple expression)
   (values (make-null-cfg) expression))
 
-     (return-2 (scfg*scfg->scfg! prefix assignment) reference))
+(define (expression-value/temporary prefix result)
   (load-temporary-register
    (lambda (assignment reference)
      (values (scfg*scfg->scfg! prefix assignment) reference))
-#|
-(define-integrable (expression-value/transform expression-value transform)
-  (transmit-values expression-value
-    (lambda (prefix expression)
-      (return-2 prefix (transform expression)))))
-|#
-\f
    result
-  (lambda (constant offset)
-    offset ;; ignored
-    (generate/constant constant)))
-(define-method-table-entry 'CONSTANT rvalue-methods
-(define (generate/constant constant)
-  (expression-value/simple (rtl:make-constant (constant-value constant))))
+   identity-procedure))
 
+(define-method-table-entry 'CONSTANT rvalue-methods
   (lambda (constant)
-  (lambda (block offset)
-    block offset ;; ignored
-(define-method-table-entry 'BLOCK rvalue-methods
+    (expression-value/simple (rtl:make-constant (constant-value constant)))))
 
+(define-method-table-entry 'BLOCK rvalue-methods
+  (lambda (block)
     block ;; ignored
-  (lambda (reference offset)
-    (let ((block (reference-block reference))
+    (expression-value/simple (rtl:make-fetch register:environment))))
+\f
 (define-method-table-entry 'REFERENCE rvalue-methods
   (lambda (reference)
     (let ((context (reference-context reference))
          (safe? (reference-safe? reference)))
             (lambda ()
-              (find-variable block lvalue offset
+              (find-variable context lvalue
                (lambda (locative)
                  (expression-value/simple (rtl:make-fetch locative)))
                (lambda (environment name)
                  (expression-value/temporary
                   (rtl:make-interpreter-call:lookup
                    environment
-                   (intern-scode-variable! block name)
+                   (intern-scode-variable! (reference-context/block context)
+                                           name)
                    safe?)
                   (rtl:interpreter-call-result:lookup)))
                (lambda (name)
                  (if (memq 'IGNORE-REFERENCE-TRAPS
                            (variable-declarations lvalue))
-                     (load-temporary-register return-2
+                     (load-temporary-register values
                                               (rtl:make-variable-cache name)
                                               rtl:make-fetch)
                      (generate/cached-reference name safe?)))))))
        (cond ((not value) (perform-fetch))
                          lvalue))
-              (generate/rvalue* value offset))
+              |#
              ((not (rvalue/procedure? value))
               (generate/rvalue* value))
              (else (perform-fetch)))))))
-\f
-(define (generate/cached-reference name safe?)
-              (perform-fetch #| lvalue |#)))))))
-    (return-2
-     (load-temporary-register scfg*scfg->scfg!
-                             (rtl:make-variable-cache name)
-  (let ((result (rtl:make-pseudo-register)))
-    (values
-     (load-temporary-register scfg*scfg->scfg! (rtl:make-variable-cache name)
-       (lambda (cell)
-        (let ((reference (rtl:make-fetch cell)))
-                (n4 (rtl:make-interpreter-call:cache-reference cell safe?))
-                 (wrap-with-continuation-entry
-                  context
-                  (rtl:make-interpreter-call:cache-reference cell safe?)))
-                (n5
-                 (rtl:make-assignment
-                  result
-                  (rtl:interpreter-call-result:cache-reference))))
-            (pcfg-alternative-connect! n2 n3)
-            (scfg-next-connect! n4 n5)
-            (if safe?
-                (let ((n6 (rtl:make-unassigned-test reference))
-                      ;; Make new copy of n3 to keep CSE happy.
-                      ;; Otherwise control merge will confuse it.
-                      (n7 (rtl:make-assignment result reference)))
-                  (pcfg-consequent-connect! n2 n6)
-                  (pcfg-consequent-connect! n6 n7)
-                  (pcfg-alternative-connect! n6 n4)
-                  (make-scfg (cfg-entry-node n2)
-                             (hooks-union
-                              (scfg-next-hooks n3)
-                              (hooks-union (scfg-next-hooks n5)
-                                           (scfg-next-hooks n7)))))
-                (begin
-                  (pcfg-consequent-connect! n2 n4)
-                  (make-scfg (cfg-entry-node n2)
-                             (hooks-union (scfg-next-hooks n3)
-                                          (scfg-next-hooks n5)))))))))
-  (lambda (procedure offset)
-\f
-(define-method-table-entry 'PROCEDURE rvalue-methods
-    (case (procedure/type procedure)
-       (if (procedure/trivial-closure? procedure)
-          (expression-value/simple (make-trivial-closure-cons procedure))
-          (load-temporary-register
-           (lambda (assignment reference)
-             (return-2
-              (scfg*scfg->scfg!
-               assignment
-               (load-closure-environment procedure offset reference))
-              reference))
-           (make-non-trivial-closure-cons procedure)
-           identity-procedure)))
-        (else
-       (make-ic-cons procedure offset
-                    (lambda (scfg expr) (return-2 scfg expr))))
-          (make-cons-closure-indirection procedure)))))
-      ((IC)
-       (make-ic-cons procedure))
-      ((OPEN-EXTERNAL OPEN-INTERNAL)
-       (if (not (procedure-virtual-closure? procedure))
-          (error "Reference to open procedure" procedure))
-           ;; inside another IC procedure?
-(define-export (load-closure-environment procedure offset closure-locative)
-  (define (load-closure-parent block force?)
-    (if (and (not force?)
-            (or (not block)
-                (not (ic-block/use-lookup? block))))
-       (make-null-cfg)
-       (let ((closure-block (procedure-closure-block procedure)))
-         (rtl:make-assignment
-          (rtl:locative-offset closure-locative closure-block-first-offset)
-          (cond ((not (ic-block/use-lookup? block))
-                 (rtl:make-constant false))
-                ((reference? closure-block)
-                 (error "load-closure-environment: bad closure block"
-                        procedure))
-                ((ic-block? closure-block)
-                 (rtl:make-fetch register:environment))
-                (else
-                 (closure-ic-locative closure-block block offset)))))))
-  (enqueue-procedure! procedure)
-  (let ((block (procedure-closing-block procedure)))
-(define (make-non-trivial-closure-cons procedure block**)
-          (make-null-cfg))
-         ((ic-block? block)
-          (load-closure-parent block true))
-         ((closure-block? block)
-          (let ((closure-block (procedure-closure-block procedure)))
-            (define (loop entries code)
-            (let loop
-                ((entries (block-closure-offsets block))
-                 (code (load-closure-parent (block-parent block) false)))
-              (if (null? entries)
-                  code
-                                   (reference-context/procedure context))
-                  (loop (cdr entries)
-                        (scfg*scfg->scfg!
-                         (rtl:make-assignment
-                          (rtl:locative-offset closure-locative
-                                               (cdar entries))
-                          (let* ((variable (caar entries))
-                                 (value (lvalue-known-value variable)))
-                            (cond
-                             ;; Paranoia.
-                             ((and value
-                                   (rvalue/procedure? value)
-                             ((not (eq? value (block-procedure
-                                               closure-block)))
-                                          value variable))
-                               (find-closure-variable closure-block
-                                                      variable
-                                                      offset)))
-                             ((eq? value
-                              (rtl:make-fetch
-                               (block-closure-locative closure-block
-                                                       offset))))))
-                         code))))
-
-            (loop
-             (block-closure-offsets block)
-             (load-closure-parent (block-parent block) false))))
-         (else
-          (error "Unknown block type" block)))))
-\f
-(define-export (make-ic-cons procedure offset recvr)
-  ;; IC procedures have their entry points linked into their headers
-  ;; at load time by the linker.
-  (let* ((header
-         (scode/make-lambda (procedure-name procedure)
-                            (map variable-name
-                                 (procedure-required-arguments procedure))
-                            (map variable-name (procedure-optional procedure))
-                            (let ((rest (procedure-rest procedure)))
-                              (and rest (variable-name rest)))
-                            (map variable-name (procedure-names procedure))
-                            '()
-                            false))
-        (kernel
-         (lambda (scfg expr)
-           (recvr scfg
-                  (rtl:make-typed-cons:pair
-                   (rtl:make-constant (scode/procedure-type-code header))
-                   (rtl:make-constant header)
-                   expr)))))
-    (set! *ic-procedure-headers*
-         (cons (cons header (procedure-label procedure))
-               *ic-procedure-headers*))
-    
-    (cond ((not (reference? (procedure-closure-block procedure)))
-          ;; Is this right if the procedure is being closed
-          ;; inside another IC procedure?
-          (kernel (make-null-cfg)
-                  (rtl:make-fetch register:environment)))
-         ((eq? offset 'USE-ENV)
-          (error "make-ic-cons: offset unavailable" procedure))
-         (else
-          (transmit-values
-           (generate/rvalue* (procedure-closure-block procedure)
-                             offset)
-           kernel)))))
-
-;;; end GENERATE/RVALUE
-)
-\f
-(define (make-trivial-closure-cons procedure)
-  (enqueue-procedure! procedure)
-  (rtl:make-cons-pointer
-   (rtl:make-constant type-code:compiled-entry)
-   (rtl:make-entry:procedure (procedure-label procedure))))
-
-(define (make-non-trivial-closure-cons procedure)
-  (rtl:make-cons-pointer
-   (rtl:make-constant type-code:compiled-entry)
-   (with-procedure-arity-encoding procedure
-     (lambda (min max)
-       (rtl:make-cons-closure
-       (rtl:make-entry:procedure (procedure-label procedure))
-       min
-       max
-       (procedure-closure-size procedure))))))
-
-(define (with-procedure-arity-encoding procedure receiver)
-  (let* ((min (1+ (length (procedure-required-arguments procedure))))
-        (max (+ min (length (procedure-optional procedure)))))
-    (receiver min
-             (if (procedure-rest procedure)
-                 (- (1+ max))
-                 max))))                              (find-closure-variable context variable)))))
-                         code)))))
-            (error "Unknown block type" block))))))
-            (error "Unknown block type" block))))))