| Index: src/code-stub-assembler.h
|
| diff --git a/src/code-stub-assembler.h b/src/code-stub-assembler.h
|
| index 7a91ea3a6f71fcd194934d40f9cc8b4a71e2124f..984e473d640748e777c1b60c3ed038a7e20f2850 100644
|
| --- a/src/code-stub-assembler.h
|
| +++ b/src/code-stub-assembler.h
|
| @@ -95,27 +95,27 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
|
| return value;
|
| }
|
|
|
| -#define PARAMETER_BINARY_OPERATION(OpName, IntPtrOpName, SmiOpName, \
|
| - Int32OpName) \
|
| - Node* OpName(Node* value1, Node* value2, ParameterMode mode) { \
|
| - if (mode == SMI_PARAMETERS) { \
|
| - return SmiOpName(value1, value2); \
|
| - } else if (mode == INTPTR_PARAMETERS) { \
|
| - return IntPtrOpName(value1, value2); \
|
| - } else { \
|
| - DCHECK_EQ(INTEGER_PARAMETERS, mode); \
|
| - return Int32OpName(value1, value2); \
|
| - } \
|
| +#define PARAMETER_BINOP(OpName, IntPtrOpName, SmiOpName, Int32OpName) \
|
| + Node* OpName(Node* a, Node* b, ParameterMode mode) { \
|
| + if (mode == SMI_PARAMETERS) { \
|
| + return SmiOpName(a, b); \
|
| + } else if (mode == INTPTR_PARAMETERS) { \
|
| + return IntPtrOpName(a, b); \
|
| + } else { \
|
| + DCHECK_EQ(INTEGER_PARAMETERS, mode); \
|
| + return Int32OpName(a, b); \
|
| + } \
|
| }
|
| - PARAMETER_BINARY_OPERATION(IntPtrOrSmiAdd, IntPtrAdd, SmiAdd, Int32Add)
|
| - PARAMETER_BINARY_OPERATION(IntPtrOrSmiLessThan, IntPtrLessThan, SmiLessThan,
|
| - Int32LessThan)
|
| - PARAMETER_BINARY_OPERATION(IntPtrOrSmiGreaterThan, IntPtrGreaterThan,
|
| - SmiGreaterThan, Int32GreaterThan)
|
| - PARAMETER_BINARY_OPERATION(UintPtrOrSmiLessThan, UintPtrLessThan, SmiBelow,
|
| - Uint32LessThan)
|
| -
|
| -#undef PARAMETER_BINARY_OPERATION
|
| + PARAMETER_BINOP(IntPtrOrSmiAdd, IntPtrAdd, SmiAdd, Int32Add)
|
| + PARAMETER_BINOP(IntPtrOrSmiLessThan, IntPtrLessThan, SmiLessThan,
|
| + Int32LessThan)
|
| + PARAMETER_BINOP(IntPtrOrSmiGreaterThan, IntPtrGreaterThan, SmiGreaterThan,
|
| + Int32GreaterThan)
|
| + PARAMETER_BINOP(UintPtrOrSmiLessThan, UintPtrLessThan, SmiBelow,
|
| + Uint32LessThan)
|
| + PARAMETER_BINOP(UintPtrOrSmiGreaterThanOrEqual, UintPtrGreaterThanOrEqual,
|
| + SmiAboveOrEqual, Uint32GreaterThanOrEqual)
|
| +#undef PARAMETER_BINOP
|
|
|
| Node* NoContextConstant();
|
| #define HEAP_CONSTANT_ACCESSOR(rootName, name) Node* name##Constant();
|
| @@ -157,25 +157,46 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
|
| Node* SmiToWord32(Node* value);
|
|
|
| // Smi operations.
|
| - Node* SmiAdd(Node* a, Node* b);
|
| - Node* SmiSub(Node* a, Node* b);
|
| - Node* SmiEqual(Node* a, Node* b);
|
| - Node* SmiAbove(Node* a, Node* b);
|
| - Node* SmiAboveOrEqual(Node* a, Node* b);
|
| - Node* SmiBelow(Node* a, Node* b);
|
| - Node* SmiLessThan(Node* a, Node* b);
|
| - Node* SmiLessThanOrEqual(Node* a, Node* b);
|
| - Node* SmiGreaterThan(Node* a, Node* b);
|
| +#define SMI_ARITHMETIC_BINOP(SmiOpName, IntPtrOpName) \
|
| + Node* SmiOpName(Node* a, Node* b) { \
|
| + return BitcastWordToTaggedSigned( \
|
| + IntPtrOpName(BitcastTaggedToWord(a), BitcastTaggedToWord(b))); \
|
| + }
|
| + SMI_ARITHMETIC_BINOP(SmiAdd, IntPtrAdd)
|
| + SMI_ARITHMETIC_BINOP(SmiSub, IntPtrSub)
|
| + SMI_ARITHMETIC_BINOP(SmiAnd, WordAnd)
|
| + SMI_ARITHMETIC_BINOP(SmiOr, WordOr)
|
| +
|
| +#define SMI_SHIFT_OP(SmiOpName, IntPtrOpName) \
|
| + Node* SmiOpName(Node* a, int shift) { \
|
| + return BitcastWordToTaggedSigned( \
|
| + IntPtrOpName(BitcastTaggedToWord(a), shift)); \
|
| + } \
|
| + SMI_ARITHMETIC_BINOP(SmiOpName, IntPtrOpName)
|
| +
|
| + SMI_SHIFT_OP(SmiShl, WordShl)
|
| + SMI_SHIFT_OP(SmiShr, WordShr)
|
| +#undef SMI_SHIFT_OP
|
| +#undef SMI_ARITHMETIC_BINOP
|
| +
|
| +#define SMI_COMPARISON_OP(SmiOpName, IntPtrOpName) \
|
| + Node* SmiOpName(Node* a, Node* b) { \
|
| + return IntPtrOpName(BitcastTaggedToWord(a), BitcastTaggedToWord(b)); \
|
| + }
|
| + SMI_COMPARISON_OP(SmiEqual, WordEqual)
|
| + SMI_COMPARISON_OP(SmiAbove, UintPtrGreaterThan)
|
| + SMI_COMPARISON_OP(SmiAboveOrEqual, UintPtrGreaterThanOrEqual)
|
| + SMI_COMPARISON_OP(SmiBelow, UintPtrLessThan)
|
| + SMI_COMPARISON_OP(SmiLessThan, IntPtrLessThan)
|
| + SMI_COMPARISON_OP(SmiLessThanOrEqual, IntPtrLessThanOrEqual)
|
| + SMI_COMPARISON_OP(SmiGreaterThan, IntPtrGreaterThan)
|
| +#undef SMI_COMPARISON_OP
|
| Node* SmiMax(Node* a, Node* b);
|
| Node* SmiMin(Node* a, Node* b);
|
| // Computes a % b for Smi inputs a and b; result is not necessarily a Smi.
|
| Node* SmiMod(Node* a, Node* b);
|
| // Computes a * b for Smi inputs a and b; result is not necessarily a Smi.
|
| Node* SmiMul(Node* a, Node* b);
|
| - Node* SmiOr(Node* a, Node* b) {
|
| - return BitcastWordToTaggedSigned(
|
| - WordOr(BitcastTaggedToWord(a), BitcastTaggedToWord(b)));
|
| - }
|
|
|
| // Smi | HeapNumber operations.
|
| Node* NumberInc(Node* value);
|
| @@ -708,6 +729,13 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
|
| return DecodeWord<T>(ChangeUint32ToWord(word32));
|
| }
|
|
|
| + // Returns a node that contains a decoded (unsigned!) value of a bit
|
| + // field |T| in |word|. Returns result as an uint32 node.
|
| + template <typename T>
|
| + Node* DecodeWord32FromWord(Node* word) {
|
| + return TruncateWordToWord32(DecodeWord<T>(word));
|
| + }
|
| +
|
| // Decodes an unsigned (!) value from |word32| to an uint32 node.
|
| Node* DecodeWord32(Node* word32, uint32_t shift, uint32_t mask);
|
|
|
| @@ -861,7 +889,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
|
| Label* if_not_found, Label* if_bailout);
|
|
|
| // This is a type of a lookup in holder generator function. In case of a
|
| - // property lookup the {key} is guaranteed to be a unique name and in case of
|
| + // property lookup the {key} is guaranteed to be an unique name and in case of
|
| // element lookup the key is an Int32 index.
|
| typedef std::function<void(Node* receiver, Node* holder, Node* map,
|
| Node* instance_type, Node* key, Label* next_holder,
|
|
|