Reduce number of operand type handling conditional blocks in byte-code dumper, by extracting them to several separate routines that can be used for most cases, remove getop_* routines from vm.

JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
This commit is contained in:
Ruben Ayrapetyan 2015-08-12 15:21:59 +03:00
parent cbdc48a1fc
commit a00079e8ff
6 changed files with 608 additions and 837 deletions

File diff suppressed because it is too large Load Diff

View File

@ -33,6 +33,8 @@ public:
EMPTY, /**< empty operand */
LITERAL, /**< operand contains literal value */
TMP, /**< operand contains byte-code register index */
IDX_CONST, /**< operand contains an integer constant that fits vm_idx_t */
UNKNOWN, /**< operand, representing unknown value that would be rewritten later */
UNINITIALIZED /**< uninitialized operand
*
* Note:
@ -65,6 +67,37 @@ public:
return ret;
} /* make_empty_operand */
/**
* Construct unknown operand
*
* @return constructed operand
*/
static jsp_operand_t
make_unknown_operand (void)
{
jsp_operand_t ret;
ret._type = jsp_operand_t::UNKNOWN;
return ret;
} /* make_unknown_operand */
/**
* Construct idx-constant operand
*
* @return constructed operand
*/
static jsp_operand_t
make_idx_const_operand (vm_idx_t cnst) /**< integer in vm_idx_t range */
{
jsp_operand_t ret;
ret._type = jsp_operand_t::IDX_CONST;
ret._data.idx_const = cnst;
return ret;
} /* make_idx_const_operand */
/**
* Construct literal operand
*
@ -124,6 +157,32 @@ public:
return (_type == jsp_operand_t::EMPTY);
} /* is_empty_operand */
/**
* Is it unknown operand?
*
* @return true / false
*/
bool
is_unknown_operand (void) const
{
JERRY_ASSERT (_type != jsp_operand_t::UNINITIALIZED);
return (_type == jsp_operand_t::UNKNOWN);
} /* is_unknown_operand */
/**
* Is it idx-constant operand?
*
* @return true / false
*/
bool
is_idx_const_operand (void) const
{
JERRY_ASSERT (_type != jsp_operand_t::UNINITIALIZED);
return (_type == jsp_operand_t::IDX_CONST);
} /* is_idx_const_operand */
/**
* Is it byte-code register operand?
*
@ -204,9 +263,22 @@ public:
}
} /* get_literal */
/**
* Get constant from idx-constant operand
*
* @return an integer
*/
vm_idx_t
get_idx_const (void) const
{
JERRY_ASSERT (is_idx_const_operand ());
return _data.idx_const;
} /* get_idx_const */
private:
union
{
vm_idx_t idx_const; /**< idx constant value (for jsp_operand_t::IDX_CONST) */
vm_idx_t uid; /**< byte-code register index (for jsp_operand_t::TMP) */
lit_cpointer_t lit_id; /**< literal (for jsp_operand_t::LITERAL) */
} _data;

View File

@ -24,10 +24,17 @@
#include "lit-id-hash-table.h"
#include "lit-literal.h"
/**
* Intermediate instruction descriptor that additionally to byte-code instruction
* holds information about literals, associated with corresponding arguments
* of the instruction.
*/
typedef struct
{
lit_cpointer_t lit_id[3];
vm_instr_t op;
lit_cpointer_t lit_id[3]; /**< literals, corresponding to arguments
* (NOT_A_LITERAL - if not literal is associated
* with corresponding argument) */
vm_instr_t op; /**< byte-code instruction */
} op_meta;
typedef struct tree_header

View File

@ -1805,43 +1805,3 @@ vm_read_instr_counter_from_meta (opcode_meta_type expected_type, /**< expected t
return vm_calc_instr_counter_from_idx_idx (data_1, data_2);
} /* vm_read_instr_counter_from_meta */
#define VM_OP_0(opcode_name, opcode_name_uppercase) \
vm_instr_t getop_##opcode_name (void) \
{ \
vm_instr_t instr; \
memset (&instr, 0, sizeof(instr)); \
instr.op_idx = VM_OP_##opcode_name_uppercase; \
return instr; \
}
#define VM_OP_1(opcode_name, opcode_name_uppercase, arg1, arg1_type) \
vm_instr_t getop_##opcode_name (vm_idx_t arg1_v) \
{ \
vm_instr_t instr; \
memset (&instr, 0, sizeof(instr)); \
instr.op_idx = VM_OP_##opcode_name_uppercase; \
instr.data.opcode_name.arg1 = arg1_v; \
return instr; \
}
#define VM_OP_2(opcode_name, opcode_name_uppercase, arg1, arg1_type, arg2, arg2_type) \
vm_instr_t getop_##opcode_name (vm_idx_t arg1_v, vm_idx_t arg2_v) \
{ \
vm_instr_t instr; \
memset (&instr, 0, sizeof(instr)); \
instr.op_idx = VM_OP_##opcode_name_uppercase; \
instr.data.opcode_name.arg1 = arg1_v; \
instr.data.opcode_name.arg2 = arg2_v; \
return instr; \
}
#define VM_OP_3(opcode_name, opcode_name_uppercase, arg1, arg1_type, arg2, arg2_type, arg3, arg3_type) \
vm_instr_t getop_##opcode_name (vm_idx_t arg1_v, vm_idx_t arg2_v, vm_idx_t arg3_v) \
{ \
vm_instr_t instr; \
instr.op_idx = VM_OP_##opcode_name_uppercase; \
instr.data.opcode_name.arg1 = arg1_v; \
instr.data.opcode_name.arg2 = arg2_v; \
instr.data.opcode_name.arg3 = arg3_v; \
return instr; \
}
#include "vm-opcodes.inc.h"

View File

@ -297,15 +297,4 @@ typedef enum
typedef ecma_completion_value_t (*opfunc) (vm_instr_t, vm_frame_ctx_t *);
#define VM_OP_0(opcode_name, opcode_name_uppercase) \
vm_instr_t getop_##opcode_name (void);
#define VM_OP_1(opcode_name, opcode_name_uppercase, arg1, arg1_type) \
vm_instr_t getop_##opcode_name (vm_idx_t);
#define VM_OP_2(opcode_name, opcode_name_uppercase, arg1, arg1_type, arg2, arg2_type) \
vm_instr_t getop_##opcode_name (vm_idx_t, vm_idx_t);
#define VM_OP_3(opcode_name, opcode_name_uppercase, arg1, arg1_type, arg2, arg2_type, arg3, arg3_type) \
vm_instr_t getop_##opcode_name (vm_idx_t, vm_idx_t, vm_idx_t);
#include "vm-opcodes.inc.h"
#endif /* OPCODES_H */

View File

@ -49,6 +49,49 @@ instrs_equal (const vm_instr_t *instrs1, vm_instr_t *instrs2, uint16_t size)
return true;
}
#define VM_OP_0(opcode_name, opcode_name_uppercase) \
static vm_instr_t __attr_unused___ getop_##opcode_name (void) \
{ \
vm_instr_t instr; \
instr.op_idx = VM_OP_##opcode_name_uppercase; \
instr.data.raw_args[0] = VM_IDX_EMPTY; \
instr.data.raw_args[1] = VM_IDX_EMPTY; \
instr.data.raw_args[2] = VM_IDX_EMPTY; \
return instr; \
}
#define VM_OP_1(opcode_name, opcode_name_uppercase, arg_1, arg1_type) \
static vm_instr_t __attr_unused___ getop_##opcode_name (vm_idx_t arg1_v) \
{ \
vm_instr_t instr; \
instr.op_idx = VM_OP_##opcode_name_uppercase; \
instr.data.raw_args[0] = arg1_v; \
instr.data.raw_args[1] = VM_IDX_EMPTY; \
instr.data.raw_args[2] = VM_IDX_EMPTY; \
return instr; \
}
#define VM_OP_2(opcode_name, opcode_name_uppercase, arg_1, arg1_type, arg_2, arg2_type) \
static vm_instr_t __attr_unused___ getop_##opcode_name (vm_idx_t arg1_v, vm_idx_t arg2_v) \
{ \
vm_instr_t instr; \
instr.op_idx = VM_OP_##opcode_name_uppercase; \
instr.data.raw_args[0] = arg1_v; \
instr.data.raw_args[1] = arg2_v; \
instr.data.raw_args[2] = VM_IDX_EMPTY; \
return instr; \
}
#define VM_OP_3(opcode_name, opcode_name_uppercase, arg_1, arg1_type, arg_2, arg2_type, arg3_name, arg3_type) \
static vm_instr_t __attr_unused___ getop_##opcode_name (vm_idx_t arg1_v, vm_idx_t arg2_v, vm_idx_t arg3_v) \
{ \
vm_instr_t instr; \
instr.op_idx = VM_OP_##opcode_name_uppercase; \
instr.data.raw_args[0] = arg1_v; \
instr.data.raw_args[1] = arg2_v; \
instr.data.raw_args[2] = arg3_v; \
return instr; \
}
#include "vm-opcodes.inc.h"
/**
* Unit test's main function.
*/