summaryrefslogtreecommitdiff
path: root/libguile/intrinsics.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2019-08-24 11:37:17 +0200
committerAndy Wingo <wingo@pobox.com>2019-08-24 11:56:18 +0200
commitb1564df298dbdd261e880837c89f04d3d82879ea (patch)
treea614f15de77aef414b45d53f824fcc414f2cd8bd /libguile/intrinsics.c
parent9e3a5c9a10d4202dabab0c93fb75d7e07201bb24 (diff)
downloadguile-b1564df298dbdd261e880837c89f04d3d82879ea.tar.gz
Unbox floor/ceiling and trigonometric functions where possible
* libguile/intrinsics.c (scm_atan1): New intrinsic, wrapping scm_atan. (scm_bootstrap_intrinsics): Add new intrinsics. * libguile/intrinsics.h (scm_t_f64_from_f64_f64_intrinsic): New intrinsic type. (SCM_FOR_ALL_VM_INTRINSICS): Add intrinsics for floor, ceiling, sin, cos, tan, asin, acos, atan, and their unboxed counterparts. * libguile/jit.c (sp_f64_operand): New helper. (compile_call_f64_from_f64, compile_call_f64_from_f64_f64): Call out to intrinsics. * libguile/vm-engine.c (call-f64<-f64-f64): New opcode. * module/language/cps/effects-analysis.scm: Add new intrinsics. * module/language/cps/reify-primitives.scm (compute-known-primitives): Add new intrinsics. * module/language/cps/slot-allocation.scm (compute-var-representations): Add 'f64 slot types for the new unboxed intrinsics. * module/language/cps/specialize-numbers.scm (specialize-operations): Support unboxing the new intrinsics. * module/language/cps/types.scm: Define type inferrers for the new intrinsics. * module/language/tree-il/cps-primitives.scm: Define CPS translations for the new intrinsics. * module/language/tree-il/primitives.scm (*interesting-primitive-names*): (*effect-free-primitives*, atan): Define primitive resolvers. * module/system/vm/assembler.scm: Export assemblers for the new intrinsics. (define-f64<-f64-f64-intrinsic): New helper.
Diffstat (limited to 'libguile/intrinsics.c')
-rw-r--r--libguile/intrinsics.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/libguile/intrinsics.c b/libguile/intrinsics.c
index a00ab39f6..3a91d0753 100644
--- a/libguile/intrinsics.c
+++ b/libguile/intrinsics.c
@@ -449,6 +449,12 @@ push_prompt (scm_thread *thread, uint8_t escape_only_p,
vra, mra, thread->vm.registers);
}
+static SCM
+scm_atan1 (SCM x)
+{
+ return scm_atan (x, SCM_UNDEFINED);
+}
+
void
scm_bootstrap_intrinsics (void)
{
@@ -522,6 +528,24 @@ scm_bootstrap_intrinsics (void)
scm_vm_intrinsics.sqrt = scm_sqrt;
scm_vm_intrinsics.fabs = fabs;
scm_vm_intrinsics.fsqrt = sqrt;
+ scm_vm_intrinsics.floor = scm_floor;
+ scm_vm_intrinsics.ceiling = scm_ceiling;
+ scm_vm_intrinsics.sin = scm_sin;
+ scm_vm_intrinsics.cos = scm_cos;
+ scm_vm_intrinsics.tan = scm_tan;
+ scm_vm_intrinsics.asin = scm_asin;
+ scm_vm_intrinsics.acos = scm_acos;
+ scm_vm_intrinsics.atan = scm_atan1;
+ scm_vm_intrinsics.atan2 = scm_atan;
+ scm_vm_intrinsics.ffloor = floor;
+ scm_vm_intrinsics.fceiling = ceil;
+ scm_vm_intrinsics.fsin = sin;
+ scm_vm_intrinsics.fcos = cos;
+ scm_vm_intrinsics.ftan = tan;
+ scm_vm_intrinsics.fasin = asin;
+ scm_vm_intrinsics.facos = acos;
+ scm_vm_intrinsics.fatan = atan;
+ scm_vm_intrinsics.fatan = atan2;
scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION,
"scm_init_intrinsics",