mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
opcodes + refined int structure
This commit is contained in:
parent
21db33fa97
commit
f18a5f5e31
@ -18,8 +18,6 @@
|
||||
void
|
||||
gen_bytecode ()
|
||||
{
|
||||
__int_data.pos = 0;
|
||||
|
||||
/*
|
||||
while (true) {
|
||||
LEDToggle (LED3);
|
||||
@ -34,12 +32,12 @@ gen_bytecode ()
|
||||
wait(500);
|
||||
}
|
||||
*/
|
||||
save_op_data (getop_loop_inf (1));
|
||||
save_op_data (getop_call_1 (0, 12));
|
||||
save_op_data (getop_call_1 (0, 13));
|
||||
save_op_data (getop_call_1 (0, 14));
|
||||
save_op_data (getop_call_1 (0, 15));
|
||||
save_op_data (getop_jmp (0));
|
||||
save_op_data (0, getop_loop_inf (1));
|
||||
save_op_data (1, getop_call_1 (0, 12));
|
||||
save_op_data (2, getop_call_1 (0, 13));
|
||||
save_op_data (3, getop_call_1 (0, 14));
|
||||
save_op_data (4, getop_call_1 (0, 15));
|
||||
save_op_data (5, getop_jmp (0));
|
||||
|
||||
#ifdef __MCU
|
||||
// It's mandatory to restart app!
|
||||
@ -50,10 +48,9 @@ gen_bytecode ()
|
||||
void
|
||||
init_int ()
|
||||
{
|
||||
#define INIT_OP_FUNC(name) __int_data.func[ name ] = opfunc_##name ;
|
||||
#define INIT_OP_FUNC(name) __opfuncs[ name ] = opfunc_##name ;
|
||||
JERRY_STATIC_ASSERT (sizeof (OPCODE) <= 4);
|
||||
|
||||
__int_data.pos = 0;
|
||||
OP_LIST (INIT_OP_FUNC)
|
||||
}
|
||||
|
||||
@ -62,9 +59,18 @@ run_int ()
|
||||
{
|
||||
init_int ();
|
||||
|
||||
struct __int_data int_data;
|
||||
int_data.pos = 0;
|
||||
|
||||
while (true)
|
||||
{
|
||||
OPCODE *curr = &__program[__int_data.pos];
|
||||
__int_data.func[curr->op_idx](*curr);
|
||||
run_int_from_pos(&int_data);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
run_int_from_pos (struct __int_data *int_data)
|
||||
{
|
||||
OPCODE *curr = &__program[int_data->pos];
|
||||
__opfuncs[curr->op_idx](*curr, int_data);
|
||||
}
|
||||
|
||||
@ -26,14 +26,17 @@
|
||||
|
||||
OPCODE __program[128];
|
||||
|
||||
struct {
|
||||
int pos;
|
||||
opfunc func[LAST_OP];
|
||||
int *root_op_addr;
|
||||
} __int_data;
|
||||
opfunc __opfuncs[LAST_OP];
|
||||
|
||||
void gen_bytecode();
|
||||
void run_int();
|
||||
struct __int_data
|
||||
{
|
||||
int pos;
|
||||
int *root_op_addr;
|
||||
};
|
||||
|
||||
void gen_bytecode ();
|
||||
void run_int ();
|
||||
void run_int_from_pos (struct __int_data *);
|
||||
|
||||
#endif /* INTERPRETER_H */
|
||||
|
||||
|
||||
@ -17,7 +17,12 @@
|
||||
#define OPCODE_STRUCTURES_H
|
||||
|
||||
// Jerry bytecode ver:07/04/2014
|
||||
#define OP_DEF(name, list) struct __op_##name { list ; }
|
||||
#define OP_DEF(name, list) struct __op_##name { list ; } ;
|
||||
|
||||
|
||||
#define OP_CODE_DECL_VOID(name) \
|
||||
struct __op_##name { }; \
|
||||
OPCODE getop_##name ();
|
||||
|
||||
#define OP_CODE_DECL(name, type, ... ) \
|
||||
OP_DEF (name, type##_DECL( __VA_ARGS__ ) ); \
|
||||
@ -321,6 +326,7 @@ OP_CODE_DECL (varg_3_end, T_IDX_IDX_IDX,
|
||||
/** return value; */
|
||||
OP_CODE_DECL (retval, T_IDX,
|
||||
ret_value);
|
||||
OP_CODE_DECL_VOID (ret);
|
||||
|
||||
// LOOPS
|
||||
// Lately, all loops should be translated into different JMPs in an optimizer.
|
||||
@ -363,7 +369,6 @@ OP_CODE_DECL (loop_postcond, T_IDX_IDX,
|
||||
condition,
|
||||
body_root);
|
||||
|
||||
//// TODO
|
||||
///** for vars...in iter, state, ctl */
|
||||
//OP_CODE_DECL (loop_init, T_IDX_IDX_IDX,
|
||||
// start_idx, stop_idx, step_idx);
|
||||
@ -374,6 +379,7 @@ OP_CODE_DECL (loop_postcond, T_IDX_IDX,
|
||||
//OP_CODE_DECL (loop_cond_pre_end, T_IDX,
|
||||
// iterator, body_root);
|
||||
|
||||
// Property accessors (array, objects, strings)
|
||||
/** Array ops for ILMIR*/
|
||||
//OP_CODE_DECL (array_copy, T_IDX_IDX, /** L = R */
|
||||
// var_left, var_right);
|
||||
@ -382,5 +388,15 @@ OP_CODE_DECL (loop_postcond, T_IDX_IDX,
|
||||
//OP_CODE_DECL (array_get, T_IDX_IDX_IDX, /** dst = array[index] */
|
||||
// dst, array, index);
|
||||
|
||||
//// TODO
|
||||
|
||||
// Variable declarations
|
||||
// TODO New constructor
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* OPCODE_STRUCTURES_H */
|
||||
|
||||
|
||||
@ -18,100 +18,101 @@
|
||||
#include "interpreter.h"
|
||||
|
||||
void
|
||||
save_op_data (OPCODE opdata)
|
||||
save_op_data (int pos, OPCODE opdata)
|
||||
{
|
||||
__program[__int_data.pos++] = opdata;
|
||||
__program[pos] = opdata;
|
||||
}
|
||||
|
||||
void opfunc_loop_init_num (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_loop_precond_begin_num (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_loop_precond_end_num (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_loop_postcond (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_call_2 (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_call_n (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_func_decl_1 (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_func_decl_2 (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_func_decl_n (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_varg_1 (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_varg_1_end (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_varg_2 (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_varg_2_end (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_varg_3 (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_varg_3_end (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_retval (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment_multiplication (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment_devision (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment_remainder (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment_addition (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment_substruction (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment_shift_left (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment_shift_right (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment_shift_uright (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment_b_and (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment_b_xor (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_assignment_b_or (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_logical_and (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_logical_or (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_b_and (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_b_or (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_b_xor (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_b_shift_left (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_b_shift_right (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_b_shift_uright (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_addition (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_substraction (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_division (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_multiplication (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_remainder (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_jmp_up (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_jmp_down (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_is_true_jmp (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_is_false_jmp (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_is_less_than (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_is_less_or_equal (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_is_greater_than (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_is_greater_or_equal (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_is_equal_value (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_is_not_equal_value (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_is_equal_value_type (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_is_not_equal_value_type (OPCODE opdata) { unreachable (); }
|
||||
void opfunc_loop_init_num (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_loop_precond_begin_num (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_loop_precond_end_num (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_loop_postcond (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_call_2 (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_call_n (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_func_decl_1 (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_func_decl_2 (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_func_decl_n (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_varg_1 (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_varg_1_end (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_varg_2 (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_varg_2_end (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_varg_3 (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_varg_3_end (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_retval (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_ret (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment_multiplication (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment_devision (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment_remainder (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment_addition (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment_substruction (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment_shift_left (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment_shift_right (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment_shift_uright (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment_b_and (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment_b_xor (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_assignment_b_or (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_logical_and (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_logical_or (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_b_and (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_b_or (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_b_xor (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_b_shift_left (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_b_shift_right (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_b_shift_uright (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_addition (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_substraction (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_division (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_multiplication (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_remainder (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_jmp_up (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_jmp_down (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_is_true_jmp (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_is_false_jmp (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_is_less_than (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_is_less_or_equal (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_is_greater_than (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_is_greater_or_equal (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_is_equal_value (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_is_not_equal_value (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_is_equal_value_type (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
void opfunc_is_not_equal_value_type (OPCODE opdata, struct __int_data *int_data) { unreachable (); }
|
||||
|
||||
void
|
||||
opfunc_loop_inf (OPCODE opdata)
|
||||
opfunc_loop_inf (OPCODE opdata, struct __int_data *int_data)
|
||||
{
|
||||
#ifdef __HOST
|
||||
printf ("%d::loop_inf:idx:%d\n",
|
||||
__int_data.pos,
|
||||
int_data->pos,
|
||||
opdata.data.loop_inf.loop_root);
|
||||
#endif
|
||||
|
||||
__int_data.pos = opdata.data.loop_inf.loop_root;
|
||||
int_data->pos = opdata.data.loop_inf.loop_root;
|
||||
}
|
||||
|
||||
void
|
||||
opfunc_call_1 (OPCODE opdata)
|
||||
opfunc_call_1 (OPCODE opdata, struct __int_data *int_data)
|
||||
{
|
||||
#ifdef __HOST
|
||||
printf ("%d::op_call_1:idx:%d:%d\n",
|
||||
__int_data.pos,
|
||||
int_data->pos,
|
||||
opdata.data.call_1.name_lit_idx,
|
||||
opdata.data.call_1.arg1_lit_idx);
|
||||
#endif
|
||||
|
||||
__int_data.pos++;
|
||||
int_data->pos++;
|
||||
}
|
||||
|
||||
void
|
||||
opfunc_jmp (OPCODE opdata)
|
||||
opfunc_jmp (OPCODE opdata, struct __int_data *int_data)
|
||||
{
|
||||
#ifdef __HOST
|
||||
printf ("%d::op_jmp:idx:%d\n",
|
||||
__int_data.pos,
|
||||
int_data->pos,
|
||||
opdata.data.jmp.opcode_idx);
|
||||
#endif
|
||||
|
||||
__int_data.pos = opdata.data.jmp.opcode_idx;
|
||||
int_data->pos = opdata.data.jmp.opcode_idx;
|
||||
}
|
||||
|
||||
OPCODE
|
||||
|
||||
@ -23,10 +23,11 @@
|
||||
#include "globals.h"
|
||||
|
||||
#define OPCODE struct __opcode
|
||||
struct __int_data;
|
||||
|
||||
#define OP_STRUCT_FIELD(name) struct __op_##name name;
|
||||
#define OP_ENUM_FIELD(name) name ,
|
||||
#define OP_FUNC_DECL(name) void opfunc_##name (OPCODE);
|
||||
#define OP_FUNC_DECL(name) void opfunc_##name (OPCODE, struct __int_data *);
|
||||
|
||||
/** A single bytecode instruction is 32bit wide and has an 8bit opcode field
|
||||
and several operand of 8 of 16 bit.*/
|
||||
@ -35,7 +36,7 @@
|
||||
#define T_IDX uint8_t /** index values */
|
||||
|
||||
OPCODE;
|
||||
typedef void (*opfunc)(OPCODE);
|
||||
typedef void (*opfunc)(OPCODE, struct __int_data *);
|
||||
|
||||
#define OP_LOOPS(op) \
|
||||
op(loop_inf) \
|
||||
@ -57,7 +58,8 @@ typedef void (*opfunc)(OPCODE);
|
||||
op(varg_2_end) \
|
||||
op(varg_3) \
|
||||
op(varg_3_end) \
|
||||
op(retval)
|
||||
op(retval)\
|
||||
op(ret)
|
||||
|
||||
#define OP_ASSIGNMENTS(op) \
|
||||
op(assignment) \
|
||||
@ -147,7 +149,7 @@ OPCODE
|
||||
}
|
||||
__packed;
|
||||
|
||||
void save_op_data (OPCODE);
|
||||
void save_op_data (int, OPCODE);
|
||||
|
||||
#endif /* OPCODES_H */
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user