diff --git a/src/libcoreint/opcode-structures.h b/src/libcoreint/opcode-structures.h index 76788722a..7f37165ff 100644 --- a/src/libcoreint/opcode-structures.h +++ b/src/libcoreint/opcode-structures.h @@ -40,6 +40,40 @@ T_IDX_DECL( name2 ); \ T_IDX_DECL( name3 ) +#define GETOP_IMPL_0(name) \ + OPCODE getop_##name () { \ + OPCODE opdata; \ + opdata.op_idx = name; \ + return opdata; \ + } + +#define GETOP_IMPL_1(name, field1) \ + OPCODE getop_##name (T_IDX arg1) { \ + OPCODE opdata; \ + opdata.op_idx = name; \ + opdata.data.name.field1 = arg1; \ + return opdata; \ + } + +#define GETOP_IMPL_2(name, field1, field2) \ + OPCODE getop_##name (T_IDX arg1, T_IDX arg2) { \ + OPCODE opdata; \ + opdata.op_idx = name; \ + opdata.data.name.field1 = arg1; \ + opdata.data.name.field2 = arg2; \ + return opdata; \ + } + +#define GETOP_IMPL_3(name, field1, field2, field3) \ + OPCODE getop_##name (T_IDX arg1, T_IDX arg2, T_IDX arg3) { \ + OPCODE opdata; \ + opdata.op_idx = name; \ + opdata.data.name.field1 = arg1; \ + opdata.data.name.field2 = arg2; \ + opdata.data.name.field3 = arg3; \ + return opdata; \ + } + // All conditional jumps should be followed by a JMP instruction, which holds // the target of conditional JMP. If condition is TRUE, than JMP to the target. // Otherwise they fall through to the instruction after the JMP. diff --git a/src/libcoreint/opcodes.c b/src/libcoreint/opcodes.c index b7276e2f9..87595d105 100644 --- a/src/libcoreint/opcodes.c +++ b/src/libcoreint/opcodes.c @@ -123,36 +123,62 @@ opfunc_jmp (OPCODE opdata, struct __int_data *int_data) int_data->pos = opdata.data.jmp.opcode_idx; } -OPCODE -getop_jmp (T_IDX arg1) -{ - OPCODE opdata; +/** Opcode generators. */ +GETOP_IMPL_2 (is_less_than, value_left, value_right) +GETOP_IMPL_2 (is_less_or_equal, value_left, value_right) +GETOP_IMPL_2 (is_greater_than, value_left, value_right) +GETOP_IMPL_2 (is_greater_or_equal, value_left, value_right) +GETOP_IMPL_2 (is_equal_value, value_left, value_right) +GETOP_IMPL_2 (is_not_equal_value, value_left, value_right) +GETOP_IMPL_2 (is_equal_value_type, value_left, value_right) +GETOP_IMPL_2 (is_not_equal_value_type, value_left, value_right) +GETOP_IMPL_2 (is_true_jmp, value, opcode) +GETOP_IMPL_2 (is_false_jmp, value, opcode) +GETOP_IMPL_1 (jmp, opcode_idx) +GETOP_IMPL_1 (jmp_up, opcode_count) +GETOP_IMPL_1 (jmp_down, opcode_count) +GETOP_IMPL_3 (addition, dst, var_left, var_right) +GETOP_IMPL_3 (substraction, dst, var_left, var_right) +GETOP_IMPL_3 (division, dst, var_left, var_right) +GETOP_IMPL_3 (multiplication, dst, var_left, var_right) +GETOP_IMPL_3 (remainder, dst, var_left, var_right) +GETOP_IMPL_3 (b_shift_left, dst, var_left, var_right) +GETOP_IMPL_3 (b_shift_right, dst, var_left, var_right) +GETOP_IMPL_3 (b_shift_uright, dst, var_left, var_right) +GETOP_IMPL_3 (b_and, dst, var_left, var_right) +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_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) +GETOP_IMPL_2 (func_decl_1, name_lit_idx, arg1_lit_idx) +GETOP_IMPL_3 (func_decl_2, name_lit_idx, arg1_lit_idx, arg2_lit_idx) +GETOP_IMPL_3 (func_decl_n, name_lit_idx, arg1_lit_idx, arg2_lit_idx) +GETOP_IMPL_1 (varg_1, arg1_lit_idx) +GETOP_IMPL_1 (varg_1_end, arg1_lit_idx) +GETOP_IMPL_2 (varg_2, arg1_lit_idx, arg2_lit_idx) +GETOP_IMPL_2 (varg_2_end, arg1_lit_idx, arg2_lit_idx) +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_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) +GETOP_IMPL_3 (loop_precond_end_num, iterator, step, precond_begin) +GETOP_IMPL_2 (loop_postcond, condition, body_root) - opdata.op_idx = jmp; - opdata.data.jmp.opcode_idx = arg1; - - return opdata; -} - -OPCODE -getop_call_1 (T_IDX arg1, T_IDX arg2) -{ - OPCODE opdata; - - opdata.op_idx = call_1; - opdata.data.call_1.name_lit_idx = arg1; - opdata.data.call_1.arg1_lit_idx = arg2; - - return opdata; -} - -OPCODE -getop_loop_inf (T_IDX arg1) -{ - OPCODE opdata; - - opdata.op_idx = loop_inf; - opdata.data.loop_inf.loop_root = arg1; - - return opdata; -}