* Interrupts now work, again
This commit is contained in:
parent
1a8af2acea
commit
8f9aa2cd18
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
|
@ -1679,7 +1679,7 @@
|
|||
|
||||
|
||||
|
||||
(define (insert-engine-checks-not-working x)
|
||||
(define (insert-engine-checks x)
|
||||
(define (Tail x)
|
||||
(make-seq
|
||||
(make-interrupt-call
|
||||
|
|
|
@ -193,6 +193,25 @@
|
|||
(include "pass-specify-rep.ss")
|
||||
|
||||
|
||||
(define (insert-engine-checks x)
|
||||
(define (Tail x)
|
||||
(make-seq
|
||||
(make-primcall '$do-event '())
|
||||
x))
|
||||
(define (CaseExpr x)
|
||||
(record-case x
|
||||
[(clambda-case info body)
|
||||
(make-clambda-case info (Tail body))]))
|
||||
(define (CodeExpr x)
|
||||
(record-case x
|
||||
[(clambda L cases free)
|
||||
(make-clambda L (map CaseExpr cases) free)]))
|
||||
(define (CodesExpr x)
|
||||
(record-case x
|
||||
[(codes list body)
|
||||
(make-codes (map CodeExpr list) (Tail body))]))
|
||||
(CodesExpr x))
|
||||
|
||||
(define (insert-stack-overflow-check x)
|
||||
(define who 'insert-stack-overflow-check)
|
||||
|
||||
|
@ -486,7 +505,7 @@
|
|||
(S* rands
|
||||
(lambda (s*)
|
||||
(make-asm-instr op (car s*) (cadr s*))))]
|
||||
[(nop interrupt) x]
|
||||
[(nop interrupt incr/zero?) x]
|
||||
[else (error 'impose-effect "invalid instr ~s" x)])]
|
||||
[(funcall rator rands)
|
||||
(handle-nontail-call rator rands #f #f)]
|
||||
|
@ -1451,7 +1470,7 @@
|
|||
[(primcall op args)
|
||||
(case op
|
||||
[(nop) (values vs rs fs ns)]
|
||||
[(interrupt)
|
||||
[(interrupt incr/zero?)
|
||||
(let ([v (exception-live-set)])
|
||||
(unless (vector? v)
|
||||
(error who "unbound exception2"))
|
||||
|
@ -1742,7 +1761,7 @@
|
|||
(NFE (fxsub1 i) (make-mask (fxsub1 i)) body)))]
|
||||
[(primcall op args)
|
||||
(case op
|
||||
[(nop interrupt) x]
|
||||
[(nop interrupt incr/zero?) x]
|
||||
[else (error who "invalid effect prim ~s" op)])]
|
||||
[(shortcut body handler)
|
||||
(make-shortcut (E body) (E handler))]
|
||||
|
@ -1901,7 +1920,7 @@
|
|||
[(primcall op arg*)
|
||||
(case op
|
||||
[(nop) s]
|
||||
[(interrupt)
|
||||
[(interrupt incr/zero?)
|
||||
(or (exception-live-set) (error who "uninitialized exception"))]
|
||||
[else (error who "invalid effect primcall ~s" op)])]
|
||||
[(shortcut body handler)
|
||||
|
@ -2225,7 +2244,7 @@
|
|||
[else (error who "invalid effect ~s" op)])]
|
||||
[(primcall op rands)
|
||||
(case op
|
||||
[(nop interrupt) x]
|
||||
[(nop interrupt incr/zero?) x]
|
||||
[else (error who "invalid op in ~s" (unparse x))])]
|
||||
[(ntcall) x]
|
||||
[(shortcut body handler)
|
||||
|
@ -2521,6 +2540,13 @@
|
|||
(let ([l (or (exception-label)
|
||||
(error who "no exception label"))])
|
||||
(cons `(jmp ,l) ac))]
|
||||
[(incr/zero?)
|
||||
(let ([l (or (exception-label)
|
||||
(error who "no exception label"))])
|
||||
(list*
|
||||
`(addl 1 ,(R (make-disp (car rands) (cadr rands))))
|
||||
`(je ,l)
|
||||
ac))]
|
||||
[else (error who "invalid effect ~s" (unparse x))])]
|
||||
[(shortcut body handler)
|
||||
(let ([L (unique-interrupt-label)] [L2 (unique-label)])
|
||||
|
@ -2581,7 +2607,7 @@
|
|||
[fl:= fl:!=] [fl:!= fl:=]
|
||||
[fl:< fl:>=] [fl:<= fl:>] [fl:> fl:<=] [fl:>= fl:<]))
|
||||
=> cadr]
|
||||
[else (error who "invalid op ~s" x)]))
|
||||
[else (error who "invalid notop ~s" x)]))
|
||||
(define (jmpname x)
|
||||
(cond
|
||||
[(assq x '([= je] [!= jne] [< jl] [<= jle] [> jg] [>= jge]
|
||||
|
@ -2610,7 +2636,7 @@
|
|||
(list* `(cmpl ,(R a0) ,(R a1))
|
||||
`(,(revjmpname op) ,lab)
|
||||
ac)]
|
||||
[else (error who "invalid ops ~s ~s" a0 a1)]))
|
||||
[else (error who "invalid cmpops ~s ~s" a0 a1)]))
|
||||
(cond
|
||||
[(and lt lf)
|
||||
(cmp op a0 a1 lt
|
||||
|
@ -2777,6 +2803,7 @@
|
|||
(proc))
|
||||
(let* ([x (introduce-primcalls x)]
|
||||
[x (eliminate-fix x)]
|
||||
[x (insert-engine-checks x)]
|
||||
[x (specify-representation x)]
|
||||
[x (insert-stack-overflow-check x)]
|
||||
[x (impose-calling-convention/evaluation-order x)]
|
||||
|
|
|
@ -1474,6 +1474,12 @@
|
|||
(define-primop $unset-interrupted! unsafe
|
||||
[(E) (prm 'mset pcr (K 40) (K 0))])
|
||||
|
||||
(define-primop $do-event safe
|
||||
[(E)
|
||||
(begin
|
||||
(interrupt)
|
||||
(prm 'incr/zero? pcr (K 36)))])
|
||||
|
||||
/section)
|
||||
|
||||
(section ;;; control operations
|
||||
|
|
Loading…
Reference in New Issue