summaryrefslogtreecommitdiff
path: root/libguile/intrinsics.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2020-04-29 21:23:53 +0200
committerAndy Wingo <wingo@pobox.com>2020-04-29 21:47:37 +0200
commitd6b6daca372e3a7d2abc601e2b60d6c2cc6c0abc (patch)
treea9c7ad961f0f8879aa7217961b9ad1c5f408b426 /libguile/intrinsics.c
parent3d96c87cf82e3f2f4d73195cda6753ebe5e6ad74 (diff)
downloadguile-d6b6daca372e3a7d2abc601e2b60d6c2cc6c0abc.tar.gz
Add intrinsics for a baseline compiler
Since there's no optimization in the baseline compiler, there's no sense in instruction explosion. * libguile/intrinsics.h: * libguile/intrinsics.c ($car, $cdr, $set-car!, $set-cdr!, $variable-ref, $variable-set!, $vector-length, $vector-ref, $vector-set!, $vector-ref/immediate, $vector-set!, $allocate-struct, $struct-vtable, $struct-ref, $struct-set! $struct-ref/immediate, $struct-set!): New intrinsics. * libguile/jit.c (compile_call_scm_scm, compile_call_scm_scm_slow) (compile_call_scm_scm_scm, compile_call_scm_scm_scm_slow) (compile_call_scm_uimm_scm, compile_call_scm_uimm_scm_slow): New code generators. * libguile/vm-engine.c (call-scm-scm, call-scm-scm-scm, call-scm-uimm-scm): New instructions. * module/system/vm/assembler.scm (emit-null?, emit-false?, emit-nil?): Export these. Also export emitters for the new intrinsics. (define-scm-scm-intrinsic, define-scm-uimm-scm-intrinsic) (define-scm-scm-scm-intrinsic): New helpers. * doc/ref/vm.texi (Intrinsic Call Instructions): Add new instructions.
Diffstat (limited to 'libguile/intrinsics.c')
-rw-r--r--libguile/intrinsics.c69
1 files changed, 68 insertions, 1 deletions
diff --git a/libguile/intrinsics.c b/libguile/intrinsics.c
index de0375950..ba25dcb0f 100644
--- a/libguile/intrinsics.c
+++ b/libguile/intrinsics.c
@@ -1,4 +1,4 @@
-/* Copyright 2018-2019
+/* Copyright 2018-2020
Free Software Foundation, Inc.
This file is part of Guile.
@@ -36,8 +36,10 @@
#include "keywords.h"
#include "modules.h"
#include "numbers.h"
+#include "struct.h"
#include "symbols.h"
#include "threads.h"
+#include "variable.h"
#include "version.h"
#include "intrinsics.h"
@@ -470,6 +472,52 @@ scm_atan1 (SCM x)
return scm_atan (x, SCM_UNDEFINED);
}
+static void
+set_car_x (SCM x, SCM y)
+{
+ scm_set_car_x (x, y);
+}
+static void
+set_cdr_x (SCM x, SCM y)
+{
+ scm_set_cdr_x (x, y);
+}
+static void
+variable_set_x (SCM x, SCM y)
+{
+ scm_variable_set_x (x, y);
+}
+static void
+vector_set_x (SCM x, SCM y, SCM z)
+{
+ scm_vector_set_x (x, y, z);
+}
+static SCM
+vector_ref_immediate (SCM x, uint8_t idx)
+{
+ return scm_c_vector_ref (x, idx);
+}
+static void
+vector_set_x_immediate (SCM x, uint8_t idx, SCM z)
+{
+ scm_c_vector_set_x (x, idx, z);
+}
+static void
+struct_set_x (SCM x, SCM y, SCM z)
+{
+ scm_struct_set_x (x, y, z);
+}
+static SCM
+struct_ref_immediate (SCM x, uint8_t idx)
+{
+ return scm_struct_ref (x, scm_from_uint8 (idx));
+}
+static void
+struct_set_x_immediate (SCM x, uint8_t idx, SCM z)
+{
+ scm_struct_set_x (x, scm_from_uint8 (idx), z);
+}
+
void
scm_bootstrap_intrinsics (void)
{
@@ -566,6 +614,25 @@ scm_bootstrap_intrinsics (void)
allocate_pointerless_words_with_freelist;
scm_vm_intrinsics.inexact = scm_exact_to_inexact;
+ /* Intrinsics for the baseline compiler. */
+ scm_vm_intrinsics.car = scm_car;
+ scm_vm_intrinsics.cdr = scm_cdr;
+ scm_vm_intrinsics.set_car_x = set_car_x;
+ scm_vm_intrinsics.set_cdr_x = set_cdr_x;
+ scm_vm_intrinsics.variable_ref = scm_variable_ref;
+ scm_vm_intrinsics.variable_set_x = variable_set_x;
+ scm_vm_intrinsics.vector_length = scm_vector_length;
+ scm_vm_intrinsics.vector_ref = scm_vector_ref;
+ scm_vm_intrinsics.vector_set_x = vector_set_x;
+ scm_vm_intrinsics.vector_ref_immediate = vector_ref_immediate;
+ scm_vm_intrinsics.vector_set_x_immediate = vector_set_x_immediate;
+ scm_vm_intrinsics.allocate_struct = scm_allocate_struct;
+ scm_vm_intrinsics.struct_vtable = scm_struct_vtable;
+ scm_vm_intrinsics.struct_ref = scm_struct_ref;
+ scm_vm_intrinsics.struct_set_x = struct_set_x;
+ scm_vm_intrinsics.struct_ref_immediate = struct_ref_immediate;
+ scm_vm_intrinsics.struct_set_x_immediate = struct_set_x_immediate;
+
scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION,
"scm_init_intrinsics",
(scm_t_extension_init_func)scm_init_intrinsics,