| 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 1700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1711 Add<HStoreKeyed>(object_elements, key_constant, value, kind); | 1711 Add<HStoreKeyed>(object_elements, key_constant, value, kind); |
| 1712 } | 1712 } |
| 1713 } | 1713 } |
| 1714 | 1714 |
| 1715 return object; | 1715 return object; |
| 1716 } | 1716 } |
| 1717 | 1717 |
| 1718 | 1718 |
| 1719 HInstruction* HGraphBuilder::BuildUnaryMathOp( | 1719 HInstruction* HGraphBuilder::BuildUnaryMathOp( |
| 1720 HValue* input, Handle<Type> type, Token::Value operation) { | 1720 HValue* input, Handle<Type> type, Token::Value operation) { |
| 1721 ASSERT_EQ(Token::BIT_NOT, operation); |
| 1721 // We only handle the numeric cases here | 1722 // We only handle the numeric cases here |
| 1722 type = handle( | 1723 type = handle( |
| 1723 Type::Intersect(type, handle(Type::Number(), isolate())), isolate()); | 1724 Type::Intersect(type, handle(Type::Number(), isolate())), isolate()); |
| 1724 | 1725 if (type->Is(Type::None())) { |
| 1725 switch (operation) { | 1726 Add<HDeoptimize>(Deoptimizer::SOFT); |
| 1726 default: | |
| 1727 UNREACHABLE(); | |
| 1728 case Token::SUB: { | |
| 1729 HInstruction* instr = | |
| 1730 NewUncasted<HMul>(input, graph()->GetConstantMinus1()); | |
| 1731 Representation rep = Representation::FromType(type); | |
| 1732 if (type->Is(Type::None())) { | |
| 1733 Add<HDeoptimize>(Deoptimizer::SOFT); | |
| 1734 } | |
| 1735 if (instr->IsBinaryOperation()) { | |
| 1736 HBinaryOperation* binop = HBinaryOperation::cast(instr); | |
| 1737 binop->set_observed_input_representation(1, rep); | |
| 1738 binop->set_observed_input_representation(2, rep); | |
| 1739 } | |
| 1740 return instr; | |
| 1741 } | |
| 1742 case Token::BIT_NOT: | |
| 1743 if (type->Is(Type::None())) { | |
| 1744 Add<HDeoptimize>(Deoptimizer::SOFT); | |
| 1745 } | |
| 1746 return New<HBitNot>(input); | |
| 1747 } | 1727 } |
| 1728 return New<HBitNot>(input); |
| 1748 } | 1729 } |
| 1749 | 1730 |
| 1750 | 1731 |
| 1751 void HGraphBuilder::BuildCompareNil( | 1732 void HGraphBuilder::BuildCompareNil( |
| 1752 HValue* value, | 1733 HValue* value, |
| 1753 Handle<Type> type, | 1734 Handle<Type> type, |
| 1754 int position, | 1735 int position, |
| 1755 HIfContinuation* continuation) { | 1736 HIfContinuation* continuation) { |
| 1756 IfBuilder if_nil(this, position); | 1737 IfBuilder if_nil(this, position); |
| 1757 bool needs_or = false; | 1738 bool needs_or = false; |
| (...skipping 5455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7213 | 7194 |
| 7214 | 7195 |
| 7215 void HOptimizedGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) { | 7196 void HOptimizedGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) { |
| 7216 ASSERT(!HasStackOverflow()); | 7197 ASSERT(!HasStackOverflow()); |
| 7217 ASSERT(current_block() != NULL); | 7198 ASSERT(current_block() != NULL); |
| 7218 ASSERT(current_block()->HasPredecessor()); | 7199 ASSERT(current_block()->HasPredecessor()); |
| 7219 switch (expr->op()) { | 7200 switch (expr->op()) { |
| 7220 case Token::DELETE: return VisitDelete(expr); | 7201 case Token::DELETE: return VisitDelete(expr); |
| 7221 case Token::VOID: return VisitVoid(expr); | 7202 case Token::VOID: return VisitVoid(expr); |
| 7222 case Token::TYPEOF: return VisitTypeof(expr); | 7203 case Token::TYPEOF: return VisitTypeof(expr); |
| 7223 case Token::SUB: return VisitSub(expr); | |
| 7224 case Token::BIT_NOT: return VisitBitNot(expr); | 7204 case Token::BIT_NOT: return VisitBitNot(expr); |
| 7225 case Token::NOT: return VisitNot(expr); | 7205 case Token::NOT: return VisitNot(expr); |
| 7226 default: UNREACHABLE(); | 7206 default: UNREACHABLE(); |
| 7227 } | 7207 } |
| 7228 } | 7208 } |
| 7229 | 7209 |
| 7230 | 7210 |
| 7231 void HOptimizedGraphBuilder::VisitDelete(UnaryOperation* expr) { | 7211 void HOptimizedGraphBuilder::VisitDelete(UnaryOperation* expr) { |
| 7232 Property* prop = expr->expression()->AsProperty(); | 7212 Property* prop = expr->expression()->AsProperty(); |
| 7233 VariableProxy* proxy = expr->expression()->AsVariableProxy(); | 7213 VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7276 | 7256 |
| 7277 void HOptimizedGraphBuilder::VisitTypeof(UnaryOperation* expr) { | 7257 void HOptimizedGraphBuilder::VisitTypeof(UnaryOperation* expr) { |
| 7278 CHECK_ALIVE(VisitForTypeOf(expr->expression())); | 7258 CHECK_ALIVE(VisitForTypeOf(expr->expression())); |
| 7279 HValue* value = Pop(); | 7259 HValue* value = Pop(); |
| 7280 HValue* context = environment()->context(); | 7260 HValue* context = environment()->context(); |
| 7281 HInstruction* instr = new(zone()) HTypeof(context, value); | 7261 HInstruction* instr = new(zone()) HTypeof(context, value); |
| 7282 return ast_context()->ReturnInstruction(instr, expr->id()); | 7262 return ast_context()->ReturnInstruction(instr, expr->id()); |
| 7283 } | 7263 } |
| 7284 | 7264 |
| 7285 | 7265 |
| 7286 void HOptimizedGraphBuilder::VisitSub(UnaryOperation* expr) { | |
| 7287 CHECK_ALIVE(VisitForValue(expr->expression())); | |
| 7288 Handle<Type> operand_type = expr->expression()->bounds().lower; | |
| 7289 HValue* value = TruncateToNumber(Pop(), &operand_type); | |
| 7290 HInstruction* instr = BuildUnaryMathOp(value, operand_type, Token::SUB); | |
| 7291 return ast_context()->ReturnInstruction(instr, expr->id()); | |
| 7292 } | |
| 7293 | |
| 7294 | |
| 7295 void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) { | 7266 void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) { |
| 7296 CHECK_ALIVE(VisitForValue(expr->expression())); | 7267 CHECK_ALIVE(VisitForValue(expr->expression())); |
| 7297 Handle<Type> operand_type = expr->expression()->bounds().lower; | 7268 Handle<Type> operand_type = expr->expression()->bounds().lower; |
| 7298 HValue* value = TruncateToNumber(Pop(), &operand_type); | 7269 HValue* value = TruncateToNumber(Pop(), &operand_type); |
| 7299 HInstruction* instr = BuildUnaryMathOp(value, operand_type, Token::BIT_NOT); | 7270 HInstruction* instr = BuildUnaryMathOp(value, operand_type, Token::BIT_NOT); |
| 7300 return ast_context()->ReturnInstruction(instr, expr->id()); | 7271 return ast_context()->ReturnInstruction(instr, expr->id()); |
| 7301 } | 7272 } |
| 7302 | 7273 |
| 7303 | 7274 |
| 7304 void HOptimizedGraphBuilder::VisitNot(UnaryOperation* expr) { | 7275 void HOptimizedGraphBuilder::VisitNot(UnaryOperation* expr) { |
| (...skipping 2425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9730 if (ShouldProduceTraceOutput()) { | 9701 if (ShouldProduceTraceOutput()) { |
| 9731 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9702 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 9732 } | 9703 } |
| 9733 | 9704 |
| 9734 #ifdef DEBUG | 9705 #ifdef DEBUG |
| 9735 graph_->Verify(false); // No full verify. | 9706 graph_->Verify(false); // No full verify. |
| 9736 #endif | 9707 #endif |
| 9737 } | 9708 } |
| 9738 | 9709 |
| 9739 } } // namespace v8::internal | 9710 } } // namespace v8::internal |
| OLD | NEW |