| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 new(zone()) HCompareIDAndBranch(phi_, terminating, token); | 711 new(zone()) HCompareIDAndBranch(phi_, terminating, token); |
| 712 compare->ChangeRepresentation(Representation::Integer32()); | 712 compare->ChangeRepresentation(Representation::Integer32()); |
| 713 compare->SetSuccessorAt(0, body_block_); | 713 compare->SetSuccessorAt(0, body_block_); |
| 714 compare->SetSuccessorAt(1, exit_block_); | 714 compare->SetSuccessorAt(1, exit_block_); |
| 715 builder_->current_block()->Finish(compare); | 715 builder_->current_block()->Finish(compare); |
| 716 | 716 |
| 717 builder_->set_current_block(body_block_); | 717 builder_->set_current_block(body_block_); |
| 718 if (direction_ == kPreIncrement || direction_ == kPreDecrement) { | 718 if (direction_ == kPreIncrement || direction_ == kPreDecrement) { |
| 719 HValue* one = builder_->graph()->GetConstant1(); | 719 HValue* one = builder_->graph()->GetConstant1(); |
| 720 if (direction_ == kPreIncrement) { | 720 if (direction_ == kPreIncrement) { |
| 721 increment_ = new(zone()) HAdd(context_, phi_, one); | 721 increment_ = HAdd::New(zone(), context_, phi_, one); |
| 722 } else { | 722 } else { |
| 723 increment_ = new(zone()) HSub(context_, phi_, one); | 723 increment_ = HSub::New(zone(), context_, phi_, one); |
| 724 } | 724 } |
| 725 increment_->ClearFlag(HValue::kCanOverflow); | 725 increment_->ClearFlag(HValue::kCanOverflow); |
| 726 increment_->ChangeRepresentation(Representation::Integer32()); | 726 increment_->ChangeRepresentation(Representation::Integer32()); |
| 727 builder_->AddInstruction(increment_); | 727 builder_->AddInstruction(increment_); |
| 728 return increment_; | 728 return increment_; |
| 729 } else { | 729 } else { |
| 730 return phi_; | 730 return phi_; |
| 731 } | 731 } |
| 732 } | 732 } |
| 733 | 733 |
| 734 | 734 |
| 735 void HGraphBuilder::LoopBuilder::EndBody() { | 735 void HGraphBuilder::LoopBuilder::EndBody() { |
| 736 ASSERT(!finished_); | 736 ASSERT(!finished_); |
| 737 | 737 |
| 738 if (direction_ == kPostIncrement || direction_ == kPostDecrement) { | 738 if (direction_ == kPostIncrement || direction_ == kPostDecrement) { |
| 739 HValue* one = builder_->graph()->GetConstant1(); | 739 HValue* one = builder_->graph()->GetConstant1(); |
| 740 if (direction_ == kPostIncrement) { | 740 if (direction_ == kPostIncrement) { |
| 741 increment_ = new(zone()) HAdd(context_, phi_, one); | 741 increment_ = HAdd::New(zone(), context_, phi_, one); |
| 742 } else { | 742 } else { |
| 743 increment_ = new(zone()) HSub(context_, phi_, one); | 743 increment_ = HSub::New(zone(), context_, phi_, one); |
| 744 } | 744 } |
| 745 increment_->ClearFlag(HValue::kCanOverflow); | 745 increment_->ClearFlag(HValue::kCanOverflow); |
| 746 increment_->ChangeRepresentation(Representation::Integer32()); | 746 increment_->ChangeRepresentation(Representation::Integer32()); |
| 747 builder_->AddInstruction(increment_); | 747 builder_->AddInstruction(increment_); |
| 748 } | 748 } |
| 749 | 749 |
| 750 builder_->environment()->Push(increment_); | 750 builder_->environment()->Push(increment_); |
| 751 builder_->current_block()->Goto(header_block_); | 751 builder_->current_block()->Goto(header_block_); |
| 752 header_block_->loop_information()->RegisterBackEdge(body_block_); | 752 header_block_->loop_information()->RegisterBackEdge(body_block_); |
| 753 header_block_->SetJoinId(BailoutId::StubEntry()); | 753 header_block_->SetJoinId(BailoutId::StubEntry()); |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 967 ElementsKind kind, | 967 ElementsKind kind, |
| 968 HValue* capacity) { | 968 HValue* capacity) { |
| 969 Zone* zone = this->zone(); | 969 Zone* zone = this->zone(); |
| 970 | 970 |
| 971 int elements_size = IsFastDoubleElementsKind(kind) | 971 int elements_size = IsFastDoubleElementsKind(kind) |
| 972 ? kDoubleSize : kPointerSize; | 972 ? kDoubleSize : kPointerSize; |
| 973 HConstant* elements_size_value = | 973 HConstant* elements_size_value = |
| 974 new(zone) HConstant(elements_size, Representation::Integer32()); | 974 new(zone) HConstant(elements_size, Representation::Integer32()); |
| 975 AddInstruction(elements_size_value); | 975 AddInstruction(elements_size_value); |
| 976 HValue* mul = AddInstruction( | 976 HValue* mul = AddInstruction( |
| 977 new(zone) HMul(context, capacity, elements_size_value)); | 977 HMul::New(zone, context, capacity, elements_size_value)); |
| 978 mul->ChangeRepresentation(Representation::Integer32()); | 978 mul->ChangeRepresentation(Representation::Integer32()); |
| 979 mul->ClearFlag(HValue::kCanOverflow); | 979 mul->ClearFlag(HValue::kCanOverflow); |
| 980 | 980 |
| 981 HConstant* header_size = | 981 HConstant* header_size = |
| 982 new(zone) HConstant(FixedArray::kHeaderSize, Representation::Integer32()); | 982 new(zone) HConstant(FixedArray::kHeaderSize, Representation::Integer32()); |
| 983 AddInstruction(header_size); | 983 AddInstruction(header_size); |
| 984 HValue* total_size = AddInstruction( | 984 HValue* total_size = AddInstruction( |
| 985 new(zone) HAdd(context, mul, header_size)); | 985 HAdd::New(zone, context, mul, header_size)); |
| 986 total_size->ChangeRepresentation(Representation::Integer32()); | 986 total_size->ChangeRepresentation(Representation::Integer32()); |
| 987 total_size->ClearFlag(HValue::kCanOverflow); | 987 total_size->ClearFlag(HValue::kCanOverflow); |
| 988 | 988 |
| 989 HAllocate::Flags flags = HAllocate::CAN_ALLOCATE_IN_NEW_SPACE; | 989 HAllocate::Flags flags = HAllocate::CAN_ALLOCATE_IN_NEW_SPACE; |
| 990 if (IsFastDoubleElementsKind(kind)) { | 990 if (IsFastDoubleElementsKind(kind)) { |
| 991 flags = static_cast<HAllocate::Flags>( | 991 flags = static_cast<HAllocate::Flags>( |
| 992 flags | HAllocate::ALLOCATE_DOUBLE_ALIGNED); | 992 flags | HAllocate::ALLOCATE_DOUBLE_ALIGNED); |
| 993 } | 993 } |
| 994 | 994 |
| 995 HValue* elements = | 995 HValue* elements = |
| (...skipping 3107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4103 next_in_bb_(next_in_bb), | 4103 next_in_bb_(next_in_bb), |
| 4104 father_in_dt_(father_in_dt) { } | 4104 father_in_dt_(father_in_dt) { } |
| 4105 | 4105 |
| 4106 private: | 4106 private: |
| 4107 BoundsCheckKey* key_; | 4107 BoundsCheckKey* key_; |
| 4108 int32_t lower_offset_; | 4108 int32_t lower_offset_; |
| 4109 int32_t upper_offset_; | 4109 int32_t upper_offset_; |
| 4110 HBasicBlock* basic_block_; | 4110 HBasicBlock* basic_block_; |
| 4111 HBoundsCheck* lower_check_; | 4111 HBoundsCheck* lower_check_; |
| 4112 HBoundsCheck* upper_check_; | 4112 HBoundsCheck* upper_check_; |
| 4113 HAdd* added_lower_index_; | 4113 HInstruction* added_lower_index_; |
| 4114 HConstant* added_lower_offset_; | 4114 HConstant* added_lower_offset_; |
| 4115 HAdd* added_upper_index_; | 4115 HInstruction* added_upper_index_; |
| 4116 HConstant* added_upper_offset_; | 4116 HConstant* added_upper_offset_; |
| 4117 BoundsCheckBbData* next_in_bb_; | 4117 BoundsCheckBbData* next_in_bb_; |
| 4118 BoundsCheckBbData* father_in_dt_; | 4118 BoundsCheckBbData* father_in_dt_; |
| 4119 | 4119 |
| 4120 // Given an existing add instruction and a bounds check it tries to | 4120 // Given an existing add instruction and a bounds check it tries to |
| 4121 // find the current context (either of the add or of the check index). | 4121 // find the current context (either of the add or of the check index). |
| 4122 HValue* IndexContext(HAdd* add, HBoundsCheck* check) { | 4122 HValue* IndexContext(HInstruction* add, HBoundsCheck* check) { |
| 4123 if (add != NULL) { | 4123 if (add != NULL && add->IsAdd()) { |
| 4124 return add->context(); | 4124 return HAdd::cast(add)->context(); |
| 4125 } | 4125 } |
| 4126 if (check->index()->IsBinaryOperation()) { | 4126 if (check->index()->IsBinaryOperation()) { |
| 4127 return HBinaryOperation::cast(check->index())->context(); | 4127 return HBinaryOperation::cast(check->index())->context(); |
| 4128 } | 4128 } |
| 4129 return NULL; | 4129 return NULL; |
| 4130 } | 4130 } |
| 4131 | 4131 |
| 4132 // This function returns false if it cannot build the add because the | 4132 // This function returns false if it cannot build the add because the |
| 4133 // current context cannot be determined. | 4133 // current context cannot be determined. |
| 4134 bool BuildOffsetAdd(HBoundsCheck* check, | 4134 bool BuildOffsetAdd(HBoundsCheck* check, |
| 4135 HAdd** add, | 4135 HInstruction** add, |
| 4136 HConstant** constant, | 4136 HConstant** constant, |
| 4137 HValue* original_value, | 4137 HValue* original_value, |
| 4138 Representation representation, | 4138 Representation representation, |
| 4139 int32_t new_offset) { | 4139 int32_t new_offset) { |
| 4140 HValue* index_context = IndexContext(*add, check); | 4140 HValue* index_context = IndexContext(*add, check); |
| 4141 if (index_context == NULL) return false; | 4141 if (index_context == NULL) return false; |
| 4142 | 4142 |
| 4143 HConstant* new_constant = new(BasicBlock()->zone()) | 4143 HConstant* new_constant = new(BasicBlock()->zone()) |
| 4144 HConstant(new_offset, Representation::Integer32()); | 4144 HConstant(new_offset, Representation::Integer32()); |
| 4145 if (*add == NULL) { | 4145 if (*add == NULL) { |
| 4146 new_constant->InsertBefore(check); | 4146 new_constant->InsertBefore(check); |
| 4147 *add = new(BasicBlock()->zone()) HAdd(index_context, | 4147 (*add) = HAdd::New( |
| 4148 original_value, | 4148 BasicBlock()->zone(), index_context, original_value, new_constant); |
| 4149 new_constant); | |
| 4150 (*add)->AssumeRepresentation(representation); | 4149 (*add)->AssumeRepresentation(representation); |
| 4151 (*add)->InsertBefore(check); | 4150 (*add)->InsertBefore(check); |
| 4152 } else { | 4151 } else { |
| 4153 new_constant->InsertBefore(*add); | 4152 new_constant->InsertBefore(*add); |
| 4154 (*constant)->DeleteAndReplaceWith(new_constant); | 4153 (*constant)->DeleteAndReplaceWith(new_constant); |
| 4155 } | 4154 } |
| 4156 *constant = new_constant; | 4155 *constant = new_constant; |
| 4157 return true; | 4156 return true; |
| 4158 } | 4157 } |
| 4159 | 4158 |
| 4160 void RemoveZeroAdd(HAdd** add, HConstant** constant) { | 4159 void RemoveZeroAdd(HInstruction** add, HConstant** constant) { |
| 4161 if (*add != NULL && (*constant)->Integer32Value() == 0) { | 4160 if (*add != NULL && (*add)->IsAdd() && (*constant)->Integer32Value() == 0) { |
| 4162 (*add)->DeleteAndReplaceWith((*add)->left()); | 4161 (*add)->DeleteAndReplaceWith(HAdd::cast(*add)->left()); |
| 4163 (*constant)->DeleteAndReplaceWith(NULL); | 4162 (*constant)->DeleteAndReplaceWith(NULL); |
| 4164 } | 4163 } |
| 4165 } | 4164 } |
| 4166 }; | 4165 }; |
| 4167 | 4166 |
| 4168 | 4167 |
| 4169 static bool BoundsCheckKeyMatch(void* key1, void* key2) { | 4168 static bool BoundsCheckKeyMatch(void* key1, void* key2) { |
| 4170 BoundsCheckKey* k1 = static_cast<BoundsCheckKey*>(key1); | 4169 BoundsCheckKey* k1 = static_cast<BoundsCheckKey*>(key1); |
| 4171 BoundsCheckKey* k2 = static_cast<BoundsCheckKey*>(key2); | 4170 BoundsCheckKey* k2 = static_cast<BoundsCheckKey*>(key2); |
| 4172 return k1->IndexBase() == k2->IndexBase() && k1->Length() == k2->Length(); | 4171 return k1->IndexBase() == k2->IndexBase() && k1->Length() == k2->Length(); |
| (...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5204 BreakAndContinueInfo break_info(stmt, 5); | 5203 BreakAndContinueInfo break_info(stmt, 5); |
| 5205 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry, &break_info)); | 5204 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry, &break_info)); |
| 5206 | 5205 |
| 5207 HBasicBlock* body_exit = | 5206 HBasicBlock* body_exit = |
| 5208 JoinContinue(stmt, current_block(), break_info.continue_block()); | 5207 JoinContinue(stmt, current_block(), break_info.continue_block()); |
| 5209 | 5208 |
| 5210 if (body_exit != NULL) { | 5209 if (body_exit != NULL) { |
| 5211 set_current_block(body_exit); | 5210 set_current_block(body_exit); |
| 5212 | 5211 |
| 5213 HValue* current_index = Pop(); | 5212 HValue* current_index = Pop(); |
| 5214 HInstruction* new_index = new(zone()) HAdd(environment()->LookupContext(), | 5213 HInstruction* new_index = HAdd::New(zone(), |
| 5215 current_index, | 5214 environment()->LookupContext(), |
| 5216 graph()->GetConstant1()); | 5215 current_index, |
| 5216 graph()->GetConstant1()); |
| 5217 new_index->AssumeRepresentation(Representation::Integer32()); | 5217 new_index->AssumeRepresentation(Representation::Integer32()); |
| 5218 PushAndAdd(new_index); | 5218 PushAndAdd(new_index); |
| 5219 body_exit = current_block(); | 5219 body_exit = current_block(); |
| 5220 } | 5220 } |
| 5221 | 5221 |
| 5222 HBasicBlock* loop_exit = CreateLoop(stmt, | 5222 HBasicBlock* loop_exit = CreateLoop(stmt, |
| 5223 loop_entry, | 5223 loop_entry, |
| 5224 body_exit, | 5224 body_exit, |
| 5225 loop_successor, | 5225 loop_successor, |
| 5226 break_info.break_block()); | 5226 break_info.break_block()); |
| (...skipping 1883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7110 if (expr->AsProperty()->IsArrayLength()) { | 7110 if (expr->AsProperty()->IsArrayLength()) { |
| 7111 HValue* array = Pop(); | 7111 HValue* array = Pop(); |
| 7112 AddInstruction(new(zone()) HCheckNonSmi(array)); | 7112 AddInstruction(new(zone()) HCheckNonSmi(array)); |
| 7113 HInstruction* mapcheck = | 7113 HInstruction* mapcheck = |
| 7114 AddInstruction(HCheckInstanceType::NewIsJSArray(array, zone())); | 7114 AddInstruction(HCheckInstanceType::NewIsJSArray(array, zone())); |
| 7115 instr = new(zone()) HJSArrayLength(array, mapcheck); | 7115 instr = new(zone()) HJSArrayLength(array, mapcheck); |
| 7116 } else if (expr->IsStringLength()) { | 7116 } else if (expr->IsStringLength()) { |
| 7117 HValue* string = Pop(); | 7117 HValue* string = Pop(); |
| 7118 AddInstruction(new(zone()) HCheckNonSmi(string)); | 7118 AddInstruction(new(zone()) HCheckNonSmi(string)); |
| 7119 AddInstruction(HCheckInstanceType::NewIsString(string, zone())); | 7119 AddInstruction(HCheckInstanceType::NewIsString(string, zone())); |
| 7120 instr = new(zone()) HStringLength(string); | 7120 instr = HStringLength::New(zone(), string); |
| 7121 } else if (expr->IsStringAccess()) { | 7121 } else if (expr->IsStringAccess()) { |
| 7122 CHECK_ALIVE(VisitForValue(expr->key())); | 7122 CHECK_ALIVE(VisitForValue(expr->key())); |
| 7123 HValue* index = Pop(); | 7123 HValue* index = Pop(); |
| 7124 HValue* string = Pop(); | 7124 HValue* string = Pop(); |
| 7125 HValue* context = environment()->LookupContext(); | 7125 HValue* context = environment()->LookupContext(); |
| 7126 HStringCharCodeAt* char_code = | 7126 HInstruction* char_code = |
| 7127 BuildStringCharCodeAt(context, string, index); | 7127 BuildStringCharCodeAt(context, string, index); |
| 7128 AddInstruction(char_code); | 7128 AddInstruction(char_code); |
| 7129 instr = new(zone()) HStringCharFromCode(context, char_code); | 7129 instr = HStringCharFromCode::New(zone(), context, char_code); |
| 7130 | 7130 |
| 7131 } else if (expr->IsFunctionPrototype()) { | 7131 } else if (expr->IsFunctionPrototype()) { |
| 7132 HValue* function = Pop(); | 7132 HValue* function = Pop(); |
| 7133 AddInstruction(new(zone()) HCheckNonSmi(function)); | 7133 AddInstruction(new(zone()) HCheckNonSmi(function)); |
| 7134 instr = new(zone()) HLoadFunctionPrototype(function); | 7134 instr = new(zone()) HLoadFunctionPrototype(function); |
| 7135 | 7135 |
| 7136 } else if (expr->key()->IsPropertyName()) { | 7136 } else if (expr->key()->IsPropertyName()) { |
| 7137 Handle<String> name = expr->key()->AsLiteral()->AsPropertyName(); | 7137 Handle<String> name = expr->key()->AsLiteral()->AsPropertyName(); |
| 7138 SmallMapList* types = expr->GetReceiverTypes(); | 7138 SmallMapList* types = expr->GetReceiverTypes(); |
| 7139 HValue* object = Top(); | 7139 HValue* object = Top(); |
| (...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7789 | 7789 |
| 7790 bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr, | 7790 bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr, |
| 7791 bool drop_extra) { | 7791 bool drop_extra) { |
| 7792 if (!expr->target()->shared()->HasBuiltinFunctionId()) return false; | 7792 if (!expr->target()->shared()->HasBuiltinFunctionId()) return false; |
| 7793 BuiltinFunctionId id = expr->target()->shared()->builtin_function_id(); | 7793 BuiltinFunctionId id = expr->target()->shared()->builtin_function_id(); |
| 7794 switch (id) { | 7794 switch (id) { |
| 7795 case kMathExp: | 7795 case kMathExp: |
| 7796 if (!FLAG_fast_math) break; | 7796 if (!FLAG_fast_math) break; |
| 7797 // Fall through if FLAG_fast_math. | 7797 // Fall through if FLAG_fast_math. |
| 7798 case kMathRound: | 7798 case kMathRound: |
| 7799 case kMathFloor: |
| 7799 case kMathAbs: | 7800 case kMathAbs: |
| 7800 case kMathSqrt: | 7801 case kMathSqrt: |
| 7801 case kMathLog: | 7802 case kMathLog: |
| 7802 case kMathSin: | 7803 case kMathSin: |
| 7803 case kMathCos: | 7804 case kMathCos: |
| 7804 case kMathTan: | 7805 case kMathTan: |
| 7805 if (expr->arguments()->length() == 1) { | 7806 if (expr->arguments()->length() == 1) { |
| 7806 HValue* argument = Pop(); | 7807 HValue* argument = Pop(); |
| 7807 HValue* context = environment()->LookupContext(); | 7808 HValue* context = environment()->LookupContext(); |
| 7808 Drop(1); // Receiver. | 7809 Drop(1); // Receiver. |
| 7809 HUnaryMathOperation* op = | 7810 HInstruction* op = |
| 7810 new(zone()) HUnaryMathOperation(context, argument, id); | 7811 HUnaryMathOperation::New(zone(), context, argument, id); |
| 7811 op->set_position(expr->position()); | 7812 op->set_position(expr->position()); |
| 7812 if (drop_extra) Drop(1); // Optionally drop the function. | 7813 if (drop_extra) Drop(1); // Optionally drop the function. |
| 7813 ast_context()->ReturnInstruction(op, expr->id()); | 7814 ast_context()->ReturnInstruction(op, expr->id()); |
| 7814 return true; | 7815 return true; |
| 7815 } | 7816 } |
| 7816 break; | 7817 break; |
| 7817 default: | 7818 default: |
| 7818 // Not supported for inlining yet. | 7819 // Not supported for inlining yet. |
| 7819 break; | 7820 break; |
| 7820 } | 7821 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 7837 case kStringCharAt: | 7838 case kStringCharAt: |
| 7838 if (argument_count == 2 && check_type == STRING_CHECK) { | 7839 if (argument_count == 2 && check_type == STRING_CHECK) { |
| 7839 HValue* index = Pop(); | 7840 HValue* index = Pop(); |
| 7840 HValue* string = Pop(); | 7841 HValue* string = Pop(); |
| 7841 HValue* context = environment()->LookupContext(); | 7842 HValue* context = environment()->LookupContext(); |
| 7842 ASSERT(!expr->holder().is_null()); | 7843 ASSERT(!expr->holder().is_null()); |
| 7843 AddInstruction(new(zone()) HCheckPrototypeMaps( | 7844 AddInstruction(new(zone()) HCheckPrototypeMaps( |
| 7844 oracle()->GetPrototypeForPrimitiveCheck(STRING_CHECK), | 7845 oracle()->GetPrototypeForPrimitiveCheck(STRING_CHECK), |
| 7845 expr->holder(), | 7846 expr->holder(), |
| 7846 zone())); | 7847 zone())); |
| 7847 HStringCharCodeAt* char_code = | 7848 HInstruction* char_code = |
| 7848 BuildStringCharCodeAt(context, string, index); | 7849 BuildStringCharCodeAt(context, string, index); |
| 7849 if (id == kStringCharCodeAt) { | 7850 if (id == kStringCharCodeAt) { |
| 7850 ast_context()->ReturnInstruction(char_code, expr->id()); | 7851 ast_context()->ReturnInstruction(char_code, expr->id()); |
| 7851 return true; | 7852 return true; |
| 7852 } | 7853 } |
| 7853 AddInstruction(char_code); | 7854 AddInstruction(char_code); |
| 7854 HStringCharFromCode* result = | 7855 HInstruction* result = |
| 7855 new(zone()) HStringCharFromCode(context, char_code); | 7856 HStringCharFromCode::New(zone(), context, char_code); |
| 7856 ast_context()->ReturnInstruction(result, expr->id()); | 7857 ast_context()->ReturnInstruction(result, expr->id()); |
| 7857 return true; | 7858 return true; |
| 7858 } | 7859 } |
| 7859 break; | 7860 break; |
| 7860 case kMathExp: | 7861 case kMathExp: |
| 7861 if (!FLAG_fast_math) break; | 7862 if (!FLAG_fast_math) break; |
| 7862 // Fall through if FLAG_fast_math. | 7863 // Fall through if FLAG_fast_math. |
| 7863 case kMathRound: | 7864 case kMathRound: |
| 7864 case kMathFloor: | 7865 case kMathFloor: |
| 7865 case kMathAbs: | 7866 case kMathAbs: |
| 7866 case kMathSqrt: | 7867 case kMathSqrt: |
| 7867 case kMathLog: | 7868 case kMathLog: |
| 7868 case kMathSin: | 7869 case kMathSin: |
| 7869 case kMathCos: | 7870 case kMathCos: |
| 7870 case kMathTan: | 7871 case kMathTan: |
| 7871 if (argument_count == 2 && check_type == RECEIVER_MAP_CHECK) { | 7872 if (argument_count == 2 && check_type == RECEIVER_MAP_CHECK) { |
| 7872 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); | 7873 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); |
| 7873 HValue* argument = Pop(); | 7874 HValue* argument = Pop(); |
| 7874 HValue* context = environment()->LookupContext(); | 7875 HValue* context = environment()->LookupContext(); |
| 7875 Drop(1); // Receiver. | 7876 Drop(1); // Receiver. |
| 7876 HUnaryMathOperation* op = | 7877 HInstruction* op = |
| 7877 new(zone()) HUnaryMathOperation(context, argument, id); | 7878 HUnaryMathOperation::New(zone(), context, argument, id); |
| 7878 op->set_position(expr->position()); | 7879 op->set_position(expr->position()); |
| 7879 ast_context()->ReturnInstruction(op, expr->id()); | 7880 ast_context()->ReturnInstruction(op, expr->id()); |
| 7880 return true; | 7881 return true; |
| 7881 } | 7882 } |
| 7882 break; | 7883 break; |
| 7883 case kMathPow: | 7884 case kMathPow: |
| 7884 if (argument_count == 3 && check_type == RECEIVER_MAP_CHECK) { | 7885 if (argument_count == 3 && check_type == RECEIVER_MAP_CHECK) { |
| 7885 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); | 7886 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); |
| 7886 HValue* right = Pop(); | 7887 HValue* right = Pop(); |
| 7887 HValue* left = Pop(); | 7888 HValue* left = Pop(); |
| 7888 Pop(); // Pop receiver. | 7889 Pop(); // Pop receiver. |
| 7889 HValue* context = environment()->LookupContext(); | 7890 HValue* context = environment()->LookupContext(); |
| 7890 HInstruction* result = NULL; | 7891 HInstruction* result = NULL; |
| 7891 // Use sqrt() if exponent is 0.5 or -0.5. | 7892 // Use sqrt() if exponent is 0.5 or -0.5. |
| 7892 if (right->IsConstant() && HConstant::cast(right)->HasDoubleValue()) { | 7893 if (right->IsConstant() && HConstant::cast(right)->HasDoubleValue()) { |
| 7893 double exponent = HConstant::cast(right)->DoubleValue(); | 7894 double exponent = HConstant::cast(right)->DoubleValue(); |
| 7894 if (exponent == 0.5) { | 7895 if (exponent == 0.5) { |
| 7895 result = | 7896 result = |
| 7896 new(zone()) HUnaryMathOperation(context, left, kMathPowHalf); | 7897 HUnaryMathOperation::New(zone(), context, left, kMathPowHalf); |
| 7897 } else if (exponent == -0.5) { | 7898 } else if (exponent == -0.5) { |
| 7898 HConstant* double_one = | 7899 HConstant* double_one = |
| 7899 new(zone()) HConstant(Handle<Object>(Smi::FromInt(1)), | 7900 new(zone()) HConstant(Handle<Object>(Smi::FromInt(1)), |
| 7900 Representation::Double()); | 7901 Representation::Double()); |
| 7901 AddInstruction(double_one); | 7902 AddInstruction(double_one); |
| 7902 HUnaryMathOperation* square_root = | 7903 HInstruction* sqrt = |
| 7903 new(zone()) HUnaryMathOperation(context, left, kMathPowHalf); | 7904 HUnaryMathOperation::New(zone(), context, left, kMathPowHalf); |
| 7904 AddInstruction(square_root); | 7905 AddInstruction(sqrt); |
| 7905 // MathPowHalf doesn't have side effects so there's no need for | 7906 // MathPowHalf doesn't have side effects so there's no need for |
| 7906 // an environment simulation here. | 7907 // an environment simulation here. |
| 7907 ASSERT(!square_root->HasObservableSideEffects()); | 7908 ASSERT(!sqrt->HasObservableSideEffects()); |
| 7908 result = new(zone()) HDiv(context, double_one, square_root); | 7909 result = HDiv::New(zone(), context, double_one, sqrt); |
| 7909 } else if (exponent == 2.0) { | 7910 } else if (exponent == 2.0) { |
| 7910 result = new(zone()) HMul(context, left, left); | 7911 result = HMul::New(zone(), context, left, left); |
| 7911 } | 7912 } |
| 7912 } else if (right->IsConstant() && | 7913 } else if (right->IsConstant() && |
| 7913 HConstant::cast(right)->HasInteger32Value() && | 7914 HConstant::cast(right)->HasInteger32Value() && |
| 7914 HConstant::cast(right)->Integer32Value() == 2) { | 7915 HConstant::cast(right)->Integer32Value() == 2) { |
| 7915 result = new(zone()) HMul(context, left, left); | 7916 result = HMul::New(zone(), context, left, left); |
| 7916 } | 7917 } |
| 7917 | 7918 |
| 7918 if (result == NULL) { | 7919 if (result == NULL) { |
| 7919 result = new(zone()) HPower(left, right); | 7920 result = HPower::New(zone(), left, right); |
| 7920 } | 7921 } |
| 7921 ast_context()->ReturnInstruction(result, expr->id()); | 7922 ast_context()->ReturnInstruction(result, expr->id()); |
| 7922 return true; | 7923 return true; |
| 7923 } | 7924 } |
| 7924 break; | 7925 break; |
| 7925 case kMathRandom: | 7926 case kMathRandom: |
| 7926 if (argument_count == 1 && check_type == RECEIVER_MAP_CHECK) { | 7927 if (argument_count == 1 && check_type == RECEIVER_MAP_CHECK) { |
| 7927 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); | 7928 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); |
| 7928 Drop(1); // Receiver. | 7929 Drop(1); // Receiver. |
| 7929 HValue* context = environment()->LookupContext(); | 7930 HValue* context = environment()->LookupContext(); |
| 7930 HGlobalObject* global_object = new(zone()) HGlobalObject(context); | 7931 HGlobalObject* global_object = new(zone()) HGlobalObject(context); |
| 7931 AddInstruction(global_object); | 7932 AddInstruction(global_object); |
| 7932 HRandom* result = new(zone()) HRandom(global_object); | 7933 HRandom* result = new(zone()) HRandom(global_object); |
| 7933 ast_context()->ReturnInstruction(result, expr->id()); | 7934 ast_context()->ReturnInstruction(result, expr->id()); |
| 7934 return true; | 7935 return true; |
| 7935 } | 7936 } |
| 7936 break; | 7937 break; |
| 7937 case kMathMax: | 7938 case kMathMax: |
| 7938 case kMathMin: | 7939 case kMathMin: |
| 7939 if (argument_count == 3 && check_type == RECEIVER_MAP_CHECK) { | 7940 if (argument_count == 3 && check_type == RECEIVER_MAP_CHECK) { |
| 7940 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); | 7941 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); |
| 7941 HValue* right = Pop(); | 7942 HValue* right = Pop(); |
| 7942 HValue* left = Pop(); | 7943 HValue* left = Pop(); |
| 7943 Drop(1); // Receiver. | 7944 Drop(1); // Receiver. |
| 7944 HValue* context = environment()->LookupContext(); | 7945 HValue* context = environment()->LookupContext(); |
| 7945 HMathMinMax::Operation op = (id == kMathMin) ? HMathMinMax::kMathMin | 7946 HMathMinMax::Operation op = (id == kMathMin) ? HMathMinMax::kMathMin |
| 7946 : HMathMinMax::kMathMax; | 7947 : HMathMinMax::kMathMax; |
| 7947 HMathMinMax* result = new(zone()) HMathMinMax(context, left, right, op); | 7948 HInstruction* result = |
| 7949 HMathMinMax::New(zone(), context, left, right, op); |
| 7948 ast_context()->ReturnInstruction(result, expr->id()); | 7950 ast_context()->ReturnInstruction(result, expr->id()); |
| 7949 return true; | 7951 return true; |
| 7950 } | 7952 } |
| 7951 break; | 7953 break; |
| 7952 default: | 7954 default: |
| 7953 // Not yet supported for inlining. | 7955 // Not yet supported for inlining. |
| 7954 break; | 7956 break; |
| 7955 } | 7957 } |
| 7956 return false; | 7958 return false; |
| 7957 } | 7959 } |
| (...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8511 HInstruction* instr = new(zone()) HTypeof(context, value); | 8513 HInstruction* instr = new(zone()) HTypeof(context, value); |
| 8512 return ast_context()->ReturnInstruction(instr, expr->id()); | 8514 return ast_context()->ReturnInstruction(instr, expr->id()); |
| 8513 } | 8515 } |
| 8514 | 8516 |
| 8515 | 8517 |
| 8516 void HOptimizedGraphBuilder::VisitAdd(UnaryOperation* expr) { | 8518 void HOptimizedGraphBuilder::VisitAdd(UnaryOperation* expr) { |
| 8517 CHECK_ALIVE(VisitForValue(expr->expression())); | 8519 CHECK_ALIVE(VisitForValue(expr->expression())); |
| 8518 HValue* value = Pop(); | 8520 HValue* value = Pop(); |
| 8519 HValue* context = environment()->LookupContext(); | 8521 HValue* context = environment()->LookupContext(); |
| 8520 HInstruction* instr = | 8522 HInstruction* instr = |
| 8521 new(zone()) HMul(context, value, graph()->GetConstant1()); | 8523 HMul::New(zone(), context, value, graph()->GetConstant1()); |
| 8522 return ast_context()->ReturnInstruction(instr, expr->id()); | 8524 return ast_context()->ReturnInstruction(instr, expr->id()); |
| 8523 } | 8525 } |
| 8524 | 8526 |
| 8525 | 8527 |
| 8526 void HOptimizedGraphBuilder::VisitSub(UnaryOperation* expr) { | 8528 void HOptimizedGraphBuilder::VisitSub(UnaryOperation* expr) { |
| 8527 CHECK_ALIVE(VisitForValue(expr->expression())); | 8529 CHECK_ALIVE(VisitForValue(expr->expression())); |
| 8528 HValue* value = Pop(); | 8530 HValue* value = Pop(); |
| 8529 HValue* context = environment()->LookupContext(); | 8531 HValue* context = environment()->LookupContext(); |
| 8530 HInstruction* instr = | 8532 HInstruction* instr = |
| 8531 new(zone()) HMul(context, value, graph()->GetConstantMinus1()); | 8533 HMul::New(zone(), context, value, graph()->GetConstantMinus1()); |
| 8532 TypeInfo info = oracle()->UnaryType(expr); | 8534 TypeInfo info = oracle()->UnaryType(expr); |
| 8533 Representation rep = ToRepresentation(info); | 8535 Representation rep = ToRepresentation(info); |
| 8534 if (info.IsUninitialized()) { | 8536 if (info.IsUninitialized()) { |
| 8535 AddSoftDeoptimize(); | 8537 AddSoftDeoptimize(); |
| 8536 info = TypeInfo::Unknown(); | 8538 info = TypeInfo::Unknown(); |
| 8537 } | 8539 } |
| 8538 HBinaryOperation::cast(instr)->set_observed_input_representation(rep, rep); | 8540 if (instr->IsBinaryOperation()) { |
| 8541 HBinaryOperation::cast(instr)->set_observed_input_representation(rep, rep); |
| 8542 } |
| 8539 return ast_context()->ReturnInstruction(instr, expr->id()); | 8543 return ast_context()->ReturnInstruction(instr, expr->id()); |
| 8540 } | 8544 } |
| 8541 | 8545 |
| 8542 | 8546 |
| 8543 void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) { | 8547 void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) { |
| 8544 CHECK_ALIVE(VisitForValue(expr->expression())); | 8548 CHECK_ALIVE(VisitForValue(expr->expression())); |
| 8545 HValue* value = Pop(); | 8549 HValue* value = Pop(); |
| 8546 TypeInfo info = oracle()->UnaryType(expr); | 8550 TypeInfo info = oracle()->UnaryType(expr); |
| 8547 if (info.IsUninitialized()) { | 8551 if (info.IsUninitialized()) { |
| 8548 AddSoftDeoptimize(); | 8552 AddSoftDeoptimize(); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8616 Push(number_input); | 8620 Push(number_input); |
| 8617 } | 8621 } |
| 8618 | 8622 |
| 8619 // The addition has no side effects, so we do not need | 8623 // The addition has no side effects, so we do not need |
| 8620 // to simulate the expression stack after this instruction. | 8624 // to simulate the expression stack after this instruction. |
| 8621 // Any later failures deopt to the load of the input or earlier. | 8625 // Any later failures deopt to the load of the input or earlier. |
| 8622 HConstant* delta = (expr->op() == Token::INC) | 8626 HConstant* delta = (expr->op() == Token::INC) |
| 8623 ? graph()->GetConstant1() | 8627 ? graph()->GetConstant1() |
| 8624 : graph()->GetConstantMinus1(); | 8628 : graph()->GetConstantMinus1(); |
| 8625 HValue* context = environment()->LookupContext(); | 8629 HValue* context = environment()->LookupContext(); |
| 8626 HInstruction* instr = new(zone()) HAdd(context, Top(), delta); | 8630 HInstruction* instr = HAdd::New(zone(), context, Top(), delta); |
| 8627 // We can't insert a simulate here, because it would break deoptimization, | 8631 // We can't insert a simulate here, because it would break deoptimization, |
| 8628 // so the HAdd must not have side effects, so we must freeze its | 8632 // so the HAdd must not have side effects, so we must freeze its |
| 8629 // representation. | 8633 // representation. |
| 8630 instr->AssumeRepresentation(rep); | 8634 instr->AssumeRepresentation(rep); |
| 8631 instr->ClearAllSideEffects(); | 8635 instr->ClearAllSideEffects(); |
| 8632 AddInstruction(instr); | 8636 AddInstruction(instr); |
| 8633 return instr; | 8637 return instr; |
| 8634 } | 8638 } |
| 8635 | 8639 |
| 8636 | 8640 |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8812 ASSERT(has_side_effects); // Stores always have side effects. | 8816 ASSERT(has_side_effects); // Stores always have side effects. |
| 8813 AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); | 8817 AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |
| 8814 } | 8818 } |
| 8815 } | 8819 } |
| 8816 | 8820 |
| 8817 Drop(returns_original_input ? 2 : 1); | 8821 Drop(returns_original_input ? 2 : 1); |
| 8818 return ast_context()->ReturnValue(expr->is_postfix() ? input : after); | 8822 return ast_context()->ReturnValue(expr->is_postfix() ? input : after); |
| 8819 } | 8823 } |
| 8820 | 8824 |
| 8821 | 8825 |
| 8822 HStringCharCodeAt* HOptimizedGraphBuilder::BuildStringCharCodeAt( | 8826 HInstruction* HOptimizedGraphBuilder::BuildStringCharCodeAt( |
| 8823 HValue* context, | 8827 HValue* context, |
| 8824 HValue* string, | 8828 HValue* string, |
| 8825 HValue* index) { | 8829 HValue* index) { |
| 8830 if (string->IsConstant() && index->IsConstant()) { |
| 8831 HConstant* c_string = HConstant::cast(string); |
| 8832 HConstant* c_index = HConstant::cast(index); |
| 8833 if (c_string->HasStringValue() && c_index->HasNumberValue()) { |
| 8834 int32_t i = c_index->NumberValueAsInteger32(); |
| 8835 Handle<String> s = c_string->StringValue(); |
| 8836 if (i < 0 || i >= s->length()) { |
| 8837 return new(zone()) HConstant(OS::nan_value(), Representation::Double()); |
| 8838 } |
| 8839 return new(zone()) HConstant(s->Get(i), Representation::Integer32()); |
| 8840 } |
| 8841 } |
| 8826 AddInstruction(new(zone()) HCheckNonSmi(string)); | 8842 AddInstruction(new(zone()) HCheckNonSmi(string)); |
| 8827 AddInstruction(HCheckInstanceType::NewIsString(string, zone())); | 8843 AddInstruction(HCheckInstanceType::NewIsString(string, zone())); |
| 8828 HStringLength* length = new(zone()) HStringLength(string); | 8844 HInstruction* length = HStringLength::New(zone(), string); |
| 8829 AddInstruction(length); | 8845 AddInstruction(length); |
| 8830 HInstruction* checked_index = AddBoundsCheck(index, length); | 8846 HInstruction* checked_index = AddBoundsCheck(index, length); |
| 8831 return new(zone()) HStringCharCodeAt(context, string, checked_index); | 8847 return new(zone()) HStringCharCodeAt(context, string, checked_index); |
| 8832 } | 8848 } |
| 8833 | 8849 |
| 8834 // Checks if the given shift amounts have form: (sa) and (32 - sa). | 8850 // Checks if the given shift amounts have form: (sa) and (32 - sa). |
| 8835 static bool ShiftAmountsAllowReplaceByRotate(HValue* sa, | 8851 static bool ShiftAmountsAllowReplaceByRotate(HValue* sa, |
| 8836 HValue* const32_minus_sa) { | 8852 HValue* const32_minus_sa) { |
| 8837 if (!const32_minus_sa->IsSub()) return false; | 8853 if (!const32_minus_sa->IsSub()) return false; |
| 8838 HSub* sub = HSub::cast(const32_minus_sa); | 8854 HSub* sub = HSub::cast(const32_minus_sa); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8906 left_info = right_info = TypeInfo::Unknown(); | 8922 left_info = right_info = TypeInfo::Unknown(); |
| 8907 } | 8923 } |
| 8908 HInstruction* instr = NULL; | 8924 HInstruction* instr = NULL; |
| 8909 switch (expr->op()) { | 8925 switch (expr->op()) { |
| 8910 case Token::ADD: | 8926 case Token::ADD: |
| 8911 if (left_info.IsString() && right_info.IsString()) { | 8927 if (left_info.IsString() && right_info.IsString()) { |
| 8912 AddInstruction(new(zone()) HCheckNonSmi(left)); | 8928 AddInstruction(new(zone()) HCheckNonSmi(left)); |
| 8913 AddInstruction(HCheckInstanceType::NewIsString(left, zone())); | 8929 AddInstruction(HCheckInstanceType::NewIsString(left, zone())); |
| 8914 AddInstruction(new(zone()) HCheckNonSmi(right)); | 8930 AddInstruction(new(zone()) HCheckNonSmi(right)); |
| 8915 AddInstruction(HCheckInstanceType::NewIsString(right, zone())); | 8931 AddInstruction(HCheckInstanceType::NewIsString(right, zone())); |
| 8916 instr = new(zone()) HStringAdd(context, left, right); | 8932 instr = HStringAdd::New(zone(), context, left, right); |
| 8917 } else { | 8933 } else { |
| 8918 instr = HAdd::NewHAdd(zone(), context, left, right); | 8934 instr = HAdd::New(zone(), context, left, right); |
| 8919 } | 8935 } |
| 8920 break; | 8936 break; |
| 8921 case Token::SUB: | 8937 case Token::SUB: |
| 8922 instr = HSub::NewHSub(zone(), context, left, right); | 8938 instr = HSub::New(zone(), context, left, right); |
| 8923 break; | 8939 break; |
| 8924 case Token::MUL: | 8940 case Token::MUL: |
| 8925 instr = HMul::NewHMul(zone(), context, left, right); | 8941 instr = HMul::New(zone(), context, left, right); |
| 8926 break; | 8942 break; |
| 8927 case Token::MOD: | 8943 case Token::MOD: |
| 8928 instr = HMod::NewHMod(zone(), context, left, right); | 8944 instr = HMod::New(zone(), context, left, right); |
| 8929 break; | 8945 break; |
| 8930 case Token::DIV: | 8946 case Token::DIV: |
| 8931 instr = HDiv::NewHDiv(zone(), context, left, right); | 8947 instr = HDiv::New(zone(), context, left, right); |
| 8932 break; | 8948 break; |
| 8933 case Token::BIT_XOR: | 8949 case Token::BIT_XOR: |
| 8934 case Token::BIT_AND: | 8950 case Token::BIT_AND: |
| 8935 instr = HBitwise::NewHBitwise(zone(), expr->op(), context, left, right); | 8951 instr = HBitwise::New(zone(), expr->op(), context, left, right); |
| 8936 break; | 8952 break; |
| 8937 case Token::BIT_OR: { | 8953 case Token::BIT_OR: { |
| 8938 HValue* operand, *shift_amount; | 8954 HValue* operand, *shift_amount; |
| 8939 if (left_info.IsInteger32() && right_info.IsInteger32() && | 8955 if (left_info.IsInteger32() && right_info.IsInteger32() && |
| 8940 MatchRotateRight(left, right, &operand, &shift_amount)) { | 8956 MatchRotateRight(left, right, &operand, &shift_amount)) { |
| 8941 instr = new(zone()) HRor(context, operand, shift_amount); | 8957 instr = new(zone()) HRor(context, operand, shift_amount); |
| 8942 } else { | 8958 } else { |
| 8943 instr = HBitwise::NewHBitwise(zone(), expr->op(), context, left, right); | 8959 instr = HBitwise::New(zone(), expr->op(), context, left, right); |
| 8944 } | 8960 } |
| 8945 break; | 8961 break; |
| 8946 } | 8962 } |
| 8947 case Token::SAR: | 8963 case Token::SAR: |
| 8948 instr = HSar::NewHSar(zone(), context, left, right); | 8964 instr = HSar::New(zone(), context, left, right); |
| 8949 break; | 8965 break; |
| 8950 case Token::SHR: | 8966 case Token::SHR: |
| 8951 instr = HShr::NewHShr(zone(), context, left, right); | 8967 instr = HShr::New(zone(), context, left, right); |
| 8952 if (FLAG_opt_safe_uint32_operations && instr->IsShr() && | 8968 if (FLAG_opt_safe_uint32_operations && instr->IsShr() && |
| 8953 CanBeZero(right)) { | 8969 CanBeZero(right)) { |
| 8954 graph()->RecordUint32Instruction(instr); | 8970 graph()->RecordUint32Instruction(instr); |
| 8955 } | 8971 } |
| 8956 break; | 8972 break; |
| 8957 case Token::SHL: | 8973 case Token::SHL: |
| 8958 instr = HShl::NewHShl(zone(), context, left, right); | 8974 instr = HShl::New(zone(), context, left, right); |
| 8959 break; | 8975 break; |
| 8960 default: | 8976 default: |
| 8961 UNREACHABLE(); | 8977 UNREACHABLE(); |
| 8962 } | 8978 } |
| 8963 | 8979 |
| 8964 if (instr->IsBinaryOperation()) { | 8980 if (instr->IsBinaryOperation()) { |
| 8965 HBinaryOperation* binop = HBinaryOperation::cast(instr); | 8981 HBinaryOperation* binop = HBinaryOperation::cast(instr); |
| 8966 binop->set_observed_input_representation(left_rep, right_rep); | 8982 binop->set_observed_input_representation(left_rep, right_rep); |
| 8967 binop->initialize_output_representation(result_rep); | 8983 binop->initialize_output_representation(result_rep); |
| 8968 } | 8984 } |
| (...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9708 void HOptimizedGraphBuilder::GenerateTwoByteSeqStringSetChar( | 9724 void HOptimizedGraphBuilder::GenerateTwoByteSeqStringSetChar( |
| 9709 CallRuntime* call) { | 9725 CallRuntime* call) { |
| 9710 ASSERT(call->arguments()->length() == 3); | 9726 ASSERT(call->arguments()->length() == 3); |
| 9711 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9727 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9712 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); | 9728 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| 9713 CHECK_ALIVE(VisitForValue(call->arguments()->at(2))); | 9729 CHECK_ALIVE(VisitForValue(call->arguments()->at(2))); |
| 9714 HValue* value = Pop(); | 9730 HValue* value = Pop(); |
| 9715 HValue* index = Pop(); | 9731 HValue* index = Pop(); |
| 9716 HValue* string = Pop(); | 9732 HValue* string = Pop(); |
| 9717 HValue* context = environment()->LookupContext(); | 9733 HValue* context = environment()->LookupContext(); |
| 9718 HStringCharCodeAt* char_code = BuildStringCharCodeAt(context, string, index); | 9734 HInstruction* char_code = BuildStringCharCodeAt(context, string, index); |
| 9719 AddInstruction(char_code); | 9735 AddInstruction(char_code); |
| 9720 HSeqStringSetChar* result = new(zone()) HSeqStringSetChar( | 9736 HSeqStringSetChar* result = new(zone()) HSeqStringSetChar( |
| 9721 String::TWO_BYTE_ENCODING, string, index, value); | 9737 String::TWO_BYTE_ENCODING, string, index, value); |
| 9722 return ast_context()->ReturnInstruction(result, call->id()); | 9738 return ast_context()->ReturnInstruction(result, call->id()); |
| 9723 } | 9739 } |
| 9724 | 9740 |
| 9725 | 9741 |
| 9726 void HOptimizedGraphBuilder::GenerateSetValueOf(CallRuntime* call) { | 9742 void HOptimizedGraphBuilder::GenerateSetValueOf(CallRuntime* call) { |
| 9727 ASSERT(call->arguments()->length() == 2); | 9743 ASSERT(call->arguments()->length() == 2); |
| 9728 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9744 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9766 | 9782 |
| 9767 | 9783 |
| 9768 // Fast support for charCodeAt(n). | 9784 // Fast support for charCodeAt(n). |
| 9769 void HOptimizedGraphBuilder::GenerateStringCharCodeAt(CallRuntime* call) { | 9785 void HOptimizedGraphBuilder::GenerateStringCharCodeAt(CallRuntime* call) { |
| 9770 ASSERT(call->arguments()->length() == 2); | 9786 ASSERT(call->arguments()->length() == 2); |
| 9771 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9787 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9772 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); | 9788 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| 9773 HValue* index = Pop(); | 9789 HValue* index = Pop(); |
| 9774 HValue* string = Pop(); | 9790 HValue* string = Pop(); |
| 9775 HValue* context = environment()->LookupContext(); | 9791 HValue* context = environment()->LookupContext(); |
| 9776 HStringCharCodeAt* result = BuildStringCharCodeAt(context, string, index); | 9792 HInstruction* result = BuildStringCharCodeAt(context, string, index); |
| 9777 return ast_context()->ReturnInstruction(result, call->id()); | 9793 return ast_context()->ReturnInstruction(result, call->id()); |
| 9778 } | 9794 } |
| 9779 | 9795 |
| 9780 | 9796 |
| 9781 // Fast support for string.charAt(n) and string[n]. | 9797 // Fast support for string.charAt(n) and string[n]. |
| 9782 void HOptimizedGraphBuilder::GenerateStringCharFromCode(CallRuntime* call) { | 9798 void HOptimizedGraphBuilder::GenerateStringCharFromCode(CallRuntime* call) { |
| 9783 ASSERT(call->arguments()->length() == 1); | 9799 ASSERT(call->arguments()->length() == 1); |
| 9784 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9800 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9785 HValue* char_code = Pop(); | 9801 HValue* char_code = Pop(); |
| 9786 HValue* context = environment()->LookupContext(); | 9802 HValue* context = environment()->LookupContext(); |
| 9787 HStringCharFromCode* result = | 9803 HInstruction* result = HStringCharFromCode::New(zone(), context, char_code); |
| 9788 new(zone()) HStringCharFromCode(context, char_code); | |
| 9789 return ast_context()->ReturnInstruction(result, call->id()); | 9804 return ast_context()->ReturnInstruction(result, call->id()); |
| 9790 } | 9805 } |
| 9791 | 9806 |
| 9792 | 9807 |
| 9793 // Fast support for string.charAt(n) and string[n]. | 9808 // Fast support for string.charAt(n) and string[n]. |
| 9794 void HOptimizedGraphBuilder::GenerateStringCharAt(CallRuntime* call) { | 9809 void HOptimizedGraphBuilder::GenerateStringCharAt(CallRuntime* call) { |
| 9795 ASSERT(call->arguments()->length() == 2); | 9810 ASSERT(call->arguments()->length() == 2); |
| 9796 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9811 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9797 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); | 9812 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| 9798 HValue* index = Pop(); | 9813 HValue* index = Pop(); |
| 9799 HValue* string = Pop(); | 9814 HValue* string = Pop(); |
| 9800 HValue* context = environment()->LookupContext(); | 9815 HValue* context = environment()->LookupContext(); |
| 9801 HStringCharCodeAt* char_code = BuildStringCharCodeAt(context, string, index); | 9816 HInstruction* char_code = BuildStringCharCodeAt(context, string, index); |
| 9802 AddInstruction(char_code); | 9817 AddInstruction(char_code); |
| 9803 HStringCharFromCode* result = | 9818 HInstruction* result = HStringCharFromCode::New(zone(), context, char_code); |
| 9804 new(zone()) HStringCharFromCode(context, char_code); | |
| 9805 return ast_context()->ReturnInstruction(result, call->id()); | 9819 return ast_context()->ReturnInstruction(result, call->id()); |
| 9806 } | 9820 } |
| 9807 | 9821 |
| 9808 | 9822 |
| 9809 // Fast support for object equality testing. | 9823 // Fast support for object equality testing. |
| 9810 void HOptimizedGraphBuilder::GenerateObjectEquals(CallRuntime* call) { | 9824 void HOptimizedGraphBuilder::GenerateObjectEquals(CallRuntime* call) { |
| 9811 ASSERT(call->arguments()->length() == 2); | 9825 ASSERT(call->arguments()->length() == 2); |
| 9812 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9826 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9813 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); | 9827 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| 9814 HValue* right = Pop(); | 9828 HValue* right = Pop(); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9954 } | 9968 } |
| 9955 | 9969 |
| 9956 | 9970 |
| 9957 // Fast call to math functions. | 9971 // Fast call to math functions. |
| 9958 void HOptimizedGraphBuilder::GenerateMathPow(CallRuntime* call) { | 9972 void HOptimizedGraphBuilder::GenerateMathPow(CallRuntime* call) { |
| 9959 ASSERT_EQ(2, call->arguments()->length()); | 9973 ASSERT_EQ(2, call->arguments()->length()); |
| 9960 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9974 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9961 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); | 9975 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| 9962 HValue* right = Pop(); | 9976 HValue* right = Pop(); |
| 9963 HValue* left = Pop(); | 9977 HValue* left = Pop(); |
| 9964 HPower* result = new(zone()) HPower(left, right); | 9978 HInstruction* result = HPower::New(zone(), left, right); |
| 9965 return ast_context()->ReturnInstruction(result, call->id()); | 9979 return ast_context()->ReturnInstruction(result, call->id()); |
| 9966 } | 9980 } |
| 9967 | 9981 |
| 9968 | 9982 |
| 9969 void HOptimizedGraphBuilder::GenerateMathSin(CallRuntime* call) { | 9983 void HOptimizedGraphBuilder::GenerateMathSin(CallRuntime* call) { |
| 9970 ASSERT_EQ(1, call->arguments()->length()); | 9984 ASSERT_EQ(1, call->arguments()->length()); |
| 9971 CHECK_ALIVE(VisitArgumentList(call->arguments())); | 9985 CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| 9972 HValue* context = environment()->LookupContext(); | 9986 HValue* context = environment()->LookupContext(); |
| 9973 HCallStub* result = | 9987 HCallStub* result = |
| 9974 new(zone()) HCallStub(context, CodeStub::TranscendentalCache, 1); | 9988 new(zone()) HCallStub(context, CodeStub::TranscendentalCache, 1); |
| (...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10677 } | 10691 } |
| 10678 } | 10692 } |
| 10679 | 10693 |
| 10680 #ifdef DEBUG | 10694 #ifdef DEBUG |
| 10681 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 10695 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
| 10682 if (allocator_ != NULL) allocator_->Verify(); | 10696 if (allocator_ != NULL) allocator_->Verify(); |
| 10683 #endif | 10697 #endif |
| 10684 } | 10698 } |
| 10685 | 10699 |
| 10686 } } // namespace v8::internal | 10700 } } // namespace v8::internal |
| OLD | NEW |