OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/crankshaft/hydrogen.h" | 5 #include "src/crankshaft/hydrogen.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/allocation-site-scopes.h" | 9 #include "src/allocation-site-scopes.h" |
10 #include "src/ast/ast-numbering.h" | 10 #include "src/ast/ast-numbering.h" |
(...skipping 11575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11586 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, | 11586 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, |
11587 Expression* sub_expr, | 11587 Expression* sub_expr, |
11588 Handle<String> check) { | 11588 Handle<String> check) { |
11589 CHECK_ALIVE(VisitForTypeOf(sub_expr)); | 11589 CHECK_ALIVE(VisitForTypeOf(sub_expr)); |
11590 SetSourcePosition(expr->position()); | 11590 SetSourcePosition(expr->position()); |
11591 HValue* value = Pop(); | 11591 HValue* value = Pop(); |
11592 HTypeofIsAndBranch* instr = New<HTypeofIsAndBranch>(value, check); | 11592 HTypeofIsAndBranch* instr = New<HTypeofIsAndBranch>(value, check); |
11593 return ast_context()->ReturnControl(instr, expr->id()); | 11593 return ast_context()->ReturnControl(instr, expr->id()); |
11594 } | 11594 } |
11595 | 11595 |
| 11596 namespace { |
11596 | 11597 |
11597 static bool IsLiteralCompareBool(Isolate* isolate, | 11598 bool IsLiteralCompareStrict(Isolate* isolate, HValue* left, Token::Value op, |
11598 HValue* left, | 11599 HValue* right) { |
11599 Token::Value op, | |
11600 HValue* right) { | |
11601 return op == Token::EQ_STRICT && | 11600 return op == Token::EQ_STRICT && |
11602 ((left->IsConstant() && | 11601 ((left->IsConstant() && |
11603 HConstant::cast(left)->handle(isolate)->IsBoolean()) || | 11602 !HConstant::cast(left)->handle(isolate)->IsNumber() && |
11604 (right->IsConstant() && | 11603 !HConstant::cast(left)->handle(isolate)->IsSimd128Value() && |
11605 HConstant::cast(right)->handle(isolate)->IsBoolean())); | 11604 !HConstant::cast(left)->handle(isolate)->IsString()) || |
| 11605 (right->IsConstant() && |
| 11606 !HConstant::cast(right)->handle(isolate)->IsNumber() && |
| 11607 !HConstant::cast(right)->handle(isolate)->IsSimd128Value() && |
| 11608 !HConstant::cast(right)->handle(isolate)->IsString())); |
11606 } | 11609 } |
11607 | 11610 |
| 11611 } // namespace |
11608 | 11612 |
11609 void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { | 11613 void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
11610 DCHECK(!HasStackOverflow()); | 11614 DCHECK(!HasStackOverflow()); |
11611 DCHECK(current_block() != NULL); | 11615 DCHECK(current_block() != NULL); |
11612 DCHECK(current_block()->HasPredecessor()); | 11616 DCHECK(current_block()->HasPredecessor()); |
11613 | 11617 |
11614 if (!top_info()->is_tracking_positions()) SetSourcePosition(expr->position()); | 11618 if (!top_info()->is_tracking_positions()) SetSourcePosition(expr->position()); |
11615 | 11619 |
11616 // Check for a few fast cases. The AST visiting behavior must be in sync | 11620 // Check for a few fast cases. The AST visiting behavior must be in sync |
11617 // with the full codegen: We don't push both left and right values onto | 11621 // with the full codegen: We don't push both left and right values onto |
(...skipping 25 matching lines...) Expand all Loading... |
11643 Type* right_type = bounds_.get(expr->right()).lower; | 11647 Type* right_type = bounds_.get(expr->right()).lower; |
11644 Type* combined_type = expr->combined_type(); | 11648 Type* combined_type = expr->combined_type(); |
11645 | 11649 |
11646 CHECK_ALIVE(VisitForValue(expr->left())); | 11650 CHECK_ALIVE(VisitForValue(expr->left())); |
11647 CHECK_ALIVE(VisitForValue(expr->right())); | 11651 CHECK_ALIVE(VisitForValue(expr->right())); |
11648 | 11652 |
11649 HValue* right = Pop(); | 11653 HValue* right = Pop(); |
11650 HValue* left = Pop(); | 11654 HValue* left = Pop(); |
11651 Token::Value op = expr->op(); | 11655 Token::Value op = expr->op(); |
11652 | 11656 |
11653 if (IsLiteralCompareBool(isolate(), left, op, right)) { | 11657 if (IsLiteralCompareStrict(isolate(), left, op, right)) { |
11654 HCompareObjectEqAndBranch* result = | 11658 HCompareObjectEqAndBranch* result = |
11655 New<HCompareObjectEqAndBranch>(left, right); | 11659 New<HCompareObjectEqAndBranch>(left, right); |
11656 return ast_context()->ReturnControl(result, expr->id()); | 11660 return ast_context()->ReturnControl(result, expr->id()); |
11657 } | 11661 } |
11658 | 11662 |
11659 if (op == Token::INSTANCEOF) { | 11663 if (op == Token::INSTANCEOF) { |
11660 // Check to see if the rhs of the instanceof is a known function. | 11664 // Check to see if the rhs of the instanceof is a known function. |
11661 if (right->IsConstant() && | 11665 if (right->IsConstant() && |
11662 HConstant::cast(right)->handle(isolate())->IsJSFunction()) { | 11666 HConstant::cast(right)->handle(isolate())->IsJSFunction()) { |
11663 Handle<JSFunction> function = | 11667 Handle<JSFunction> function = |
(...skipping 1975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13639 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13643 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
13640 } | 13644 } |
13641 | 13645 |
13642 #ifdef DEBUG | 13646 #ifdef DEBUG |
13643 graph_->Verify(false); // No full verify. | 13647 graph_->Verify(false); // No full verify. |
13644 #endif | 13648 #endif |
13645 } | 13649 } |
13646 | 13650 |
13647 } // namespace internal | 13651 } // namespace internal |
13648 } // namespace v8 | 13652 } // namespace v8 |
OLD | NEW |