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 |