1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00
guile/libguile/jit.c
Andy Wingo a20feea43e Continuations capture machine code address
* libguile/continuations.c (scm_i_continuation_to_frame): Adapt to vra
  field renaming.
  (scm_i_reinstate_continuation, grow_stack, copy_stack_and_call)
  (scm_dynthrow): Take mra of continuation.  Set on the vp before the
  longjmp.
* libguile/continuations.h: Update scm_i_reinstate_continuation
  prototype.
* libguile/dynstack.h:
* libguile/control.c (scm_suspendable_continuation_p):
* libguile/dynstack.c (PROMPT_WORDS, PROMPT_VRA, PROMPT_MRA):
  (PROMPT_JMPBUF, scm_dynstack_push_prompt, scm_dynstack_find_prompt)
  (scm_dynstack_wind_prompt): Store both virtual and machine return
  addresses on the dynstack, for prompts.
* libguile/eval.c (eval): Pass NULL for mra.
* libguile/intrinsics.c (push_prompt): Add mra arg, and pass it to the
  dynstack.
* libguile/intrinsics.h: Update prototypes so that continuation-related
  intrinsics can save and restore the MRA.
* libguile/jit.h:
* libguile/jit.c: Return VRA when JIT code needs to tier down.
* libguile/stacks.c (find_prompt, scm_make_stack)
* libguile/throw.c (catch): Adapt find-prompt calls.
* libguile/vm-engine.c (instrument-entry, instrument-loop): Add logic to
  continue with vcode after the mcode finishes.
  (compose-continuation, capture-continuation, abort, prompt): Add logic
  to pass NULL as captured MRA, but continue with mcode from new
  continuations, if appropriate.
* libguile/vm.c (scm_i_vm_cont_to_frame, capture_stack)
  (scm_i_capture_current_stack, reinstate_continuation_x)
  (capture_continuation, compose_continuation_inner, compose_continuation)
  (capture_delimited_continuation, abort_to_prompt): Adapt to plumb
  around machine code continuations.
  (scm_call_n): Check "mra_after_abort" field for machine code
  continuation, if any.
* libguile/vm.h (struct scm_vm): Add "mra_after_abort" field.
  (struct scm_vm_cont): Rename "ra" field to "vra" and add "mra" field.
2018-08-12 15:57:53 +02:00

1228 lines
34 KiB
C

/* Copyright 2018
Free Software Foundation, Inc.
This file is part of Guile.
Guile is free software: you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Guile is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with Guile. If not, see
<https://www.gnu.org/licenses/>. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#if ENABLE_JIT
#include <lightning.h>
#endif
#include "threads.h"
#include "vm-operations.h"
#include "jit.h"
typedef struct {
scm_thread *thread;
const uint32_t *start;
uint32_t *ip;
const uint32_t *end;
} scm_jit_state;
static void
bad_instruction (scm_jit_state *j)
{
abort ();
}
static void
compile_halt (scm_jit_state *j)
{
bad_instruction (j);
}
static void
compile_call (scm_jit_state *j, uint32_t a, uint32_t b)
{
}
static void
compile_call_label (scm_jit_state *j, uint32_t a, uint32_t b, const uint32_t *vcode)
{
}
static void
compile_tail_call (scm_jit_state *j)
{
}
static void
compile_tail_call_label (scm_jit_state *j, const uint32_t *vcode)
{
}
static void
compile_instrument_entry (scm_jit_state *j, void *data)
{
}
static void
compile_instrument_loop (scm_jit_state *j, void *data)
{
}
static void
compile_receive (scm_jit_state *j, uint16_t dst, uint16_t a, uint32_t b)
{
}
static void
compile_receive_values (scm_jit_state *j, uint32_t a, uint8_t b, uint32_t c)
{
}
static void
compile_shuffle_down (scm_jit_state *j, uint16_t from, uint16_t to)
{
}
static void
compile_return_values (scm_jit_state *j)
{
}
static void
compile_subr_call (scm_jit_state *j, uint32_t idx)
{
}
static void
compile_foreign_call (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_continuation_call (scm_jit_state *j, uint32_t a)
{
}
static void
compile_compose_continuation (scm_jit_state *j, uint32_t a)
{
}
static void
compile_capture_continuation (scm_jit_state *j, uint32_t dst)
{
}
static void
compile_abort (scm_jit_state *j)
{
}
static void
compile_builtin_ref (scm_jit_state *j, uint16_t dst, uint16_t a)
{
}
static void
compile_throw (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_throw_value (scm_jit_state *j, uint32_t a, const void *data)
{
}
static void
compile_throw_value_and_data (scm_jit_state *j, uint32_t a, const void *data)
{
}
static void
compile_assert_nargs_ee (scm_jit_state *j, uint32_t a)
{
}
static void
compile_assert_nargs_ge (scm_jit_state *j, uint32_t a)
{
}
static void
compile_assert_nargs_le (scm_jit_state *j, uint32_t a)
{
}
static void
compile_alloc_frame (scm_jit_state *j, uint32_t a)
{
}
static void
compile_reset_frame (scm_jit_state *j, uint32_t a)
{
}
static void
compile_push (scm_jit_state *j, uint32_t a)
{
}
static void
compile_pop (scm_jit_state *j, uint32_t dst)
{
}
static void
compile_drop (scm_jit_state *j, uint32_t a)
{
}
static void
compile_assert_nargs_ee_locals (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_expand_apply_argument (scm_jit_state *j)
{
}
static void
compile_bind_kwargs (scm_jit_state *j, uint32_t a, uint8_t b, uint32_t c, uint32_t d, const void *data)
{
}
static void
compile_bind_rest (scm_jit_state *j, uint32_t dst)
{
}
static void
compile_allocate_words (scm_jit_state *j, uint16_t dst, uint16_t a)
{
}
static void
compile_allocate_words_immediate (scm_jit_state *j, uint16_t dst, uint16_t a)
{
}
static void
compile_scm_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_scm_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_scm_ref_tag (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_scm_set_tag (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_scm_ref_immediate (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_scm_set_immediate (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_word_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_word_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_word_ref_immediate (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_word_set_immediate (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_pointer_ref_immediate (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_pointer_set_immediate (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_tail_pointer_ref_immediate (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_mov (scm_jit_state *j, uint16_t dst, uint16_t a)
{
}
static void
compile_long_mov (scm_jit_state *j, uint32_t dst, uint32_t a)
{
}
static void
compile_long_fmov (scm_jit_state *j, uint32_t dst, uint32_t a)
{
}
static void
compile_call_scm_from_scm_scm (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b, uint32_t c)
{
}
static void
compile_call_scm_from_scm_uimm (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b, uint32_t c)
{
}
static void
compile_call_scm_u64_u64 (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c, uint32_t d)
{
}
static void
compile_call_scm_from_scm (scm_jit_state *j, uint16_t dst, uint16_t a, uint32_t b)
{
}
static void
compile_call_f64_from_scm (scm_jit_state *j, uint16_t dst, uint16_t a, uint32_t b)
{
}
static void
compile_call_u64_from_scm (scm_jit_state *j, uint16_t dst, uint16_t a, uint32_t b)
{
}
static void
compile_make_short_immediate (scm_jit_state *j, uint8_t dst, SCM a)
{
}
static void
compile_make_long_immediate (scm_jit_state *j, uint32_t dst, SCM a)
{
}
static void
compile_make_long_long_immediate (scm_jit_state *j, uint32_t dst, SCM a)
{
}
static void
compile_make_non_immediate (scm_jit_state *j, uint32_t dst, const void *data)
{
}
static void
compile_static_ref (scm_jit_state *j, uint32_t dst, void *loc)
{
}
static void
compile_static_set (scm_jit_state *j, uint32_t a, void *loc)
{
}
static void
compile_static_patch (scm_jit_state *j, void *dst, const void *src)
{
}
static void
compile_prompt (scm_jit_state *j, uint32_t a, uint8_t b, uint32_t c, const uint32_t *vcode)
{
}
static void
compile_load_label (scm_jit_state *j, uint32_t dst, const uint32_t *vcode)
{
}
static void
compile_call_s64_from_scm (scm_jit_state *j, uint16_t dst, uint16_t a, uint32_t b)
{
}
static void
compile_call_scm_from_u64 (scm_jit_state *j, uint16_t dst, uint16_t a, uint32_t b)
{
}
static void
compile_call_scm_from_s64 (scm_jit_state *j, uint16_t dst, uint16_t a, uint32_t b)
{
}
static void
compile_tag_char (scm_jit_state *j, uint16_t dst, uint16_t a)
{
}
static void
compile_untag_char (scm_jit_state *j, uint16_t dst, uint16_t a)
{
}
static void
compile_atomic_ref_scm_immediate (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_atomic_set_scm_immediate (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_atomic_scm_swap_immediate (scm_jit_state *j, uint32_t dst, uint32_t a, uint8_t b, uint32_t c)
{
}
static void
compile_atomic_scm_compare_and_swap_immediate (scm_jit_state *j, uint32_t dst, uint32_t a, uint8_t b, uint32_t c, uint32_t d)
{
}
static void
compile_call_thread_scm_scm (scm_jit_state *j, uint16_t a, uint16_t b, uint32_t c)
{
}
static void
compile_call_thread (scm_jit_state *j, uint32_t a)
{
}
static void
compile_call_scm_from_thread_scm (scm_jit_state *j, uint16_t dst, uint16_t a, uint32_t b)
{
}
static void
compile_call_thread_scm (scm_jit_state *j, uint32_t a, uint32_t b)
{
}
static void
compile_call_scm_from_scm_u64 (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b, uint32_t c)
{
}
static void
compile_call_scm_from_thread (scm_jit_state *j, uint32_t dst, uint32_t a)
{
}
static void
compile_fadd (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_fsub (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_fmul (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_fdiv (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_uadd (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_usub (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_umul (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_uadd_immediate (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_usub_immediate (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_umul_immediate (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_load_f64 (scm_jit_state *j, uint32_t dst, double a)
{
}
static void
compile_load_u64 (scm_jit_state *j, uint32_t dst, uint64_t a)
{
}
static void
compile_load_s64 (scm_jit_state *j, uint32_t dst, int64_t a)
{
}
static void
compile_current_thread (scm_jit_state *j, uint32_t dst)
{
}
static void
compile_ulogand (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_ulogior (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_ulogsub (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_ursh (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_ulsh (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_ursh_immediate (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_ulsh_immediate (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_ulogxor (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_handle_interrupts (scm_jit_state *j)
{
}
static void
compile_return_from_interrupt (scm_jit_state *j)
{
}
static void
compile_u64_numerically_equal (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_u64_less (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_s64_numerically_equal (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_s64_less (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_f64_numerically_equal (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_f64_less (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_numerically_equal (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_less (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_check_arguments (scm_jit_state *j, uint32_t a)
{
}
static void
compile_check_positional_arguments (scm_jit_state *j, uint32_t a, uint32_t b)
{
}
static void
compile_immediate_tag_equals (scm_jit_state *j, uint32_t a, uint16_t b, uint16_t c)
{
}
static void
compile_heap_tag_equals (scm_jit_state *j, uint32_t a, uint16_t b, uint16_t c)
{
}
static void
compile_eq (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_j (scm_jit_state *j, const uint32_t *vcode)
{
}
static void
compile_jl (scm_jit_state *j, const uint32_t *vcode)
{
}
static void
compile_je (scm_jit_state *j, const uint32_t *vcode)
{
}
static void
compile_jnl (scm_jit_state *j, const uint32_t *vcode)
{
}
static void
compile_jne (scm_jit_state *j, const uint32_t *vcode)
{
}
static void
compile_jge (scm_jit_state *j, const uint32_t *vcode)
{
}
static void
compile_jnge (scm_jit_state *j, const uint32_t *vcode)
{
}
static void
compile_heap_numbers_equal (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_untag_fixnum (scm_jit_state *j, uint16_t dst, uint16_t a)
{
}
static void
compile_tag_fixnum (scm_jit_state *j, uint16_t dst, uint16_t a)
{
}
static void
compile_srsh (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_srsh_immediate (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_s64_imm_numerically_equal (scm_jit_state *j, uint16_t a, int16_t b)
{
}
static void
compile_u64_imm_less (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_imm_u64_less (scm_jit_state *j, uint16_t a, uint16_t b)
{
}
static void
compile_s64_imm_less (scm_jit_state *j, uint16_t a, int16_t b)
{
}
static void
compile_imm_s64_less (scm_jit_state *j, uint16_t a, int16_t b)
{
}
static void
compile_u8_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_u16_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_u32_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_u64_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_u8_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_u16_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_u32_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_u64_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_s8_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_s16_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_s32_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_s64_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_s8_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_s16_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_s32_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_s64_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_f32_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_f64_ref (scm_jit_state *j, uint8_t dst, uint8_t a, uint8_t b)
{
}
static void
compile_f32_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
static void
compile_f64_set (scm_jit_state *j, uint8_t a, uint8_t b, uint8_t c)
{
}
#define UNPACK_8_8_8(op,a,b,c) \
do \
{ \
a = (op >> 8) & 0xff; \
b = (op >> 16) & 0xff; \
c = op >> 24; \
} \
while (0)
#define UNPACK_8_16(op,a,b) \
do \
{ \
a = (op >> 8) & 0xff; \
b = op >> 16; \
} \
while (0)
#define UNPACK_12_12(op,a,b) \
do \
{ \
a = (op >> 8) & 0xfff; \
b = op >> 20; \
} \
while (0)
#define UNPACK_24(op,a) \
do \
{ \
a = op >> 8; \
} \
while (0)
#define UNPACK_8_24(op,a,b) \
do \
{ \
a = op & 0xff; \
b = op >> 8; \
} \
while (0)
#define UNPACK_16_16(op,a,b) \
do \
{ \
a = op & 0xffff; \
b = op >> 16; \
} \
while (0)
#define COMPILE_OP1(t0) \
COMPILE_##t0
#define COMPILE_OP2(t0, t1) \
COMPILE_##t0##__##t1
#define COMPILE_OP3(t0, t1, t2) \
COMPILE_##t0##__##t1##__##t2
#define COMPILE_OP4(t0, t1, t2, t3) \
COMPILE_##t0##__##t1##__##t2##__##t3
#define COMPILE_OP5(t0, t1, t2, t3, t4) \
COMPILE_##t0##__##t1##__##t2##__##t3##__##t4
#define COMPILE_DOP1(t0) COMPILE_OP1(t0)
#define COMPILE_DOP2(t0, t1) COMPILE_OP2(t0, t1)
#define COMPILE_DOP3(t0, t1, t2) COMPILE_OP3(t0, t1, t2)
#define COMPILE_DOP4(t0, t1, t2, t3) COMPILE_OP4(t0, t1, t2, t3)
#define COMPILE_DOP5(t0, t1, t2, t3, t4) COMPILE_OP5(t0, t1, t2, t3, t4)
#define COMPILE_NOP(j, comp) \
{ \
bad_instruction(j); \
}
#define COMPILE_X32(j, comp) \
{ \
comp (j); \
j->ip += 1; \
}
#define COMPILE_X8_C24(j, comp) \
{ \
uint32_t a; \
UNPACK_24 (j->ip[0], a); \
comp (j, a); \
j->ip += 1; \
}
#define COMPILE_X8_F24(j, comp) \
COMPILE_X8_C24 (j, comp)
#define COMPILE_X8_S24(j, comp) \
COMPILE_X8_C24 (j, comp)
#define COMPILE_X8_L24(j, comp) \
{ \
int32_t a = j->ip[0]; \
a >>= 8; /* Sign extension. */ \
comp (j, j->ip + a); \
j->ip += 1; \
}
#define COMPILE_X8_C12_C12(j, comp) \
{ \
uint16_t a, b; \
UNPACK_12_12 (j->ip[0], a, b); \
comp (j, a, b); \
j->ip += 1; \
}
#define COMPILE_X8_S12_C12(j, comp) \
COMPILE_X8_C12_C12 (j, comp)
#define COMPILE_X8_S12_S12(j, comp) \
COMPILE_X8_C12_C12 (j, comp)
#define COMPILE_X8_F12_F12(j, comp) \
COMPILE_X8_C12_C12 (j, comp)
#define COMPILE_X8_S12_Z12(j, comp) \
{ \
uint16_t a = (j->ip[0] >> 8) & 0xfff; \
int16_t b = ((int32_t) j->ip[0]) >> 20; /* Sign extension. */ \
comp (j, a, b); \
j->ip += 1; \
}
#define COMPILE_X8_S8_C8_S8(j, comp) \
{ \
uint8_t a, b, c; \
UNPACK_8_8_8 (j->ip[0], a, b, c); \
comp (j, a, b, c); \
j->ip += 1; \
}
#define COMPILE_X8_S8_S8_C8(j, comp) \
COMPILE_X8_S8_C8_S8 (j, comp)
#define COMPILE_X8_S8_S8_S8(j, comp) \
COMPILE_X8_S8_C8_S8 (j, comp)
#define COMPILE_X8_S8_I16(j, comp) \
{ \
uint8_t a; \
scm_t_bits b; \
UNPACK_8_16 (j->ip[0], a, b); \
comp (j, a, SCM_PACK (b)); \
j->ip += 1; \
}
#define COMPILE_X32__C32(j, comp) \
{ \
comp (j, j->ip[1]); \
j->ip += 2; \
}
#define COMPILE_X32__L32(j, comp) \
{ \
int32_t a = j->ip[1]; \
comp (j, j->ip + a); \
j->ip += 2; \
}
#define COMPILE_X32__N32(j, comp) \
COMPILE_X32__L32 (j, comp)
#define COMPILE_X8_C24__L32(j, comp) \
{ \
uint32_t a; \
int32_t b; \
UNPACK_24 (j->ip[0], a); \
b = j->ip[1]; \
comp (j, a, j->ip + b); \
j->ip += 2; \
}
#define COMPILE_X8_S24__L32(j, comp) \
COMPILE_X8_C24__L32 (j, comp)
#define COMPILE_X8_S24__LO32(j, comp) \
COMPILE_X8_C24__L32 (j, comp)
#define COMPILE_X8_S24__N32(j, comp) \
COMPILE_X8_C24__L32 (j, comp)
#define COMPILE_X8_S24__R32(j, comp) \
COMPILE_X8_C24__L32 (j, comp)
#define COMPILE_X8_C24__X8_C24(j, comp) \
{ \
uint32_t a, b; \
UNPACK_24 (j->ip[0], a); \
UNPACK_24 (j->ip[1], b); \
comp (j, a, b); \
j->ip += 2; \
}
#define COMPILE_X8_F24__X8_C24(j, comp) \
COMPILE_X8_C24__X8_C24(j, comp)
#define COMPILE_X8_F24__X8_F24(j, comp) \
COMPILE_X8_C24__X8_C24(j, comp)
#define COMPILE_X8_S24__X8_S24(j, comp) \
COMPILE_X8_C24__X8_C24(j, comp)
#define COMPILE_X8_F12_F12__X8_C24(j, comp) \
{ \
uint16_t a, b; \
uint32_t c; \
UNPACK_12_12 (j->ip[0], a, b); \
UNPACK_24 (j->ip[1], c); \
comp (j, a, b, c); \
j->ip += 2; \
}
#define COMPILE_X8_F24__B1_X7_C24(j, comp) \
{ \
uint32_t a, c; \
uint8_t b; \
UNPACK_24 (j->ip[0], a); \
b = j->ip[1] & 0x1; \
UNPACK_24 (j->ip[1], c); \
comp (j, a, b, c); \
j->ip += 2; \
}
#define COMPILE_X8_S12_S12__C32(j, comp) \
{ \
uint16_t a, b; \
uint32_t c; \
UNPACK_12_12 (j->ip[0], a, b); \
c = j->ip[1]; \
comp (j, a, b, c); \
j->ip += 2; \
}
#define COMPILE_X8_S24__C16_C16(j, comp) \
{ \
uint32_t a; \
uint16_t b, c; \
UNPACK_24 (j->ip[0], a); \
UNPACK_16_16 (j->ip[1], b, c); \
comp (j, a, b, c); \
j->ip += 2; \
}
#define COMPILE_X8_S24__C32(j, comp) \
{ \
uint32_t a, b; \
UNPACK_24 (j->ip[0], a); \
b = j->ip[1]; \
comp (j, a, b); \
j->ip += 2; \
}
#define COMPILE_X8_S24__I32(j, comp) \
{ \
uint32_t a; \
scm_t_bits b; \
UNPACK_24 (j->ip[0], a); \
b = j->ip[1]; \
comp (j, a, SCM_PACK (b)); \
j->ip += 2; \
}
#define COMPILE_X8_S8_S8_C8__C32(j, comp) \
{ \
uint8_t a, b, c; \
uint32_t d; \
UNPACK_8_8_8 (j->ip[0], a, b, c); \
d = j->ip[1]; \
comp (j, a, b, c, d); \
j->ip += 2; \
}
#define COMPILE_X8_S8_S8_S8__C32(j, comp) \
COMPILE_X8_S8_S8_C8__C32(j, comp)
#define COMPILE_X32__LO32__L32(j, comp) \
{ \
int32_t a = j->ip[1], b = j->ip[2]; \
comp (j, j->ip + a, j->ip + b); \
j->ip += 3; \
}
#define COMPILE_X8_F24__X8_C24__L32(j, comp) \
{ \
uint32_t a, b; \
int32_t c; \
UNPACK_24 (j->ip[0], a); \
UNPACK_24 (j->ip[1], b); \
c = j->ip[2]; \
comp (j, a, b, j->ip + c); \
j->ip += 3; \
}
#define COMPILE_X8_S24__A32__B32(j, comp) \
{ \
uint32_t a; \
uint64_t b; \
UNPACK_24 (j->ip[0], a); \
b = (((uint64_t) j->ip[1]) << 32) | ((uint64_t) j->ip[2]); \
if (b > (uint64_t) UINTPTR_MAX) abort (); \
comp (j, a, SCM_PACK ((uintptr_t) b)); \
j->ip += 3; \
}
#define COMPILE_X8_S24__AF32__BF32(j, comp) \
{ \
uint32_t a; \
union { uint64_t u; double d; } b; \
UNPACK_24 (j->ip[0], a); \
b.u = (((uint64_t) j->ip[1]) << 32) | ((uint64_t) j->ip[2]); \
comp (j, a, b.d); \
j->ip += 3; \
}
#define COMPILE_X8_S24__AS32__BS32(j, comp) \
{ \
uint32_t a; \
uint64_t b; \
UNPACK_24 (j->ip[0], a); \
b = (((uint64_t) j->ip[1]) << 32) | ((uint64_t) j->ip[2]); \
comp (j, a, (int64_t) b); \
j->ip += 3; \
}
#define COMPILE_X8_S24__AU32__BU32(j, comp) \
{ \
uint32_t a; \
uint64_t b; \
UNPACK_24 (j->ip[0], a); \
b = (((uint64_t) j->ip[1]) << 32) | ((uint64_t) j->ip[2]); \
comp (j, a, b); \
j->ip += 3; \
}
#define COMPILE_X8_S24__B1_X7_F24__X8_L24(j, comp) \
{ \
uint32_t a, c; \
uint8_t b; \
int32_t d; \
UNPACK_24 (j->ip[0], a); \
b = j->ip[1] & 0x1; \
UNPACK_24 (j->ip[1], c); \
d = j->ip[2]; d >>= 8; /* Sign extension. */ \
comp (j, a, b, c, j->ip + d); \
j->ip += 3; \
}
#define COMPILE_X8_S24__X8_S24__C8_S24(j, comp) \
{ \
uint32_t a, b, d; \
uint8_t c; \
UNPACK_24 (j->ip[0], a); \
UNPACK_24 (j->ip[1], b); \
UNPACK_8_24 (j->ip[2], c, d); \
comp (j, a, b, c, d); \
j->ip += 3; \
}
#define COMPILE_X8_C24__C8_C24__X8_C24__N32(j, comp) \
{ \
uint32_t a, c, d; \
uint8_t b; \
int32_t e; \
UNPACK_24 (j->ip[0], a); \
UNPACK_8_24 (j->ip[1], b, c); \
UNPACK_24 (j->ip[2], d); \
e = j->ip[3]; e >>= 8; /* Sign extension. */ \
comp (j, a, b, c, d, j->ip + e); \
j->ip += 4; \
}
#define COMPILE_X8_S24__X8_S24__C8_S24__X8_S24(j, comp) \
{ \
uint32_t a, b, d, e; \
uint8_t c; \
UNPACK_24 (j->ip[0], a); \
UNPACK_24 (j->ip[1], b); \
UNPACK_8_24 (j->ip[2], c, d); \
UNPACK_24 (j->ip[3], e); \
comp (j, a, b, c, d, e); \
j->ip += 4; \
}
static const uint32_t *
compile1 (scm_jit_state *j)
{
switch (j->ip[0] & 0xff)
{
#define COMPILE1(code, cname, name, arity) \
case code: COMPILE_##arity(j, compile_##cname)
FOR_EACH_VM_OPERATION(COMPILE1)
#undef COMPILE1
default:
abort ();
}
}
static void
compile (scm_jit_state *j)
{
j->ip = (uint32_t *) j->start;
while (j->ip < j->end)
compile1 (j);
}
const uint8_t *
scm_jit_compute_mcode (scm_thread *thread, struct scm_jit_function_data *data)
{
return NULL;
}
uint32_t *
scm_jit_enter_mcode (scm_thread *thread, const uint8_t *mcode)
{
abort ();
return NULL;
}
void
scm_init_jit (void)
{
}