summaryrefslogtreecommitdiff
path: root/libguile/vm-engine.c
AgeCommit message (Collapse)AuthorFilesLines
2018-06-27Inline handling of non-program applyAndy Wingo1-18/+28
* libguile/vm.c (vm_apply_non_program_code): Remove, now unneeded. * libguile/vm-engine.c (vm_engine, call, tail-call, tail-call/shuffle) (tail-apply, call/cc): Inline handling of non-programs, as will be the case with JIT code.
2018-06-27Apply-non-program is an intrinsicAndy Wingo1-30/+3
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Add apply-non-program intrinsic. * libguile/vm-engine.c (apply-non-program): Replace impl with call to intrinsic. * libguile/vm.c (vm_error_wrong_type_apply): Inline into apply_non_program intrinsic. (apply_non_program): New intrinsic. (scm_bootstrap_vm): Wire it up.
2018-06-27Add intrinsics for error conditions (wrong num args etc)Andy Wingo1-7/+8
* libguile/intrinsics.c (error_wrong_num_args, error_no_values) (error_not_enough_values, error_wrong_number_of_values): New intrinsics. * libguile/intrinsics.h: Add new intrinsics. * libguile/vm-engine.c: Signal errors using the new intrinsics. * libguile/vm.c (vm_error): Remove, now that it's unused. (vm_error_bad_instruction): Abort instead of throwing an exception. If we get a bad instruction, nothing good will ever happen! (compose_continuation): Use wrong-type-arg for unrewindable continuations. (scm_bootstrap_vm): No need to make "vm-run" or "vm-error" symbols.
2018-06-26VM throw uses intrinsicsAndy Wingo1-3/+3
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Add intrinsics for throw, throw/value, and throw/value+data. * libguile/intrinsics.c (throw_, throw_with_value): (throw_with_value_and_data): And here they are. * libguile/vm-engine.c (throw, throw/value, throw/value+data): Use intrinsics. * libguile/vm.c: Remove vm_throw et al.
2018-06-26Allow abort_to_prompt to avoid a longjmpAndy Wingo1-2/+6
* libguile/vm-engine.c (abort): * libguile/vm.c (abort_to_prompt): Allow fallthrough if longjmp isn't needed.
2018-06-26abort-to-prompt uses an intrinsicAndy Wingo1-4/+1
* libguile/control.h: * libguile/control.c (scm_i_make_composable_continuation): Rename from make_partial_continuation and expose internally. (scm_abort_to_prompt_star): Adapt to scm_i_vm_abort name change. * libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Define abort_to_prompt intrinsic. * libguile/throw.c (abort_to_prompt): Adapt to scm_i_vm_abort name change. * libguile/vm-engine.c (abort): Use abort_to_prompt intrinsic. * libguile/vm.c (capture_delimited_continuation): Move here from control.c where it was named reify_partial_continuation. (scm_i_vm_abort): Move from control.c where it was named scm_c_abort (and only exposed internally). (abort_to_prompt): New intrinsic, replacing vm_abort. * libguile/vm.h: Add setjmp include and scm_i_vm_abort decl.
2018-06-26Add rest-arg-length intrinsic.Andy Wingo1-3/+3
* libguile/intrinsics.h: * libguile/vm.c (rest_arg_length): New intrinsic. (vm_error_apply_to_non_list): Remove now-unused error proc. * libguile/vm-engine.c (tail-apply): Use new intrinsic.
2018-06-26compose-continuation uses an intrinsicAndy Wingo1-4/+1
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Add compose-continuation intrinsic. * libguile/vm-engine.c (compose-continuation): Call compose-continuation intrinsic. * libguile/vm.c (compose_continuation_inner, compose_continuation): Move down and rename from vm_reinstate_partial_continuation, and make into a form that works as an intrinsic.
2018-06-26Add intrinsic for call/ccAndy Wingo1-10/+2
* libguile/intrinsics.h: Add "capture-continuation" intrinsic. * libguile/vm-engine.c (call/cc): Rework to use capture_continuation intrinsic. * libguile/vm.c (capture_continuation): New intrinsic.
2018-06-26Rename scm_i_thread to scm_threadAndy Wingo1-1/+1
* libguile/scm.h (struct scm_thread, scm_thread): Rename from scm_i_thread. * libguile/deprecated.h (scm_i_thread): Add deprecated typedef. * libguile/threads.h: Adapt to renaming. * libguile/intrinsics.h: * libguile/scmsigs.h: * libguile/cache-internal.h: Remove threads.h includes; unnecessary with the forward decl. * libguile/continuations.h: * libguile/gc-inline.h: * libguile/async.h: Adapt scm_thread type name change. * libguile/async.c: * libguile/continuations.c: * libguile/control.c: * libguile/dynstack.c: * libguile/dynwind.c: * libguile/eval.c: * libguile/finalizers.c: * libguile/fluids.c: * libguile/gc.c: * libguile/intrinsics.c: * libguile/load.c: * libguile/memoize.c: * libguile/print.c: * libguile/read.c: * libguile/scmsigs.c: * libguile/script.c: * libguile/stackchk.c: * libguile/stacks.c: * libguile/symbols.c: * libguile/threads.c: * libguile/throw.c: * libguile/vm-engine.c: * libguile/vm.c: Adapt to type name change, and add additional includes as needed.
2018-06-26Refactor continuation capture in VMAndy Wingo1-26/+11
* libguile/continuations.h: * libguile/continuations.c (scm_i_make_continuation): Refactor to expect registers to already be captured. * libguile/scm.h (scm_i_thread): Add forward decl. * libguile/threads.h (struct scm_i_thread): Just fill in the struct type. * libguile/vm-engine.c (call/cc); Use the registers already captured before entering the VM.
2018-06-26Foreign-call intrinsic boxes errnoAndy Wingo1-3/+2
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): * libguile/foreign.c (foreign_call): * libguile/vm-engine.c (foreign-call): Change foreign-call intrinsic to handle boxing of errno.
2018-06-26Reinstating undelimited continuations uses intrinsicAndy Wingo1-7/+2
* libguile/continuations.h (scm_t_contregs): Remove "struct vm*" member; unneeded. * libguile/continuations.c (scm_i_make_continuation): No need to store continuation->vp. (scm_i_contregs): New internal function, replaces scm_i_contregs_vp and scm_i_contregs_vm_cont. (scm_i_check_continuation): Remove; moved to vm.c. (scm_i_reinstate_continuation): Add an abort(), to satisfy SCM_NORETURN. * libguile/intrinsics.h: Add new "reinstate-continuation!" intrinsic. * libguile/vm-engine.c (continuation-call): Use new reinstate-continuation! intrinsic. * libguile/vm.c (vm_return_to_continuation_inner): Move later in the file. (reinstate_continuation_x): New intrinsic. (scm_bootstrap_vm): Init new intrinsic.
2018-06-26Add intrinsic for foreign-callAndy Wingo1-1/+1
* libguile/Makefile.am (noinst_HEADERS, modinclude_HEADERS): Change to not install intrinsics.h. * libguile/intrinsics.h: Add an error if BUILDING_LIBGUILE isn't set, to catch any stray bad inclusions. Add intrinsic for foreign-call. * libguile/foreign.c (foreign_call): Rename from scm_i_foreign_call, and set as the foreign-call intrinsic. * libguile/vm-engine.c (foreign-call): Use the intrinsic. In the future we'll want to totally revamp the FFI, if we know that a JIT is available!
2018-06-25Give multiple-values objects a tc7Andy Wingo1-13/+9
* libguile/scm.h (scm_tc7_values): New tc7. Never seen by Scheme, so we don't need to update it anywhere else. * libguile/values.h (scm_is_values): New public static inline function. (scm_i_nvalues, scm_i_value_ref): New private static inline functions. (SCM_VALUESP): Use scm_is_value. (scm_values_2, scm_values_3): New functions. (scm_values_vtable): Remove; values objects are not structs any more. * libguile/values.c (scm_i_extract_values_2): Adapt to new values representation. (print_values): Remove now-unused function. (scm_c_nvalues): Use scm_i_nvalues. (scm_c_value_ref): Use scm_i_value_ref. (scm_values, scm_c_values): Make the new-style objects, which store their values inline. (scm_values_2, scm_values_3): New helpers, to avoid consing little useless lists. * libguile/vm-engine.c (halt, subr-call) * libguile/eval.c (eval): Adapt to new values representation. * libguile/i18n.c (scm_locale_string_to_integer) (scm_locale_string_to_integer) * libguile/numbers.c (scm_i_floor_divide, scm_i_ceiling_divide) (scm_i_truncate_divide, scm_i_centered_divide, scm_i_round_divide) (scm_i_exact_integer_sqrt) * libguile/r6rs-ports.c (make_bytevector_output_port) * libguile/srfi-1.c (scm_srfi1_partition, scm_srfi1_partition_x) * libguile/srfi-14.c (scm_char_set_diff_plus_intersection) (scm_char_set_diff_plus_intersection_x) * libguile/posix.c (scm_getrlimit, scm_open_process): Adapt to use scm_values_2 or scm_values_3. * libguile/print.c (iprin1): Add printer for values objects.
2018-06-25Add push-interrupt-frame VM intrinsicAndy Wingo1-27/+8
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Add push-interrupt-frame. * libguile/vm.c (push_interrupt_frame): New intrinsic. Goal is to reduce the amount of inline code the JIT will generate for handling interrupts. * libguile/vm-engine.c (handle-interrupts): Call out to the push_interrupt_frame intrinsic in the slow case.
2018-06-25Move VM keyword argument parsing to happen via an intrinsicAndy Wingo1-60/+11
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Add new intrinsics for binding keyword arguments. * libguile/vm-engine.c (bind_kwargs): Call intrinsics. * libguile/vm.c (vm_error_kwargs_missing_value) (vm_error_kwargs_invalid_keyword) (vm_error_kwargs_unrecognized_keyword): Remove unused error cases. (frame_locals_count, alloc_frame): New helper. (compute_kwargs_npositional, bind_kwargs, cons_rest): New intrinsics. (scm_bootstrap_vm): Define intrinsics.
2018-06-25expand_stack intrinsic takes threadAndy Wingo1-1/+1
* libguile/intrinsics.h (scm_t_thread_sp_intrinsic): Change to take thread instead of vp. (SCM_FOR_ALL_VM_INTRINSICS): Change expand_stack to expect thread, not vp. * libguile/vm-engine.c (ALLOC_FRAME): Call expand_stack with thread. * libguile/vm.c (thread_expand_stack, scm_bootstrap_vm): Adapt.
2018-06-25VM gets VP from threadAndy Wingo1-89/+91
* libguile/vm.c (scm_t_vm_engine, scm_call_n): Remove "vp" argument. * libguile/vm-engine.c (VP): New macro, to get VP from thread. Replace all uses of vp with this.
2018-06-21Use ptrdiff_t instead of scm_t_ptrdiffAndy Wingo1-6/+6
* libguile/continuations.h: * libguile/control.c: * libguile/control.h: * libguile/dynstack.c: * libguile/dynstack.h: * libguile/eval.c: * libguile/foreign.c: * libguile/frames.h: * libguile/gen-scmconfig.c: * libguile/gsubr.c: * libguile/gsubr.h: * libguile/loader.c: * libguile/numbers.h: * libguile/stacks.c: * libguile/throw.c: * libguile/vm-engine.c: * libguile/vm.c: * libguile/vm.h: Use ptrdiff_t from stddef.h.
2018-06-21Replace uses of scm_t_int8, scm_t_uintmax, etc with stdint typesAndy Wingo1-208/+208
* libguile/bitvectors.c: * libguile/bitvectors.h: * libguile/bytevectors.c: * libguile/bytevectors.h: * libguile/chars.c: * libguile/continuations.c: * libguile/control.c: * libguile/conv-integer.i.c: * libguile/conv-uinteger.i.c: * libguile/dynstack.c: * libguile/dynstack.h: * libguile/foreign.c: * libguile/frames.c: * libguile/frames.h: * libguile/gc-inline.h: * libguile/gc.h: * libguile/gsubr.c: * libguile/gsubr.h: * libguile/hash.c: * libguile/i18n.c: * libguile/instructions.c: * libguile/intrinsics.c: * libguile/intrinsics.h: * libguile/loader.c: * libguile/loader.h: * libguile/numbers.c: * libguile/numbers.h: * libguile/pairs.c: * libguile/ports-internal.h: * libguile/ports.c: * libguile/ports.h: * libguile/posix.c: * libguile/print.c: * libguile/print.h: * libguile/programs.c: * libguile/programs.h: * libguile/r6rs-ports.c: * libguile/random.c: * libguile/random.h: * libguile/scm.h: * libguile/socket.c: * libguile/srfi-4.c: * libguile/srfi-4.h: * libguile/stacks.c: * libguile/stime.c: * libguile/strings.c: * libguile/struct.c: * libguile/struct.h: * libguile/symbols.c: * libguile/threads.c: * libguile/threads.h: * libguile/uniform.c: * libguile/vm-engine.c: * libguile/vm.c: * libguile/vm.h: * libguile/vports.c: * test-suite/standalone/test-conversion.c: * test-suite/standalone/test-ffi-lib.c: * test-suite/standalone/test-scm-take-u8vector.c: * test-suite/standalone/test-srfi-4.c: Replace e.g. scm_t_uint8 with uint8_t.
2018-06-20Update license notices in all C filesAndy Wingo1-17/+17
Update to newest recommended license notices from the FSF. Everything stays LGPLv3+ except guile-readline which is GPLv3+.
2018-06-20Remove (C) from copyright statementsAndy Wingo1-1/+1
As the FSF advises, 'There is no legal significance to using the three-character sequence “(C)”, but it does no harm.' It does take up space though! For that reason, we remove it here from our C files.
2018-06-20Make .c copyright headers uniformAndy Wingo1-1/+1
2018-06-20Remove Emacs local variables comments in Guile sourceAndy Wingo1-5/+0
The .dir-locals.el file in the repository is sufficient for Emacs users. * libguile/__scm.h: * libguile/alist.c: * libguile/alist.h: * libguile/array-handle.c: * libguile/array-handle.h: * libguile/array-map.c: * libguile/array-map.h: * libguile/arrays.c: * libguile/arrays.h: * libguile/async.c: * libguile/async.h: * libguile/backtrace.c: * libguile/backtrace.h: * libguile/bitvectors.c: * libguile/bitvectors.h: * libguile/boolean.c: * libguile/boolean.h: * libguile/chars.c: * libguile/chars.h: * libguile/chooks.c: * libguile/chooks.h: * libguile/continuations.c: * libguile/continuations.h: * libguile/control.c: * libguile/conv-integer.i.c: * libguile/debug-malloc.h: * libguile/debug.c: * libguile/debug.h: * libguile/deprecation.c: * libguile/deprecation.h: * libguile/dynl.c: * libguile/dynl.h: * libguile/dynstack.c: * libguile/dynstack.h: * libguile/dynwind.c: * libguile/dynwind.h: * libguile/eq.c: * libguile/eq.h: * libguile/error.c: * libguile/error.h: * libguile/eval.c: * libguile/eval.h: * libguile/evalext.c: * libguile/evalext.h: * libguile/expand.c: * libguile/expand.h: * libguile/extensions.c: * libguile/extensions.h: * libguile/feature.c: * libguile/feature.h: * libguile/filesys.c: * libguile/filesys.h: * libguile/fluids.c: * libguile/fluids.h: * libguile/foreign.c: * libguile/fports.c: * libguile/fports.h: * libguile/frames.c: * libguile/frames.h: * libguile/gc-inline.h: * libguile/gc.c: * libguile/gc.h: * libguile/generalized-arrays.c: * libguile/generalized-arrays.h: * libguile/generalized-vectors.c: * libguile/generalized-vectors.h: * libguile/gettext.c: * libguile/gettext.h: * libguile/goops.c: * libguile/goops.h: * libguile/gsubr.c: * libguile/gsubr.h: * libguile/guardians.c: * libguile/guardians.h: * libguile/guile.c: * libguile/hash.c: * libguile/hash.h: * libguile/hashtab.c: * libguile/hashtab.h: * libguile/hooks.c: * libguile/hooks.h: * libguile/i18n.c: * libguile/i18n.h: * libguile/init.c: * libguile/init.h: * libguile/instructions.c: * libguile/instructions.h: * libguile/intrinsics.c: * libguile/intrinsics.h: * libguile/ioext.c: * libguile/ioext.h: * libguile/iselect.h: * libguile/keywords.c: * libguile/keywords.h: * libguile/list.c: * libguile/list.h: * libguile/load.c: * libguile/load.h: * libguile/loader.c: * libguile/loader.h: * libguile/macros.c: * libguile/macros.h: * libguile/mallocs.c: * libguile/mallocs.h: * libguile/memmove.c: * libguile/memoize.c: * libguile/memoize.h: * libguile/modules.c: * libguile/modules.h: * libguile/net_db.c: * libguile/net_db.h: * libguile/null-threads.c: * libguile/null-threads.h: * libguile/numbers.c: * libguile/numbers.h: * libguile/objprop.c: * libguile/objprop.h: * libguile/options.c: * libguile/options.h: * libguile/pairs.c: * libguile/pairs.h: * libguile/poll.c: * libguile/poll.h: * libguile/ports.c: * libguile/ports.h: * libguile/posix.c: * libguile/posix.h: * libguile/print.c: * libguile/print.h: * libguile/procprop.c: * libguile/procprop.h: * libguile/procs.c: * libguile/procs.h: * libguile/programs.c: * libguile/programs.h: * libguile/promises.c: * libguile/promises.h: * libguile/pthread-threads.h: * libguile/random.c: * libguile/random.h: * libguile/rdelim.c: * libguile/rdelim.h: * libguile/read.c: * libguile/read.h: * libguile/regex-posix.c: * libguile/regex-posix.h: * libguile/rw.c: * libguile/rw.h: * libguile/scmsigs.c: * libguile/scmsigs.h: * libguile/script.c: * libguile/script.h: * libguile/simpos.c: * libguile/simpos.h: * libguile/smob.c: * libguile/smob.h: * libguile/snarf.h: * libguile/socket.c: * libguile/socket.h: * libguile/sort.c: * libguile/sort.h: * libguile/srcprop.c: * libguile/srcprop.h: * libguile/stackchk.c: * libguile/stackchk.h: * libguile/stacks.c: * libguile/stacks.h: * libguile/stime.c: * libguile/stime.h: * libguile/strerror.c: * libguile/strings.c: * libguile/strings.h: * libguile/strorder.c: * libguile/strorder.h: * libguile/strports.c: * libguile/strports.h: * libguile/struct.c: * libguile/struct.h: * libguile/symbols.c: * libguile/symbols.h: * libguile/syntax.c: * libguile/syscalls.h: * libguile/tags.h: * libguile/threads.c: * libguile/threads.h: * libguile/throw.c: * libguile/throw.h: * libguile/trees.h: * libguile/unicode.c: * libguile/unicode.h: * libguile/uniform.c: * libguile/uniform.h: * libguile/values.c: * libguile/values.h: * libguile/variable.c: * libguile/variable.h: * libguile/vectors.c: * libguile/vectors.h: * libguile/version.c: * libguile/vm-engine.c: * libguile/vm-expand.h: * libguile/vm.c: * libguile/vm.h: * libguile/vports.c: * libguile/vports.h: * libguile/weak-list.h: * libguile/weak-set.c: * libguile/weak-set.h: * libguile/weak-table.c: * libguile/weak-table.h: * libguile/weak-vector.c: * libguile/weak-vector.h: Remove needless trailing comments.
2018-06-17Inline definition of SIZEOF_SCM_T_BITSAndy Wingo1-1/+1
* libguile/_scm.h (SIZEOF_SCM_T_BITS): Remove definition. * libguile/conv-integer.i.c (SCM_TO_TYPE_PROTO, SCM_FROM_TYPE_PROTO): * libguile/conv-uinteger.i.c (SCM_FROM_TYPE_PROTO): * libguile/gc.c (DEFAULT_INITIAL_HEAP_SIZE): * libguile/hashtab.c: * libguile/loader.c: * libguile/socket.c: * libguile/vm-engine.c (VM_NAME): Use SIZEOF_UINTPTR_T instead of SIZEOF_SCM_T_BITS.
2018-06-17Refactor handling of auxiliary stacks and setjmp/longjmpAndy Wingo1-1/+1
* libguile/__scm.h (scm_i_jmp_buf): Remove definition, which was a shim for ia64. Instead, always use setjmp/longjmp and jmp_buf. * libguile/_scm.h (SCM_I_SETJMP, SCM_I_LONGJMP): Remove; instead use setjmp and longjmp. * libguile/continuations.c (capture_auxiliary_stack): (restore_auxiliary_stack): New helpers. (scm_i_make_continuation): Use capture_auxiliary_stack. (copy_stack_and_call): Use restore_auxiliary_stack. No need to stash the aux stack on the thread, either. * libguile/continuations.h (scm_t_contregs): Use SCM_HAVE_AUXILIARY_STACK to flag when to have an auxiliary_stack member. * libguile/control.h: * libguile/control.c (reify_partial_continuation, scm_c_abort): (scm_suspendable_continuation_p): Adapt to use setjmp/longjmp directly. * libguile/deprecated.h: Add deprecated scm_i_jmp_buf define. * libguile/dynstack.h: * libguile/dynstack.c (PROMPT_JMPBUF): (scm_dynstack_push_prompt, scm_dynstack_find_prompt): (scm_dynstack_wind_prompt): Adapt to jmp_buf type. * libguile/eval.c (eval): Use jmp_buf and setjmp directly. * libguile/gc-malloc.c: No need for ia64-specific things. * libguile/gc.c: No need for ia64-specific things. * libguile/gc.h: No need to declare scm_ia64_ar_bsp. * libguile/init.c: Remove typedef of setjmp_type for Cray, unused. * libguile/threads.c (guilify_self_1): No more pending_rbs_continuation in scm_i_thread, and register_backing_store_base is handled by libgc. (scm_ia64_ar_bsp): Remove definitions; inlined into continuations.c's capture_auxiliary_stack. * libguile/threads.h (scm_i_thread): jmpbuf member is plain jmp_buf. * libguile/throw.c (catch): Just use jmp_buf and setjmp. * libguile/vm-engine.c (VM_NAME): Adapt prototype to take jmp_buf pointer. * libguile/vm.c (vm_abort): Adapt jmp_buf types. (scm_call_n): Use setjmp.
2018-06-11Call out to expand_stack through new VM intrinsicAndy Wingo1-1/+2
* libguile/intrinsics.h (scm_t_vp_sp_intrinsic): New type. (SCM_FOR_ALL_VM_INTRINSICS): Add expand-stack. * libguile/vm-engine.c (ALLOC_FRAME): Call through the intrinsics. * libguile/vm.c (scm_bootstrap_vm): Initialize the expand-stack intrinsic.
2018-05-14Remove unused macro in vm-engineAndy Wingo1-3/+0
* libguile/vm-engine.c (VARIABLE_BOUNDP): Remove.
2018-05-14Remove implementations of now-unused toplevel-box et al instructionsAndy Wingo1-202/+6
* libguile/vm-engine.c (resolve, define!, toplevel-box, module-box): Remove implementations.
2018-05-13Mark call-scm<-scm-u64 as defining a resultAndy Wingo1-1/+1
* libguile/vm-engine.c (call-scm<-scm-u64): Add OP_DST.
2018-05-08Remove unused macros in VMAndy Wingo1-28/+0
* libguile/vm-engine.c (ARGS1, ARGS2, RETURN, RETURN_EXP) (UNPACK_16_8): Remove.
2018-05-08VM calls =? through intrinsicAndy Wingo1-1/+1
* libguile/intrinsics.c (numerically_equal_p): New intrinsic. * libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Declare new intrinsic. * libguile/vm-engine.c (=?): Call through intrinsic.
2018-05-08VM calls "<?" through intrinsic.Andy Wingo1-6/+1
* libguile/intrinsics.c (less_p): New intrinsic. (scm_bootstrap_intrinsics): Wire up intrinsic. * libguile/intrinsics.h: Declare new intrinsic. * libguile/vm-engine.c (less_p): Call through intrinsic.
2018-05-08VM calls out to heap-numbers-equal? through intrinsicsAndy Wingo1-1/+1
* libguile/numbers.h: * libguile/eq.c (scm_i_heap_numbers_equal_p): Change to return boolean directly instead of tagged Scheme value. (scm_eqv_p): Adapt caller of scm_i_heap_numbers_equal_p. * libguile/intrinsics.c (scm_bootstrap_intrinsics): * libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Declare heap-numbers-equal? intrinsic. * libguile/vm-engine.c (heap-numbers-equal?): Call out through the intrinsics table.
2018-05-01Remove implementation of lsh, rsh instructionsAndy Wingo1-116/+2
* libguile/vm-engine.c: Remove implementation of now-gone instructions.
2018-05-01lsh, rsh etc are intrinsicsAndy Wingo1-28/+25
* libguile/intrinsics.c (lsh, rsh, lsh_immediate, rsh_immediate): New intrinsics. (scm_bootstrap_intrinsics): Wire up the intrinsics. * libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Add new intrinsics. * libguile/vm-engine.c (call-scm<-scm-u64): New intrinsic caller. (lsh, rsh, lsh/immediate, rsh/immediate): Disable. * module/language/cps/reify-primitives.scm (compute-known-primitives): Add new intrinsics. * module/system/vm/assembler.scm: Adapt assemblers for new intrinsics.
2018-04-29Remove old VM ops for fluid-ref et alAndy Wingo1-97/+2
* libguile/vm-engine.c (wind, unwind, push_fluid, pop_fluid) (fluid_ref, push_dynamic_state, pop_dynamic_state): Remove now-unused implementations.
2018-04-29push and pop dynamic state via intrinsicsAndy Wingo1-12/+17
* libguile/intrinsics.c (push_dynamic_state, pop_dynamic_state): New intrinsics. (scm_bootstrap_intrinsics): Add new intrinsics. * libguile/intrinsics.h: Declare new intrinsics. * libguile/vm-engine.c (call-thread-scm): New intrinsic caller. (push-dynamic-state, pop-dynamic-state): Disable. * module/language/cps/reify-primitives.scm (compute-known-primitives): Add new intrinsics. * module/system/vm/assembler.scm (push-dynamic-state) (pop-dynamic-state): Emit as intrinsics.
2018-04-29Intrinsics for dynamic state instructionsAndy Wingo1-36/+6
* libguile/intrinsics.c (wind, unwind, push_fluid, pop_fluid) (fluid_ref): New intrinsics. (scm_bootstrap_intrinsics): Wire them up. * libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Declare new intrinsics. * libguile/vm-engine.c (wind, unwind, push_fluid, pop_fluid) (fluid_ref): Disable these instructions. * module/language/cps/reify-primitives.scm (compute-known-primitives): Add new intrinsics. * module/system/vm/assembler.scm (wind, unwind, push_fluid, pop_fluid) (fluid_ref): Assemble as intrinsics.
2018-04-29Add support for dynamic-state-related intrinsicsAndy Wingo1-3/+46
* libguile/vm-engine.c (call-thread, call-thread-scm-scm) (call-scm<-thread-scm): New intrinsics. * module/system/vm/assembler.scm (define-thread-scm-scm-intrinsic) (define-thread-intrinsic, define-scm<-thread-scm-intrinsic): New helpers. (encode-X8_S12_S12-C32!/shuffle): New shuffler. * libguile/intrinsics.h: Add new intrinsic types.
2018-04-29Fix width of operands to intrinsic call instructionsAndy Wingo1-6/+6
* libguile/vm-engine.c (call-scm<-scm, etc): The operands were getting unpacked into 8-bit locals, which were too small. Fix to use 16-bit locals.
2018-04-13Remove unused macros in vm-engineAndy Wingo1-56/+6
* libguile/vm-engine.c: Remove unused CPP macros.
2018-04-13Remove implementation of atomic box opsAndy Wingo1-65/+2
* libguile/vm-engine.c (VM_VALIDATE, VM_VALIDATE_ATOMIC_BOX): Remove now-unused definitions. Remove implementations of atomic-box-ref et al. * libguile/vm.c (vm_error_not_a_atomic_box): Remove.
2018-04-13Explode atomic box ops to new atomic instructionsAndy Wingo1-30/+63
* libguile/instructions.c (FOR_EACH_INSTRUCTION_WORD_TYPE): Add C8_S24 word type. * libguile/vm-engine.c (UNPACK_8_24): New helper. (atomic-scm-ref/immediate, atomic-scm-set!/immediate) (atomic-swap-scm!/immediate, atomic-scm-compare-and-swap!/immediate): New instructions. (make-atomic-box, atomic-box-ref, atomic-box-set!, atomic-box-swap!) (atomic-box-compare-and-swap!): Disable these ops. * module/language/bytecode.scm (compute-instruction-arity): Add C8_S24 support. * module/system/vm/assembler.scm: Add C8_S24 support. Export assemblers for new opcodes. * module/system/vm/disassembler.scm (disassembler): Support C8_S24. * module/language/cps/compile-bytecode.scm (compile-function): Replace old atomic-box assemblers with the new instructions. * module/language/cps/effects-analysis.scm (annotation->memory-kind): * module/language/cps/types.scm (annotation->type): Add cases for atomic boxes. Mark as all memory kinds because atomic ops serialize memory accesses. * module/language/tree-il/compile-cps.scm (make-atomic-box): (ensure-atomic-box, atomic-box-ref, atomic-box-set!): (atomic-box-swap!, atomic-box-compare-and-swap!): Explode these ops to more basic instructions. * module/system/base/types/internal.scm (%tc7-atomic-box): Add forgotten export.
2018-04-12Remove implementation of logsub VM opAndy Wingo1-13/+2
* libguile/vm-engine.c (logsub): Remove implementation.
2018-04-12logsub is intrinsicAndy Wingo1-5/+1
* libguile/intrinsics.h: * libguile/intrinsics.c (logsub): New intrinsic. (scm_bootstrap_intrinsics): Init new intrinsic. * libguile/vm-engine.c (logsub): Disable. * module/language/cps/reify-primitives.scm (compute-known-primitives): Add logsub. * module/system/vm/assembler.scm: Update logsub intrinsic assembler.
2018-04-12Remove implementations of obsolete s64->scm, u64->scm instsAndy Wingo1-22/+1
* libguile/vm-engine.c (s64->scm, u64->scm): Remove implementation.
2018-04-12u64->scm, s64->scm intrinsicsAndy Wingo1-12/+36
* libguile/intrinsics.h (u64->scm, s64->scm): New intrinsics. * libguile/intrinsics.c (scm_bootstrap_intrinsics): Initialize new intrinsics. * libguile/vm-engine.c (call-scm<-u64, call-scm<-s64): New intrinsic callers. (u64->scm, s64->scm): Disable instructions. * module/language/cps/reify-primitives.scm (compute-known-primitives): Add new intrinsics as macro-instructions. * module/system/vm/assembler.scm (define-scm<-u64-intrinsic): (define-scm<-s64-intrinsic, u64->scm, s64->scm): Wire up new intrinsics.
2018-04-12Remove scm->u64, etc implementationsAndy Wingo1-27/+6
* libguile/vm-engine.c: Remove implementations of now-obsolete bytecodes.