mirror of https://github.com/ademakov/libjit
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
250 lines
9.4 KiB
250 lines
9.4 KiB
/*
|
|
* jit-interp.h - Bytecode interpreter for platforms without native support.
|
|
*
|
|
* Copyright (C) 2004 Southern Storm Software, Pty Ltd.
|
|
*
|
|
* This file is part of the libjit library.
|
|
*
|
|
* The libjit library 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 2.1 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* The libjit library 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 the libjit library. If not, see
|
|
* <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef _JIT_INTERP_H
|
|
#define _JIT_INTERP_H
|
|
|
|
#include "jit-internal.h"
|
|
#include "jit-apply-rules.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
* Structure of a stack item.
|
|
*/
|
|
typedef union
|
|
{
|
|
jit_int int_value;
|
|
jit_uint uint_value;
|
|
jit_long long_value;
|
|
jit_ulong ulong_value;
|
|
jit_float32 float32_value;
|
|
jit_float64 float64_value;
|
|
jit_nfloat nfloat_value;
|
|
void *ptr_value;
|
|
#if JIT_APPLY_MAX_STRUCT_IN_REG != 0
|
|
char struct_value[JIT_APPLY_MAX_STRUCT_IN_REG];
|
|
#endif
|
|
|
|
} jit_item;
|
|
|
|
/*
|
|
* Number of items that make up a struct or union value on the stack.
|
|
*/
|
|
#define JIT_NUM_ITEMS_IN_STRUCT(size) \
|
|
(((size) + (sizeof(jit_item) - 1)) / sizeof(jit_item))
|
|
|
|
/*
|
|
* Information that is prefixed to a function that describes
|
|
* its interpretation context. The code starts just after this.
|
|
*/
|
|
typedef struct jit_function_interp *jit_function_interp_t;
|
|
struct jit_function_interp
|
|
{
|
|
/* The function that this structure is associated with */
|
|
jit_function_t func;
|
|
|
|
/* Size of the argument area to allocate, in bytes */
|
|
unsigned int args_size;
|
|
|
|
/* Size of the local stack frame to allocate, in bytes */
|
|
unsigned int frame_size;
|
|
|
|
/* Size of the working stack area of the frame, in items */
|
|
unsigned int working_area;
|
|
};
|
|
|
|
/*
|
|
* Get the size of the "jit_function_interp" structure, rounded
|
|
* up to a multiple of "void *".
|
|
*/
|
|
#define jit_function_interp_size \
|
|
((sizeof(struct jit_function_interp) + sizeof(void *) - 1) & \
|
|
~(sizeof(void *) - 1))
|
|
|
|
/*
|
|
* Get the entry point for a function, from its "jit_function_interp_t" block.
|
|
*/
|
|
#define jit_function_interp_entry_pc(info) \
|
|
((void **)(((unsigned char *)(info)) + jit_function_interp_size))
|
|
|
|
/*
|
|
* Argument variable access opcodes.
|
|
*/
|
|
#define JIT_OP_LDA_0_SBYTE (JIT_OP_NUM_OPCODES + 0x0000)
|
|
#define JIT_OP_LDA_0_UBYTE (JIT_OP_NUM_OPCODES + 0x0001)
|
|
#define JIT_OP_LDA_0_SHORT (JIT_OP_NUM_OPCODES + 0x0002)
|
|
#define JIT_OP_LDA_0_USHORT (JIT_OP_NUM_OPCODES + 0x0003)
|
|
#define JIT_OP_LDA_0_INT (JIT_OP_NUM_OPCODES + 0x0004)
|
|
#define JIT_OP_LDA_0_LONG (JIT_OP_NUM_OPCODES + 0x0005)
|
|
#define JIT_OP_LDA_0_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0006)
|
|
#define JIT_OP_LDA_0_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0007)
|
|
#define JIT_OP_LDA_0_NFLOAT (JIT_OP_NUM_OPCODES + 0x0008)
|
|
#define JIT_OP_LDAA_0 (JIT_OP_NUM_OPCODES + 0x0009)
|
|
#define JIT_OP_LDA_1_SBYTE (JIT_OP_NUM_OPCODES + 0x000a)
|
|
#define JIT_OP_LDA_1_UBYTE (JIT_OP_NUM_OPCODES + 0x000b)
|
|
#define JIT_OP_LDA_1_SHORT (JIT_OP_NUM_OPCODES + 0x000c)
|
|
#define JIT_OP_LDA_1_USHORT (JIT_OP_NUM_OPCODES + 0x000d)
|
|
#define JIT_OP_LDA_1_INT (JIT_OP_NUM_OPCODES + 0x000e)
|
|
#define JIT_OP_LDA_1_LONG (JIT_OP_NUM_OPCODES + 0x000f)
|
|
#define JIT_OP_LDA_1_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0010)
|
|
#define JIT_OP_LDA_1_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0011)
|
|
#define JIT_OP_LDA_1_NFLOAT (JIT_OP_NUM_OPCODES + 0x0012)
|
|
#define JIT_OP_LDAA_1 (JIT_OP_NUM_OPCODES + 0x0013)
|
|
#define JIT_OP_LDA_2_SBYTE (JIT_OP_NUM_OPCODES + 0x0014)
|
|
#define JIT_OP_LDA_2_UBYTE (JIT_OP_NUM_OPCODES + 0x0015)
|
|
#define JIT_OP_LDA_2_SHORT (JIT_OP_NUM_OPCODES + 0x0016)
|
|
#define JIT_OP_LDA_2_USHORT (JIT_OP_NUM_OPCODES + 0x0017)
|
|
#define JIT_OP_LDA_2_INT (JIT_OP_NUM_OPCODES + 0x0018)
|
|
#define JIT_OP_LDA_2_LONG (JIT_OP_NUM_OPCODES + 0x0019)
|
|
#define JIT_OP_LDA_2_FLOAT32 (JIT_OP_NUM_OPCODES + 0x001a)
|
|
#define JIT_OP_LDA_2_FLOAT64 (JIT_OP_NUM_OPCODES + 0x001b)
|
|
#define JIT_OP_LDA_2_NFLOAT (JIT_OP_NUM_OPCODES + 0x001c)
|
|
#define JIT_OP_LDAA_2 (JIT_OP_NUM_OPCODES + 0x001d)
|
|
#define JIT_OP_STA_0_BYTE (JIT_OP_NUM_OPCODES + 0x001e)
|
|
#define JIT_OP_STA_0_SHORT (JIT_OP_NUM_OPCODES + 0x001f)
|
|
#define JIT_OP_STA_0_INT (JIT_OP_NUM_OPCODES + 0x0020)
|
|
#define JIT_OP_STA_0_LONG (JIT_OP_NUM_OPCODES + 0x0021)
|
|
#define JIT_OP_STA_0_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0022)
|
|
#define JIT_OP_STA_0_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0023)
|
|
#define JIT_OP_STA_0_NFLOAT (JIT_OP_NUM_OPCODES + 0x0024)
|
|
|
|
/*
|
|
* Local variable frame access opcodes.
|
|
*/
|
|
#define JIT_OP_LDL_0_SBYTE (JIT_OP_NUM_OPCODES + 0x0025)
|
|
#define JIT_OP_LDL_0_UBYTE (JIT_OP_NUM_OPCODES + 0x0026)
|
|
#define JIT_OP_LDL_0_SHORT (JIT_OP_NUM_OPCODES + 0x0027)
|
|
#define JIT_OP_LDL_0_USHORT (JIT_OP_NUM_OPCODES + 0x0028)
|
|
#define JIT_OP_LDL_0_INT (JIT_OP_NUM_OPCODES + 0x0029)
|
|
#define JIT_OP_LDL_0_LONG (JIT_OP_NUM_OPCODES + 0x002a)
|
|
#define JIT_OP_LDL_0_FLOAT32 (JIT_OP_NUM_OPCODES + 0x002b)
|
|
#define JIT_OP_LDL_0_FLOAT64 (JIT_OP_NUM_OPCODES + 0x002c)
|
|
#define JIT_OP_LDL_0_NFLOAT (JIT_OP_NUM_OPCODES + 0x002d)
|
|
#define JIT_OP_LDLA_0 (JIT_OP_NUM_OPCODES + 0x002e)
|
|
#define JIT_OP_LDL_1_SBYTE (JIT_OP_NUM_OPCODES + 0x002f)
|
|
#define JIT_OP_LDL_1_UBYTE (JIT_OP_NUM_OPCODES + 0x0030)
|
|
#define JIT_OP_LDL_1_SHORT (JIT_OP_NUM_OPCODES + 0x0031)
|
|
#define JIT_OP_LDL_1_USHORT (JIT_OP_NUM_OPCODES + 0x0032)
|
|
#define JIT_OP_LDL_1_INT (JIT_OP_NUM_OPCODES + 0x0033)
|
|
#define JIT_OP_LDL_1_LONG (JIT_OP_NUM_OPCODES + 0x0034)
|
|
#define JIT_OP_LDL_1_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0035)
|
|
#define JIT_OP_LDL_1_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0036)
|
|
#define JIT_OP_LDL_1_NFLOAT (JIT_OP_NUM_OPCODES + 0x0037)
|
|
#define JIT_OP_LDLA_1 (JIT_OP_NUM_OPCODES + 0x0038)
|
|
#define JIT_OP_LDL_2_SBYTE (JIT_OP_NUM_OPCODES + 0x0039)
|
|
#define JIT_OP_LDL_2_UBYTE (JIT_OP_NUM_OPCODES + 0x003a)
|
|
#define JIT_OP_LDL_2_SHORT (JIT_OP_NUM_OPCODES + 0x003b)
|
|
#define JIT_OP_LDL_2_USHORT (JIT_OP_NUM_OPCODES + 0x003c)
|
|
#define JIT_OP_LDL_2_INT (JIT_OP_NUM_OPCODES + 0x003d)
|
|
#define JIT_OP_LDL_2_LONG (JIT_OP_NUM_OPCODES + 0x003e)
|
|
#define JIT_OP_LDL_2_FLOAT32 (JIT_OP_NUM_OPCODES + 0x003f)
|
|
#define JIT_OP_LDL_2_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0040)
|
|
#define JIT_OP_LDL_2_NFLOAT (JIT_OP_NUM_OPCODES + 0x0041)
|
|
#define JIT_OP_LDLA_2 (JIT_OP_NUM_OPCODES + 0x0042)
|
|
#define JIT_OP_STL_0_BYTE (JIT_OP_NUM_OPCODES + 0x0043)
|
|
#define JIT_OP_STL_0_SHORT (JIT_OP_NUM_OPCODES + 0x0044)
|
|
#define JIT_OP_STL_0_INT (JIT_OP_NUM_OPCODES + 0x0045)
|
|
#define JIT_OP_STL_0_LONG (JIT_OP_NUM_OPCODES + 0x0046)
|
|
#define JIT_OP_STL_0_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0047)
|
|
#define JIT_OP_STL_0_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0048)
|
|
#define JIT_OP_STL_0_NFLOAT (JIT_OP_NUM_OPCODES + 0x0049)
|
|
|
|
/*
|
|
* Load constant values.
|
|
*/
|
|
#define JIT_OP_LDC_0_INT (JIT_OP_NUM_OPCODES + 0x004a)
|
|
#define JIT_OP_LDC_1_INT (JIT_OP_NUM_OPCODES + 0x004b)
|
|
#define JIT_OP_LDC_2_INT (JIT_OP_NUM_OPCODES + 0x004c)
|
|
#define JIT_OP_LDC_0_LONG (JIT_OP_NUM_OPCODES + 0x004d)
|
|
#define JIT_OP_LDC_1_LONG (JIT_OP_NUM_OPCODES + 0x004e)
|
|
#define JIT_OP_LDC_2_LONG (JIT_OP_NUM_OPCODES + 0x004f)
|
|
#define JIT_OP_LDC_0_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0050)
|
|
#define JIT_OP_LDC_1_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0051)
|
|
#define JIT_OP_LDC_2_FLOAT32 (JIT_OP_NUM_OPCODES + 0x0052)
|
|
#define JIT_OP_LDC_0_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0053)
|
|
#define JIT_OP_LDC_1_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0054)
|
|
#define JIT_OP_LDC_2_FLOAT64 (JIT_OP_NUM_OPCODES + 0x0055)
|
|
#define JIT_OP_LDC_0_NFLOAT (JIT_OP_NUM_OPCODES + 0x0056)
|
|
#define JIT_OP_LDC_1_NFLOAT (JIT_OP_NUM_OPCODES + 0x0057)
|
|
#define JIT_OP_LDC_2_NFLOAT (JIT_OP_NUM_OPCODES + 0x0058)
|
|
|
|
/*
|
|
* Load return value.
|
|
*/
|
|
#define JIT_OP_LDR_0_INT (JIT_OP_NUM_OPCODES + 0x0059)
|
|
#define JIT_OP_LDR_0_LONG (JIT_OP_NUM_OPCODES + 0x005a)
|
|
#define JIT_OP_LDR_0_FLOAT32 (JIT_OP_NUM_OPCODES + 0x005b)
|
|
#define JIT_OP_LDR_0_FLOAT64 (JIT_OP_NUM_OPCODES + 0x005c)
|
|
#define JIT_OP_LDR_0_NFLOAT (JIT_OP_NUM_OPCODES + 0x005d)
|
|
|
|
/*
|
|
* Stack management.
|
|
*/
|
|
#define JIT_OP_POP (JIT_OP_NUM_OPCODES + 0x005e)
|
|
#define JIT_OP_POP_2 (JIT_OP_NUM_OPCODES + 0x005f)
|
|
#define JIT_OP_POP_3 (JIT_OP_NUM_OPCODES + 0x0060)
|
|
|
|
/*
|
|
* Nested function call handling.
|
|
*/
|
|
#define JIT_OP_IMPORT_LOCAL (JIT_OP_NUM_OPCODES + 0x0061)
|
|
#define JIT_OP_IMPORT_ARG (JIT_OP_NUM_OPCODES + 0x0062)
|
|
|
|
/*
|
|
* Marker opcode for the end of the interpreter-specific opcodes.
|
|
*/
|
|
#define JIT_OP_END_MARKER (JIT_OP_NUM_OPCODES + 0x0063)
|
|
|
|
/*
|
|
* Number of interpreter-specific opcodes.
|
|
*/
|
|
#define JIT_OP_NUM_INTERP_OPCODES \
|
|
(JIT_OP_END_MARKER + 1 - JIT_OP_NUM_OPCODES)
|
|
|
|
/*
|
|
* Opcode version. Should be increased whenever new opcodes
|
|
* are added to this list or the public list in "jit-opcode.h".
|
|
* This value is written to ELF binaries, to ensure that code
|
|
* for one version of libjit is not inadvertantly used in another.
|
|
*/
|
|
#define JIT_OPCODE_VERSION 0
|
|
|
|
/*
|
|
* Additional opcode definition flags.
|
|
*/
|
|
#define JIT_OPCODE_INTERP_ARGS_MASK 0x7E000000
|
|
#define JIT_OPCODE_NINT_ARG 0x02000000
|
|
#define JIT_OPCODE_NINT_ARG_TWO 0x04000000
|
|
#define JIT_OPCODE_CONST_LONG 0x06000000
|
|
#define JIT_OPCODE_CONST_FLOAT32 0x08000000
|
|
#define JIT_OPCODE_CONST_FLOAT64 0x0A000000
|
|
#define JIT_OPCODE_CONST_NFLOAT 0x0C000000
|
|
#define JIT_OPCODE_CALL_INDIRECT_ARGS 0x0E000000
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
|
|
#endif /* _JIT_INTERP_H */
|
|
|