* passing 2.1
This commit is contained in:
parent
5174ccb1cc
commit
217445835f
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
|
@ -447,7 +447,7 @@
|
|||
(record-case a1
|
||||
[(constant i)
|
||||
(unless (fixnum? i) (err x))
|
||||
(make-primcall 'mem
|
||||
(make-primcall 'mref
|
||||
(list (Value a0)
|
||||
(make-constant
|
||||
(+ (- disp-closure-data closure-tag)
|
||||
|
@ -540,26 +540,34 @@
|
|||
(values (cons (car regs) r*)
|
||||
(cons (car args) rl*)
|
||||
f*))])))
|
||||
(define (handle-nontail-call rator rands dest)
|
||||
(define (handle-nontail-call rator rands value-dest call-targ)
|
||||
(let-values ([(reg-locs reg-args frm-args)
|
||||
(nontail-locations (cons rator rands))])
|
||||
(let ([regt* (map (lambda (x) (unique-var 'rt)) reg-args)]
|
||||
[frmt* (map (lambda (x) (make-nfvar #f #f)) frm-args)])
|
||||
(let ([body
|
||||
(make-nframe frmt* #f
|
||||
(do-bind frmt* frm-args
|
||||
(do-bind regt* reg-args
|
||||
(assign* reg-locs regt*
|
||||
(make-seq
|
||||
(make-set argc-register
|
||||
(make-constant
|
||||
(argc-convention (length rands))))
|
||||
(make-primcall
|
||||
'indirect-call
|
||||
(cons argc-register
|
||||
(append reg-locs frmt*))))))))])
|
||||
(if dest
|
||||
(make-seq body (make-set dest return-value-register))
|
||||
(let* ([call
|
||||
(cond
|
||||
[call-targ
|
||||
(make-primcall 'direct-call
|
||||
(cons call-targ
|
||||
(cons argc-register
|
||||
(append reg-locs frmt*))))]
|
||||
[else
|
||||
(make-primcall 'indirect-call
|
||||
(cons argc-register
|
||||
(append reg-locs frmt*)))])]
|
||||
[body
|
||||
(make-nframe frmt* #f
|
||||
(do-bind frmt* frm-args
|
||||
(do-bind regt* reg-args
|
||||
(assign* reg-locs regt*
|
||||
(make-seq
|
||||
(make-set argc-register
|
||||
(make-constant
|
||||
(argc-convention (length rands))))
|
||||
call)))))])
|
||||
(if value-dest
|
||||
(make-seq body (make-set value-dest return-value-register))
|
||||
body)))))
|
||||
(define (V d x)
|
||||
(record-case x
|
||||
|
@ -576,7 +584,9 @@
|
|||
(lambda (rands)
|
||||
(make-set d (make-primcall op rands))))]
|
||||
[(funcall rator rands)
|
||||
(handle-nontail-call rator rands d)]
|
||||
(handle-nontail-call rator rands d #f)]
|
||||
[(jmpcall label rator rands)
|
||||
(handle-nontail-call rator rands d (make-code-loc label))]
|
||||
[else (error who "invalid value ~s" x)]))
|
||||
;;;
|
||||
(define (assign* lhs* rhs* ac)
|
||||
|
@ -602,7 +612,7 @@
|
|||
(lambda (rands)
|
||||
(make-primcall op rands)))]
|
||||
[(funcall rator rands)
|
||||
(handle-nontail-call rator rands #f)]
|
||||
(handle-nontail-call rator rands #f #f)]
|
||||
[else (error who "invalid effect ~s" x)]))
|
||||
;;;
|
||||
(define (P x)
|
||||
|
@ -616,6 +626,24 @@
|
|||
(make-primcall op rands)))]
|
||||
[else (error who "invalid pred ~s" x)]))
|
||||
;;;
|
||||
(define (handle-tail-call target rator rands)
|
||||
(let ([cpt (unique-var 'rator)]
|
||||
[rt* (map (lambda (x) (unique-var 't)) rands)])
|
||||
(do-bind rt* rands
|
||||
(do-bind (list cpt) (list rator)
|
||||
(let ([args (cons cpt rt*)]
|
||||
[locs (formals-locations (cons cpt rt*))])
|
||||
(assign* (reverse locs)
|
||||
(reverse args)
|
||||
(make-seq
|
||||
(make-set argc-register
|
||||
(make-constant
|
||||
(argc-convention (length rands))))
|
||||
(cond
|
||||
[target
|
||||
(make-primcall 'direct-jump (cons target locs))]
|
||||
[else
|
||||
(make-primcall 'indirect-jump locs)]))))))))
|
||||
(define (Tail x)
|
||||
(record-case x
|
||||
[(constant) (VT x)]
|
||||
|
@ -628,19 +656,9 @@
|
|||
[(conditional e0 e1 e2)
|
||||
(make-conditional (P e0) (Tail e1) (Tail e2))]
|
||||
[(funcall rator rands)
|
||||
(let ([cpt (unique-var 'rator)]
|
||||
[rt* (map (lambda (x) (unique-var 't)) rands)])
|
||||
(do-bind rt* rands
|
||||
(do-bind (list cpt) (list rator)
|
||||
(let ([args (cons cpt rt*)]
|
||||
[locs (formals-locations (cons cpt rt*))])
|
||||
(assign* (reverse locs)
|
||||
(reverse args)
|
||||
(make-seq
|
||||
(make-set argc-register
|
||||
(make-constant
|
||||
(argc-convention (length rands))))
|
||||
(make-primcall 'indirect-jump locs)))))))]
|
||||
(handle-tail-call #f rator rands)]
|
||||
[(jmpcall label rator rands)
|
||||
(handle-tail-call (make-code-loc label) rator rands)]
|
||||
[else (error who "invalid tail ~s" x)]))
|
||||
;;;
|
||||
(define (formals-locations args)
|
||||
|
@ -983,7 +1001,7 @@
|
|||
[(seq e0 e1) (make-seq (E e0) (NFE idx e1))]
|
||||
[(primcall op rands)
|
||||
(case op
|
||||
[(indirect-call)
|
||||
[(indirect-call direct-call)
|
||||
(make-primcall op
|
||||
(cons (make-constant idx) (map Rand rands)))]
|
||||
[else (error who "invalid NFE ~s" x)])]
|
||||
|
@ -1097,6 +1115,7 @@
|
|||
(case op
|
||||
[(nop) x]
|
||||
[(indirect-call) x]
|
||||
[(direct-call) x]
|
||||
[else (error who "invalid op in ~s" x)])]
|
||||
[else (error who "invalid effect ~s" x)]))
|
||||
(define (P x)
|
||||
|
@ -1228,14 +1247,27 @@
|
|||
[(set lhs rhs)
|
||||
(Rhs rhs (Rand lhs) ac)]
|
||||
[(conditional e0 e1 e2)
|
||||
(let ([lf (unique-label)])
|
||||
(let ([lf (unique-label)] [le (unique-label)])
|
||||
(P e0 #f lf
|
||||
(E e1
|
||||
(cons `(jmp ,lf)
|
||||
(E e2 (cons lf ac))))))]
|
||||
(list* `(jmp ,le) lf
|
||||
(E e2 (cons le ac))))))]
|
||||
[(primcall op rands)
|
||||
(case op
|
||||
[(nop) ac]
|
||||
[(mset!)
|
||||
(cons `(movl ,(Rand (caddr rands))
|
||||
(disp ,(Rand (car rands))
|
||||
,(Rand (cadr rands))))
|
||||
ac)]
|
||||
[(direct-call)
|
||||
(record-case (car rands)
|
||||
[(constant i)
|
||||
(list* `(subl ,(* (fxsub1 i) wordsize) ,fpr)
|
||||
`(call (label ,(code-loc-label (cadr rands))))
|
||||
`(addl ,(* (fxsub1 i) wordsize) ,fpr)
|
||||
ac)]
|
||||
[else (error who "invalid ~s" x)])]
|
||||
[(indirect-call)
|
||||
(record-case (car rands)
|
||||
[(constant i)
|
||||
|
@ -1328,6 +1360,8 @@
|
|||
[(indirect-jump)
|
||||
(cons `(jmp (disp ,(fx- disp-closure-code closure-tag) ,cp-register))
|
||||
ac)]
|
||||
[(direct-jump)
|
||||
(cons `(jmp (label ,(code-loc-label (car rands)))) ac)]
|
||||
[else (error who "invalid tail ~s" x)])]
|
||||
[else (error who "invalid tail ~s" x)]))
|
||||
;;;
|
||||
|
@ -1376,7 +1410,7 @@
|
|||
[x (color-by-chaitin x)]
|
||||
;[foo (print-code x)]
|
||||
[ls (flatten-codes x)])
|
||||
(when #f
|
||||
(when #t
|
||||
(parameterize ([gensym-prefix "L"]
|
||||
[print-gensym #f])
|
||||
(for-each
|
||||
|
|
Loading…
Reference in New Issue