| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 6303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6314 | 6314 |
| 6315 | 6315 |
| 6316 int HOptimizedGraphBuilder::InliningAstSize(Handle<JSFunction> target) { | 6316 int HOptimizedGraphBuilder::InliningAstSize(Handle<JSFunction> target) { |
| 6317 if (!FLAG_use_inlining) return kNotInlinable; | 6317 if (!FLAG_use_inlining) return kNotInlinable; |
| 6318 | 6318 |
| 6319 // Precondition: call is monomorphic and we have found a target with the | 6319 // Precondition: call is monomorphic and we have found a target with the |
| 6320 // appropriate arity. | 6320 // appropriate arity. |
| 6321 Handle<JSFunction> caller = current_info()->closure(); | 6321 Handle<JSFunction> caller = current_info()->closure(); |
| 6322 Handle<SharedFunctionInfo> target_shared(target->shared()); | 6322 Handle<SharedFunctionInfo> target_shared(target->shared()); |
| 6323 | 6323 |
| 6324 // Always inline builtins marked for inlining. |
| 6325 if (target->IsBuiltin()) { |
| 6326 return target_shared->inline_builtin() ? 0 : kNotInlinable; |
| 6327 } |
| 6328 |
| 6324 // Do a quick check on source code length to avoid parsing large | 6329 // Do a quick check on source code length to avoid parsing large |
| 6325 // inlining candidates. | 6330 // inlining candidates. |
| 6326 if (target_shared->SourceSize() > | 6331 if (target_shared->SourceSize() > |
| 6327 Min(FLAG_max_inlined_source_size, kUnlimitedMaxInlinedSourceSize)) { | 6332 Min(FLAG_max_inlined_source_size, kUnlimitedMaxInlinedSourceSize)) { |
| 6328 TraceInline(target, caller, "target text too big"); | 6333 TraceInline(target, caller, "target text too big"); |
| 6329 return kNotInlinable; | 6334 return kNotInlinable; |
| 6330 } | 6335 } |
| 6331 | 6336 |
| 6332 // Target must be inlineable. | 6337 // Target must be inlineable. |
| 6333 if (!target->IsInlineable()) { | 6338 if (!target_shared->IsInlineable()) { |
| 6334 TraceInline(target, caller, "target not inlineable"); | 6339 TraceInline(target, caller, "target not inlineable"); |
| 6335 return kNotInlinable; | 6340 return kNotInlinable; |
| 6336 } | 6341 } |
| 6337 if (target_shared->dont_inline() || target_shared->dont_optimize()) { | 6342 if (target_shared->dont_inline() || target_shared->dont_optimize()) { |
| 6338 TraceInline(target, caller, "target contains unsupported syntax [early]"); | 6343 TraceInline(target, caller, "target contains unsupported syntax [early]"); |
| 6339 return kNotInlinable; | 6344 return kNotInlinable; |
| 6340 } | 6345 } |
| 6341 | 6346 |
| 6342 int nodes_added = target_shared->ast_node_count(); | 6347 int nodes_added = target_shared->ast_node_count(); |
| 6343 return nodes_added; | 6348 return nodes_added; |
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6721 BuiltinFunctionId id = expr->target()->shared()->builtin_function_id(); | 6726 BuiltinFunctionId id = expr->target()->shared()->builtin_function_id(); |
| 6722 switch (id) { | 6727 switch (id) { |
| 6723 case kMathExp: | 6728 case kMathExp: |
| 6724 if (!FLAG_fast_math) break; | 6729 if (!FLAG_fast_math) break; |
| 6725 // Fall through if FLAG_fast_math. | 6730 // Fall through if FLAG_fast_math. |
| 6726 case kMathRound: | 6731 case kMathRound: |
| 6727 case kMathFloor: | 6732 case kMathFloor: |
| 6728 case kMathAbs: | 6733 case kMathAbs: |
| 6729 case kMathSqrt: | 6734 case kMathSqrt: |
| 6730 case kMathLog: | 6735 case kMathLog: |
| 6731 case kMathSin: | |
| 6732 case kMathCos: | |
| 6733 case kMathTan: | |
| 6734 if (expr->arguments()->length() == 1) { | 6736 if (expr->arguments()->length() == 1) { |
| 6735 HValue* argument = Pop(); | 6737 HValue* argument = Pop(); |
| 6736 Drop(1); // Receiver. | 6738 Drop(1); // Receiver. |
| 6737 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id); | 6739 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id); |
| 6738 if (drop_extra) Drop(1); // Optionally drop the function. | 6740 if (drop_extra) Drop(1); // Optionally drop the function. |
| 6739 ast_context()->ReturnInstruction(op, expr->id()); | 6741 ast_context()->ReturnInstruction(op, expr->id()); |
| 6740 return true; | 6742 return true; |
| 6741 } | 6743 } |
| 6742 break; | 6744 break; |
| 6743 case kMathImul: | 6745 case kMathImul: |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6802 } | 6804 } |
| 6803 break; | 6805 break; |
| 6804 case kMathExp: | 6806 case kMathExp: |
| 6805 if (!FLAG_fast_math) break; | 6807 if (!FLAG_fast_math) break; |
| 6806 // Fall through if FLAG_fast_math. | 6808 // Fall through if FLAG_fast_math. |
| 6807 case kMathRound: | 6809 case kMathRound: |
| 6808 case kMathFloor: | 6810 case kMathFloor: |
| 6809 case kMathAbs: | 6811 case kMathAbs: |
| 6810 case kMathSqrt: | 6812 case kMathSqrt: |
| 6811 case kMathLog: | 6813 case kMathLog: |
| 6812 case kMathSin: | |
| 6813 case kMathCos: | |
| 6814 case kMathTan: | |
| 6815 if (argument_count == 2 && check_type == RECEIVER_MAP_CHECK) { | 6814 if (argument_count == 2 && check_type == RECEIVER_MAP_CHECK) { |
| 6816 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); | 6815 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); |
| 6817 HValue* argument = Pop(); | 6816 HValue* argument = Pop(); |
| 6818 Drop(1); // Receiver. | 6817 Drop(1); // Receiver. |
| 6819 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id); | 6818 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id); |
| 6820 ast_context()->ReturnInstruction(op, expr->id()); | 6819 ast_context()->ReturnInstruction(op, expr->id()); |
| 6821 return true; | 6820 return true; |
| 6822 } | 6821 } |
| 6823 break; | 6822 break; |
| 6824 case kMathPow: | 6823 case kMathPow: |
| (...skipping 2299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9124 ASSERT_EQ(2, call->arguments()->length()); | 9123 ASSERT_EQ(2, call->arguments()->length()); |
| 9125 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9124 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9126 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); | 9125 CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| 9127 HValue* right = Pop(); | 9126 HValue* right = Pop(); |
| 9128 HValue* left = Pop(); | 9127 HValue* left = Pop(); |
| 9129 HInstruction* result = NewUncasted<HPower>(left, right); | 9128 HInstruction* result = NewUncasted<HPower>(left, right); |
| 9130 return ast_context()->ReturnInstruction(result, call->id()); | 9129 return ast_context()->ReturnInstruction(result, call->id()); |
| 9131 } | 9130 } |
| 9132 | 9131 |
| 9133 | 9132 |
| 9134 void HOptimizedGraphBuilder::GenerateMathSin(CallRuntime* call) { | |
| 9135 ASSERT_EQ(1, call->arguments()->length()); | |
| 9136 CHECK_ALIVE(VisitArgumentList(call->arguments())); | |
| 9137 HCallStub* result = New<HCallStub>(CodeStub::TranscendentalCache, 1); | |
| 9138 result->set_transcendental_type(TranscendentalCache::SIN); | |
| 9139 Drop(1); | |
| 9140 return ast_context()->ReturnInstruction(result, call->id()); | |
| 9141 } | |
| 9142 | |
| 9143 | |
| 9144 void HOptimizedGraphBuilder::GenerateMathCos(CallRuntime* call) { | |
| 9145 ASSERT_EQ(1, call->arguments()->length()); | |
| 9146 CHECK_ALIVE(VisitArgumentList(call->arguments())); | |
| 9147 HCallStub* result = New<HCallStub>(CodeStub::TranscendentalCache, 1); | |
| 9148 result->set_transcendental_type(TranscendentalCache::COS); | |
| 9149 Drop(1); | |
| 9150 return ast_context()->ReturnInstruction(result, call->id()); | |
| 9151 } | |
| 9152 | |
| 9153 | |
| 9154 void HOptimizedGraphBuilder::GenerateMathTan(CallRuntime* call) { | |
| 9155 ASSERT_EQ(1, call->arguments()->length()); | |
| 9156 CHECK_ALIVE(VisitArgumentList(call->arguments())); | |
| 9157 HCallStub* result = New<HCallStub>(CodeStub::TranscendentalCache, 1); | |
| 9158 result->set_transcendental_type(TranscendentalCache::TAN); | |
| 9159 Drop(1); | |
| 9160 return ast_context()->ReturnInstruction(result, call->id()); | |
| 9161 } | |
| 9162 | |
| 9163 | |
| 9164 void HOptimizedGraphBuilder::GenerateMathLog(CallRuntime* call) { | 9133 void HOptimizedGraphBuilder::GenerateMathLog(CallRuntime* call) { |
| 9165 ASSERT_EQ(1, call->arguments()->length()); | 9134 ASSERT_EQ(1, call->arguments()->length()); |
| 9166 CHECK_ALIVE(VisitArgumentList(call->arguments())); | 9135 CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| 9167 HCallStub* result = New<HCallStub>(CodeStub::TranscendentalCache, 1); | 9136 HCallStub* result = New<HCallStub>(CodeStub::TranscendentalCache, 1); |
| 9168 result->set_transcendental_type(TranscendentalCache::LOG); | 9137 result->set_transcendental_type(TranscendentalCache::LOG); |
| 9169 Drop(1); | 9138 Drop(1); |
| 9170 return ast_context()->ReturnInstruction(result, call->id()); | 9139 return ast_context()->ReturnInstruction(result, call->id()); |
| 9171 } | 9140 } |
| 9172 | 9141 |
| 9173 | 9142 |
| 9174 void HOptimizedGraphBuilder::GenerateMathSqrt(CallRuntime* call) { | 9143 void HOptimizedGraphBuilder::GenerateMathSqrt(CallRuntime* call) { |
| 9175 ASSERT(call->arguments()->length() == 1); | 9144 ASSERT(call->arguments()->length() == 1); |
| 9176 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9145 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9177 HValue* value = Pop(); | 9146 HValue* value = Pop(); |
| 9178 HInstruction* result = New<HUnaryMathOperation>(value, kMathSqrt); | 9147 HInstruction* result = New<HUnaryMathOperation>(value, kMathSqrt); |
| 9179 return ast_context()->ReturnInstruction(result, call->id()); | 9148 return ast_context()->ReturnInstruction(result, call->id()); |
| 9180 } | 9149 } |
| 9181 | 9150 |
| 9182 | 9151 |
| 9152 void HOptimizedGraphBuilder::GenerateMathFloor(CallRuntime* call) { |
| 9153 ASSERT(call->arguments()->length() == 1); |
| 9154 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9155 HValue* value = Pop(); |
| 9156 HInstruction* result = New<HUnaryMathOperation>(value, kMathFloor); |
| 9157 return ast_context()->ReturnInstruction(result, call->id()); |
| 9158 } |
| 9159 |
| 9160 |
| 9183 // Check whether two RegExps are equivalent | 9161 // Check whether two RegExps are equivalent |
| 9184 void HOptimizedGraphBuilder::GenerateIsRegExpEquivalent(CallRuntime* call) { | 9162 void HOptimizedGraphBuilder::GenerateIsRegExpEquivalent(CallRuntime* call) { |
| 9185 return Bailout(kInlinedRuntimeFunctionIsRegExpEquivalent); | 9163 return Bailout(kInlinedRuntimeFunctionIsRegExpEquivalent); |
| 9186 } | 9164 } |
| 9187 | 9165 |
| 9188 | 9166 |
| 9189 void HOptimizedGraphBuilder::GenerateGetCachedArrayIndex(CallRuntime* call) { | 9167 void HOptimizedGraphBuilder::GenerateGetCachedArrayIndex(CallRuntime* call) { |
| 9190 ASSERT(call->arguments()->length() == 1); | 9168 ASSERT(call->arguments()->length() == 1); |
| 9191 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9169 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9192 HValue* value = Pop(); | 9170 HValue* value = Pop(); |
| (...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9824 if (ShouldProduceTraceOutput()) { | 9802 if (ShouldProduceTraceOutput()) { |
| 9825 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9803 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 9826 } | 9804 } |
| 9827 | 9805 |
| 9828 #ifdef DEBUG | 9806 #ifdef DEBUG |
| 9829 graph_->Verify(false); // No full verify. | 9807 graph_->Verify(false); // No full verify. |
| 9830 #endif | 9808 #endif |
| 9831 } | 9809 } |
| 9832 | 9810 |
| 9833 } } // namespace v8::internal | 9811 } } // namespace v8::internal |
| OLD | NEW |