| 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 1699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1710 HInstruction* value = Add<HLoadKeyed>(boilerplate_elements, key_constant, | 1710 HInstruction* value = Add<HLoadKeyed>(boilerplate_elements, key_constant, |
| 1711 static_cast<HValue*>(NULL), kind); | 1711 static_cast<HValue*>(NULL), kind); |
| 1712 Add<HStoreKeyed>(object_elements, key_constant, value, kind); | 1712 Add<HStoreKeyed>(object_elements, key_constant, value, kind); |
| 1713 } | 1713 } |
| 1714 } | 1714 } |
| 1715 | 1715 |
| 1716 return object; | 1716 return object; |
| 1717 } | 1717 } |
| 1718 | 1718 |
| 1719 | 1719 |
| 1720 HInstruction* HGraphBuilder::BuildUnaryMathOp( | |
| 1721 HValue* input, Handle<Type> type, Token::Value operation) { | |
| 1722 ASSERT_EQ(Token::BIT_NOT, operation); | |
| 1723 // We only handle the numeric cases here | |
| 1724 type = handle( | |
| 1725 Type::Intersect(type, handle(Type::Number(), isolate())), isolate()); | |
| 1726 if (type->Is(Type::None())) { | |
| 1727 Add<HDeoptimize>(Deoptimizer::SOFT); | |
| 1728 } | |
| 1729 return New<HBitNot>(input); | |
| 1730 } | |
| 1731 | |
| 1732 | |
| 1733 void HGraphBuilder::BuildCompareNil( | 1720 void HGraphBuilder::BuildCompareNil( |
| 1734 HValue* value, | 1721 HValue* value, |
| 1735 Handle<Type> type, | 1722 Handle<Type> type, |
| 1736 int position, | 1723 int position, |
| 1737 HIfContinuation* continuation) { | 1724 HIfContinuation* continuation) { |
| 1738 IfBuilder if_nil(this, position); | 1725 IfBuilder if_nil(this, position); |
| 1739 bool needs_or = false; | 1726 bool needs_or = false; |
| 1740 if (type->Maybe(Type::Null())) { | 1727 if (type->Maybe(Type::Null())) { |
| 1741 if (needs_or) if_nil.Or(); | 1728 if (needs_or) if_nil.Or(); |
| 1742 if_nil.If<HCompareObjectEqAndBranch>(value, graph()->GetConstantNull()); | 1729 if_nil.If<HCompareObjectEqAndBranch>(value, graph()->GetConstantNull()); |
| (...skipping 5477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7220 | 7207 |
| 7221 | 7208 |
| 7222 void HOptimizedGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) { | 7209 void HOptimizedGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) { |
| 7223 ASSERT(!HasStackOverflow()); | 7210 ASSERT(!HasStackOverflow()); |
| 7224 ASSERT(current_block() != NULL); | 7211 ASSERT(current_block() != NULL); |
| 7225 ASSERT(current_block()->HasPredecessor()); | 7212 ASSERT(current_block()->HasPredecessor()); |
| 7226 switch (expr->op()) { | 7213 switch (expr->op()) { |
| 7227 case Token::DELETE: return VisitDelete(expr); | 7214 case Token::DELETE: return VisitDelete(expr); |
| 7228 case Token::VOID: return VisitVoid(expr); | 7215 case Token::VOID: return VisitVoid(expr); |
| 7229 case Token::TYPEOF: return VisitTypeof(expr); | 7216 case Token::TYPEOF: return VisitTypeof(expr); |
| 7230 case Token::BIT_NOT: return VisitBitNot(expr); | |
| 7231 case Token::NOT: return VisitNot(expr); | 7217 case Token::NOT: return VisitNot(expr); |
| 7232 default: UNREACHABLE(); | 7218 default: UNREACHABLE(); |
| 7233 } | 7219 } |
| 7234 } | 7220 } |
| 7235 | 7221 |
| 7236 | 7222 |
| 7237 void HOptimizedGraphBuilder::VisitDelete(UnaryOperation* expr) { | 7223 void HOptimizedGraphBuilder::VisitDelete(UnaryOperation* expr) { |
| 7238 Property* prop = expr->expression()->AsProperty(); | 7224 Property* prop = expr->expression()->AsProperty(); |
| 7239 VariableProxy* proxy = expr->expression()->AsVariableProxy(); | 7225 VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| 7240 if (prop != NULL) { | 7226 if (prop != NULL) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7282 | 7268 |
| 7283 void HOptimizedGraphBuilder::VisitTypeof(UnaryOperation* expr) { | 7269 void HOptimizedGraphBuilder::VisitTypeof(UnaryOperation* expr) { |
| 7284 CHECK_ALIVE(VisitForTypeOf(expr->expression())); | 7270 CHECK_ALIVE(VisitForTypeOf(expr->expression())); |
| 7285 HValue* value = Pop(); | 7271 HValue* value = Pop(); |
| 7286 HValue* context = environment()->context(); | 7272 HValue* context = environment()->context(); |
| 7287 HInstruction* instr = new(zone()) HTypeof(context, value); | 7273 HInstruction* instr = new(zone()) HTypeof(context, value); |
| 7288 return ast_context()->ReturnInstruction(instr, expr->id()); | 7274 return ast_context()->ReturnInstruction(instr, expr->id()); |
| 7289 } | 7275 } |
| 7290 | 7276 |
| 7291 | 7277 |
| 7292 void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) { | |
| 7293 CHECK_ALIVE(VisitForValue(expr->expression())); | |
| 7294 Handle<Type> operand_type = expr->expression()->bounds().lower; | |
| 7295 HValue* value = TruncateToNumber(Pop(), &operand_type); | |
| 7296 HInstruction* instr = BuildUnaryMathOp(value, operand_type, Token::BIT_NOT); | |
| 7297 return ast_context()->ReturnInstruction(instr, expr->id()); | |
| 7298 } | |
| 7299 | |
| 7300 | |
| 7301 void HOptimizedGraphBuilder::VisitNot(UnaryOperation* expr) { | 7278 void HOptimizedGraphBuilder::VisitNot(UnaryOperation* expr) { |
| 7302 if (ast_context()->IsTest()) { | 7279 if (ast_context()->IsTest()) { |
| 7303 TestContext* context = TestContext::cast(ast_context()); | 7280 TestContext* context = TestContext::cast(ast_context()); |
| 7304 VisitForControl(expr->expression(), | 7281 VisitForControl(expr->expression(), |
| 7305 context->if_false(), | 7282 context->if_false(), |
| 7306 context->if_true()); | 7283 context->if_true()); |
| 7307 return; | 7284 return; |
| 7308 } | 7285 } |
| 7309 | 7286 |
| 7310 if (ast_context()->IsEffect()) { | 7287 if (ast_context()->IsEffect()) { |
| (...skipping 2416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9727 if (ShouldProduceTraceOutput()) { | 9704 if (ShouldProduceTraceOutput()) { |
| 9728 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9705 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 9729 } | 9706 } |
| 9730 | 9707 |
| 9731 #ifdef DEBUG | 9708 #ifdef DEBUG |
| 9732 graph_->Verify(false); // No full verify. | 9709 graph_->Verify(false); // No full verify. |
| 9733 #endif | 9710 #endif |
| 9734 } | 9711 } |
| 9735 | 9712 |
| 9736 } } // namespace v8::internal | 9713 } } // namespace v8::internal |
| OLD | NEW |