| OLD | NEW | 
|     1 // Copyright 2014 the V8 project authors. All rights reserved. |     1 // Copyright 2014 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/compiler/instruction-selector.h" |     5 #include "src/compiler/instruction-selector.h" | 
|     6  |     6  | 
|     7 #include <limits> |     7 #include <limits> | 
|     8  |     8  | 
|     9 #include "src/base/adapters.h" |     9 #include "src/base/adapters.h" | 
|    10 #include "src/compiler/instruction-selector-impl.h" |    10 #include "src/compiler/instruction-selector-impl.h" | 
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   292 void InstructionSelector::MarkAsDefined(Node* node) { |   292 void InstructionSelector::MarkAsDefined(Node* node) { | 
|   293   DCHECK_NOT_NULL(node); |   293   DCHECK_NOT_NULL(node); | 
|   294   size_t const id = node->id(); |   294   size_t const id = node->id(); | 
|   295   DCHECK_LT(id, defined_.size()); |   295   DCHECK_LT(id, defined_.size()); | 
|   296   defined_[id] = true; |   296   defined_[id] = true; | 
|   297 } |   297 } | 
|   298  |   298  | 
|   299  |   299  | 
|   300 bool InstructionSelector::IsUsed(Node* node) const { |   300 bool InstructionSelector::IsUsed(Node* node) const { | 
|   301   DCHECK_NOT_NULL(node); |   301   DCHECK_NOT_NULL(node); | 
 |   302   // TODO(bmeurer): This is a terrible monster hack, but we have to make sure | 
 |   303   // that the Retain is actually emitted, otherwise the GC will mess up. | 
 |   304   if (node->opcode() == IrOpcode::kRetain) return true; | 
|   302   if (!node->op()->HasProperty(Operator::kEliminatable)) return true; |   305   if (!node->op()->HasProperty(Operator::kEliminatable)) return true; | 
|   303   size_t const id = node->id(); |   306   size_t const id = node->id(); | 
|   304   DCHECK_LT(id, used_.size()); |   307   DCHECK_LT(id, used_.size()); | 
|   305   return used_[id]; |   308   return used_[id]; | 
|   306 } |   309 } | 
|   307  |   310  | 
|   308  |   311  | 
|   309 void InstructionSelector::MarkAsUsed(Node* node) { |   312 void InstructionSelector::MarkAsUsed(Node* node) { | 
|   310   DCHECK_NOT_NULL(node); |   313   DCHECK_NOT_NULL(node); | 
|   311   size_t const id = node->id(); |   314   size_t const id = node->id(); | 
| (...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   922     case IrOpcode::kFrameState: |   925     case IrOpcode::kFrameState: | 
|   923     case IrOpcode::kStateValues: |   926     case IrOpcode::kStateValues: | 
|   924     case IrOpcode::kObjectState: |   927     case IrOpcode::kObjectState: | 
|   925       return; |   928       return; | 
|   926     case IrOpcode::kDebugBreak: |   929     case IrOpcode::kDebugBreak: | 
|   927       VisitDebugBreak(node); |   930       VisitDebugBreak(node); | 
|   928       return; |   931       return; | 
|   929     case IrOpcode::kComment: |   932     case IrOpcode::kComment: | 
|   930       VisitComment(node); |   933       VisitComment(node); | 
|   931       return; |   934       return; | 
 |   935     case IrOpcode::kRetain: | 
 |   936       VisitRetain(node); | 
 |   937       return; | 
|   932     case IrOpcode::kLoad: { |   938     case IrOpcode::kLoad: { | 
|   933       LoadRepresentation type = LoadRepresentationOf(node->op()); |   939       LoadRepresentation type = LoadRepresentationOf(node->op()); | 
|   934       MarkAsRepresentation(type.representation(), node); |   940       MarkAsRepresentation(type.representation(), node); | 
|   935       return VisitLoad(node); |   941       return VisitLoad(node); | 
|   936     } |   942     } | 
|   937     case IrOpcode::kStore: |   943     case IrOpcode::kStore: | 
|   938       return VisitStore(node); |   944       return VisitStore(node); | 
|   939     case IrOpcode::kWord32And: |   945     case IrOpcode::kWord32And: | 
|   940       return MarkAsWord32(node), VisitWord32And(node); |   946       return MarkAsWord32(node), VisitWord32And(node); | 
|   941     case IrOpcode::kWord32Or: |   947     case IrOpcode::kWord32Or: | 
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1290       MarkAsWord32(NodeProperties::FindProjection(node, 0)); |  1296       MarkAsWord32(NodeProperties::FindProjection(node, 0)); | 
|  1291       MarkAsWord32(NodeProperties::FindProjection(node, 1)); |  1297       MarkAsWord32(NodeProperties::FindProjection(node, 1)); | 
|  1292       return VisitWord32PairSar(node); |  1298       return VisitWord32PairSar(node); | 
|  1293     case IrOpcode::kAtomicLoad: { |  1299     case IrOpcode::kAtomicLoad: { | 
|  1294       LoadRepresentation type = LoadRepresentationOf(node->op()); |  1300       LoadRepresentation type = LoadRepresentationOf(node->op()); | 
|  1295       MarkAsRepresentation(type.representation(), node); |  1301       MarkAsRepresentation(type.representation(), node); | 
|  1296       return VisitAtomicLoad(node); |  1302       return VisitAtomicLoad(node); | 
|  1297     } |  1303     } | 
|  1298     case IrOpcode::kAtomicStore: |  1304     case IrOpcode::kAtomicStore: | 
|  1299       return VisitAtomicStore(node); |  1305       return VisitAtomicStore(node); | 
 |  1306     case IrOpcode::kUnsafePointerAdd: | 
 |  1307       MarkAsRepresentation(MachineType::PointerRepresentation(), node); | 
 |  1308       return VisitUnsafePointerAdd(node); | 
|  1300     default: |  1309     default: | 
|  1301       V8_Fatal(__FILE__, __LINE__, "Unexpected operator #%d:%s @ node #%d", |  1310       V8_Fatal(__FILE__, __LINE__, "Unexpected operator #%d:%s @ node #%d", | 
|  1302                node->opcode(), node->op()->mnemonic(), node->id()); |  1311                node->opcode(), node->op()->mnemonic(), node->id()); | 
|  1303       break; |  1312       break; | 
|  1304   } |  1313   } | 
|  1305 } |  1314 } | 
|  1306  |  1315  | 
|  1307 void InstructionSelector::VisitImpossibleToWord32(Node* node) { |  1316 void InstructionSelector::VisitImpossibleToWord32(Node* node) { | 
|  1308   OperandGenerator g(this); |  1317   OperandGenerator g(this); | 
|  1309   Emit(kArchImpossible, g.DefineAsConstant(node, Constant(0))); |  1318   Emit(kArchImpossible, g.DefineAsConstant(node, Constant(0))); | 
| (...skipping 699 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2009   OperandGenerator g(this); |  2018   OperandGenerator g(this); | 
|  2010   Emit(kArchDebugBreak, g.NoOutput()); |  2019   Emit(kArchDebugBreak, g.NoOutput()); | 
|  2011 } |  2020 } | 
|  2012  |  2021  | 
|  2013 void InstructionSelector::VisitComment(Node* node) { |  2022 void InstructionSelector::VisitComment(Node* node) { | 
|  2014   OperandGenerator g(this); |  2023   OperandGenerator g(this); | 
|  2015   InstructionOperand operand(g.UseImmediate(node)); |  2024   InstructionOperand operand(g.UseImmediate(node)); | 
|  2016   Emit(kArchComment, 0, nullptr, 1, &operand); |  2025   Emit(kArchComment, 0, nullptr, 1, &operand); | 
|  2017 } |  2026 } | 
|  2018  |  2027  | 
 |  2028 void InstructionSelector::VisitUnsafePointerAdd(Node* node) { | 
 |  2029 #if V8_TARGET_ARCH_64_BIT | 
 |  2030   VisitInt64Add(node); | 
 |  2031 #else   // V8_TARGET_ARCH_64_BIT | 
 |  2032   VisitInt32Add(node); | 
 |  2033 #endif  // V8_TARGET_ARCH_64_BIT | 
 |  2034 } | 
 |  2035  | 
 |  2036 void InstructionSelector::VisitRetain(Node* node) { | 
 |  2037   OperandGenerator g(this); | 
 |  2038   Emit(kArchNop, g.NoOutput(), g.UseAny(node->InputAt(0))); | 
 |  2039 } | 
 |  2040  | 
|  2019 bool InstructionSelector::CanProduceSignalingNaN(Node* node) { |  2041 bool InstructionSelector::CanProduceSignalingNaN(Node* node) { | 
|  2020   // TODO(jarin) Improve the heuristic here. |  2042   // TODO(jarin) Improve the heuristic here. | 
|  2021   if (node->opcode() == IrOpcode::kFloat64Add || |  2043   if (node->opcode() == IrOpcode::kFloat64Add || | 
|  2022       node->opcode() == IrOpcode::kFloat64Sub || |  2044       node->opcode() == IrOpcode::kFloat64Sub || | 
|  2023       node->opcode() == IrOpcode::kFloat64Mul) { |  2045       node->opcode() == IrOpcode::kFloat64Mul) { | 
|  2024     return false; |  2046     return false; | 
|  2025   } |  2047   } | 
|  2026   return true; |  2048   return true; | 
|  2027 } |  2049 } | 
|  2028  |  2050  | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
|  2051   return new (instruction_zone()) FrameStateDescriptor( |  2073   return new (instruction_zone()) FrameStateDescriptor( | 
|  2052       instruction_zone(), state_info.type(), state_info.bailout_id(), |  2074       instruction_zone(), state_info.type(), state_info.bailout_id(), | 
|  2053       state_info.state_combine(), parameters, locals, stack, |  2075       state_info.state_combine(), parameters, locals, stack, | 
|  2054       state_info.shared_info(), outer_state); |  2076       state_info.shared_info(), outer_state); | 
|  2055 } |  2077 } | 
|  2056  |  2078  | 
|  2057  |  2079  | 
|  2058 }  // namespace compiler |  2080 }  // namespace compiler | 
|  2059 }  // namespace internal |  2081 }  // namespace internal | 
|  2060 }  // namespace v8 |  2082 }  // namespace v8 | 
| OLD | NEW |