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 #ifndef V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ | 5 #ifndef V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ |
6 #define V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ | 6 #define V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ |
7 | 7 |
8 #include "src/compiler/instruction.h" | 8 #include "src/compiler/instruction.h" |
9 #include "src/compiler/instruction-selector.h" | 9 #include "src/compiler/instruction-selector.h" |
10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 UnallocatedOperand(UnallocatedOperand::FIXED_DOUBLE_REGISTER, | 41 UnallocatedOperand(UnallocatedOperand::FIXED_DOUBLE_REGISTER, |
42 DoubleRegister::ToAllocationIndex(reg))); | 42 DoubleRegister::ToAllocationIndex(reg))); |
43 } | 43 } |
44 | 44 |
45 InstructionOperand* DefineAsConstant(Node* node) { | 45 InstructionOperand* DefineAsConstant(Node* node) { |
46 selector()->MarkAsDefined(node); | 46 selector()->MarkAsDefined(node); |
47 sequence()->AddConstant(node->id(), ToConstant(node)); | 47 sequence()->AddConstant(node->id(), ToConstant(node)); |
48 return ConstantOperand::Create(node->id(), zone()); | 48 return ConstantOperand::Create(node->id(), zone()); |
49 } | 49 } |
50 | 50 |
51 InstructionOperand* DefineAsLocation(Node* node, LinkageLocation location) { | 51 InstructionOperand* DefineAsLocation(Node* node, LinkageLocation location, |
52 return Define(node, ToUnallocatedOperand(location)); | 52 MachineType type) { |
| 53 return Define(node, ToUnallocatedOperand(location, type)); |
53 } | 54 } |
54 | 55 |
55 InstructionOperand* Use(Node* node) { | 56 InstructionOperand* Use(Node* node) { |
56 return Use(node, | 57 return Use(node, |
57 new (zone()) UnallocatedOperand( | 58 new (zone()) UnallocatedOperand( |
58 UnallocatedOperand::ANY, UnallocatedOperand::USED_AT_START)); | 59 UnallocatedOperand::ANY, UnallocatedOperand::USED_AT_START)); |
59 } | 60 } |
60 | 61 |
61 InstructionOperand* UseRegister(Node* node) { | 62 InstructionOperand* UseRegister(Node* node) { |
62 return Use(node, new (zone()) | 63 return Use(node, new (zone()) |
(...skipping 24 matching lines...) Expand all Loading... |
87 return Use(node, new (zone()) | 88 return Use(node, new (zone()) |
88 UnallocatedOperand(UnallocatedOperand::FIXED_DOUBLE_REGISTER, | 89 UnallocatedOperand(UnallocatedOperand::FIXED_DOUBLE_REGISTER, |
89 DoubleRegister::ToAllocationIndex(reg))); | 90 DoubleRegister::ToAllocationIndex(reg))); |
90 } | 91 } |
91 | 92 |
92 InstructionOperand* UseImmediate(Node* node) { | 93 InstructionOperand* UseImmediate(Node* node) { |
93 int index = sequence()->AddImmediate(ToConstant(node)); | 94 int index = sequence()->AddImmediate(ToConstant(node)); |
94 return ImmediateOperand::Create(index, zone()); | 95 return ImmediateOperand::Create(index, zone()); |
95 } | 96 } |
96 | 97 |
97 InstructionOperand* UseLocation(Node* node, LinkageLocation location) { | 98 InstructionOperand* UseLocation(Node* node, LinkageLocation location, |
98 return Use(node, ToUnallocatedOperand(location)); | 99 MachineType type) { |
| 100 return Use(node, ToUnallocatedOperand(location, type)); |
99 } | 101 } |
100 | 102 |
101 InstructionOperand* TempRegister() { | 103 InstructionOperand* TempRegister() { |
102 UnallocatedOperand* op = | 104 UnallocatedOperand* op = |
103 new (zone()) UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER, | 105 new (zone()) UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER, |
104 UnallocatedOperand::USED_AT_START); | 106 UnallocatedOperand::USED_AT_START); |
105 op->set_virtual_register(sequence()->NextVirtualRegister()); | 107 op->set_virtual_register(sequence()->NextVirtualRegister()); |
106 return op; | 108 return op; |
107 } | 109 } |
108 | 110 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 } | 169 } |
168 | 170 |
169 UnallocatedOperand* Use(Node* node, UnallocatedOperand* operand) { | 171 UnallocatedOperand* Use(Node* node, UnallocatedOperand* operand) { |
170 DCHECK_NOT_NULL(node); | 172 DCHECK_NOT_NULL(node); |
171 DCHECK_NOT_NULL(operand); | 173 DCHECK_NOT_NULL(operand); |
172 operand->set_virtual_register(node->id()); | 174 operand->set_virtual_register(node->id()); |
173 selector()->MarkAsUsed(node); | 175 selector()->MarkAsUsed(node); |
174 return operand; | 176 return operand; |
175 } | 177 } |
176 | 178 |
177 UnallocatedOperand* ToUnallocatedOperand(LinkageLocation location) { | 179 UnallocatedOperand* ToUnallocatedOperand(LinkageLocation location, |
| 180 MachineType type) { |
178 if (location.location_ == LinkageLocation::ANY_REGISTER) { | 181 if (location.location_ == LinkageLocation::ANY_REGISTER) { |
179 return new (zone()) | 182 return new (zone()) |
180 UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER); | 183 UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER); |
181 } | 184 } |
182 if (location.location_ < 0) { | 185 if (location.location_ < 0) { |
183 return new (zone()) UnallocatedOperand(UnallocatedOperand::FIXED_SLOT, | 186 return new (zone()) UnallocatedOperand(UnallocatedOperand::FIXED_SLOT, |
184 location.location_); | 187 location.location_); |
185 } | 188 } |
186 if (RepresentationOf(location.rep_) == kRepFloat64) { | 189 if (RepresentationOf(type) == kRepFloat64) { |
187 return new (zone()) UnallocatedOperand( | 190 return new (zone()) UnallocatedOperand( |
188 UnallocatedOperand::FIXED_DOUBLE_REGISTER, location.location_); | 191 UnallocatedOperand::FIXED_DOUBLE_REGISTER, location.location_); |
189 } | 192 } |
190 return new (zone()) UnallocatedOperand(UnallocatedOperand::FIXED_REGISTER, | 193 return new (zone()) UnallocatedOperand(UnallocatedOperand::FIXED_REGISTER, |
191 location.location_); | 194 location.location_); |
192 } | 195 } |
193 | 196 |
194 InstructionSelector* selector_; | 197 InstructionSelector* selector_; |
195 }; | 198 }; |
196 | 199 |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 CallBuffer(Zone* zone, CallDescriptor* descriptor, | 334 CallBuffer(Zone* zone, CallDescriptor* descriptor, |
332 FrameStateDescriptor* frame_state); | 335 FrameStateDescriptor* frame_state); |
333 | 336 |
334 CallDescriptor* descriptor; | 337 CallDescriptor* descriptor; |
335 FrameStateDescriptor* frame_state_descriptor; | 338 FrameStateDescriptor* frame_state_descriptor; |
336 NodeVector output_nodes; | 339 NodeVector output_nodes; |
337 InstructionOperandVector outputs; | 340 InstructionOperandVector outputs; |
338 InstructionOperandVector instruction_args; | 341 InstructionOperandVector instruction_args; |
339 NodeVector pushed_nodes; | 342 NodeVector pushed_nodes; |
340 | 343 |
341 int input_count() const { return descriptor->InputCount(); } | 344 size_t input_count() const { return descriptor->InputCount(); } |
342 | 345 |
343 int frame_state_count() const { return descriptor->FrameStateCount(); } | 346 size_t frame_state_count() const { return descriptor->FrameStateCount(); } |
344 | 347 |
345 int frame_state_value_count() const { | 348 size_t frame_state_value_count() const { |
346 return (frame_state_descriptor == NULL) | 349 return (frame_state_descriptor == NULL) |
347 ? 0 | 350 ? 0 |
348 : (frame_state_descriptor->size() + 1); | 351 : (frame_state_descriptor->size() + 1); |
349 } | 352 } |
350 }; | 353 }; |
351 | 354 |
352 } // namespace compiler | 355 } // namespace compiler |
353 } // namespace internal | 356 } // namespace internal |
354 } // namespace v8 | 357 } // namespace v8 |
355 | 358 |
356 #endif // V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ | 359 #endif // V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ |
OLD | NEW |