opcodes + refined int structure

This commit is contained in:
e.gavrin 2014-07-08 13:18:00 +04:00
parent 21db33fa97
commit f18a5f5e31
5 changed files with 117 additions and 89 deletions

View File

@ -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);
}

View File

@ -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 */

View File

@ -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 */

View File

@ -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

View File

@ -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 */