Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(113)

Side by Side Diff: src/hydrogen.cc

Issue 22184004: Desugar bitwise negation into XOR and kill all UnaryOp stuff. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased. Feedback. Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 1701 matching lines...) Expand 10 before | Expand all | Expand 10 after
1712 HInstruction* value = Add<HLoadKeyed>(boilerplate_elements, key_constant, 1712 HInstruction* value = Add<HLoadKeyed>(boilerplate_elements, key_constant,
1713 static_cast<HValue*>(NULL), kind); 1713 static_cast<HValue*>(NULL), kind);
1714 Add<HStoreKeyed>(object_elements, key_constant, value, kind); 1714 Add<HStoreKeyed>(object_elements, key_constant, value, kind);
1715 } 1715 }
1716 } 1716 }
1717 1717
1718 return object; 1718 return object;
1719 } 1719 }
1720 1720
1721 1721
1722 HInstruction* HGraphBuilder::BuildUnaryMathOp(
1723 HValue* input, Handle<Type> type, Token::Value operation) {
1724 ASSERT_EQ(Token::BIT_NOT, operation);
1725 // We only handle the numeric cases here
1726 type = handle(
1727 Type::Intersect(type, handle(Type::Number(), isolate())), isolate());
1728 if (type->Is(Type::None())) {
1729 Add<HDeoptimize>(Deoptimizer::SOFT);
1730 }
1731 return New<HBitNot>(input);
1732 }
1733
1734
1735 void HGraphBuilder::BuildCompareNil( 1722 void HGraphBuilder::BuildCompareNil(
1736 HValue* value, 1723 HValue* value,
1737 Handle<Type> type, 1724 Handle<Type> type,
1738 int position, 1725 int position,
1739 HIfContinuation* continuation) { 1726 HIfContinuation* continuation) {
1740 IfBuilder if_nil(this, position); 1727 IfBuilder if_nil(this, position);
1741 bool needs_or = false; 1728 bool needs_or = false;
1742 if (type->Maybe(Type::Null())) { 1729 if (type->Maybe(Type::Null())) {
1743 if (needs_or) if_nil.Or(); 1730 if (needs_or) if_nil.Or();
1744 if_nil.If<HCompareObjectEqAndBranch>(value, graph()->GetConstantNull()); 1731 if_nil.If<HCompareObjectEqAndBranch>(value, graph()->GetConstantNull());
(...skipping 5477 matching lines...) Expand 10 before | Expand all | Expand 10 after
7222 7209
7223 7210
7224 void HOptimizedGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) { 7211 void HOptimizedGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) {
7225 ASSERT(!HasStackOverflow()); 7212 ASSERT(!HasStackOverflow());
7226 ASSERT(current_block() != NULL); 7213 ASSERT(current_block() != NULL);
7227 ASSERT(current_block()->HasPredecessor()); 7214 ASSERT(current_block()->HasPredecessor());
7228 switch (expr->op()) { 7215 switch (expr->op()) {
7229 case Token::DELETE: return VisitDelete(expr); 7216 case Token::DELETE: return VisitDelete(expr);
7230 case Token::VOID: return VisitVoid(expr); 7217 case Token::VOID: return VisitVoid(expr);
7231 case Token::TYPEOF: return VisitTypeof(expr); 7218 case Token::TYPEOF: return VisitTypeof(expr);
7232 case Token::BIT_NOT: return VisitBitNot(expr);
7233 case Token::NOT: return VisitNot(expr); 7219 case Token::NOT: return VisitNot(expr);
7234 default: UNREACHABLE(); 7220 default: UNREACHABLE();
7235 } 7221 }
7236 } 7222 }
7237 7223
7238 7224
7239 void HOptimizedGraphBuilder::VisitDelete(UnaryOperation* expr) { 7225 void HOptimizedGraphBuilder::VisitDelete(UnaryOperation* expr) {
7240 Property* prop = expr->expression()->AsProperty(); 7226 Property* prop = expr->expression()->AsProperty();
7241 VariableProxy* proxy = expr->expression()->AsVariableProxy(); 7227 VariableProxy* proxy = expr->expression()->AsVariableProxy();
7242 if (prop != NULL) { 7228 if (prop != NULL) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
7284 7270
7285 void HOptimizedGraphBuilder::VisitTypeof(UnaryOperation* expr) { 7271 void HOptimizedGraphBuilder::VisitTypeof(UnaryOperation* expr) {
7286 CHECK_ALIVE(VisitForTypeOf(expr->expression())); 7272 CHECK_ALIVE(VisitForTypeOf(expr->expression()));
7287 HValue* value = Pop(); 7273 HValue* value = Pop();
7288 HValue* context = environment()->context(); 7274 HValue* context = environment()->context();
7289 HInstruction* instr = new(zone()) HTypeof(context, value); 7275 HInstruction* instr = new(zone()) HTypeof(context, value);
7290 return ast_context()->ReturnInstruction(instr, expr->id()); 7276 return ast_context()->ReturnInstruction(instr, expr->id());
7291 } 7277 }
7292 7278
7293 7279
7294 void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) {
7295 CHECK_ALIVE(VisitForValue(expr->expression()));
7296 Handle<Type> operand_type = expr->expression()->bounds().lower;
7297 HValue* value = TruncateToNumber(Pop(), &operand_type);
7298 HInstruction* instr = BuildUnaryMathOp(value, operand_type, Token::BIT_NOT);
7299 return ast_context()->ReturnInstruction(instr, expr->id());
7300 }
7301
7302
7303 void HOptimizedGraphBuilder::VisitNot(UnaryOperation* expr) { 7280 void HOptimizedGraphBuilder::VisitNot(UnaryOperation* expr) {
7304 if (ast_context()->IsTest()) { 7281 if (ast_context()->IsTest()) {
7305 TestContext* context = TestContext::cast(ast_context()); 7282 TestContext* context = TestContext::cast(ast_context());
7306 VisitForControl(expr->expression(), 7283 VisitForControl(expr->expression(),
7307 context->if_false(), 7284 context->if_false(),
7308 context->if_true()); 7285 context->if_true());
7309 return; 7286 return;
7310 } 7287 }
7311 7288
7312 if (ast_context()->IsEffect()) { 7289 if (ast_context()->IsEffect()) {
(...skipping 2416 matching lines...) Expand 10 before | Expand all | Expand 10 after
9729 if (ShouldProduceTraceOutput()) { 9706 if (ShouldProduceTraceOutput()) {
9730 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 9707 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
9731 } 9708 }
9732 9709
9733 #ifdef DEBUG 9710 #ifdef DEBUG
9734 graph_->Verify(false); // No full verify. 9711 graph_->Verify(false); // No full verify.
9735 #endif 9712 #endif
9736 } 9713 }
9737 9714
9738 } } // namespace v8::internal 9715 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | src/x64/lithium-codegen-x64.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698