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

Side by Side Diff: src/hydrogen.cc

Issue 17229005: Convert UnaryOpStub to a HydrogenCodeStub (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: add some duckt tape for now to fix non-sse Created 7 years, 5 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 990 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 int num_parameters = graph()->info()->num_parameters(); 1001 int num_parameters = graph()->info()->num_parameters();
1002 HValue* params = AddInstruction(new(graph()->zone()) 1002 HValue* params = AddInstruction(new(graph()->zone())
1003 HConstant(num_parameters)); 1003 HConstant(num_parameters));
1004 HReturn* return_instruction = new(graph()->zone()) 1004 HReturn* return_instruction = new(graph()->zone())
1005 HReturn(value, context, params); 1005 HReturn(value, context, params);
1006 current_block()->FinishExit(return_instruction); 1006 current_block()->FinishExit(return_instruction);
1007 return return_instruction; 1007 return return_instruction;
1008 } 1008 }
1009 1009
1010 1010
1011 void HGraphBuilder::AddSoftDeoptimize() {
1012 if (FLAG_always_opt) return;
1013 if (current_block()->IsDeoptimizing()) return;
1014 AddInstruction(new(zone()) HSoftDeoptimize());
1015 current_block()->MarkAsDeoptimizing();
1016 graph()->set_has_soft_deoptimize(true);
1017 }
1018
1019
1020 // TODO(rossberg): this should die eventually.
1021 Representation HGraphBuilder::ToRepresentation(TypeInfo info) {
1022 if (info.IsUninitialized()) return Representation::None();
1023 // TODO(verwaest): Return Smi rather than Integer32.
1024 if (info.IsSmi()) return Representation::Integer32();
1025 if (info.IsInteger32()) return Representation::Integer32();
1026 if (info.IsDouble()) return Representation::Double();
1027 if (info.IsNumber()) return Representation::Double();
1028 return Representation::Tagged();
1029 }
1030
1031
1032 Representation HGraphBuilder::ToRepresentation(Handle<Type> type) {
1033 if (type->Is(Type::None())) return Representation::None();
1034 if (type->Is(Type::Integer32())) return Representation::Integer32();
1035 if (type->Is(Type::Number())) return Representation::Double();
1036 return Representation::Tagged();
1037 }
1038
1039
1011 HBasicBlock* HGraphBuilder::CreateBasicBlock(HEnvironment* env) { 1040 HBasicBlock* HGraphBuilder::CreateBasicBlock(HEnvironment* env) {
1012 HBasicBlock* b = graph()->CreateBasicBlock(); 1041 HBasicBlock* b = graph()->CreateBasicBlock();
1013 b->SetInitialEnvironment(env); 1042 b->SetInitialEnvironment(env);
1014 return b; 1043 return b;
1015 } 1044 }
1016 1045
1017 1046
1018 HBasicBlock* HGraphBuilder::CreateLoopHeaderBlock() { 1047 HBasicBlock* HGraphBuilder::CreateLoopHeaderBlock() {
1019 HBasicBlock* header = graph()->CreateBasicBlock(); 1048 HBasicBlock* header = graph()->CreateBasicBlock();
1020 HEnvironment* entry_env = environment()->CopyAsLoopHeader(header); 1049 HEnvironment* entry_env = environment()->CopyAsLoopHeader(header);
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
1671 key_constant, 1700 key_constant,
1672 value, 1701 value,
1673 kind)); 1702 kind));
1674 } 1703 }
1675 } 1704 }
1676 1705
1677 return object; 1706 return object;
1678 } 1707 }
1679 1708
1680 1709
1710 HInstruction* HGraphBuilder::BuildSub(
1711 HValue* value, Handle<Type> type, HValue* context) {
1712 HInstruction* instr =
1713 HMul::New(zone(), context, value, graph()->GetConstantMinus1());
1714 Representation rep = ToRepresentation(type);
1715 if (type->Is(Type::None())) {
1716 AddSoftDeoptimize();
1717 type = handle(Type::Any(), isolate());
1718 }
1719 if (instr->IsBinaryOperation()) {
1720 HBinaryOperation::cast(instr)->set_observed_input_representation(1, rep);
1721 HBinaryOperation::cast(instr)->set_observed_input_representation(2, rep);
1722 }
1723 return instr;
1724 }
1725
1726
1727 HInstruction* HGraphBuilder::BuildBitNot(HValue* value, Handle<Type> type) {
1728 if (type->Is(Type::None())) {
1729 AddSoftDeoptimize();
1730 }
1731 return new(zone()) HBitNot(value);
1732 }
1733
1734
1681 void HGraphBuilder::BuildCompareNil( 1735 void HGraphBuilder::BuildCompareNil(
1682 HValue* value, 1736 HValue* value,
1683 Handle<Type> type, 1737 Handle<Type> type,
1684 int position, 1738 int position,
1685 HIfContinuation* continuation) { 1739 HIfContinuation* continuation) {
1686 IfBuilder if_nil(this, position); 1740 IfBuilder if_nil(this, position);
1687 bool needs_or = false; 1741 bool needs_or = false;
1688 if (type->Maybe(Type::Null())) { 1742 if (type->Maybe(Type::Null())) {
1689 if (needs_or) if_nil.Or(); 1743 if (needs_or) if_nil.Or();
1690 if_nil.If<HCompareObjectEqAndBranch>(value, graph()->GetConstantNull()); 1744 if_nil.If<HCompareObjectEqAndBranch>(value, graph()->GetConstantNull());
(...skipping 2965 matching lines...) Expand 10 before | Expand all | Expand 10 after
4656 current_block()->AddPhi(instr); 4710 current_block()->AddPhi(instr);
4657 } 4711 }
4658 4712
4659 4713
4660 void HOptimizedGraphBuilder::PushAndAdd(HInstruction* instr) { 4714 void HOptimizedGraphBuilder::PushAndAdd(HInstruction* instr) {
4661 Push(instr); 4715 Push(instr);
4662 AddInstruction(instr); 4716 AddInstruction(instr);
4663 } 4717 }
4664 4718
4665 4719
4666 void HOptimizedGraphBuilder::AddSoftDeoptimize() {
4667 if (FLAG_always_opt) return;
4668 if (current_block()->IsDeoptimizing()) return;
4669 AddInstruction(new(zone()) HSoftDeoptimize());
4670 current_block()->MarkAsDeoptimizing();
4671 graph()->set_has_soft_deoptimize(true);
4672 }
4673
4674
4675 template <class Instruction> 4720 template <class Instruction>
4676 HInstruction* HOptimizedGraphBuilder::PreProcessCall(Instruction* call) { 4721 HInstruction* HOptimizedGraphBuilder::PreProcessCall(Instruction* call) {
4677 int count = call->argument_count(); 4722 int count = call->argument_count();
4678 ZoneList<HValue*> arguments(count, zone()); 4723 ZoneList<HValue*> arguments(count, zone());
4679 for (int i = 0; i < count; ++i) { 4724 for (int i = 0; i < count; ++i) {
4680 arguments.Add(Pop(), zone()); 4725 arguments.Add(Pop(), zone());
4681 } 4726 }
4682 4727
4683 while (!arguments.is_empty()) { 4728 while (!arguments.is_empty()) {
4684 AddInstruction(new(zone()) HPushArgument(arguments.RemoveLast())); 4729 AddInstruction(new(zone()) HPushArgument(arguments.RemoveLast()));
(...skipping 4340 matching lines...) Expand 10 before | Expand all | Expand 10 after
9025 HValue* context = environment()->LookupContext(); 9070 HValue* context = environment()->LookupContext();
9026 HInstruction* instr = new(zone()) HTypeof(context, value); 9071 HInstruction* instr = new(zone()) HTypeof(context, value);
9027 return ast_context()->ReturnInstruction(instr, expr->id()); 9072 return ast_context()->ReturnInstruction(instr, expr->id());
9028 } 9073 }
9029 9074
9030 9075
9031 void HOptimizedGraphBuilder::VisitSub(UnaryOperation* expr) { 9076 void HOptimizedGraphBuilder::VisitSub(UnaryOperation* expr) {
9032 CHECK_ALIVE(VisitForValue(expr->expression())); 9077 CHECK_ALIVE(VisitForValue(expr->expression()));
9033 HValue* value = Pop(); 9078 HValue* value = Pop();
9034 HValue* context = environment()->LookupContext(); 9079 HValue* context = environment()->LookupContext();
9035 HInstruction* instr =
9036 HMul::New(zone(), context, value, graph()->GetConstantMinus1());
9037 Handle<Type> type = expr->type(); 9080 Handle<Type> type = expr->type();
9038 Representation rep = ToRepresentation(type); 9081 HInstruction* instr = BuildSub(value, type, context);
9039 if (type->Is(Type::None())) {
9040 AddSoftDeoptimize();
9041 type = handle(Type::Any(), isolate());
9042 }
9043 if (instr->IsBinaryOperation()) {
9044 HBinaryOperation::cast(instr)->set_observed_input_representation(1, rep);
9045 HBinaryOperation::cast(instr)->set_observed_input_representation(2, rep);
9046 }
9047 return ast_context()->ReturnInstruction(instr, expr->id()); 9082 return ast_context()->ReturnInstruction(instr, expr->id());
9048 } 9083 }
9049 9084
9050 9085
9051 void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) { 9086 void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) {
9052 CHECK_ALIVE(VisitForValue(expr->expression())); 9087 CHECK_ALIVE(VisitForValue(expr->expression()));
9053 HValue* value = Pop(); 9088 HValue* value = Pop();
9054 Handle<Type> info = expr->type(); 9089 Handle<Type> info = expr->type();
9055 if (info->Is(Type::None())) { 9090 HInstruction* instr = BuildBitNot(value, info);
9056 AddSoftDeoptimize();
9057 }
9058 HInstruction* instr = new(zone()) HBitNot(value);
9059 return ast_context()->ReturnInstruction(instr, expr->id()); 9091 return ast_context()->ReturnInstruction(instr, expr->id());
9060 } 9092 }
9061 9093
9062 9094
9063 void HOptimizedGraphBuilder::VisitNot(UnaryOperation* expr) { 9095 void HOptimizedGraphBuilder::VisitNot(UnaryOperation* expr) {
9064 if (ast_context()->IsTest()) { 9096 if (ast_context()->IsTest()) {
9065 TestContext* context = TestContext::cast(ast_context()); 9097 TestContext* context = TestContext::cast(ast_context());
9066 VisitForControl(expr->expression(), 9098 VisitForControl(expr->expression(),
9067 context->if_false(), 9099 context->if_false(),
9068 context->if_true()); 9100 context->if_true());
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
9647 CHECK_ALIVE(VisitForValue(expr->left())); 9679 CHECK_ALIVE(VisitForValue(expr->left()));
9648 CHECK_ALIVE(VisitForValue(expr->right())); 9680 CHECK_ALIVE(VisitForValue(expr->right()));
9649 HValue* right = Pop(); 9681 HValue* right = Pop();
9650 HValue* left = Pop(); 9682 HValue* left = Pop();
9651 HInstruction* instr = BuildBinaryOperation(expr, left, right); 9683 HInstruction* instr = BuildBinaryOperation(expr, left, right);
9652 instr->set_position(expr->position()); 9684 instr->set_position(expr->position());
9653 return ast_context()->ReturnInstruction(instr, expr->id()); 9685 return ast_context()->ReturnInstruction(instr, expr->id());
9654 } 9686 }
9655 9687
9656 9688
9657 // TODO(rossberg): this should die eventually.
9658 Representation HOptimizedGraphBuilder::ToRepresentation(TypeInfo info) {
9659 if (info.IsUninitialized()) return Representation::None();
9660 // TODO(verwaest): Return Smi rather than Integer32.
9661 if (info.IsSmi()) return Representation::Integer32();
9662 if (info.IsInteger32()) return Representation::Integer32();
9663 if (info.IsDouble()) return Representation::Double();
9664 if (info.IsNumber()) return Representation::Double();
9665 return Representation::Tagged();
9666 }
9667
9668
9669 Representation HOptimizedGraphBuilder::ToRepresentation(Handle<Type> type) {
9670 if (type->Is(Type::None())) return Representation::None();
9671 if (type->Is(Type::Integer32())) return Representation::Integer32();
9672 if (type->Is(Type::Number())) return Representation::Double();
9673 return Representation::Tagged();
9674 }
9675
9676
9677 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, 9689 void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr,
9678 HTypeof* typeof_expr, 9690 HTypeof* typeof_expr,
9679 Handle<String> check) { 9691 Handle<String> check) {
9680 // Note: The HTypeof itself is removed during canonicalization, if possible. 9692 // Note: The HTypeof itself is removed during canonicalization, if possible.
9681 HValue* value = typeof_expr->value(); 9693 HValue* value = typeof_expr->value();
9682 HTypeofIsAndBranch* instr = new(zone()) HTypeofIsAndBranch(value, check); 9694 HTypeofIsAndBranch* instr = new(zone()) HTypeofIsAndBranch(value, check);
9683 instr->set_position(expr->position()); 9695 instr->set_position(expr->position());
9684 return ast_context()->ReturnControl(instr, expr->id()); 9696 return ast_context()->ReturnControl(instr, expr->id());
9685 } 9697 }
9686 9698
(...skipping 1901 matching lines...) Expand 10 before | Expand all | Expand 10 after
11588 } 11600 }
11589 } 11601 }
11590 11602
11591 #ifdef DEBUG 11603 #ifdef DEBUG
11592 if (graph_ != NULL) graph_->Verify(false); // No full verify. 11604 if (graph_ != NULL) graph_->Verify(false); // No full verify.
11593 if (allocator_ != NULL) allocator_->Verify(); 11605 if (allocator_ != NULL) allocator_->Verify();
11594 #endif 11606 #endif
11595 } 11607 }
11596 11608
11597 } } // namespace v8::internal 11609 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698