summaryrefslogtreecommitdiff
path: root/libguile/jit.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2019-09-01 20:40:14 +0200
committerAndy Wingo <wingo@pobox.com>2019-09-01 20:46:04 +0200
commitd1cf8928802843a14c53f2a2de55bf01e75e2662 (patch)
tree22b5f290b8c5f3a60f8241068dda424eee045f88 /libguile/jit.c
parent74f14562a65c34929176a290a5a9c421b1854046 (diff)
downloadguile-d1cf8928802843a14c53f2a2de55bf01e75e2662.tar.gz
Optimize fixnum or s64 -> f64 conversions
* libguile/intrinsics.c (scm_bootstrap_intrinsics): * libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Add "inexact" intrinsic. * libguile/jit.c (compile_s64_to_f64): New compiler. * libguile/vm-engine.c (s64->f64): New instruction. * module/language/cps/effects-analysis.scm (heap-numbers-equal?): * module/language/cps/reify-primitives.scm (compute-known-primitives): * module/language/cps/slot-allocation.scm (compute-var-representations): * module/language/cps/specialize-numbers.scm (fixnum->f64): (specialize-operations): * module/language/cps/type-fold.scm (scm->f64, inexact): * module/language/cps/types.scm (inexact, s64->f64): * module/language/tree-il/cps-primitives.scm (exact->inexact): * module/language/tree-il/primitives.scm (*interesting-primitive-names*): (*effect-free-primitives*): * module/system/vm/assembler.scm: Recognize exact->inexact as a primitive, and optimize it. Add compiler support for new "inexact" and "s64->f64" primcalls.
Diffstat (limited to 'libguile/jit.c')
-rw-r--r--libguile/jit.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/libguile/jit.c b/libguile/jit.c
index f1c7a4941..a05734f6d 100644
--- a/libguile/jit.c
+++ b/libguile/jit.c
@@ -4287,6 +4287,15 @@ compile_f64_set (scm_jit_state *j, uint8_t ptr, uint8_t idx, uint8_t v)
jit_stxr_d (j->jit, T0, T1, JIT_F0);
}
+static void
+compile_s64_to_f64 (scm_jit_state *j, uint16_t dst, uint16_t src)
+{
+ emit_sp_ref_s64 (j, T0, src);
+ jit_extr_d (j->jit, JIT_F0, T0);
+ record_fpr_clobber (j, JIT_F0);
+ emit_sp_set_f64 (j, dst, JIT_F0);
+}
+
#define UNPACK_8_8_8(op,a,b,c) \
do \