summaryrefslogtreecommitdiff
path: root/libguile/jit.c
AgeCommit message (Collapse)AuthorFilesLines
2019-09-01Optimize fixnum or s64 -> f64 conversionsAndy Wingo1-0/+9
* 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.
2019-08-26Compiler allocates boxed flonums in unmarked spaceAndy Wingo1-0/+54
This fixes a bug whereby the compiler would sometimes allocate floats in marked space. * libguile/gc-inline.h (scm_inline_gc_malloc_pointerless_words): New internal helper. * libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): * libguile/intrinsics.c (allocate_pointerless_words): (allocate_pointerless_words_with_freelist): New intrinsics. * libguile/jit.c (compile_allocate_pointerless_words): (compile_allocate_pointerless_words_immediate): New compilers. * libguile/vm-engine.c (allocate_pointerless_words) (allocate_pointerless_words_immediate): New opcodes. * module/language/cps/compile-bytecode.scm (compile-function): * module/language/cps/effects-analysis.scm (param): * module/language/cps/reify-primitives.scm (reify-primitives): * module/language/cps/specialize-primcalls.scm (specialize-primcalls): * module/language/cps/types.scm (allocate-words): (allocate-words/immediate): * module/system/vm/assembler.scm (system): Add support for the new opcodes.
2019-08-24Unbox floor/ceiling and trigonometric functions where possibleAndy Wingo1-1/+26
* 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.
2019-08-04Add support for optimized unboxed abs and sqrtAndy Wingo1-0/+26
Some components of this have been wired up for a while; this commit finishes the compiler, runtime, and JIT support. * libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): * libguile/intrinsics.c (scm_bootstrap_intrinsics): Declare the new intrinsics. * libguile/jit.c (compile_call_f64_from_f64): Define code generators for the new intrinsics. * libguile/vm-engine.c (call-f64<-f64): New instruction. * module/language/cps/effects-analysis.scm: * module/language/cps/reify-primitives.scm (compute-known-primitives): * module/language/cps/slot-allocation.scm (compute-var-representations): * module/language/cps/specialize-numbers.scm (specialize-operations): * module/language/tree-il/cps-primitives.scm (abs): * module/system/vm/assembler.scm (system, define-f64<-f64-intrinsic): (sqrt, abs, fsqrt, fabs): * module/language/cps/types.scm (fsqrt, fabs): Add new f64<-f64 primitives.
2019-08-03Fix some compiler warnings on 64-bit buildsAndy Wingo1-18/+2
2019-08-02Fix calls to handle-interrupts trampoline on ARMv7Andy Wingo1-2/+0
* libguile/jit.c (initialize_jit): Keep handle_interrupts_trampoline as an address, not a function pointer.
2019-06-20Add an inlined jit fast-path for allocate-words/immediateAndy Wingo1-7/+35
* libguile/intrinsics.c (allocate_words_with_freelist) (scm_bootstrap_intrinsics): * libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): New intrinsic. * libguile/jit.c (compile_allocate_words_immediate): Add fast-path. A marginal improvement.
2019-06-20Fix compilation on GCC 5.5Andy Wingo1-5/+8
* libguile/jit.c (OLD_FP_FOR_RETURN_TRAMPOLINE): Initialize static const var from CPP define instead of T0. (compile_return_values, emit_return_to_interpreter_trampoline): Adapt to upper-casing.
2019-06-20Use call/return instructions for non-tail callsAndy Wingo1-24/+34
This change speeds up the indirect branches at return sites by taking advantage of the CPU's return address stack. * libguile/jit.c (emit_push_frame): Don't store the mra; we do that via a trampoline. (emit_handle_interrupts_trampoline): Take MRA from link register instead of T0. (compile_call, compile_call_label): Compute MRA via the new jmpi_with_link lightening instruction. (compile_return_values): Return to caller via ret instead of jmp. (compile_handle_interrupts): Jump to handle-interrupts trampoline via jmpi_with_link, to provide the MRA. (initialize_jit): Bless the trampolines so that they are valid operands to BX on ARM.
2019-06-18Speed up returns in JITAndy Wingo1-11/+39
This patch is a bit unfortunate, in the sense that it exposes some of the JIT guts to the rest of the VM. Code needs to treat "machine return addresses" as valid if non-NULL (as before) and also not equal to a tier-down trampoline. This is because tier-down at a return needs the old frame pointer to load the "virtual return address", and the way this patch works is that it passes the vra in a well-known register. It's a custom calling convention for a certain kind of return. * libguile/jit.h (scm_jit_return_to_interpreter_trampoline): New internal global. * libguile/jit.c: (scm_jit_clear_mcode_return_addresses): Move here, from vm.c. Instead of zeroing return addresses, set them to the return-to-interpreter trampoline. * libguile/vm-engine.c (return-values): Don't enter mcode if the mra is scm_jit_return_to_interpreter_trampoline. * libguile/vm.c (capture_continuation): Treat the tier-down trampoline as NULL.
2019-06-18jit: Direct tail calls assert that target can have mcodeAndy Wingo1-6/+2
* libguile/jit.c (emit_direct_tail_call): Assert that the callee label starts with an instrument-entry.
2019-06-06VM does not initialize stack framesAndy Wingo1-32/+2
* libguile/jit.c (compile_alloc_frame): Stop initializing locals. (compile_bind_rest): Use emit_alloc_frame. * libguile/vm-engine.c (assert_nargs_ee_locals, allocate_frame): Don't initialize locals. (bind_rest): Don't initialize locals, and assert that the locals count has a minimum.
2019-06-06Allow for bind-optionals without alloc-frameAndy Wingo1-45/+68
This reduces subr trampoline instruction count for subrs with optional args. * libguile/gsubr.c (get_subr_stub_code): Insert bind-optionals instructions. (primitive_call_ip): Handle bind-optionals. * libguile/programs.c (try_parse_arity): Handle bind-optionals. * libguile/jit.c (struct scm_jit_state) (compile_call, compile_call_label, compile_tail_call) (compile_tail_call_label, compile_receive), compile_receive_values) (compile_shuffle_down, compile_return_values, compile_subr_call) (compile_foreign_call, compile_continuation_call) (compile_compose_continuation, compile_abort, compile_assert_nargs_ee) (compile_assert_nargs_ge, compile_assert_nargs_le) (compile_alloc_frame, compile_reset_frame, compile_push) (compile_pop, compile_drop, compile_expand_apply_argument) (compile_bind_kwargs, compile_bind_rest, compile_bind_optionals) (compile, compute_mcode): Separately track min and max frame sizes.
2019-06-06Add bind-optionals instructionAndy Wingo1-0/+31
* doc/ref/vm.texi (Function Prologue Instructions): Document new instruction. * libguile/jit.c (compile_bind_optionals): New compiler. * libguile/vm-engine.c (VM_NAME): New interpreter. * module/system/vm/assembler.scm (opt-prelude): Emit bind-optionals as appropriate. * module/system/vm/disassembler.scm (define-stack-effect-parser) (code-annotation): Handle bind-optionals.
2019-06-06Avoid saving IP for <? fast-pathAndy Wingo1-1/+1
* libguile/jit.c (compile_less): Only save IP on slow-path.
2019-05-27Remove check for instrument-entryAndy Wingo1-7/+0
* libguile/jit.c (emit_indirect_tail_call): If everything starts with instrument-entry, and thus has a vcode pointer, no need to emit a dynamic check.
2019-05-27Dynamically assert functions start with instrument-entryAndy Wingo1-6/+4
* libguile/jit.c (emit_indirect_tail_call): Add dynamic assertion.
2019-05-27Reapply atomics inliningAndy Wingo1-10/+2
This patch reapplies 230a5559764679d75e3e8941e97a268a2b2e6a53 and e8d34258beab2799951e16d21d547299d4659364, but fixing a misplaced comma (!).
2019-05-27Revert "Fix atomics usage in handle-interrupts JIT."Andy Wingo1-2/+10
This reverts commit e8d34258beab2799951e16d21d547299d4659364.
2019-05-27Fix atomics usage in handle-interrupts JIT.Andy Wingo1-10/+2
* libguile/jit.c (compile_handle_interrupts): Use atomics in handle-interrupts.
2019-05-27Use new atomic instructions from lighteningAndy Wingo1-34/+19
* libguile/jit.c (compile_atomic_scm_ref_immediate): (compile_atomic_scm_set_immediate): (compile_atomic_scm_swap_immediate): (compile_atomic_scm_compare_and_swap_immediate): Use lightening instructions.
2019-05-23Mark a couple functions as maybe-unused.Andy Wingo1-0/+4
* libguile/jit.c (fp_scm_operand, sp_slot_operand): Maybe unused.
2019-05-21Bless enter_mcode as a function pointerAndy Wingo1-2/+3
* libguile/jit.c (initialize_jit): Bless enter_mcode, to allow ARMv7 interworking.
2019-05-21Allow jit_end to failAndy Wingo1-3/+2
* libguile/jit.c (emit_code): Emitting a constant table might cause us to fail.
2019-05-21Fix allocator passed to lighteningAndy Wingo1-1/+1
* libguile/jit.c (jit_alloc_fn): On targets that need a dynamically allocated literal pool, we will need to trace that pool, so pass a pointerful malloc. Fixes JIT on AArch64.
2019-04-29Fix u64-ref JIT on 32-bitAndy Wingo1-4/+4
* libguile/jit.c (compile_u64_ref): Fix 32-bit load path; endianness was reversed.
2019-04-28Fix unneeded stack alignment.Andy Wingo1-2/+0
* libguile/jit.c (emit_entry_trampoline): Remove unneeded alignment.
2019-04-28Fix errors in 32-bit JIT supportAndy Wingo1-4/+4
* libguile/jit.c (compile_ursh_immediate): (compile_ulsh_immediate): Fix immediate/register variant calling. Happily a benefit of lightening, as type safety did this for us. (DEFINE_CLOBBER_RECORDING_EMITTER_R_R_2): Pass JIT state.
2019-04-28Adapt to lightening changesAndy Wingo1-26/+3
* libguile/jit.c (emit_entry_trampoline): Use jit_{enter,leave}_jit_abi. (compile_allocate_words_immediate): Use JIT_OPERAND_ABI_WORD.
2019-04-28Align stack before entering JIT codeAndy Wingo1-0/+2
* libguile/jit.c (emit_entry_trampoline): Ensure stack is aligned when going into JIT code.
2019-04-26Ensure stack alignment in JIT code.Andy Wingo1-0/+4
* libguile/jit.c (emit_entry_trampoline): Explicitly align stack.
2019-04-25Adapt to changes in upstream lighteningAndy Wingo1-4/+4
* libguile/jit.c (emit_entry_trampoline): Adapt to change in callee-save predicates.
2019-04-25Lower default JIT threshold as JIT is cheaper nowAndy Wingo1-1/+1
* libguile/jit.c (default_jit_threshold): Lower from 50000 to 1000.
2019-04-25Re-enable fixnum less-than JIT fast-pathAndy Wingo1-8/+0
* libguile/jit.c (compile_less): Re-enable fast-path for fixnums, now that the JIT library works :)
2019-04-24Fix a JIT bugAndy Wingo1-0/+1
* libguile/jit.c (compile): Reset frame size as well when restarting compilation. Fixes JIT errors.
2019-04-24Adapt to new lightening call APIAndy Wingo1-218/+170
* libguile/jit.c: Operands have their ABI in them. We can now have addends on GPR and MEM operands, which can improve register allocation. Use new jit_calli_3, etc helper APIs.
2019-04-04Fix compilation of call-scm<-u64Andy Wingo1-2/+2
* libguile/jit.c (compile_call_scm_from_u64): Fix to take operands from the right place.
2019-04-04Fix arena expansion logicAndy Wingo1-3/+4
* libguile/jit.c (compile): Fix logic to clear old labels.
2019-04-04JIT fixes for arena overflowAndy Wingo1-2/+8
* libguile/jit.c (compute_mcode): Move analysis outside the code emitter, as it doesn't need to re-run on overflow. (compile): Clear labels before emitting, as they may have changed if we overflowed.
2019-04-04Minor JIT cleanupsAndy Wingo1-19/+12
* libguile/jit.c (fp_scm_operand): Fix assertion about register state. (compile_call_scm_sz_u32): Fix ABI declaration for immediate. Some whitespace cleanups as well.
2019-04-04More various JIT fixenAndy Wingo1-9/+1
* libguile/jit.c (prepare_jit_state): Remove unused function. (initialize_thread_jit_state): Since the lightening state is allocated using GC memory, trace the JIT state. (compute_mcode): Avoid double-compile.
2019-04-04Fix some aspects of instruction mcode addressesAndy Wingo1-5/+3
* libguile/jit.c (struct scm_jit_state): Remove entry_mcode member. (add_inter_instruction_patch): Fix off-by-one. (compile): Reset reloc_idx when restarting a compile. All instructions record their addresses.
2019-04-04Fix JIT bugsAndy Wingo1-2/+2
* libguile/jit.c (compile): Fix reloc fixup. (compute_mcode): Correctly compute entry mcode.
2019-04-04Fix jit_gpr_is_callee_save usageAndy Wingo1-5/+5
* libguile/jit.c (emit_entry_trampoline): Fix invocations for jit_gpr_is_callee_save.
2019-04-04jit: Fix inter-instruction relocs.Andy Wingo1-6/+38
* libguile/jit.c (struct pending_reloc, emit_entry_trampoline) (add_inter_instruction_patch, compile, compute_mcode): Fix inter-instruction relocs.
2019-04-03Fix jit.c compilationAndy Wingo1-160/+234
* libguile/jit.c: Finish adaptation for lightening. Still crashes though.
2019-04-03Checkpoint for lightning to lightening conversionAndy Wingo1-463/+444
2019-04-03Adapt to lightning -> lightening name changeAndy Wingo1-2/+2
* libguile/jit.c: Include lightening.h. * libguile/Makefile.am: Adapt.
2018-10-09Fix JIT of 64-bit comparisons on 32-bit architecturesAndy Wingo1-8/+8
* libguile/jit.c (compile_u64_imm_less): Compare high word using not-equal, to avoid a signedness compare. (compile_s64_imm_less, compile_imm_s64_less): Fix the not-less cases.
2018-10-09Better ursh/ulsh/srsh JIT on 32-bit platformsAndy Wingo1-21/+39
* libguile/jit.c (compile_ursh_immediate, compile_ulsh_immediate) (compile_srsh_immediate): Special-case shifts by 32 bits on 32-bit platforms. Avoids shifting by 0.