#include "jit-interp.h"
#include "jit-rules.h"
#if HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if HAVE_ALLOCA_H
#include <alloca.h>
#endif
#ifdef JIT_WIN32_PLATFORM
#include <malloc.h>
#ifndef alloca
#define alloca _alloca
#endif
#endif
#include "jit-setjmp.h"
#if defined(JIT_BACKEND_INTERP)
#ifdef HAVE_COMPUTED_GOTO
#if defined(PIC) && defined(HAVE_PIC_COMPUTED_GOTO)
#define JIT_INTERP_TOKEN_PIC 1
#elif defined(PIC)
#define JIT_INTERP_SWITCH 1
#else
#define JIT_INTERP_TOKEN 1
#endif
#else
#define JIT_INTERP_SWITCH 1
#endif
#define VM_MODIFY_PC_AND_STACK(pcmod,stkmod) \
do { \
pc += (jit_nint)(int)(pcmod); \
stacktop += (jit_nint)(int)(stkmod); \
} while (0)
#define VM_MODIFY_PC(pcmod) \
do { \
pc += (jit_nint)(int)(pcmod); \
} while (0)
#define VM_MODIFY_STACK(stkmod) \
do { \
stacktop += (jit_nint)(int)(stkmod); \
} while (0)
#define VM_NINT_ARG (((jit_nint *)(pc))[1])
#define VM_NINT_ARG2 (((jit_nint *)(pc))[2])
#define VM_NINT_ARG3 (((jit_nint *)(pc))[3])
#define VM_BR_TARGET (pc + VM_NINT_ARG)
#define VM_R0_INT (r0.int_value)
#define VM_R0_UINT (r0.uint_value)
#define VM_R0_LONG (r0.long_value)
#define VM_R0_ULONG (r0.ulong_value)
#define VM_R0_FLOAT32 (r0.float32_value)
#define VM_R0_FLOAT64 (r0.float64_value)
#define VM_R0_NFLOAT (r0.nfloat_value)
#define VM_R0_PTR (r0.ptr_value)
#define VM_R1_INT (r1.int_value)
#define VM_R1_UINT (r1.uint_value)
#define VM_R1_LONG (r1.long_value)
#define VM_R1_ULONG (r1.ulong_value)
#define VM_R1_FLOAT32 (r1.float32_value)
#define VM_R1_FLOAT64 (r1.float64_value)
#define VM_R1_NFLOAT (r1.nfloat_value)
#define VM_R1_PTR (r1.ptr_value)
#define VM_R2_INT (r2.int_value)
#define VM_R2_UINT (r2.uint_value)
#define VM_R2_LONG (r2.long_value)
#define VM_R2_ULONG (r2.ulong_value)
#define VM_R2_FLOAT32 (r2.float32_value)
#define VM_R2_FLOAT64 (r2.float64_value)
#define VM_R2_NFLOAT (r2.nfloat_value)
#define VM_R2_PTR (r2.ptr_value)
#ifdef JIT_NATIVE_INT32
#define VM_R0_NINT VM_RO_INT
#define VM_R0_NUINT VM_RO_UINT
#define VM_R1_NINT VM_R1_INT
#define VM_R1_NUINT VM_R1_UINT
#define VM_R2_NINT VM_R2_INT
#define VM_R2_NUINT VM_R2_UINT
#else
#define VM_R0_NINT VM_RO_LONG
#define VM_R0_NUINT VM_RO_ULONG
#define VM_R1_NINT VM_R1_LONG
#define VM_R1_NUINT VM_R1_ULONG
#define VM_R2_NINT VM_R2_LONG
#define VM_R2_NUINT VM_R2_LONG
#endif
#define VM_STK_INT0 (stacktop[0].int_value)
#define VM_STK_INT1 (stacktop[1].int_value)
#define VM_STK_INTP (stacktop[-1].int_value)
#define VM_STK_UINT0 (stacktop[0].uint_value)
#define VM_STK_UINT1 (stacktop[1].uint_value)
#define VM_STK_UINTP (stacktop[-1].uint_value)
#define VM_STK_LONG0 (stacktop[0].long_value)
#define VM_STK_LONG1 (stacktop[1].long_value)
#define VM_STK_LONGP (stacktop[-1].long_value)
#define VM_STK_ULONG0 (stacktop[0].ulong_value)
#define VM_STK_ULONG1 (stacktop[1].ulong_value)
#define VM_STK_ULONGP (stacktop[-1].ulong_value)
#define VM_STK_FLOAT320 (stacktop[0].float32_value)
#define VM_STK_FLOAT321 (stacktop[1].float32_value)
#define VM_STK_FLOAT32P (stacktop[-1].float32_value)
#define VM_STK_FLOAT640 (stacktop[0].float64_value)
#define VM_STK_FLOAT641 (stacktop[1].float64_value)
#define VM_STK_FLOAT64P (stacktop[-1].float64_value)
#define VM_STK_NFLOAT0 (stacktop[0].nfloat_value)
#define VM_STK_NFLOAT1 (stacktop[1].nfloat_value)
#define VM_STK_NFLOATP (stacktop[-1].nfloat_value)
#define VM_STK_PTR0 (stacktop[0].ptr_value)
#define VM_STK_PTR1 (stacktop[1].ptr_value)
#define VM_STK_PTR2 (stacktop[2].ptr_value)
#define VM_STK_PTRP (stacktop[-1].ptr_value)
#define VM_STK_PTRP2 (stacktop[-2].ptr_value)
#ifdef JIT_NATIVE_INT32
#define VM_STK_NINT0 VM_STK_INT0
#define VM_STK_NINT1 VM_STK_INT1
#define VM_STK_NUINT0 VM_STK_UINT0
#define VM_STK_NUINT1 VM_STK_UINT1
#else
#define VM_STK_NINT0 VM_STK_LONG0
#define VM_STK_NINT1 VM_STK_LONG1
#define VM_STK_NUINT0 VM_STK_ULONG0
#define VM_STK_NUINT1 VM_STK_ULONG1
#endif
#define VM_REL(type,ptr) \
((type *)(((unsigned char *)(ptr)) + VM_NINT_ARG))
#define VM_LOAD_ELEM(type) \
(*(((type *)VM_R1_PTR) + VM_R2_NINT))
#define VM_STORE_ELEM(type,value) \
(*(((type *)VM_R0_PTR) + VM_R1_NINT) = (type)(value))
#define VM_ARG(type) \
((type *)(((jit_item *)args) + VM_NINT_ARG))
#define VM_LOC(type) \
((type *)(((jit_item *)frame) + VM_NINT_ARG))
#define VM_BUILTIN(value) \
do { \
builtin_exception = (value); \
if(builtin_exception < JIT_RESULT_OK) \
{ \
goto handle_builtin; \
} \
} while (0)
#define VM_PERFORM_TAIL(newfunc) \
{ \
if(jbuf) \
{ \
_jit_unwind_pop_setjmp(); \
} \
func = (newfunc); \
if(func->frame_size > current_frame_size) \
{ \
current_frame_size = func->frame_size; \
frame_base = (jit_item *)alloca(current_frame_size); \
} \
stacktop = frame_base + func->working_area; \
frame = stacktop; \
goto restart_tail; \
}
static void apply_from_interpreter
(jit_type_t signature, void *func,
jit_item *args, unsigned int num_fixed_args,
void *return_area)
{
unsigned int num_params;
unsigned int param;
jit_type_t type;
void **apply_args;
num_params = jit_type_num_params(signature);
apply_args = (void **)alloca(sizeof(void *) * num_params);
for(param = 0; param < num_params; ++param)
{
type = jit_type_normalize(jit_type_get_param(signature, param));
switch(type->kind)
{
case JIT_TYPE_SBYTE:
case JIT_TYPE_UBYTE:
{
apply_args[param] =
((unsigned char *)args) + _jit_int_lowest_byte();
++args;
}
break;
case JIT_TYPE_SHORT:
case JIT_TYPE_USHORT:
{
apply_args[param] =
((unsigned char *)args) + _jit_int_lowest_short();
++args;
}
break;
case JIT_TYPE_INT:
case JIT_TYPE_UINT:
case JIT_TYPE_LONG:
case JIT_TYPE_ULONG:
case JIT_TYPE_FLOAT32:
case JIT_TYPE_FLOAT64:
case JIT_TYPE_NFLOAT:
{
apply_args[param] = args;
++args;
}
break;
case JIT_TYPE_STRUCT:
case JIT_TYPE_UNION:
{
apply_args[param] = args;
args += JIT_NUM_ITEMS_IN_STRUCT(jit_type_get_size(type));
}
break;
default:
{
apply_args[param] = args;
}
break;
}
}
jit_apply(signature, func, apply_args, num_fixed_args, return_area);
}
void _jit_run_function(jit_function_interp_t func, jit_item *args,
jit_item *return_area)
{
jit_item *frame_base;
jit_item *frame;
jit_item *stacktop;
jit_item r0, r1, r2;
void **pc;
jit_int builtin_exception;
jit_nint temparg;
void *tempptr;
void *tempptr2;
jit_function_t call_func;
struct jit_backtrace call_trace;
void *entry;
void *exception_object = 0;
void *exception_pc = 0;
void *handler;
jit_jmp_buf *jbuf;
jit_nint current_frame_size;
#include "jit-interp-labels.h"
current_frame_size = func->frame_size;
frame_base = (jit_item *)alloca(current_frame_size);
stacktop = frame_base + func->working_area;
frame = stacktop;
restart_tail:
pc = jit_function_interp_entry_pc(func);
if(func->func->has_try)
{
jbuf = (jit_jmp_buf *)alloca(sizeof(jit_jmp_buf));
_jit_unwind_push_setjmp(jbuf);
if(setjmp(jbuf->buf))
{
exception_object = jit_exception_get_last_and_clear();
exception_pc = pc - 1;
goto handle_exception;
}
}
else
{
jbuf = 0;
}
VMSWITCH(pc)
{
VMCASE(JIT_OP_NOP):
{
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_TRUNC_SBYTE):
{
VM_R0_INT = (jit_int)(jit_sbyte)VM_R1_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_TRUNC_UBYTE):
{
VM_R0_INT = (jit_int)(jit_ubyte)VM_R1_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_TRUNC_SHORT):
{
VM_R0_INT = (jit_int)(jit_short)VM_R1_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_TRUNC_USHORT):
{
VM_R0_INT = (jit_int)(jit_ushort)VM_R1_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_TRUNC_INT):
{
VM_R0_INT = VM_R1_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_TRUNC_UINT):
{
VM_R0_INT = VM_R1_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_SBYTE):
{
VM_BUILTIN(jit_int_to_sbyte_ovf(&VM_R0_INT, VM_R1_INT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_UBYTE):
{
VM_BUILTIN(jit_int_to_ubyte_ovf(&VM_R0_INT, VM_R1_INT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_SHORT):
{
VM_BUILTIN(jit_int_to_short_ovf(&VM_R0_INT, VM_R1_INT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_USHORT):
{
VM_BUILTIN(jit_int_to_ushort_ovf(&VM_R0_INT, VM_R1_INT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_INT):
{
VM_BUILTIN(jit_uint_to_int_ovf(&VM_R0_INT, VM_R1_UINT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_UINT):
{
VM_BUILTIN(jit_int_to_uint_ovf(&VM_R0_UINT, VM_R1_INT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LOW_WORD):
{
VM_R0_UINT = (jit_uint)VM_R1_LONG;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_EXPAND_INT):
{
VM_R0_LONG = (jit_long)VM_R1_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_EXPAND_UINT):
{
VM_R0_ULONG = (jit_ulong)VM_R1_UINT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_LOW_WORD):
{
VM_BUILTIN(jit_long_to_uint_ovf(&VM_R0_UINT, VM_R1_LONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_SIGNED_LOW_WORD):
{
VM_BUILTIN(jit_long_to_int_ovf(&VM_R0_INT, VM_R1_LONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_LONG):
{
VM_BUILTIN(jit_ulong_to_long_ovf(&VM_R0_LONG, VM_R1_ULONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_ULONG):
{
VM_BUILTIN(jit_long_to_ulong_ovf(&VM_R0_ULONG, VM_R1_LONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT32_TO_INT):
{
VM_R0_INT = jit_float32_to_int(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT32_TO_UINT):
{
VM_R0_UINT = jit_float32_to_uint(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT32_TO_LONG):
{
VM_R0_LONG = jit_float32_to_long(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT32_TO_ULONG):
{
VM_R0_ULONG = jit_float32_to_ulong(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_FLOAT32_TO_INT):
{
VM_BUILTIN(jit_float32_to_int_ovf(&VM_R0_INT, VM_R1_FLOAT32));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_FLOAT32_TO_UINT):
{
VM_BUILTIN(jit_float32_to_uint_ovf(&VM_R0_UINT, VM_R1_FLOAT32));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_FLOAT32_TO_LONG):
{
VM_BUILTIN(jit_float32_to_long_ovf(&VM_R0_LONG, VM_R1_FLOAT32));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_FLOAT32_TO_ULONG):
{
VM_BUILTIN(jit_float32_to_ulong_ovf(&VM_R0_ULONG, VM_R1_FLOAT32));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_INT_TO_FLOAT32):
{
VM_R0_FLOAT32 = jit_int_to_float32(VM_R1_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_UINT_TO_FLOAT32):
{
VM_R0_FLOAT32 = jit_uint_to_float32(VM_R1_UINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LONG_TO_FLOAT32):
{
VM_R0_FLOAT32 = jit_long_to_float32(VM_R1_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ULONG_TO_FLOAT32):
{
VM_R0_FLOAT32 = jit_ulong_to_float32(VM_R1_ULONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT32_TO_FLOAT64):
{
VM_R0_FLOAT64 = jit_float32_to_float64(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT64_TO_INT):
{
VM_R0_INT = jit_float64_to_int(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT64_TO_UINT):
{
VM_R0_UINT = jit_float64_to_uint(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT64_TO_LONG):
{
VM_R0_LONG = jit_float64_to_long(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT64_TO_ULONG):
{
VM_R0_ULONG = jit_float64_to_ulong(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_FLOAT64_TO_INT):
{
VM_BUILTIN(jit_float64_to_int_ovf(&VM_R0_INT, VM_R1_FLOAT64));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_FLOAT64_TO_UINT):
{
VM_BUILTIN(jit_float64_to_uint_ovf(&VM_R0_UINT, VM_R1_FLOAT64));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_FLOAT64_TO_LONG):
{
VM_BUILTIN(jit_float64_to_long_ovf(&VM_R0_LONG, VM_R1_FLOAT64));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_FLOAT64_TO_ULONG):
{
VM_BUILTIN(jit_float64_to_ulong_ovf(&VM_R0_ULONG, VM_R1_FLOAT64));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_INT_TO_FLOAT64):
{
VM_R0_FLOAT64 = jit_int_to_float64(VM_R1_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_UINT_TO_FLOAT64):
{
VM_R0_FLOAT64 = jit_uint_to_float64(VM_R1_UINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LONG_TO_FLOAT64):
{
VM_R0_FLOAT64 = jit_long_to_float64(VM_R1_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ULONG_TO_FLOAT64):
{
VM_R0_FLOAT64 = jit_ulong_to_float64(VM_R1_ULONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT64_TO_FLOAT32):
{
VM_R0_FLOAT32 = jit_float64_to_float32(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLOAT_TO_INT):
{
VM_R0_INT = jit_nfloat_to_int(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLOAT_TO_UINT):
{
VM_R0_UINT = jit_nfloat_to_uint(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLOAT_TO_LONG):
{
VM_R0_LONG = jit_nfloat_to_long(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLOAT_TO_ULONG):
{
VM_R0_ULONG = jit_nfloat_to_ulong(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_NFLOAT_TO_INT):
{
VM_BUILTIN(jit_nfloat_to_int_ovf(&VM_R0_INT, VM_R1_NFLOAT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_NFLOAT_TO_UINT):
{
VM_BUILTIN(jit_nfloat_to_uint_ovf(&VM_R0_UINT, VM_R1_NFLOAT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_NFLOAT_TO_LONG):
{
VM_BUILTIN(jit_nfloat_to_long_ovf(&VM_R0_LONG, VM_R1_NFLOAT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_NFLOAT_TO_ULONG):
{
VM_BUILTIN(jit_nfloat_to_ulong_ovf(&VM_R0_ULONG, VM_R1_NFLOAT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_INT_TO_NFLOAT):
{
VM_R0_NFLOAT = jit_int_to_nfloat(VM_R1_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_UINT_TO_NFLOAT):
{
VM_R0_NFLOAT = jit_uint_to_nfloat(VM_R1_UINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LONG_TO_NFLOAT):
{
VM_R0_NFLOAT = jit_long_to_nfloat(VM_R1_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ULONG_TO_NFLOAT):
{
VM_R0_NFLOAT = jit_ulong_to_nfloat(VM_R1_ULONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLOAT_TO_FLOAT32):
{
VM_R0_FLOAT32 = jit_nfloat_to_float32(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLOAT_TO_FLOAT64):
{
VM_R0_FLOAT64 = jit_nfloat_to_float64(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT32_TO_NFLOAT):
{
VM_R0_NFLOAT = jit_float32_to_nfloat(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOAT64_TO_NFLOAT):
{
VM_R0_NFLOAT = jit_float64_to_nfloat(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IADD):
{
VM_R0_INT = VM_R1_INT + VM_R2_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IADD_OVF):
{
VM_BUILTIN(jit_int_add_ovf(&VM_R0_INT, VM_R1_INT, VM_R2_INT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IADD_OVF_UN):
{
VM_BUILTIN(jit_uint_add_ovf(&VM_R0_UINT, VM_R1_UINT, VM_R2_UINT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ISUB):
{
VM_R0_INT = VM_R1_INT - VM_R2_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ISUB_OVF):
{
VM_BUILTIN(jit_int_sub_ovf(&VM_R0_INT, VM_R1_INT, VM_R2_INT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ISUB_OVF_UN):
{
VM_BUILTIN(jit_uint_sub_ovf(&VM_R0_UINT, VM_R1_UINT, VM_R2_UINT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IMUL):
{
VM_R0_INT = VM_R1_INT * VM_R2_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IMUL_OVF):
{
VM_BUILTIN(jit_int_mul_ovf(&VM_R0_INT, VM_R1_INT, VM_R2_INT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IMUL_OVF_UN):
{
VM_BUILTIN(jit_uint_mul_ovf(&VM_R0_UINT, VM_R1_UINT, VM_R2_UINT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IDIV):
{
VM_BUILTIN(jit_int_div(&VM_R0_INT, VM_R1_INT, VM_R2_INT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IDIV_UN):
{
VM_BUILTIN(jit_uint_div(&VM_R0_UINT, VM_R1_UINT, VM_R2_UINT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IREM):
{
VM_BUILTIN(jit_int_rem(&VM_R0_INT, VM_R1_INT, VM_R2_INT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IREM_UN):
{
VM_BUILTIN(jit_uint_rem(&VM_R0_UINT, VM_R1_UINT, VM_R2_UINT));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_INEG):
{
VM_R0_INT = -VM_R1_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LADD):
{
VM_R0_LONG = VM_R1_LONG + VM_R2_LONG;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LADD_OVF):
{
VM_BUILTIN(jit_long_add_ovf(&VM_R0_LONG, VM_R1_LONG, VM_R2_LONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LADD_OVF_UN):
{
VM_BUILTIN(jit_ulong_add_ovf(&VM_R0_ULONG, VM_R1_ULONG, VM_R2_ULONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LSUB):
{
VM_R0_LONG = VM_R1_LONG - VM_R2_LONG;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LSUB_OVF):
{
VM_BUILTIN(jit_long_sub_ovf(&VM_R0_LONG, VM_R1_LONG, VM_R2_LONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LSUB_OVF_UN):
{
VM_BUILTIN(jit_ulong_sub_ovf(&VM_R0_ULONG, VM_R1_ULONG, VM_R2_ULONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LMUL):
{
VM_R0_LONG = VM_R1_LONG * VM_R2_LONG;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LMUL_OVF):
{
VM_BUILTIN(jit_long_mul_ovf(&VM_R0_LONG, VM_R1_LONG, VM_R2_LONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LMUL_OVF_UN):
{
VM_BUILTIN(jit_ulong_mul_ovf(&VM_R0_ULONG, VM_R1_ULONG, VM_R2_ULONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LDIV):
{
VM_BUILTIN(jit_long_div (&VM_R0_LONG, VM_R1_LONG, VM_R2_LONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LDIV_UN):
{
VM_BUILTIN(jit_ulong_div(&VM_R0_ULONG, VM_R1_ULONG, VM_R2_ULONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LREM):
{
VM_BUILTIN(jit_long_rem(&VM_R0_LONG, VM_R1_LONG, VM_R2_LONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LREM_UN):
{
VM_BUILTIN(jit_ulong_rem(&VM_R0_ULONG, VM_R1_ULONG, VM_R2_ULONG));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LNEG):
{
VM_R0_LONG = -VM_R1_LONG;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FADD):
{
VM_R0_FLOAT32 = VM_R1_FLOAT32 + VM_R2_FLOAT32;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FSUB):
{
VM_R0_FLOAT32 = VM_R1_FLOAT32 - VM_R2_FLOAT32;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FMUL):
{
VM_R0_FLOAT32 = VM_R1_FLOAT32 * VM_R2_FLOAT32;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FDIV):
{
VM_R0_FLOAT32 = VM_R1_FLOAT32 / VM_R2_FLOAT32;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FREM):
{
VM_R0_FLOAT32 = jit_float32_rem(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FREM_IEEE):
{
VM_R0_FLOAT32 = jit_float32_ieee_rem(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FNEG):
{
VM_R0_FLOAT32 = -VM_R1_FLOAT32;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DADD):
{
VM_R0_FLOAT64 = VM_R1_FLOAT64 + VM_R2_FLOAT64;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DSUB):
{
VM_R0_FLOAT64 = VM_R1_FLOAT64 - VM_R2_FLOAT64;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DMUL):
{
VM_R0_FLOAT64 = VM_R1_FLOAT64 * VM_R2_FLOAT64;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DDIV):
{
VM_R0_FLOAT64 = VM_R1_FLOAT64 / VM_R2_FLOAT64;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DREM):
{
VM_R0_FLOAT64 = jit_float64_rem(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DREM_IEEE):
{
VM_R0_FLOAT64 = jit_float64_ieee_rem(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DNEG):
{
VM_R0_FLOAT64 = -VM_R1_FLOAT64;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFADD):
{
VM_R0_NFLOAT = VM_R1_NFLOAT + VM_R2_NFLOAT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFSUB):
{
VM_R0_NFLOAT = VM_R1_NFLOAT - VM_R2_NFLOAT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFMUL):
{
VM_R0_NFLOAT = VM_R1_NFLOAT * VM_R2_NFLOAT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFDIV):
{
VM_R0_NFLOAT = VM_R1_NFLOAT / VM_R2_NFLOAT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFREM):
{
VM_R0_NFLOAT = jit_nfloat_rem(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFREM_IEEE):
{
VM_R0_NFLOAT = jit_nfloat_ieee_rem(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFNEG):
{
VM_R0_NFLOAT = -VM_R1_NFLOAT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IAND):
{
VM_R0_INT = VM_R1_INT & VM_R2_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IOR):
{
VM_R0_INT = VM_R1_INT | VM_R2_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IXOR):
{
VM_R0_INT = VM_R1_INT ^ VM_R2_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_INOT):
{
VM_R0_INT = ~VM_R1_INT;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ISHL):
{
VM_R0_INT = VM_R1_INT << (VM_R2_INT & 0x1F);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ISHR):
{
VM_R0_INT = VM_R1_INT >> (VM_R2_UINT & 0x1F);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ISHR_UN):
{
VM_R0_UINT = VM_R1_UINT >> (VM_R2_UINT & 0x1F);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LAND):
{
VM_R0_LONG = VM_R1_LONG & VM_R2_LONG;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LOR):
{
VM_R0_LONG = VM_R1_LONG | VM_R2_LONG;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LXOR):
{
VM_R0_LONG = VM_R1_LONG ^ VM_R2_LONG;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LNOT):
{
VM_R0_LONG = ~VM_R1_LONG;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LSHL):
{
VM_R0_LONG = (VM_R1_LONG << (VM_R2_UINT & 0x3F));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LSHR):
{
VM_R0_LONG = (VM_R1_LONG >> (VM_R2_UINT & 0x3F));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LSHR_UN):
{
VM_R0_ULONG = (VM_R1_ULONG >> (VM_R2_UINT & 0x3F));
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_BR):
{
pc = VM_BR_TARGET;
}
VMBREAK;
VMCASE(JIT_OP_BR_IFALSE):
{
if(VM_R1_INT == 0)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_ITRUE):
{
if(VM_R1_INT != 0)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_IEQ):
{
if(VM_R1_INT == VM_R2_INT)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_INE):
{
if(VM_R1_INT != VM_R2_INT)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_ILT):
{
if(VM_R1_INT < VM_R2_INT)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_ILT_UN):
{
if(VM_R1_UINT < VM_R2_UINT)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_ILE):
{
if(VM_R1_INT <= VM_R2_INT)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_ILE_UN):
{
if(VM_R1_UINT <= VM_R2_UINT)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_IGT):
{
if(VM_R1_INT > VM_R2_INT)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_IGT_UN):
{
if(VM_R1_UINT > VM_R2_UINT)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_IGE):
{
if(VM_R1_INT >= VM_R2_INT)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_IGE_UN):
{
if(VM_R1_UINT >= VM_R2_UINT)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LFALSE):
{
if(VM_R1_LONG == 0)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LTRUE):
{
if(VM_R1_LONG != 0)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LEQ):
{
if(VM_R1_LONG == VM_R2_LONG)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LNE):
{
if(VM_R1_LONG != VM_R2_LONG)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LLT):
{
if(VM_R1_LONG < VM_R2_LONG)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LLT_UN):
{
if(VM_R1_ULONG < VM_R2_ULONG)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LLE):
{
if(VM_R1_LONG <= VM_R2_LONG)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LLE_UN):
{
if(VM_R1_ULONG <= VM_R2_ULONG)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LGT):
{
if(VM_R1_LONG > VM_R2_LONG)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LGT_UN):
{
if(VM_R1_ULONG > VM_R2_ULONG)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LGE):
{
if(VM_R1_LONG >= VM_R2_LONG)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_LGE_UN):
{
if(VM_R1_ULONG >= VM_R2_ULONG)
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_FEQ):
{
if(jit_float32_eq(VM_R1_FLOAT32, VM_R2_FLOAT32))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_FNE):
{
if(jit_float32_ne(VM_R1_FLOAT32, VM_R2_FLOAT32))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_FLT):
{
if(jit_float32_lt(VM_R1_FLOAT32, VM_R2_FLOAT32))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_FLE):
{
if(jit_float32_le(VM_R1_FLOAT32, VM_R2_FLOAT32))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_FGT):
{
if(jit_float32_gt(VM_R1_FLOAT32, VM_R2_FLOAT32))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_FGE):
{
if(jit_float32_ge(VM_R1_FLOAT32, VM_R2_FLOAT32))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_FLT_INV):
{
if(!jit_float32_ge(VM_R1_FLOAT32, VM_R2_FLOAT32))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_FLE_INV):
{
if(!jit_float32_gt(VM_R1_FLOAT32, VM_R2_FLOAT32))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_FGT_INV):
{
if(!jit_float32_le(VM_R1_FLOAT32, VM_R2_FLOAT32))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_FGE_INV):
{
if(!jit_float32_lt(VM_R1_FLOAT32, VM_R2_FLOAT32))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_DEQ):
{
if(jit_float64_eq(VM_R1_FLOAT64, VM_R2_FLOAT64))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_DNE):
{
if(jit_float64_ne(VM_R1_FLOAT64, VM_R2_FLOAT64))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_DLT):
{
if(jit_float64_lt(VM_R1_FLOAT64, VM_R2_FLOAT64))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_DLE):
{
if(jit_float64_le(VM_R1_FLOAT64, VM_R2_FLOAT64))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_DGT):
{
if(jit_float64_gt(VM_R1_FLOAT64, VM_R2_FLOAT64))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_DGE):
{
if(jit_float64_ge(VM_R1_FLOAT64, VM_R2_FLOAT64))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_DLT_INV):
{
if(!jit_float64_ge(VM_R1_FLOAT64, VM_R2_FLOAT64))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_DLE_INV):
{
if(!jit_float64_gt(VM_R1_FLOAT64, VM_R2_FLOAT64))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_DGT_INV):
{
if(!jit_float64_le(VM_R1_FLOAT64, VM_R2_FLOAT64))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_DGE_INV):
{
if(!jit_float64_lt(VM_R1_FLOAT64, VM_R2_FLOAT64))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_NFEQ):
{
if(jit_nfloat_eq(VM_R1_NFLOAT, VM_R2_NFLOAT))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_NFNE):
{
if(jit_nfloat_ne(VM_R1_NFLOAT, VM_R2_NFLOAT))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_NFLT):
{
if(jit_nfloat_lt(VM_R1_NFLOAT, VM_R2_NFLOAT))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_NFLE):
{
if(jit_nfloat_le(VM_R1_NFLOAT, VM_R2_NFLOAT))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_NFGT):
{
if(jit_nfloat_gt(VM_R1_NFLOAT, VM_R2_NFLOAT))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_NFGE):
{
if(jit_nfloat_ge(VM_R1_NFLOAT, VM_R2_NFLOAT))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_NFLT_INV):
{
if(!jit_nfloat_ge(VM_R1_NFLOAT, VM_R2_NFLOAT))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_NFLE_INV):
{
if(!jit_nfloat_gt(VM_R1_NFLOAT, VM_R2_NFLOAT))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_NFGT_INV):
{
if(!jit_nfloat_le(VM_R1_NFLOAT, VM_R2_NFLOAT))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_BR_NFGE_INV):
{
if(!jit_nfloat_lt(VM_R1_NFLOAT, VM_R2_NFLOAT))
{
pc = VM_BR_TARGET;
}
else
{
VM_MODIFY_PC(2);
}
}
VMBREAK;
VMCASE(JIT_OP_JUMP_TABLE):
{
if(VM_R0_INT < VM_NINT_ARG && VM_R0_INT >= 0)
{
pc = pc[2 + VM_R0_INT];
}
else
{
VM_MODIFY_PC(2 + VM_NINT_ARG);
}
}
VMBREAK;
VMCASE(JIT_OP_ICMP):
{
VM_R0_INT = jit_int_cmp(VM_R1_INT, VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ICMP_UN):
{
VM_R0_UINT = jit_uint_cmp(VM_R1_UINT, VM_R2_UINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LCMP):
{
VM_R0_INT = jit_long_cmp(VM_R1_LONG, VM_R2_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LCMP_UN):
{
VM_R0_INT = jit_ulong_cmp(VM_R1_ULONG, VM_R2_ULONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FCMPL):
{
VM_R0_INT = jit_float32_cmpl(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FCMPG):
{
VM_R0_INT = jit_float32_cmpg(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DCMPL):
{
VM_R0_INT = jit_float64_cmpl(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DCMPG):
{
VM_R0_INT = jit_float64_cmpg(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFCMPL):
{
VM_R0_INT = jit_float64_cmpl(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFCMPG):
{
VM_R0_INT = jit_float64_cmpg(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IEQ):
{
VM_R0_INT = (jit_int)(VM_R1_INT == VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_INE):
{
VM_R0_INT = (jit_int)(VM_R1_INT != VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ILT):
{
VM_R0_INT = (jit_int)(VM_R1_INT < VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ILT_UN):
{
VM_R0_INT = (jit_int)(VM_R1_UINT < VM_R2_UINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ILE):
{
VM_R0_INT = (jit_int)(VM_R1_INT <= VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ILE_UN):
{
VM_R0_INT = (jit_int)(VM_R1_UINT <= VM_R2_UINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IGT):
{
VM_R0_INT = (jit_int)(VM_R1_INT > VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IGT_UN):
{
VM_R0_INT = (jit_int)(VM_R1_UINT > VM_R2_UINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IGE):
{
VM_R0_INT = (jit_int)(VM_R1_INT >= VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IGE_UN):
{
VM_R0_INT = (jit_int)(VM_R1_UINT >= VM_R2_UINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LEQ):
{
VM_R0_INT = (jit_int)(VM_R1_LONG == VM_R2_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LNE):
{
VM_R0_INT = (jit_int)(VM_R1_LONG != VM_R2_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LLT):
{
VM_R0_INT = (jit_int)(VM_R1_LONG < VM_R2_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LLT_UN):
{
VM_R0_INT = (jit_int)(VM_R1_ULONG < VM_R2_ULONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LLE):
{
VM_R0_INT = (jit_int)(VM_R1_LONG <= VM_R2_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LLE_UN):
{
VM_R0_INT = (jit_int)(VM_R1_ULONG <= VM_R2_ULONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LGT):
{
VM_R0_INT = (jit_int)(VM_R1_LONG > VM_R2_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LGT_UN):
{
VM_R0_INT = (jit_int)(VM_R1_ULONG > VM_R2_ULONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LGE):
{
VM_R0_INT = (jit_int)(VM_R1_LONG >= VM_R2_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LGE_UN):
{
VM_R0_INT = (jit_int)(VM_R1_ULONG >= VM_R2_ULONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FEQ):
{
VM_R0_INT = jit_float32_eq(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FNE):
{
VM_R0_INT = jit_float32_ne(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLT):
{
VM_R0_INT = jit_float32_lt(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLE):
{
VM_R0_INT = jit_float32_le(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FGT):
{
VM_R0_INT = jit_float32_gt(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FGE):
{
VM_R0_INT = jit_float32_ge(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLT_INV):
{
VM_R0_INT = !jit_float32_ge(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLE_INV):
{
VM_R0_INT = !jit_float32_gt(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FGT_INV):
{
VM_R0_INT = !jit_float32_le(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FGE_INV):
{
VM_R0_INT = !jit_float32_lt(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DEQ):
{
VM_R0_INT = jit_float64_eq(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DNE):
{
VM_R0_INT = jit_float64_ne(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DLT):
{
VM_R0_INT = jit_float64_lt(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DLE):
{
VM_R0_INT = jit_float64_le(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DGT):
{
VM_R0_INT = jit_float64_gt(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DGE):
{
VM_R0_INT = jit_float64_ge(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DLT_INV):
{
VM_R0_INT = !jit_float64_ge(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DLE_INV):
{
VM_R0_INT = !jit_float64_gt(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DGT_INV):
{
VM_R0_INT = !jit_float64_le(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DGE_INV):
{
VM_R0_INT = !jit_float64_lt(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFEQ):
{
VM_R0_INT = jit_nfloat_eq(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFNE):
{
VM_R0_INT = jit_nfloat_ne(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLT):
{
VM_R0_INT = jit_nfloat_lt(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLE):
{
VM_R0_INT = jit_nfloat_le(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFGT):
{
VM_R0_INT = jit_nfloat_gt(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFGE):
{
VM_R0_INT = jit_nfloat_ge(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLT_INV):
{
VM_R0_INT = !jit_nfloat_ge(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLE_INV):
{
VM_R0_INT = !jit_nfloat_gt(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFGT_INV):
{
VM_R0_INT = !jit_nfloat_le(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFGE_INV):
{
VM_R0_INT = !jit_nfloat_lt(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IS_FNAN):
{
VM_R0_INT = jit_float32_is_nan(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IS_FINF):
{
VM_R0_INT = jit_float32_is_inf(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IS_FFINITE):
{
VM_R0_INT = jit_float32_is_finite(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IS_DNAN):
{
VM_R0_INT = jit_float64_is_nan(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IS_DINF):
{
VM_R0_INT = jit_float64_is_inf(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IS_DFINITE):
{
VM_R0_INT = jit_float64_is_finite(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IS_NFNAN):
{
VM_R0_INT = jit_nfloat_is_nan(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IS_NFINF):
{
VM_R0_INT = jit_nfloat_is_inf(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IS_NFFINITE):
{
VM_R0_INT = jit_nfloat_is_finite(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FACOS):
{
VM_R0_FLOAT32 = jit_float32_acos(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FASIN):
{
VM_R0_FLOAT32 = jit_float32_asin(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FATAN):
{
VM_R0_FLOAT32 = jit_float32_atan(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FATAN2):
{
VM_R0_FLOAT32 = jit_float32_atan2(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FCEIL):
{
VM_R0_FLOAT32 = jit_float32_ceil(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FCOS):
{
VM_R0_FLOAT32 = jit_float32_cos(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FCOSH):
{
VM_R0_FLOAT32 = jit_float32_cosh(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FEXP):
{
VM_R0_FLOAT32 = jit_float32_exp(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FFLOOR):
{
VM_R0_FLOAT32 = jit_float32_floor(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOG):
{
VM_R0_FLOAT32 = jit_float32_log(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FLOG10):
{
VM_R0_FLOAT32 = jit_float32_log10(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FPOW):
{
VM_R0_FLOAT32 = jit_float32_pow(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FRINT):
{
VM_R0_FLOAT32 = jit_float32_rint(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FROUND):
{
VM_R0_FLOAT32 = jit_float32_round(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FSIN):
{
VM_R0_FLOAT32 = jit_float32_sin(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FSINH):
{
VM_R0_FLOAT32 = jit_float32_sinh(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FSQRT):
{
VM_R0_FLOAT32 = jit_float32_sqrt(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FTAN):
{
VM_R0_FLOAT32 = jit_float32_tan(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FTANH):
{
VM_R0_FLOAT32 = jit_float32_tanh(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FTRUNC):
{
VM_R0_FLOAT32 = jit_float32_trunc(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DACOS):
{
VM_R0_FLOAT64 = jit_float64_acos(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DASIN):
{
VM_R0_FLOAT64 = jit_float64_asin(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DATAN):
{
VM_R0_FLOAT64 = jit_float64_atan(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DATAN2):
{
VM_R0_FLOAT64 = jit_float64_atan2(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DCEIL):
{
VM_R0_FLOAT64 = jit_float64_ceil(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DCOS):
{
VM_R0_FLOAT64 = jit_float64_cos(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DCOSH):
{
VM_R0_FLOAT64 = jit_float64_cosh(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DEXP):
{
VM_R0_FLOAT64 = jit_float64_exp(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DFLOOR):
{
VM_R0_FLOAT64 = jit_float64_floor(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DLOG):
{
VM_R0_FLOAT64 = jit_float64_log(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DLOG10):
{
VM_R0_FLOAT64 = jit_float64_log10(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DPOW):
{
VM_R0_FLOAT64 = jit_float64_pow(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DRINT):
{
VM_R0_FLOAT64 = jit_float64_rint(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DROUND):
{
VM_R0_FLOAT64 = jit_float64_round(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DSIN):
{
VM_R0_FLOAT64 = jit_float64_sin(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DSINH):
{
VM_R0_FLOAT64 = jit_float64_sinh(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DSQRT):
{
VM_R0_FLOAT64 = jit_float64_sqrt(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DTAN):
{
VM_R0_FLOAT64 = jit_float64_tan(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DTANH):
{
VM_R0_FLOAT64 = jit_float64_tanh(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DTRUNC):
{
VM_R0_FLOAT64 = jit_float64_trunc(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFACOS):
{
VM_R0_NFLOAT = jit_nfloat_acos(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFASIN):
{
VM_R0_NFLOAT = jit_nfloat_asin(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFATAN):
{
VM_R0_NFLOAT = jit_nfloat_atan(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFATAN2):
{
VM_R0_NFLOAT = jit_nfloat_atan2(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFCEIL):
{
VM_R0_NFLOAT = jit_nfloat_ceil(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFCOS):
{
VM_R0_NFLOAT = jit_nfloat_cos(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFCOSH):
{
VM_R0_NFLOAT = jit_nfloat_cosh(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFEXP):
{
VM_R0_NFLOAT = jit_nfloat_exp(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFFLOOR):
{
VM_R0_NFLOAT = jit_nfloat_floor(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLOG):
{
VM_R0_NFLOAT = jit_nfloat_log(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFLOG10):
{
VM_R0_NFLOAT = jit_nfloat_log10(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFPOW):
{
VM_R0_NFLOAT = jit_nfloat_pow(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFRINT):
{
VM_R0_NFLOAT = jit_nfloat_rint(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFROUND):
{
VM_R0_NFLOAT = jit_nfloat_round(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFSIN):
{
VM_R0_NFLOAT = jit_nfloat_sin(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFSINH):
{
VM_R0_NFLOAT = jit_nfloat_sinh(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFSQRT):
{
VM_R0_NFLOAT = jit_nfloat_sqrt(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFTAN):
{
VM_R0_NFLOAT = jit_nfloat_tan(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFTANH):
{
VM_R0_NFLOAT = jit_nfloat_tanh(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFTRUNC):
{
VM_R0_NFLOAT = jit_nfloat_trunc(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IABS):
{
VM_R0_INT = jit_int_abs(VM_R1_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LABS):
{
VM_R0_LONG = jit_long_abs(VM_R1_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FABS):
{
VM_R0_FLOAT32 = jit_float32_abs(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DABS):
{
VM_R0_FLOAT64 = jit_float64_abs(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFABS):
{
VM_R0_NFLOAT = jit_nfloat_abs(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IMIN):
{
VM_R0_INT = jit_int_min(VM_R1_INT, VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IMIN_UN):
{
VM_R0_UINT = jit_uint_min(VM_R1_UINT, VM_R2_UINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LMIN):
{
VM_R0_LONG = jit_long_min(VM_R1_LONG, VM_R2_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LMIN_UN):
{
VM_R0_ULONG = jit_ulong_min(VM_R1_ULONG, VM_R2_ULONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FMIN):
{
VM_R0_FLOAT32 = jit_float32_min(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DMIN):
{
VM_R0_FLOAT64 = jit_float64_min(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFMIN):
{
VM_R0_NFLOAT = jit_nfloat_min(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IMAX):
{
VM_R0_INT = jit_int_max(VM_R1_INT, VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_IMAX_UN):
{
VM_R0_UINT = jit_uint_max(VM_R1_UINT, VM_R2_UINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LMAX):
{
VM_R0_LONG = jit_long_max(VM_R1_LONG, VM_R2_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LMAX_UN):
{
VM_R0_ULONG = jit_ulong_max(VM_R1_ULONG, VM_R2_ULONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FMAX):
{
VM_R0_FLOAT32 = jit_float32_max(VM_R1_FLOAT32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DMAX):
{
VM_R0_FLOAT64 = jit_float64_max(VM_R1_FLOAT64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFMAX):
{
VM_R0_NFLOAT = jit_nfloat_max(VM_R1_NFLOAT, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ISIGN):
{
VM_R0_INT = jit_int_sign(VM_R1_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LSIGN):
{
VM_R0_INT = jit_long_sign(VM_R1_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_FSIGN):
{
VM_R0_INT = jit_float32_sign(VM_R1_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_DSIGN):
{
VM_R0_INT = jit_float64_sign(VM_R1_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_NFSIGN):
{
VM_R0_INT = jit_nfloat_sign(VM_R1_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CHECK_NULL):
{
if(!VM_R1_PTR)
{
VM_BUILTIN(JIT_RESULT_NULL_REFERENCE);
}
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_CALL):
{
call_func = (jit_function_t)VM_NINT_ARG;
VM_MODIFY_PC(2);
entry = call_func->entry_point;
_jit_backtrace_push(&call_trace, pc);
if(!entry)
{
entry = (*call_func->context->on_demand_driver)(call_func);
}
_jit_run_function((jit_function_interp_t)entry,
stacktop,
return_area);
_jit_backtrace_pop();
}
VMBREAK;
VMCASE(JIT_OP_CALL_TAIL):
{
call_func = (jit_function_t)VM_NINT_ARG;
entry = call_func->entry_point;
if(!entry)
{
entry = (*call_func->context->on_demand_driver)(call_func);
}
VM_PERFORM_TAIL((jit_function_interp_t)entry);
}
VMCASE(JIT_OP_CALL_INDIRECT):
VMCASE(JIT_OP_CALL_INDIRECT_TAIL):
{
tempptr = (void *)VM_NINT_ARG;
temparg = VM_NINT_ARG2;
VM_MODIFY_PC_AND_STACK(3, 1);
_jit_backtrace_push(&call_trace, pc);
apply_from_interpreter((jit_type_t)tempptr,
(void *)VM_R1_PTR,
stacktop,
(unsigned int)temparg,
VM_STK_PTRP);
_jit_backtrace_pop();
}
VMBREAK;
VMCASE(JIT_OP_CALL_VTABLE_PTR):
{
call_func = (jit_function_t)(VM_R1_PTR);
if(!call_func)
{
VM_BUILTIN(JIT_RESULT_NULL_FUNCTION);
}
VM_MODIFY_PC(1);
entry = call_func->entry_point;
_jit_backtrace_push(&call_trace, pc);
if(!entry)
{
entry = (*call_func->context->on_demand_driver)(call_func);
}
_jit_run_function((jit_function_interp_t)entry,
stacktop,
return_area);
_jit_backtrace_pop();
}
VMBREAK;
VMCASE(JIT_OP_CALL_VTABLE_PTR_TAIL):
{
call_func = (jit_function_t)(VM_R1_PTR);
if(!call_func)
{
VM_BUILTIN(JIT_RESULT_NULL_FUNCTION);
}
entry = call_func->entry_point;
if(!entry)
{
entry = (*call_func->context->on_demand_driver)(call_func);
}
VM_PERFORM_TAIL((jit_function_interp_t)entry);
}
VMCASE(JIT_OP_CALL_EXTERNAL):
VMCASE(JIT_OP_CALL_EXTERNAL_TAIL):
{
tempptr = (void *)VM_NINT_ARG;
tempptr2 = (void *)VM_NINT_ARG2;
temparg = VM_NINT_ARG3;
VM_MODIFY_PC_AND_STACK(4, 1);
_jit_backtrace_push(&call_trace, pc);
apply_from_interpreter((jit_type_t)tempptr,
(void *)tempptr2,
stacktop,
(unsigned int)temparg,
VM_STK_PTRP);
_jit_backtrace_pop();
}
VMBREAK;
VMCASE(JIT_OP_RETURN):
{
if(jbuf)
{
_jit_unwind_pop_setjmp();
}
return;
}
VMCASE(JIT_OP_RETURN_INT):
{
return_area->int_value = VM_R1_INT;
if(jbuf)
{
_jit_unwind_pop_setjmp();
}
return;
}
VMCASE(JIT_OP_RETURN_LONG):
{
return_area->long_value = VM_R1_LONG;
if(jbuf)
{
_jit_unwind_pop_setjmp();
}
return;
}
VMCASE(JIT_OP_RETURN_FLOAT32):
{
return_area->float32_value = VM_R1_FLOAT32;
if(jbuf)
{
_jit_unwind_pop_setjmp();
}
return;
}
VMCASE(JIT_OP_RETURN_FLOAT64):
{
return_area->float64_value = VM_R1_FLOAT64;
if(jbuf)
{
_jit_unwind_pop_setjmp();
}
return;
}
VMCASE(JIT_OP_RETURN_NFLOAT):
{
return_area->nfloat_value = VM_R1_NFLOAT;
if(jbuf)
{
_jit_unwind_pop_setjmp();
}
return;
}
VMCASE(JIT_OP_RETURN_SMALL_STRUCT):
{
#if JIT_APPLY_MAX_STRUCT_IN_REG != 0
jit_memcpy(return_area->struct_value,
VM_R1_PTR,
(unsigned int)VM_NINT_ARG);
#endif
if(jbuf)
{
_jit_unwind_pop_setjmp();
}
return;
}
VMCASE(JIT_OP_SETUP_FOR_NESTED):
{
stacktop[-1].ptr_value = args;
stacktop[-2].ptr_value = frame;
VM_MODIFY_PC_AND_STACK(1, -2);
}
VMBREAK;
VMCASE(JIT_OP_SETUP_FOR_SIBLING):
{
temparg = VM_NINT_ARG;
tempptr = &(args[0]);
while(temparg > 0)
{
tempptr = (((jit_item *)tempptr)[1]).ptr_value;
--temparg;
}
stacktop[-1].ptr_value = (((jit_item *)tempptr)[1]).ptr_value;
stacktop[-2].ptr_value = (((jit_item *)tempptr)[0]).ptr_value;
VM_MODIFY_PC_AND_STACK(1, -2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_IMPORT_LOCAL):
{
temparg = VM_NINT_ARG2;
tempptr = args[0].ptr_value;
tempptr2 = args[1].ptr_value;
while(temparg > 1)
{
tempptr = ((jit_item *)tempptr2)[0].ptr_value;
tempptr2 = ((jit_item *)tempptr2)[1].ptr_value;
--temparg;
}
VM_R0_PTR = ((jit_item *)tempptr) + VM_NINT_ARG;
VM_MODIFY_PC(3);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_IMPORT_ARG):
{
temparg = VM_NINT_ARG2;
tempptr = args[1].ptr_value;
while(temparg > 1)
{
tempptr = ((jit_item *)tempptr)[1].ptr_value;
--temparg;
}
VM_R0_PTR = ((jit_item *)tempptr) + VM_NINT_ARG;
VM_MODIFY_PC(3);
}
VMBREAK;
VMCASE(JIT_OP_PUSH_INT):
{
VM_STK_INTP = VM_R1_INT;
VM_MODIFY_PC_AND_STACK(1, -1);
}
VMBREAK;
VMCASE(JIT_OP_PUSH_LONG):
{
VM_STK_LONGP = VM_R1_LONG;
VM_MODIFY_PC_AND_STACK(1, -1);
}
VMBREAK;
VMCASE(JIT_OP_PUSH_FLOAT32):
{
VM_STK_FLOAT32P = VM_R1_FLOAT32;
VM_MODIFY_PC_AND_STACK(1, -1);
}
VMBREAK;
VMCASE(JIT_OP_PUSH_FLOAT64):
{
VM_STK_FLOAT64P = VM_R1_FLOAT64;
VM_MODIFY_PC_AND_STACK(1, -1);
}
VMBREAK;
VMCASE(JIT_OP_PUSH_NFLOAT):
{
VM_STK_NFLOATP = VM_R1_NFLOAT;
VM_MODIFY_PC_AND_STACK(1, -1);
}
VMBREAK;
VMCASE(JIT_OP_PUSH_STRUCT):
{
temparg = VM_NINT_ARG;
stacktop -= JIT_NUM_ITEMS_IN_STRUCT(temparg);
jit_memcpy(stacktop, VM_R1_PTR, (unsigned int)temparg);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_FLUSH_SMALL_STRUCT):
{
#if JIT_APPLY_MAX_STRUCT_IN_REG != 0
jit_memcpy(VM_R0_PTR, return_area->struct_value, VM_NINT_ARG);
#endif
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_THROW):
{
exception_object = VM_R1_PTR;
exception_pc = pc;
handle_exception:
tempptr = jit_function_from_pc(func->func->context, pc, &handler);
if(tempptr == func->func && handler != 0)
{
pc = (void **)handler;
stacktop = frame;
VM_R0_PTR = exception_object;
}
else
{
if(jbuf)
{
_jit_unwind_pop_setjmp();
}
jit_exception_throw(exception_object);
}
}
VMBREAK;
VMCASE(JIT_OP_RETHROW):
{
if(jbuf)
{
_jit_unwind_pop_setjmp();
}
jit_exception_throw(VM_R1_PTR);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_PC):
{
VM_R0_PTR = (void *)pc;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_EXCEPTION_PC):
{
VM_R0_PTR = (void *)exception_pc;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LEAVE_FINALLY):
{
pc = (void **)VM_STK_PTR0;
VM_MODIFY_STACK(1);
}
VMBREAK;
VMCASE(JIT_OP_LEAVE_FILTER):
{
pc = (void **)(stacktop[0].ptr_value);
VM_MODIFY_STACK(1);
}
VMBREAK;
VMCASE(JIT_OP_CALL_FILTER):
{
stacktop[-1].ptr_value = (void *)(pc + 2);
VM_MODIFY_STACK(-1);
pc = VM_BR_TARGET;
}
VMBREAK;
VMCASE(JIT_OP_CALL_FINALLY):
{
VM_STK_PTRP = (void *)(pc + 2);
VM_MODIFY_STACK(-1);
pc = VM_BR_TARGET;
}
VMBREAK;
VMCASE(JIT_OP_ADDRESS_OF_LABEL):
{
VM_R0_PTR = VM_BR_TARGET;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_COPY_STRUCT):
{
jit_memcpy(VM_R0_PTR, VM_R1_PTR, VM_NINT_ARG);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_RELATIVE_SBYTE):
{
VM_R0_INT = *VM_REL(jit_sbyte, VM_R1_PTR);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_RELATIVE_UBYTE):
{
VM_R0_INT = *VM_REL(jit_ubyte, VM_R1_PTR);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_RELATIVE_SHORT):
{
VM_R0_INT = *VM_REL(jit_short, VM_R1_PTR);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_RELATIVE_USHORT):
{
VM_R0_INT = *VM_REL(jit_ushort, VM_R1_PTR);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_RELATIVE_INT):
{
VM_R0_INT = *VM_REL(jit_int, VM_R1_PTR);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_RELATIVE_LONG):
{
VM_R0_LONG = *VM_REL(jit_long, VM_R1_PTR);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_RELATIVE_FLOAT32):
{
VM_R0_FLOAT32 = *VM_REL(jit_float32, VM_R1_PTR);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_RELATIVE_FLOAT64):
{
VM_R0_FLOAT64 = *VM_REL(jit_float64, VM_R1_PTR);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_RELATIVE_NFLOAT):
{
VM_R0_NFLOAT = *VM_REL(jit_nfloat, VM_R1_PTR);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_RELATIVE_STRUCT):
{
jit_memcpy(VM_R0_PTR, VM_REL(void, VM_R1_PTR), VM_NINT_ARG2);
VM_MODIFY_PC(3);
}
VMBREAK;
VMCASE(JIT_OP_STORE_RELATIVE_BYTE):
{
*VM_REL(jit_sbyte, VM_R0_PTR) = (jit_sbyte)VM_R1_INT;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_STORE_RELATIVE_SHORT):
{
*VM_REL(jit_short, VM_R0_PTR) = (jit_short)VM_R1_INT;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_STORE_RELATIVE_INT):
{
*VM_REL(jit_int, VM_R0_PTR) = VM_R1_INT;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_STORE_RELATIVE_LONG):
{
*VM_REL(jit_long, VM_R0_PTR) = VM_R1_LONG;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_STORE_RELATIVE_FLOAT32):
{
*VM_REL(jit_float32, VM_R0_PTR) = VM_R1_FLOAT32;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_STORE_RELATIVE_FLOAT64):
{
*VM_REL(jit_float64, VM_R0_PTR) = VM_R1_FLOAT64;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_STORE_RELATIVE_NFLOAT):
{
*VM_REL(jit_nfloat, VM_R0_PTR) = VM_R1_NFLOAT;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_STORE_RELATIVE_STRUCT):
{
jit_memcpy(VM_REL(void, VM_R0_PTR), VM_R1_PTR, VM_NINT_ARG2);
VM_MODIFY_PC(3);
}
VMBREAK;
VMCASE(JIT_OP_ADD_RELATIVE):
{
VM_R0_PTR = VM_REL(void, VM_R1_PTR);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_ELEMENT_SBYTE):
{
VM_R0_INT = VM_LOAD_ELEM(jit_sbyte);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_ELEMENT_UBYTE):
{
VM_R0_INT = VM_LOAD_ELEM(jit_ubyte);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_ELEMENT_SHORT):
{
VM_R0_INT = VM_LOAD_ELEM(jit_short);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_ELEMENT_USHORT):
{
VM_R0_INT = VM_LOAD_ELEM(jit_ushort);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_ELEMENT_INT):
{
VM_R0_INT = VM_LOAD_ELEM(jit_int);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_ELEMENT_LONG):
{
VM_R0_LONG = VM_LOAD_ELEM(jit_long);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_ELEMENT_FLOAT32):
{
VM_R0_FLOAT32 = VM_LOAD_ELEM(jit_float32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_ELEMENT_FLOAT64):
{
VM_R0_FLOAT64 = VM_LOAD_ELEM(jit_float64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_LOAD_ELEMENT_NFLOAT):
{
VM_R0_NFLOAT = VM_LOAD_ELEM(jit_nfloat);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_STORE_ELEMENT_BYTE):
{
VM_STORE_ELEM(jit_sbyte, VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_STORE_ELEMENT_SHORT):
{
VM_STORE_ELEM(jit_short, VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_STORE_ELEMENT_INT):
{
VM_STORE_ELEM(jit_int, VM_R2_INT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_STORE_ELEMENT_LONG):
{
VM_STORE_ELEM(jit_long, VM_R2_LONG);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_STORE_ELEMENT_FLOAT32):
{
VM_STORE_ELEM(jit_float32, VM_R2_FLOAT32);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_STORE_ELEMENT_FLOAT64):
{
VM_STORE_ELEM(jit_float64, VM_R2_FLOAT64);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_STORE_ELEMENT_NFLOAT):
{
VM_STORE_ELEM(jit_nfloat, VM_R2_NFLOAT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_MEMCPY):
{
jit_memcpy(VM_R0_PTR, VM_R1_PTR, VM_R2_NUINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_MEMMOVE):
{
jit_memmove(VM_R0_PTR, VM_R1_PTR, VM_R2_NUINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_MEMSET):
{
jit_memset(VM_R0_PTR, (int)VM_R1_INT, VM_R2_NUINT);
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_ALLOCA):
{
VM_R0_PTR = (void *)alloca(VM_R1_NUINT);
VM_MODIFY_PC(1);
if(jbuf)
{
if(setjmp(jbuf->buf))
{
exception_object = jit_exception_get_last_and_clear();
exception_pc = pc - 1;
goto handle_exception;
}
}
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_0_SBYTE):
{
VM_R0_INT = *VM_ARG(jit_sbyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_0_UBYTE):
{
VM_R0_INT = *VM_ARG(jit_ubyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_0_SHORT):
{
VM_R0_INT = *VM_ARG(jit_short);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_0_USHORT):
{
VM_R0_INT = *VM_ARG(jit_ushort);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_0_INT):
{
VM_R0_INT = *VM_ARG(jit_int);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_0_LONG):
{
VM_R0_LONG = *VM_ARG(jit_long);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_0_FLOAT32):
{
VM_R0_FLOAT32 = *VM_ARG(jit_float32);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_0_FLOAT64):
{
VM_R0_FLOAT64 = *VM_ARG(jit_float64);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_0_NFLOAT):
{
VM_R0_NFLOAT = *VM_ARG(jit_nfloat);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDAA_0):
{
VM_R0_PTR = VM_ARG(void);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_1_SBYTE):
{
VM_R1_INT = *VM_ARG(jit_sbyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_1_UBYTE):
{
VM_R1_INT = *VM_ARG(jit_ubyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_1_SHORT):
{
VM_R1_INT = *VM_ARG(jit_short);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_1_USHORT):
{
VM_R1_INT = *VM_ARG(jit_ushort);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_1_INT):
{
VM_R1_INT = *VM_ARG(jit_int);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_1_LONG):
{
VM_R1_LONG = *VM_ARG(jit_long);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_1_FLOAT32):
{
VM_R1_FLOAT32 = *VM_ARG(jit_float32);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_1_FLOAT64):
{
VM_R1_FLOAT64 = *VM_ARG(jit_float64);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_1_NFLOAT):
{
VM_R1_NFLOAT = *VM_ARG(jit_nfloat);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDAA_1):
{
VM_R1_PTR = VM_ARG(void);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_2_SBYTE):
{
VM_R2_INT = *VM_ARG(jit_sbyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_2_UBYTE):
{
VM_R2_INT = *VM_ARG(jit_ubyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_2_SHORT):
{
VM_R2_INT = *VM_ARG(jit_short);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_2_USHORT):
{
VM_R2_INT = *VM_ARG(jit_ushort);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_2_INT):
{
VM_R2_INT = *VM_ARG(jit_int);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_2_LONG):
{
VM_R2_LONG = *VM_ARG(jit_long);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_2_FLOAT32):
{
VM_R2_FLOAT32 = *VM_ARG(jit_float32);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_2_FLOAT64):
{
VM_R2_FLOAT64 = *VM_ARG(jit_float64);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDA_2_NFLOAT):
{
VM_R2_NFLOAT = *VM_ARG(jit_nfloat);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDAA_2):
{
VM_R2_PTR = VM_ARG(void);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STA_0_BYTE):
{
*VM_ARG(jit_sbyte) = (jit_sbyte)VM_R0_INT;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STA_0_SHORT):
{
*VM_ARG(jit_short) = (jit_short)VM_R0_INT;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STA_0_INT):
{
*VM_ARG(jit_int) = (jit_int)VM_R0_INT;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STA_0_LONG):
{
*VM_ARG(jit_long) = (jit_long)VM_R0_LONG;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STA_0_FLOAT32):
{
*VM_ARG(jit_float32) = VM_R0_FLOAT32;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STA_0_FLOAT64):
{
*VM_ARG(jit_float64) = VM_R0_FLOAT64;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STA_0_NFLOAT):
{
*VM_ARG(jit_nfloat) = VM_R0_NFLOAT;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_0_SBYTE):
{
VM_R0_INT = *VM_LOC(jit_sbyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_0_UBYTE):
{
VM_R0_INT = *VM_LOC(jit_ubyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_0_SHORT):
{
VM_R0_INT = *VM_LOC(jit_short);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_0_USHORT):
{
VM_R0_INT = *VM_LOC(jit_ushort);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_0_INT):
{
VM_R0_INT = *VM_LOC(jit_int);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_0_LONG):
{
VM_R0_LONG = *VM_LOC(jit_long);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_0_FLOAT32):
{
VM_R0_FLOAT32 = *VM_LOC(jit_float32);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_0_FLOAT64):
{
VM_R0_FLOAT64 = *VM_LOC(jit_float64);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_0_NFLOAT):
{
VM_R0_NFLOAT = *VM_LOC(jit_nfloat);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDLA_0):
{
VM_R0_PTR = VM_LOC(void);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_1_SBYTE):
{
VM_R1_INT = *VM_LOC(jit_sbyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_1_UBYTE):
{
VM_R1_INT = *VM_LOC(jit_ubyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_1_SHORT):
{
VM_R1_INT = *VM_LOC(jit_short);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_1_USHORT):
{
VM_R1_INT = *VM_LOC(jit_ushort);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_1_INT):
{
VM_R1_INT = *VM_LOC(jit_int);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_1_LONG):
{
VM_R1_LONG = *VM_LOC(jit_long);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_1_FLOAT32):
{
VM_R1_FLOAT32 = *VM_LOC(jit_float32);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_1_FLOAT64):
{
VM_R1_FLOAT64 = *VM_LOC(jit_float64);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_1_NFLOAT):
{
VM_R1_NFLOAT = *VM_LOC(jit_nfloat);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDLA_1):
{
VM_R1_PTR = VM_LOC(void);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_2_SBYTE):
{
VM_R2_INT = *VM_LOC(jit_sbyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_2_UBYTE):
{
VM_R2_INT = *VM_LOC(jit_ubyte);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_2_SHORT):
{
VM_R2_INT = *VM_LOC(jit_short);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_2_USHORT):
{
VM_R2_INT = *VM_LOC(jit_ushort);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_2_INT):
{
VM_R2_INT = *VM_LOC(jit_int);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_2_LONG):
{
VM_R2_LONG = *VM_LOC(jit_long);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_2_FLOAT32):
{
VM_R2_FLOAT32 = *VM_LOC(jit_float32);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_2_FLOAT64):
{
VM_R2_FLOAT64 = *VM_LOC(jit_float64);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDL_2_NFLOAT):
{
VM_R2_NFLOAT = *VM_LOC(jit_nfloat);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDLA_2):
{
VM_R2_PTR = VM_LOC(void);
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STL_0_BYTE):
{
*VM_LOC(jit_sbyte) = (jit_sbyte)VM_R0_INT;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STL_0_SHORT):
{
*VM_LOC(jit_short) = (jit_short)VM_R0_INT;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STL_0_INT):
{
*VM_LOC(jit_int) = (jit_int)VM_R0_INT;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STL_0_LONG):
{
*VM_LOC(jit_long) = (jit_long)VM_R0_LONG;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STL_0_FLOAT32):
{
*VM_LOC(jit_float32) = VM_R0_FLOAT32;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STL_0_FLOAT64):
{
*VM_LOC(jit_float64) = VM_R0_FLOAT64;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_STL_0_NFLOAT):
{
*VM_LOC(jit_nfloat) = VM_R0_NFLOAT;
VM_MODIFY_PC(2);
}
VMBREAK;
#define JIT_WORDS_PER_TYPE(type) \
((sizeof(type) + sizeof(void *) - 1) / sizeof(void *))
VMCASE(JIT_INTERP_OP_LDC_0_INT):
{
VM_R0_INT = (jit_int)VM_NINT_ARG;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_0_LONG):
{
#ifdef JIT_NATIVE_INT64
VM_R0_LONG = (jit_long)VM_NINT_ARG;
VM_MODIFY_PC(2);
#else
jit_memcpy(&r0.long_value, pc + 1, sizeof(jit_long));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_long));
#endif
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_0_FLOAT32):
{
jit_memcpy(&r0.float32_value, pc + 1, sizeof(jit_float32));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_float32));
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_0_FLOAT64):
{
jit_memcpy(&r0.float64_value, pc + 1, sizeof(jit_float64));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_float64));
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_0_NFLOAT):
{
jit_memcpy(&r0.nfloat_value, pc + 1, sizeof(jit_nfloat));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_nfloat));
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_1_INT):
{
VM_R1_INT = (jit_int)VM_NINT_ARG;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_1_LONG):
{
#ifdef JIT_NATIVE_INT64
VM_R1_LONG = (jit_long)VM_NINT_ARG;
VM_MODIFY_PC(2);
#else
jit_memcpy(&r1.long_value, pc + 1, sizeof(jit_long));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_long));
#endif
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_1_FLOAT32):
{
jit_memcpy(&r1.float32_value, pc + 1, sizeof(jit_float32));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_float32));
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_1_FLOAT64):
{
jit_memcpy(&r1.float64_value, pc + 1, sizeof(jit_float64));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_float64));
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_1_NFLOAT):
{
jit_memcpy(&r1.nfloat_value, pc + 1, sizeof(jit_nfloat));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_nfloat));
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_2_INT):
{
VM_R2_INT = (jit_int)VM_NINT_ARG;
VM_MODIFY_PC(2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_2_LONG):
{
#ifdef JIT_NATIVE_INT64
VM_R2_LONG = (jit_long)VM_NINT_ARG;
VM_MODIFY_PC(2);
#else
jit_memcpy(&r2.long_value, pc + 1, sizeof(jit_long));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_long));
#endif
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_2_FLOAT32):
{
jit_memcpy(&r2.float32_value, pc + 1, sizeof(jit_float32));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_float32));
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_2_FLOAT64):
{
jit_memcpy(&r2.float64_value, pc + 1, sizeof(jit_float64));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_float64));
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDC_2_NFLOAT):
{
jit_memcpy(&r2.nfloat_value, pc + 1, sizeof(jit_nfloat));
VM_MODIFY_PC(1 + JIT_WORDS_PER_TYPE(jit_nfloat));
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDR_0_INT):
{
VM_R0_INT = return_area->int_value;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDR_0_LONG):
{
VM_R0_LONG = return_area->long_value;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDR_0_FLOAT32):
{
VM_R0_FLOAT32 = return_area->float32_value;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDR_0_FLOAT64):
{
VM_R0_FLOAT64 = return_area->float64_value;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_LDR_0_NFLOAT):
{
VM_R0_NFLOAT = return_area->nfloat_value;
VM_MODIFY_PC(1);
}
VMBREAK;
VMCASE(JIT_OP_POP_STACK):
{
temparg = VM_NINT_ARG;
VM_MODIFY_PC_AND_STACK(2, temparg);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_POP):
{
VM_MODIFY_PC_AND_STACK(1, 1);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_POP_2):
{
VM_MODIFY_PC_AND_STACK(1, 2);
}
VMBREAK;
VMCASE(JIT_INTERP_OP_POP_3):
{
VM_MODIFY_PC_AND_STACK(1, 3);
}
VMBREAK;
VMCASE(JIT_OP_PUSH_RETURN_AREA_PTR):
{
VM_STK_PTRP = return_area;
VM_MODIFY_PC_AND_STACK(1, -1);
}
VMBREAK;
VMCASE(JIT_OP_MARK_BREAKPOINT):
{
tempptr = (void *)VM_NINT_ARG;
tempptr2 = (void *)VM_NINT_ARG2;
VM_MODIFY_PC(3);
_jit_backtrace_push(&call_trace, pc);
_jit_debugger_hook
(func->func, (jit_nint)tempptr, (jit_nint)tempptr2);
_jit_backtrace_pop();
}
VMBREAK;
VMCASE(JIT_OP_IMPORT):
VMCASE(JIT_OP_COPY_LOAD_SBYTE):
VMCASE(JIT_OP_COPY_LOAD_UBYTE):
VMCASE(JIT_OP_COPY_LOAD_SHORT):
VMCASE(JIT_OP_COPY_LOAD_USHORT):
VMCASE(JIT_OP_COPY_INT):
VMCASE(JIT_OP_COPY_LONG):
VMCASE(JIT_OP_COPY_FLOAT32):
VMCASE(JIT_OP_COPY_FLOAT64):
VMCASE(JIT_OP_COPY_NFLOAT):
VMCASE(JIT_OP_COPY_STORE_BYTE):
VMCASE(JIT_OP_COPY_STORE_SHORT):
VMCASE(JIT_OP_ADDRESS_OF):
VMCASE(JIT_OP_INCOMING_REG):
VMCASE(JIT_OP_INCOMING_FRAME_POSN):
VMCASE(JIT_OP_OUTGOING_REG):
VMCASE(JIT_OP_OUTGOING_FRAME_POSN):
VMCASE(JIT_OP_RETURN_REG):
VMCASE(JIT_OP_SET_PARAM_INT):
VMCASE(JIT_OP_SET_PARAM_LONG):
VMCASE(JIT_OP_SET_PARAM_FLOAT32):
VMCASE(JIT_OP_SET_PARAM_FLOAT64):
VMCASE(JIT_OP_SET_PARAM_NFLOAT):
VMCASE(JIT_OP_SET_PARAM_STRUCT):
VMCASE(JIT_OP_ENTER_FINALLY):
VMCASE(JIT_OP_ENTER_FILTER):
VMCASE(JIT_OP_CALL_FILTER_RETURN):
VMCASE(JIT_OP_MARK_OFFSET):
{
VM_MODIFY_PC_AND_STACK(1, 0);
}
VMBREAK;
}
VMSWITCHEND
handle_builtin: ;
jit_exception_builtin(builtin_exception);
}
int jit_function_apply
(jit_function_t func, void **args, void *return_area)
{
if(func)
{
return jit_function_apply_vararg
(func, func->signature, args, return_area);
}
else
{
return jit_function_apply_vararg(func, 0, args, return_area);
}
}
unsigned int _jit_interp_calculate_arg_size
(jit_function_t func, jit_type_t signature);
int jit_function_apply_vararg
(jit_function_t func, jit_type_t signature, void **args, void *return_area)
{
struct jit_backtrace call_trace;
jit_function_interp_t entry;
jit_item interp_return_area;
jit_item *arg_buffer;
jit_item *temp_arg;
jit_type_t type;
unsigned int num_params;
unsigned int param;
jit_jmp_buf jbuf;
_jit_unwind_push_setjmp(&jbuf);
if(setjmp(jbuf.buf))
{
_jit_unwind_pop_setjmp();
return 0;
}
_jit_backtrace_push(&call_trace, 0);
jit_exception_clear_last();
if(!func)
{
jit_exception_builtin(JIT_RESULT_NULL_FUNCTION);
}
if(func->is_compiled)
{
entry = (jit_function_interp_t)(func->entry_point);
}
else
{
entry = (jit_function_interp_t)(*func->context->on_demand_driver)(func);
}
if(!signature)
{
signature = func->signature;
arg_buffer = (jit_item *)alloca(entry->args_size);
}
else if(signature == func->signature)
{
arg_buffer = (jit_item *)alloca(entry->args_size);
}
else
{
arg_buffer = (jit_item *)alloca
(_jit_interp_calculate_arg_size(func, signature));
}
temp_arg = arg_buffer;
if(func->nested_parent)
{
jit_exception_builtin(JIT_RESULT_CALLED_NESTED);
}
type = jit_type_get_return(signature);
if(jit_type_return_via_pointer(type))
{
if(!return_area)
{
return_area = alloca(jit_type_get_size(type));
}
temp_arg->ptr_value = return_area;
++temp_arg;
}
num_params = jit_type_num_params(signature);
for(param = 0; param < num_params; ++param)
{
type = jit_type_normalize
(jit_type_get_param(signature, param));
if(!(args[param]))
{
jit_exception_builtin(JIT_RESULT_NULL_REFERENCE);
}
switch(type->kind)
{
case JIT_TYPE_SBYTE:
{
temp_arg->int_value = *((jit_sbyte *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_UBYTE:
{
temp_arg->int_value = *((jit_ubyte *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_SHORT:
{
temp_arg->int_value = *((jit_short *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_USHORT:
{
temp_arg->int_value = *((jit_ushort *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_INT:
case JIT_TYPE_UINT:
{
temp_arg->int_value = *((jit_int *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_LONG:
case JIT_TYPE_ULONG:
{
temp_arg->long_value = *((jit_long *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_FLOAT32:
{
temp_arg->float32_value =
*((jit_float32 *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_FLOAT64:
{
temp_arg->float64_value =
*((jit_float64 *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_NFLOAT:
{
temp_arg->nfloat_value =
*((jit_nfloat *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_STRUCT:
case JIT_TYPE_UNION:
{
jit_memcpy(temp_arg, args[param],
jit_type_get_size(type));
temp_arg += JIT_NUM_ITEMS_IN_STRUCT
(jit_type_get_size(type));
}
break;
}
}
_jit_run_function(entry, arg_buffer, &interp_return_area);
if(return_area)
{
type = jit_type_normalize(jit_type_get_return(signature));
if(type && type != jit_type_void)
{
switch(type->kind)
{
case JIT_TYPE_SBYTE:
case JIT_TYPE_UBYTE:
{
*((jit_sbyte *)return_area) =
(jit_sbyte)(interp_return_area.int_value);
}
break;
case JIT_TYPE_SHORT:
case JIT_TYPE_USHORT:
{
*((jit_short *)return_area) =
(jit_short)(interp_return_area.int_value);
}
break;
case JIT_TYPE_INT:
case JIT_TYPE_UINT:
{
*((jit_int *)return_area) =
interp_return_area.int_value;
}
break;
case JIT_TYPE_LONG:
case JIT_TYPE_ULONG:
{
*((jit_long *)return_area) =
interp_return_area.long_value;
}
break;
case JIT_TYPE_FLOAT32:
{
*((jit_float32 *)return_area) =
interp_return_area.float32_value;
}
break;
case JIT_TYPE_FLOAT64:
{
*((jit_float64 *)return_area) =
interp_return_area.float64_value;
}
break;
case JIT_TYPE_NFLOAT:
{
*((jit_nfloat *)return_area) =
interp_return_area.nfloat_value;
}
break;
case JIT_TYPE_STRUCT:
case JIT_TYPE_UNION:
{
if(!jit_type_return_via_pointer(type))
{
jit_memcpy(return_area, &interp_return_area,
jit_type_get_size(type));
}
}
break;
}
}
}
_jit_unwind_pop_setjmp();
return 1;
}
#endif