mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-13 15:10:34 +02:00
reify-primitives reifies constants for out-of-range imm params
* module/language/cps/reify-primitives.scm (reify-primitives): Add pass to re-reify constant arguments for primcalls with immediate parameters that can't be encoded as bytecode.
This commit is contained in:
parent
cc1b23ffe8
commit
1160690fde
1 changed files with 46 additions and 1 deletions
|
@ -151,7 +151,52 @@
|
||||||
(cond
|
(cond
|
||||||
((or (prim-instruction name) (branching-primitive? name))
|
((or (prim-instruction name) (branching-primitive? name))
|
||||||
;; Assume arities are correct.
|
;; Assume arities are correct.
|
||||||
cps)
|
(let ()
|
||||||
|
(define (u6? val) (and (exact-integer? val) (<= 0 val 63)))
|
||||||
|
(define (u8? val) (and (exact-integer? val) (<= 0 val 255)))
|
||||||
|
(define-syntax-rule (reify-constants wrap
|
||||||
|
((op (pred? c) in ...) (op* out ...))
|
||||||
|
...
|
||||||
|
(_ default))
|
||||||
|
(match name
|
||||||
|
('op
|
||||||
|
(if (pred? param)
|
||||||
|
cps
|
||||||
|
(match args
|
||||||
|
((in ...)
|
||||||
|
(with-cps cps
|
||||||
|
(letv c)
|
||||||
|
(letk kconst ($kargs ('c) (c)
|
||||||
|
($continue k src
|
||||||
|
($primcall 'op* #f (out ...)))))
|
||||||
|
(setk label
|
||||||
|
($kargs names vars
|
||||||
|
($continue kconst src wrap))))))))
|
||||||
|
...
|
||||||
|
(_ default)))
|
||||||
|
(define-syntax-rule (reify-scm-constants clause ...)
|
||||||
|
(reify-constants ($const param) clause ...))
|
||||||
|
(define-syntax-rule (reify-u64-constants clause ...)
|
||||||
|
(reify-constants ($primcall 'load-u64 param ()) clause ...))
|
||||||
|
(reify-scm-constants
|
||||||
|
((add/immediate (u8? y) x) (add x y))
|
||||||
|
((sub/immediate (u8? y) x) (sub x y))
|
||||||
|
(_
|
||||||
|
(reify-u64-constants
|
||||||
|
((make-vector/immediate (u8? size) init) (make-vector size init))
|
||||||
|
((vector-ref/immediate (u8? idx) v) (vector-ref v idx))
|
||||||
|
((vector-set!/immediate (u8? idx) v val) (vector-set! v idx val))
|
||||||
|
((allocate-struct/immediate (u8? size) vt) (allocate-struct vt size))
|
||||||
|
((struct-ref/immediate (u8? idx) s) (struct-ref s idx))
|
||||||
|
((struct-set!/immediate (u8? idx) s val) (struct-set! s idx val))
|
||||||
|
((uadd/immediate (u8? y) x) (uadd x y))
|
||||||
|
((usub/immediate (u8? y) x) (usub x y))
|
||||||
|
((umul/immediate (u8? y) x) (umul x y))
|
||||||
|
((rsh/immediate (u6? y) x) (rsh x y))
|
||||||
|
((lsh/immediate (u6? y) x) (lsh x y))
|
||||||
|
((ursh/immediate (u6? y) x) (ursh x y))
|
||||||
|
((ulsh/immediate (u6? y) x) (ulsh x y))
|
||||||
|
(_ cps))))))
|
||||||
(param (error "unexpected param to reified primcall" name))
|
(param (error "unexpected param to reified primcall" name))
|
||||||
(else
|
(else
|
||||||
(with-cps cps
|
(with-cps cps
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue