| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 3532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3543 ASSERT(slot != NULL); | 3543 ASSERT(slot != NULL); |
| 3544 | 3544 |
| 3545 // Evaluate the right-hand side. | 3545 // Evaluate the right-hand side. |
| 3546 if (node->is_compound()) { | 3546 if (node->is_compound()) { |
| 3547 // For a compound assignment the right-hand side is a binary operation | 3547 // For a compound assignment the right-hand side is a binary operation |
| 3548 // between the current property value and the actual right-hand side. | 3548 // between the current property value and the actual right-hand side. |
| 3549 LoadFromSlotCheckForArguments(slot, NOT_INSIDE_TYPEOF); | 3549 LoadFromSlotCheckForArguments(slot, NOT_INSIDE_TYPEOF); |
| 3550 | 3550 |
| 3551 // Perform the binary operation. | 3551 // Perform the binary operation. |
| 3552 Literal* literal = node->value()->AsLiteral(); | 3552 Literal* literal = node->value()->AsLiteral(); |
| 3553 bool overwrite_value = | 3553 bool overwrite_value = node->value()->ResultOverwriteAllowed(); |
| 3554 (node->value()->AsBinaryOperation() != NULL && | |
| 3555 node->value()->AsBinaryOperation()->ResultOverwriteAllowed()); | |
| 3556 if (literal != NULL && literal->handle()->IsSmi()) { | 3554 if (literal != NULL && literal->handle()->IsSmi()) { |
| 3557 SmiOperation(node->binary_op(), | 3555 SmiOperation(node->binary_op(), |
| 3558 literal->handle(), | 3556 literal->handle(), |
| 3559 false, | 3557 false, |
| 3560 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); | 3558 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); |
| 3561 } else { | 3559 } else { |
| 3562 GenerateInlineSmi inline_smi = | 3560 GenerateInlineSmi inline_smi = |
| 3563 loop_nesting() > 0 ? GENERATE_INLINE_SMI : DONT_GENERATE_INLINE_SMI; | 3561 loop_nesting() > 0 ? GENERATE_INLINE_SMI : DONT_GENERATE_INLINE_SMI; |
| 3564 if (literal != NULL) { | 3562 if (literal != NULL) { |
| 3565 ASSERT(!literal->handle()->IsSmi()); | 3563 ASSERT(!literal->handle()->IsSmi()); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3643 Load(prop->obj()); | 3641 Load(prop->obj()); |
| 3644 } else if (var != NULL) { | 3642 } else if (var != NULL) { |
| 3645 LoadGlobal(); | 3643 LoadGlobal(); |
| 3646 } else { | 3644 } else { |
| 3647 frame_->Dup(); | 3645 frame_->Dup(); |
| 3648 } | 3646 } |
| 3649 EmitNamedLoad(name, var != NULL); | 3647 EmitNamedLoad(name, var != NULL); |
| 3650 | 3648 |
| 3651 // Perform the binary operation. | 3649 // Perform the binary operation. |
| 3652 Literal* literal = node->value()->AsLiteral(); | 3650 Literal* literal = node->value()->AsLiteral(); |
| 3653 bool overwrite_value = | 3651 bool overwrite_value = node->value()->ResultOverwriteAllowed(); |
| 3654 (node->value()->AsBinaryOperation() != NULL && | |
| 3655 node->value()->AsBinaryOperation()->ResultOverwriteAllowed()); | |
| 3656 if (literal != NULL && literal->handle()->IsSmi()) { | 3652 if (literal != NULL && literal->handle()->IsSmi()) { |
| 3657 SmiOperation(node->binary_op(), | 3653 SmiOperation(node->binary_op(), |
| 3658 literal->handle(), | 3654 literal->handle(), |
| 3659 false, | 3655 false, |
| 3660 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); | 3656 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); |
| 3661 } else { | 3657 } else { |
| 3662 GenerateInlineSmi inline_smi = | 3658 GenerateInlineSmi inline_smi = |
| 3663 loop_nesting() > 0 ? GENERATE_INLINE_SMI : DONT_GENERATE_INLINE_SMI; | 3659 loop_nesting() > 0 ? GENERATE_INLINE_SMI : DONT_GENERATE_INLINE_SMI; |
| 3664 if (literal != NULL) { | 3660 if (literal != NULL) { |
| 3665 ASSERT(!literal->handle()->IsSmi()); | 3661 ASSERT(!literal->handle()->IsSmi()); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3759 if (node->is_compound()) { | 3755 if (node->is_compound()) { |
| 3760 // For a compound assignment the right-hand side is a binary operation | 3756 // For a compound assignment the right-hand side is a binary operation |
| 3761 // between the current property value and the actual right-hand side. | 3757 // between the current property value and the actual right-hand side. |
| 3762 // Duplicate receiver and key for loading the current property value. | 3758 // Duplicate receiver and key for loading the current property value. |
| 3763 frame_->Dup2(); | 3759 frame_->Dup2(); |
| 3764 EmitKeyedLoad(); | 3760 EmitKeyedLoad(); |
| 3765 frame_->EmitPush(r0); | 3761 frame_->EmitPush(r0); |
| 3766 | 3762 |
| 3767 // Perform the binary operation. | 3763 // Perform the binary operation. |
| 3768 Literal* literal = node->value()->AsLiteral(); | 3764 Literal* literal = node->value()->AsLiteral(); |
| 3769 bool overwrite_value = | 3765 bool overwrite_value = node->value()->ResultOverwriteAllowed(); |
| 3770 (node->value()->AsBinaryOperation() != NULL && | |
| 3771 node->value()->AsBinaryOperation()->ResultOverwriteAllowed()); | |
| 3772 if (literal != NULL && literal->handle()->IsSmi()) { | 3766 if (literal != NULL && literal->handle()->IsSmi()) { |
| 3773 SmiOperation(node->binary_op(), | 3767 SmiOperation(node->binary_op(), |
| 3774 literal->handle(), | 3768 literal->handle(), |
| 3775 false, | 3769 false, |
| 3776 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); | 3770 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); |
| 3777 } else { | 3771 } else { |
| 3778 GenerateInlineSmi inline_smi = | 3772 GenerateInlineSmi inline_smi = |
| 3779 loop_nesting() > 0 ? GENERATE_INLINE_SMI : DONT_GENERATE_INLINE_SMI; | 3773 loop_nesting() > 0 ? GENERATE_INLINE_SMI : DONT_GENERATE_INLINE_SMI; |
| 3780 if (literal != NULL) { | 3774 if (literal != NULL) { |
| 3781 ASSERT(!literal->handle()->IsSmi()); | 3775 ASSERT(!literal->handle()->IsSmi()); |
| (...skipping 1966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5748 } | 5742 } |
| 5749 | 5743 |
| 5750 } else if (op == Token::TYPEOF) { | 5744 } else if (op == Token::TYPEOF) { |
| 5751 // Special case for loading the typeof expression; see comment on | 5745 // Special case for loading the typeof expression; see comment on |
| 5752 // LoadTypeofExpression(). | 5746 // LoadTypeofExpression(). |
| 5753 LoadTypeofExpression(node->expression()); | 5747 LoadTypeofExpression(node->expression()); |
| 5754 frame_->CallRuntime(Runtime::kTypeof, 1); | 5748 frame_->CallRuntime(Runtime::kTypeof, 1); |
| 5755 frame_->EmitPush(r0); // r0 has result | 5749 frame_->EmitPush(r0); // r0 has result |
| 5756 | 5750 |
| 5757 } else { | 5751 } else { |
| 5758 bool can_overwrite = | 5752 bool can_overwrite = node->expression()->ResultOverwriteAllowed(); |
| 5759 (node->expression()->AsBinaryOperation() != NULL && | |
| 5760 node->expression()->AsBinaryOperation()->ResultOverwriteAllowed()); | |
| 5761 UnaryOverwriteMode overwrite = | 5753 UnaryOverwriteMode overwrite = |
| 5762 can_overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE; | 5754 can_overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE; |
| 5763 | 5755 |
| 5764 bool no_negative_zero = node->expression()->no_negative_zero(); | 5756 bool no_negative_zero = node->expression()->no_negative_zero(); |
| 5765 Load(node->expression()); | 5757 Load(node->expression()); |
| 5766 switch (op) { | 5758 switch (op) { |
| 5767 case Token::NOT: | 5759 case Token::NOT: |
| 5768 case Token::DELETE: | 5760 case Token::DELETE: |
| 5769 case Token::TYPEOF: | 5761 case Token::TYPEOF: |
| 5770 UNREACHABLE(); // handled above | 5762 UNREACHABLE(); // handled above |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6074 | 6066 |
| 6075 if (node->op() == Token::AND || node->op() == Token::OR) { | 6067 if (node->op() == Token::AND || node->op() == Token::OR) { |
| 6076 GenerateLogicalBooleanOperation(node); | 6068 GenerateLogicalBooleanOperation(node); |
| 6077 } else { | 6069 } else { |
| 6078 // Optimize for the case where (at least) one of the expressions | 6070 // Optimize for the case where (at least) one of the expressions |
| 6079 // is a literal small integer. | 6071 // is a literal small integer. |
| 6080 Literal* lliteral = node->left()->AsLiteral(); | 6072 Literal* lliteral = node->left()->AsLiteral(); |
| 6081 Literal* rliteral = node->right()->AsLiteral(); | 6073 Literal* rliteral = node->right()->AsLiteral(); |
| 6082 // NOTE: The code below assumes that the slow cases (calls to runtime) | 6074 // NOTE: The code below assumes that the slow cases (calls to runtime) |
| 6083 // never return a constant/immutable object. | 6075 // never return a constant/immutable object. |
| 6084 bool overwrite_left = | 6076 bool overwrite_left = node->left()->ResultOverwriteAllowed(); |
| 6085 (node->left()->AsBinaryOperation() != NULL && | 6077 bool overwrite_right = node->right()->ResultOverwriteAllowed(); |
| 6086 node->left()->AsBinaryOperation()->ResultOverwriteAllowed()); | |
| 6087 bool overwrite_right = | |
| 6088 (node->right()->AsBinaryOperation() != NULL && | |
| 6089 node->right()->AsBinaryOperation()->ResultOverwriteAllowed()); | |
| 6090 | 6078 |
| 6091 if (rliteral != NULL && rliteral->handle()->IsSmi()) { | 6079 if (rliteral != NULL && rliteral->handle()->IsSmi()) { |
| 6092 VirtualFrame::RegisterAllocationScope scope(this); | 6080 VirtualFrame::RegisterAllocationScope scope(this); |
| 6093 Load(node->left()); | 6081 Load(node->left()); |
| 6094 if (frame_->KnownSmiAt(0)) overwrite_left = false; | 6082 if (frame_->KnownSmiAt(0)) overwrite_left = false; |
| 6095 SmiOperation(node->op(), | 6083 SmiOperation(node->op(), |
| 6096 rliteral->handle(), | 6084 rliteral->handle(), |
| 6097 false, | 6085 false, |
| 6098 overwrite_left ? OVERWRITE_LEFT : NO_OVERWRITE); | 6086 overwrite_left ? OVERWRITE_LEFT : NO_OVERWRITE); |
| 6099 } else if (lliteral != NULL && lliteral->handle()->IsSmi()) { | 6087 } else if (lliteral != NULL && lliteral->handle()->IsSmi()) { |
| (...skipping 995 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7095 BinaryOpIC::GetName(runtime_operands_type_)); | 7083 BinaryOpIC::GetName(runtime_operands_type_)); |
| 7096 return name_; | 7084 return name_; |
| 7097 } | 7085 } |
| 7098 | 7086 |
| 7099 | 7087 |
| 7100 #undef __ | 7088 #undef __ |
| 7101 | 7089 |
| 7102 } } // namespace v8::internal | 7090 } } // namespace v8::internal |
| 7103 | 7091 |
| 7104 #endif // V8_TARGET_ARCH_ARM | 7092 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |