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