diff options
author | Andy Wingo <wingo@pobox.com> | 2017-11-05 10:46:13 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2017-11-05 15:00:16 +0100 |
commit | 17bd5a893835b44acbfc5ee4254813e9a6ceea25 (patch) | |
tree | e8838950c55ac1ef9e871e5c5b92b026840c4940 /module/language/cps/compile-bytecode.scm | |
parent | dea84a46b476643ea0abf7133ff4bdf59c46a88e (diff) | |
download | guile-17bd5a893835b44acbfc5ee4254813e9a6ceea25.tar.gz |
Add lsh, rsh instructions
* libguile/vm-engine.c (lsh, rsh, lsh/immediate, rsh/immediate): New
instructions taking unboxed bit counts.
* module/language/cps/compile-bytecode.scm (compile-function):
* module/language/cps/effects-analysis.scm:
* module/language/cps/specialize-numbers.scm (specialize-f64-unop):
(specialize-u64-unop): Add ability to specialize add/immediate, etc,
and add lsh/immediate as well.
(specialize-u64-binop, specialize-u64-shift): Move rsh/lsh
specialization to its own procedure, given that the bit count is
already unboxed.
(specialize-operations): Adapt to support more /immediate
instructions.
* module/language/cps/type-fold.scm (mul): Reify an lsh/immediate
instead of an ash.
* module/language/cps/types.scm (compute-ash-range): Add type inferrers
for lsh, rsh, and their immediate variants.
* module/system/vm/assembler.scm: Export emit-lsh and so on.
* module/language/tree-il/compile-cps.scm (convert): Convert "ash" on
immediates to rsh/immediate or lsh/immediate.
Diffstat (limited to 'module/language/cps/compile-bytecode.scm')
-rw-r--r-- | module/language/cps/compile-bytecode.scm | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/module/language/cps/compile-bytecode.scm b/module/language/cps/compile-bytecode.scm index 43c6d7133..2b5d7591a 100644 --- a/module/language/cps/compile-bytecode.scm +++ b/module/language/cps/compile-bytecode.scm @@ -192,6 +192,14 @@ (emit-usub/immediate asm (from-sp dst) (from-sp (slot x)) y)) (($ $primcall 'umul/immediate y (x)) (emit-umul/immediate asm (from-sp dst) (from-sp (slot x)) y)) + (($ $primcall 'rsh (x y)) + (emit-rsh asm (from-sp dst) (from-sp (slot x)) (from-sp (slot y)))) + (($ $primcall 'lsh (x y)) + (emit-lsh asm (from-sp dst) (from-sp (slot x)) (from-sp (slot y)))) + (($ $primcall 'rsh/immediate y (x)) + (emit-rsh/immediate asm (from-sp dst) (from-sp (slot x)) y)) + (($ $primcall 'lsh/immediate y (x)) + (emit-lsh/immediate asm (from-sp dst) (from-sp (slot x)) y)) (($ $primcall 'ursh/immediate y (x)) (emit-ursh/immediate asm (from-sp dst) (from-sp (slot x)) y)) (($ $primcall 'ulsh/immediate y (x)) |