#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/lapgen.scm,v 1.179 1987/06/10 19:48:46 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/lapgen.scm,v 1.180 1987/06/11 20:48:14 cph Exp $
Copyright (c) 1987 Massachusetts Institute of Technology
(define-rule statement
(INVOCATION:APPLY (? number-pushed) (? prefix) (? continuation))
(disable-frame-pointer-offset!
- `(,@(generate-invocation-prefix prefix)
+ `(,@(generate-invocation-prefix prefix '())
,(load-dnw number-pushed 0)
(JMP ,entry:compiler-apply))))
(INVOCATION:JUMP (? number-pushed) (? prefix) (? continuation) (? label))
(QUALIFIER (not (memq (car prefix) '(APPLY-CLOSURE APPLY-STACK))))
(disable-frame-pointer-offset!
- `(,@(generate-invocation-prefix prefix)
+ `(,@(generate-invocation-prefix prefix '())
(BRA L (@PCR ,label)))))
(define-rule statement
(INVOCATION:LEXPR (? number-pushed) (? prefix) (? continuation)
(? label))
(disable-frame-pointer-offset!
- `(,@(generate-invocation-prefix prefix)
+ `(,@(generate-invocation-prefix prefix '())
,(load-dnw number-pushed 0)
(BRA L (@PCR ,label)))))
\f
(let ((set-extension (expression->machine-register! extension a3)))
(delete-dead-registers!)
`(,@set-extension
- ,@(generate-invocation-prefix prefix)
+ ,@(generate-invocation-prefix prefix (list a3))
,(load-dnw frame-size 0)
(LEA (@PCR ,*block-start-label*) (A 1))
(JMP ,entry:compiler-cache-reference-apply)))))
(let ((set-environment (expression->machine-register! environment d4)))
(delete-dead-registers!)
`(,@set-environment
- ,@(generate-invocation-prefix prefix)
+ ,@(generate-invocation-prefix prefix (list d4))
,(load-constant name '(D 5))
,(load-dnw frame-size 0)
(JMP ,entry:compiler-lookup-apply)))))
(INVOCATION:PRIMITIVE (? number-pushed) (? prefix) (? continuation)
(? primitive))
(disable-frame-pointer-offset!
- `(,@(generate-invocation-prefix prefix)
+ `(,@(generate-invocation-prefix prefix '())
,@(if (eq? primitive compiled-error-procedure)
`(,(load-dnw (1+ number-pushed) 0)
(JMP ,entry:compiler-error))
(CLR B (@A 7))
(RTS))))
\f
-(define (generate-invocation-prefix prefix)
- `(,@(clear-map!)
- ,@(case (car prefix)
- ((NULL) '())
- ((MOVE-FRAME-UP)
- (apply generate-invocation-prefix:move-frame-up (cdr prefix)))
- ((APPLY-CLOSURE)
- (apply generate-invocation-prefix:apply-closure (cdr prefix)))
- ((APPLY-STACK)
- (apply generate-invocation-prefix:apply-stack (cdr prefix)))
- (else (error "GENERATE-INVOCATION-PREFIX: bad prefix type" prefix)))))
+(define (generate-invocation-prefix prefix needed-registers)
+ (let ((clear-map (clear-map!)))
+ (need-registers! needed-registers)
+ `(,@clear-map
+ ,@(case (car prefix)
+ ((NULL) '())
+ ((MOVE-FRAME-UP)
+ (apply generate-invocation-prefix:move-frame-up (cdr prefix)))
+ ((APPLY-CLOSURE)
+ (apply generate-invocation-prefix:apply-closure (cdr prefix)))
+ ((APPLY-STACK)
+ (apply generate-invocation-prefix:apply-stack (cdr prefix)))
+ (else
+ (error "bad prefix type" prefix))))))
(define (generate-invocation-prefix:move-frame-up frame-size how-far)
(cond ((zero? how-far) '())