#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/make.scm-68040,v 1.45 1987/11/21 18:47:39 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/make.scm-68040,v 1.46 1987/12/04 06:17:32 jinx Exp $
Copyright (c) 1987 Massachusetts Institute of Technology
(make-environment
(define :name "Liar (Bobcat 68020)")
(define :version 3)
- (define :modification 3)
+ (define :modification 4)
(define :files)
; (parse-rcs-header
-; "$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/make.scm-68040,v 1.45 1987/11/21 18:47:39 jinx Exp $"
+; "$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/make.scm-68040,v 1.46 1987/12/04 06:17:32 jinx Exp $"
; (lambda (filename version date time zone author state)
; (set! :version (car version))
; (set! :modification (cadr version))))
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/rules3.scm,v 1.16 1987/11/21 18:46:28 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/rules3.scm,v 1.17 1987/12/04 06:16:41 jinx Exp $
Copyright (c) 1987 Massachusetts Institute of Technology
(declare (usual-integrations))
\f
+(define-rule statement
+ (RETURN)
+ (disable-frame-pointer-offset!
+ (LAP ,@(clear-map!)
+ (CLR B (@A 7))
+ (RTS))))
+
;;;; Invocations
(define-rule statement
,(load-dnw frame-size 0)
(JMP ,entry:compiler-lookup-apply)))))
-(define-rule statement
- (INVOCATION:PRIMITIVE (? frame-size) (? prefix) (? continuation)
- (? primitive))
- (disable-frame-pointer-offset!
- (LAP ,@(generate-invocation-prefix prefix '())
- ,@(if (eq? primitive compiled-error-procedure)
- (LAP ,(load-dnw frame-size 0)
- (JMP ,entry:compiler-error))
- (LAP (MOV L (@PCR ,(constant->label primitive)) (D 6))
- (JMP ,entry:compiler-primitive-apply))))))
-
(define-rule statement
(INVOCATION:UUO-LINK (? frame-size) (? prefix) (? continuation) (? name))
(disable-frame-pointer-offset!
(MOV L (D 1) (A 0))
(JMP (@A 0)))))
\f
+(define-rule statement
+ (INVOCATION:PRIMITIVE (? frame-size) (? prefix) (? continuation)
+ (? primitive))
+ (disable-frame-pointer-offset!
+ (LAP ,@(generate-invocation-prefix prefix '())
+ ,@(let ((arity (primitive-procedure-arity primitive)))
+ (cond ((eq? primitive compiled-error-procedure)
+ (LAP ,(load-dnw frame-size 0)
+ (JMP ,entry:compiler-error)))
+ ((not (negative? arity))
+ (LAP (MOV L (@PCR ,(constant->label primitive)) (D 6))
+ (JMP ,entry:compiler-primitive-apply)))
+ ((= arity -1)
+ (LAP (MOV L (& ,frame-size) ,reg:lexpr-primitive-arity)
+ (MOV L (@PCR ,(constant->label primitive)) (D 6))
+ (JMP ,entry:compiler-primitive-apply)))
+ (else
+ ;; Unknown primitive arity. Go through apply.
+ (LAP ,(load-dnw frame-size 0)
+ (MOV L (@PCR ,(constant->label primitive)) (@-A 7))
+ (JMP ,entry:compiler-apply))))))))
+
(let-syntax
((define-special-primitive-invocation
(macro (name)
(define-special-primitive-invocation zero?)
(define-special-primitive-invocation positive?)
(define-special-primitive-invocation negative?))
-
-(define-rule statement
- (RETURN)
- (disable-frame-pointer-offset!
- (LAP ,@(clear-map!)
- (CLR B (@A 7))
- (RTS))))
\f
(define (generate-invocation-prefix prefix needed-registers)
(let ((clear-map (clear-map!)))