Extract binary lvalue operators (#2630)
This patch substitutes all binary lvalue operators with an assigment + the corresponding binary operator. E.g. A += (expression) is pasred as A = A + (expression). Due to this replacement, all the related binary lvalue CBC opcodes can be removed. Also the arithmetic related VM instructions can put their result directly onto the stack, since no more checking is needed. JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik frobert@inf.u-szeged.hu
This commit is contained in:
committed by
László Langó
parent
e8502fa8cc
commit
93ec226650
@@ -116,28 +116,8 @@
|
||||
CBC_OPCODE (name ## _IDENT_BLOCK, CBC_HAS_LITERAL_ARG, 0, \
|
||||
(VM_OC_ ## group) | VM_OC_GET_LITERAL | VM_OC_PUT_IDENT | VM_OC_PUT_BLOCK)
|
||||
|
||||
#define CBC_BINARY_LVALUE_OPERATION(name, group) \
|
||||
CBC_OPCODE (name, CBC_NO_FLAG, -4, \
|
||||
(VM_OC_ ## group) | VM_OC_GET_STACK_STACK | VM_OC_PUT_REFERENCE) \
|
||||
CBC_OPCODE (name ## _LITERAL, CBC_HAS_LITERAL_ARG, -3, \
|
||||
(VM_OC_ ## group) | VM_OC_GET_STACK_LITERAL | VM_OC_PUT_REFERENCE) \
|
||||
|
||||
#define CBC_EXT_BINARY_LVALUE_OPERATION(name, group) \
|
||||
CBC_OPCODE (name ## _PUSH_RESULT, CBC_NO_FLAG, -3, \
|
||||
(VM_OC_ ## group) | VM_OC_GET_STACK_STACK | VM_OC_PUT_REFERENCE | VM_OC_PUT_STACK) \
|
||||
CBC_OPCODE (name ## _LITERAL_PUSH_RESULT, CBC_HAS_LITERAL_ARG, -2, \
|
||||
(VM_OC_ ## group) | VM_OC_GET_STACK_LITERAL | VM_OC_PUT_REFERENCE | VM_OC_PUT_STACK) \
|
||||
|
||||
#define CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION(name, group) \
|
||||
CBC_OPCODE (name ## _BLOCK, CBC_NO_FLAG, -4, \
|
||||
(VM_OC_ ## group) | VM_OC_GET_STACK_STACK | VM_OC_PUT_REFERENCE | VM_OC_PUT_BLOCK) \
|
||||
CBC_OPCODE (name ## _LITERAL_BLOCK, CBC_HAS_LITERAL_ARG, -3, \
|
||||
(VM_OC_ ## group) | VM_OC_GET_STACK_LITERAL | VM_OC_PUT_REFERENCE | VM_OC_PUT_BLOCK) \
|
||||
|
||||
#define CBC_UNARY_LVALUE_WITH_IDENT 3
|
||||
|
||||
#define CBC_BINARY_LVALUE_WITH_LITERAL 1
|
||||
|
||||
#define CBC_BINARY_WITH_LITERAL 1
|
||||
#define CBC_BINARY_WITH_TWO_LITERALS 2
|
||||
|
||||
@@ -162,12 +142,6 @@
|
||||
#define CBC_NO_RESULT_OPERATION(opcode) \
|
||||
(((opcode) >= CBC_PRE_INCR && (opcode) < CBC_END) || CBC_SUPER_CALL_OPERATION ((opcode)))
|
||||
|
||||
#define CBC_NO_RESULT_BLOCK(opcode) \
|
||||
(((opcode) >= CBC_PRE_INCR && (opcode) < CBC_ASSIGN_ADD) || CBC_SUPER_CALL_OPERATION ((opcode)))
|
||||
|
||||
#define CBC_NO_RESULT_COMPOUND_ASSIGMENT(opcode) \
|
||||
((opcode) >= CBC_ASSIGN_ADD && (opcode) < CBC_END && !CBC_SUPER_CALL_OPERATION ((opcode)))
|
||||
|
||||
/**
|
||||
* Branch instructions are organized in group of 8 opcodes.
|
||||
* - 1st opcode: unused, can be used for other purpose
|
||||
@@ -497,30 +471,6 @@
|
||||
CBC_OPCODE (CBC_ASSIGN_PROP_THIS_LITERAL_BLOCK, CBC_HAS_LITERAL_ARG, -1, \
|
||||
VM_OC_ASSIGN_PROP_THIS | VM_OC_GET_LITERAL | VM_OC_PUT_REFERENCE | VM_OC_PUT_BLOCK) \
|
||||
\
|
||||
/* Binary compound assignment opcodes. */ \
|
||||
CBC_BINARY_LVALUE_OPERATION (CBC_ASSIGN_ADD, \
|
||||
ADD) \
|
||||
CBC_BINARY_LVALUE_OPERATION (CBC_ASSIGN_SUBTRACT, \
|
||||
SUB) \
|
||||
CBC_BINARY_LVALUE_OPERATION (CBC_ASSIGN_MULTIPLY, \
|
||||
MUL) \
|
||||
CBC_BINARY_LVALUE_OPERATION (CBC_ASSIGN_DIVIDE, \
|
||||
DIV) \
|
||||
CBC_BINARY_LVALUE_OPERATION (CBC_ASSIGN_MODULO, \
|
||||
MOD) \
|
||||
CBC_BINARY_LVALUE_OPERATION (CBC_ASSIGN_LEFT_SHIFT, \
|
||||
LEFT_SHIFT) \
|
||||
CBC_BINARY_LVALUE_OPERATION (CBC_ASSIGN_RIGHT_SHIFT, \
|
||||
RIGHT_SHIFT) \
|
||||
CBC_BINARY_LVALUE_OPERATION (CBC_ASSIGN_UNS_RIGHT_SHIFT, \
|
||||
UNS_RIGHT_SHIFT) \
|
||||
CBC_BINARY_LVALUE_OPERATION (CBC_ASSIGN_BIT_AND, \
|
||||
BIT_AND) \
|
||||
CBC_BINARY_LVALUE_OPERATION (CBC_ASSIGN_BIT_OR, \
|
||||
BIT_OR) \
|
||||
CBC_BINARY_LVALUE_OPERATION (CBC_ASSIGN_BIT_XOR, \
|
||||
BIT_XOR) \
|
||||
\
|
||||
/* Last opcode (not a real opcode). */ \
|
||||
CBC_OPCODE (CBC_END, CBC_NO_FLAG, 0, \
|
||||
VM_OC_NONE)
|
||||
@@ -631,54 +581,6 @@
|
||||
CBC_OPCODE (CBC_EXT_ERROR, CBC_NO_FLAG, 0, \
|
||||
VM_OC_ERROR) \
|
||||
\
|
||||
/* Binary compound assignment opcodes with pushing the result. */ \
|
||||
CBC_EXT_BINARY_LVALUE_OPERATION (CBC_EXT_ASSIGN_ADD, \
|
||||
ADD) \
|
||||
CBC_EXT_BINARY_LVALUE_OPERATION (CBC_EXT_ASSIGN_SUBTRACT, \
|
||||
SUB) \
|
||||
CBC_EXT_BINARY_LVALUE_OPERATION (CBC_EXT_ASSIGN_MULTIPLY, \
|
||||
MUL) \
|
||||
CBC_EXT_BINARY_LVALUE_OPERATION (CBC_EXT_ASSIGN_DIVIDE, \
|
||||
DIV) \
|
||||
CBC_EXT_BINARY_LVALUE_OPERATION (CBC_EXT_ASSIGN_MODULO, \
|
||||
MOD) \
|
||||
CBC_EXT_BINARY_LVALUE_OPERATION (CBC_EXT_ASSIGN_LEFT_SHIFT, \
|
||||
LEFT_SHIFT) \
|
||||
CBC_EXT_BINARY_LVALUE_OPERATION (CBC_EXT_ASSIGN_RIGHT_SHIFT, \
|
||||
RIGHT_SHIFT) \
|
||||
CBC_EXT_BINARY_LVALUE_OPERATION (CBC_EXT_ASSIGN_UNS_RIGHT_SHIFT, \
|
||||
UNS_RIGHT_SHIFT) \
|
||||
CBC_EXT_BINARY_LVALUE_OPERATION (CBC_EXT_ASSIGN_BIT_AND, \
|
||||
BIT_AND) \
|
||||
CBC_EXT_BINARY_LVALUE_OPERATION (CBC_EXT_ASSIGN_BIT_OR, \
|
||||
BIT_OR) \
|
||||
CBC_EXT_BINARY_LVALUE_OPERATION (CBC_EXT_ASSIGN_BIT_XOR, \
|
||||
BIT_XOR) \
|
||||
\
|
||||
/* Binary compound assignment opcodes with saving the result. */ \
|
||||
CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION (CBC_EXT_ASSIGN_ADD, \
|
||||
ADD) \
|
||||
CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION (CBC_EXT_ASSIGN_SUBTRACT, \
|
||||
SUB) \
|
||||
CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION (CBC_EXT_ASSIGN_MULTIPLY, \
|
||||
MUL) \
|
||||
CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION (CBC_EXT_ASSIGN_DIVIDE, \
|
||||
DIV) \
|
||||
CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION (CBC_EXT_ASSIGN_MODULO, \
|
||||
MOD) \
|
||||
CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION (CBC_EXT_ASSIGN_LEFT_SHIFT, \
|
||||
LEFT_SHIFT) \
|
||||
CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION (CBC_EXT_ASSIGN_RIGHT_SHIFT, \
|
||||
RIGHT_SHIFT) \
|
||||
CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION (CBC_EXT_ASSIGN_UNS_RIGHT_SHIFT, \
|
||||
UNS_RIGHT_SHIFT) \
|
||||
CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION (CBC_EXT_ASSIGN_BIT_AND, \
|
||||
BIT_AND) \
|
||||
CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION (CBC_EXT_ASSIGN_BIT_OR, \
|
||||
BIT_OR) \
|
||||
CBC_EXT_BINARY_LVALUE_BLOCK_OPERATION (CBC_EXT_ASSIGN_BIT_XOR, \
|
||||
BIT_XOR) \
|
||||
\
|
||||
/* Last opcode (not a real opcode). */ \
|
||||
CBC_OPCODE (CBC_EXT_END, CBC_NO_FLAG, 0, \
|
||||
VM_OC_NONE)
|
||||
|
||||
Reference in New Issue
Block a user