Start dumping assignment expressions to bytecode; revise bytecode instructions
This commit is contained in:
@@ -228,6 +228,58 @@ OP_CODE_DECL (logical_or, T_IDX_IDX_IDX,
|
||||
var_left,
|
||||
var_right)
|
||||
|
||||
// Equality operations.
|
||||
|
||||
/** dst = L == R. */
|
||||
OP_CODE_DECL (equal_value, T_IDX_IDX_IDX,
|
||||
dst,
|
||||
var_left,
|
||||
var_right)
|
||||
|
||||
/** dst = L != R. */
|
||||
OP_CODE_DECL (not_equal_value, T_IDX_IDX_IDX,
|
||||
dst,
|
||||
var_left,
|
||||
var_right)
|
||||
|
||||
/** dst = L === R. */
|
||||
OP_CODE_DECL (equal_value_type, T_IDX_IDX_IDX,
|
||||
dst,
|
||||
var_left,
|
||||
var_right)
|
||||
|
||||
/** dst = L !== R. */
|
||||
OP_CODE_DECL (not_equal_value_type, T_IDX_IDX_IDX,
|
||||
dst,
|
||||
var_left,
|
||||
var_right)
|
||||
|
||||
// Relational operations.
|
||||
|
||||
/** dst = L < R. */
|
||||
OP_CODE_DECL (less_than, T_IDX_IDX_IDX,
|
||||
dst,
|
||||
var_left,
|
||||
var_right)
|
||||
|
||||
/** dst = L > R. */
|
||||
OP_CODE_DECL (greater_than, T_IDX_IDX_IDX,
|
||||
dst,
|
||||
var_left,
|
||||
var_right)
|
||||
|
||||
/** dst = L <= R. */
|
||||
OP_CODE_DECL (less_or_equal_than, T_IDX_IDX_IDX,
|
||||
dst,
|
||||
var_left,
|
||||
var_right)
|
||||
|
||||
/** dst = L >= R. */
|
||||
OP_CODE_DECL (greater_or_equal_than, T_IDX_IDX_IDX,
|
||||
dst,
|
||||
var_left,
|
||||
var_right)
|
||||
|
||||
// Assignment operators.
|
||||
// Assign value to LEFT operand based on value of RIGHT operand.
|
||||
|
||||
@@ -236,61 +288,6 @@ OP_CODE_DECL (assignment, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
/** L *= R */
|
||||
OP_CODE_DECL (assignment_multiplication, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
/** L /= R */
|
||||
OP_CODE_DECL (assignment_devision, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
/** L %= R */
|
||||
OP_CODE_DECL (assignment_remainder, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
/** L += R */
|
||||
OP_CODE_DECL (assignment_addition, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
/** L -= R */
|
||||
OP_CODE_DECL (assignment_substruction, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
/** L <<= R */
|
||||
OP_CODE_DECL (assignment_shift_left, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
/** L >>= R */
|
||||
OP_CODE_DECL (assignment_shift_right, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
/** L >>>= R */
|
||||
OP_CODE_DECL (assignment_shift_uright, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
/** L &= R */
|
||||
OP_CODE_DECL (assignment_b_and, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
/** L ^= R */
|
||||
OP_CODE_DECL (assignment_b_xor, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
/** L |= R */
|
||||
OP_CODE_DECL (assignment_b_or, T_IDX_IDX,
|
||||
value_left,
|
||||
value_right)
|
||||
|
||||
// Functions calls, declarations and argument handling
|
||||
|
||||
/** name(arg1); */
|
||||
@@ -362,6 +359,8 @@ OP_CODE_DECL (retval, T_IDX,
|
||||
ret_value)
|
||||
OP_CODE_DECL_VOID (ret)
|
||||
|
||||
OP_CODE_DECL_VOID (nop)
|
||||
|
||||
// LOOPS
|
||||
// Lately, all loops should be translated into different JMPs in an optimizer.
|
||||
|
||||
|
||||
+18
-22
@@ -41,6 +41,15 @@ void opfunc_varg_3 (OPCODE opdata __unused, struct __int_data *int_data __unused
|
||||
void opfunc_varg_3_end (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_retval (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_ret (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_nop (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_equal_value (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_not_equal_value (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_equal_value_type (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_not_equal_value_type (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_less_than (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_greater_than (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_less_or_equal_than (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_greater_or_equal_than (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
|
||||
void
|
||||
opfunc_assignment(OPCODE opdata __unused,
|
||||
@@ -49,17 +58,6 @@ opfunc_assignment(OPCODE opdata __unused,
|
||||
JERRY_UNREACHABLE ();
|
||||
}
|
||||
|
||||
void opfunc_assignment_multiplication (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_assignment_devision (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_assignment_remainder (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_assignment_addition (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_assignment_substruction (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_assignment_shift_left (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_assignment_shift_right (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_assignment_shift_uright (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_assignment_b_and (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_assignment_b_xor (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_assignment_b_or (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_logical_and (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_logical_or (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
void opfunc_b_and (OPCODE opdata __unused, struct __int_data *int_data __unused) { JERRY_UNREACHABLE (); }
|
||||
@@ -150,18 +148,15 @@ GETOP_IMPL_3 (b_or, dst, var_left, var_right)
|
||||
GETOP_IMPL_3 (b_xor, dst, var_left, var_right)
|
||||
GETOP_IMPL_3 (logical_and, dst, var_left, var_right)
|
||||
GETOP_IMPL_3 (logical_or, dst, var_left, var_right)
|
||||
GETOP_IMPL_3 (equal_value, dst, var_left, var_right)
|
||||
GETOP_IMPL_3 (not_equal_value, dst, var_left, var_right)
|
||||
GETOP_IMPL_3 (equal_value_type, dst, var_left, var_right)
|
||||
GETOP_IMPL_3 (not_equal_value_type, dst, var_left, var_right)
|
||||
GETOP_IMPL_3 (less_than, dst, var_left, var_right)
|
||||
GETOP_IMPL_3 (greater_than, dst, var_left, var_right)
|
||||
GETOP_IMPL_3 (less_or_equal_than, dst, var_left, var_right)
|
||||
GETOP_IMPL_3 (greater_or_equal_than, dst, var_left, var_right)
|
||||
GETOP_IMPL_2 (assignment, value_left, value_right)
|
||||
GETOP_IMPL_2 (assignment_multiplication, value_left, value_right)
|
||||
GETOP_IMPL_2 (assignment_devision, value_left, value_right)
|
||||
GETOP_IMPL_2 (assignment_remainder, value_left, value_right)
|
||||
GETOP_IMPL_2 (assignment_addition, value_left, value_right)
|
||||
GETOP_IMPL_2 (assignment_substruction, value_left, value_right)
|
||||
GETOP_IMPL_2 (assignment_shift_left, value_left, value_right)
|
||||
GETOP_IMPL_2 (assignment_shift_right, value_left, value_right)
|
||||
GETOP_IMPL_2 (assignment_shift_uright, value_left, value_right)
|
||||
GETOP_IMPL_2 (assignment_b_and, value_left, value_right)
|
||||
GETOP_IMPL_2 (assignment_b_xor, value_left, value_right)
|
||||
GETOP_IMPL_2 (assignment_b_or, value_left, value_right)
|
||||
GETOP_IMPL_2 (call_1, name_lit_idx, arg1_lit_idx)
|
||||
GETOP_IMPL_3 (call_2, name_lit_idx, arg1_lit_idx, arg2_lit_idx)
|
||||
GETOP_IMPL_3 (call_n, name_lit_idx, arg1_lit_idx, arg2_lit_idx)
|
||||
@@ -176,6 +171,7 @@ GETOP_IMPL_3 (varg_3, arg1_lit_idx, arg2_lit_idx, arg3_lit_idx)
|
||||
GETOP_IMPL_3 (varg_3_end, arg1_lit_idx, arg2_lit_idx, arg3_lit_idx)
|
||||
GETOP_IMPL_1 (retval, ret_value)
|
||||
GETOP_IMPL_0 (ret)
|
||||
GETOP_IMPL_0 (nop)
|
||||
GETOP_IMPL_1 (loop_inf, loop_root)
|
||||
GETOP_IMPL_3 (loop_init_num, start, stop, step)
|
||||
GETOP_IMPL_2 (loop_precond_begin_num, condition, after_loop_op)
|
||||
|
||||
+18
-14
@@ -54,22 +54,11 @@ typedef void (*opfunc)(OPCODE, struct __int_data *);
|
||||
op(varg_2_end) \
|
||||
op(varg_3) \
|
||||
op(varg_3_end) \
|
||||
op(retval)\
|
||||
op(retval) \
|
||||
op(ret)
|
||||
|
||||
#define OP_ASSIGNMENTS(op) \
|
||||
op(assignment) \
|
||||
op(assignment_multiplication) \
|
||||
op(assignment_devision) \
|
||||
op(assignment_remainder) \
|
||||
op(assignment_addition) \
|
||||
op(assignment_substruction) \
|
||||
op(assignment_shift_left) \
|
||||
op(assignment_shift_right) \
|
||||
op(assignment_shift_uright) \
|
||||
op(assignment_b_and) \
|
||||
op(assignment_b_xor) \
|
||||
op(assignment_b_or)
|
||||
op(assignment)
|
||||
|
||||
#define OP_B_SHIFTS(op) \
|
||||
op(b_shift_left) \
|
||||
@@ -85,6 +74,18 @@ typedef void (*opfunc)(OPCODE, struct __int_data *);
|
||||
op(logical_and) \
|
||||
op(logical_or)
|
||||
|
||||
#define OP_EQUALITY(op) \
|
||||
op(equal_value) \
|
||||
op(not_equal_value) \
|
||||
op(equal_value_type) \
|
||||
op(not_equal_value_type)
|
||||
|
||||
#define OP_RELATIONAL(op) \
|
||||
op(less_than) \
|
||||
op(greater_than) \
|
||||
op(less_or_equal_than) \
|
||||
op(greater_or_equal_than)
|
||||
|
||||
#define OP_ARITHMETIC(op) \
|
||||
op(addition) \
|
||||
op(substraction) \
|
||||
@@ -95,7 +96,8 @@ typedef void (*opfunc)(OPCODE, struct __int_data *);
|
||||
#define OP_UNCONDITIONAL_JUMPS(op) \
|
||||
op(jmp) \
|
||||
op(jmp_up) \
|
||||
op(jmp_down)
|
||||
op(jmp_down) \
|
||||
op(nop)
|
||||
|
||||
#define OP_UNARY_OPS(op) \
|
||||
op(is_true_jmp) \
|
||||
@@ -119,6 +121,8 @@ typedef void (*opfunc)(OPCODE, struct __int_data *);
|
||||
OP_B_LOGICAL(op) \
|
||||
OP_B_BITWISE(op) \
|
||||
OP_B_SHIFTS(op) \
|
||||
OP_EQUALITY(op) \
|
||||
OP_RELATIONAL(op) \
|
||||
OP_ARITHMETIC(op) \
|
||||
OP_UNCONDITIONAL_JUMPS(op) \
|
||||
OP_CONDITIONAL_JUMPS(op)
|
||||
|
||||
Reference in New Issue
Block a user