OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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_CODE_ASSEMBLER_H_ | 5 #ifndef V8_COMPILER_CODE_ASSEMBLER_H_ |
6 #define V8_COMPILER_CODE_ASSEMBLER_H_ | 6 #define V8_COMPILER_CODE_ASSEMBLER_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
(...skipping 12 matching lines...) Expand all Loading... |
23 | 23 |
24 class Callable; | 24 class Callable; |
25 class CallInterfaceDescriptor; | 25 class CallInterfaceDescriptor; |
26 class Isolate; | 26 class Isolate; |
27 class Factory; | 27 class Factory; |
28 class Zone; | 28 class Zone; |
29 | 29 |
30 namespace compiler { | 30 namespace compiler { |
31 | 31 |
32 class CallDescriptor; | 32 class CallDescriptor; |
| 33 class CodeAssemblerState; |
33 class Node; | 34 class Node; |
34 class RawMachineAssembler; | 35 class RawMachineAssembler; |
35 class RawMachineLabel; | 36 class RawMachineLabel; |
36 | 37 |
37 #define CODE_ASSEMBLER_COMPARE_BINARY_OP_LIST(V) \ | 38 #define CODE_ASSEMBLER_COMPARE_BINARY_OP_LIST(V) \ |
38 V(Float32Equal) \ | 39 V(Float32Equal) \ |
39 V(Float32LessThan) \ | 40 V(Float32LessThan) \ |
40 V(Float32LessThanOrEqual) \ | 41 V(Float32LessThanOrEqual) \ |
41 V(Float32GreaterThan) \ | 42 V(Float32GreaterThan) \ |
42 V(Float32GreaterThanOrEqual) \ | 43 V(Float32GreaterThanOrEqual) \ |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 // V8 components that need to generate low-level code using this interface | 167 // V8 components that need to generate low-level code using this interface |
167 // should include this header--and this header only--from the compiler directory | 168 // should include this header--and this header only--from the compiler directory |
168 // (this is actually enforced). Since all interesting data structures are | 169 // (this is actually enforced). Since all interesting data structures are |
169 // forward declared, it's not possible for clients to peek inside the compiler | 170 // forward declared, it's not possible for clients to peek inside the compiler |
170 // internals. | 171 // internals. |
171 // | 172 // |
172 // In addition to providing isolation between TurboFan and code generation | 173 // In addition to providing isolation between TurboFan and code generation |
173 // clients, CodeAssembler also provides an abstraction for creating variables | 174 // clients, CodeAssembler also provides an abstraction for creating variables |
174 // and enhanced Label functionality to merge variable values along paths where | 175 // and enhanced Label functionality to merge variable values along paths where |
175 // they have differing values, including loops. | 176 // they have differing values, including loops. |
| 177 // |
| 178 // The CodeAssembler itself is stateless (and instances are expected to be |
| 179 // temporary-scoped and short-lived); all its state is encapsulated into |
| 180 // a CodeAssemblerState instance. |
176 class V8_EXPORT_PRIVATE CodeAssembler { | 181 class V8_EXPORT_PRIVATE CodeAssembler { |
177 public: | 182 public: |
178 // Create with CallStub linkage. | 183 explicit CodeAssembler(CodeAssemblerState* state) : state_(state) {} |
179 // |result_size| specifies the number of results returned by the stub. | |
180 // TODO(rmcilroy): move result_size to the CallInterfaceDescriptor. | |
181 CodeAssembler(Isolate* isolate, Zone* zone, | |
182 const CallInterfaceDescriptor& descriptor, Code::Flags flags, | |
183 const char* name, size_t result_size = 1); | |
184 | |
185 // Create with JSCall linkage. | |
186 CodeAssembler(Isolate* isolate, Zone* zone, int parameter_count, | |
187 Code::Flags flags, const char* name); | |
188 | 184 |
189 virtual ~CodeAssembler(); | 185 virtual ~CodeAssembler(); |
190 | 186 |
191 Handle<Code> GenerateCode(); | 187 static Handle<Code> GenerateCode(CodeAssemblerState* state); |
192 | 188 |
193 bool Is64() const; | 189 bool Is64() const; |
194 bool IsFloat64RoundUpSupported() const; | 190 bool IsFloat64RoundUpSupported() const; |
195 bool IsFloat64RoundDownSupported() const; | 191 bool IsFloat64RoundDownSupported() const; |
196 bool IsFloat64RoundTruncateSupported() const; | 192 bool IsFloat64RoundTruncateSupported() const; |
197 | 193 |
198 class Label; | 194 class Label; |
199 class Variable { | 195 class Variable { |
200 public: | 196 public: |
201 explicit Variable(CodeAssembler* assembler, MachineRepresentation rep); | 197 explicit Variable(CodeAssembler* assembler, MachineRepresentation rep); |
202 ~Variable(); | 198 ~Variable(); |
203 void Bind(Node* value); | 199 void Bind(Node* value); |
204 Node* value() const; | 200 Node* value() const; |
205 MachineRepresentation rep() const; | 201 MachineRepresentation rep() const; |
206 bool IsBound() const; | 202 bool IsBound() const; |
207 | 203 |
208 private: | 204 private: |
209 friend class CodeAssembler; | 205 friend class CodeAssembler; |
| 206 friend class CodeAssemblerState; |
210 class Impl; | 207 class Impl; |
211 Impl* impl_; | 208 Impl* impl_; |
212 CodeAssembler* assembler_; | 209 CodeAssemblerState* state_; |
213 }; | 210 }; |
214 | 211 |
215 typedef ZoneList<Variable*> VariableList; | 212 typedef ZoneList<Variable*> VariableList; |
216 | 213 |
217 // =========================================================================== | 214 // =========================================================================== |
218 // Base Assembler | 215 // Base Assembler |
219 // =========================================================================== | 216 // =========================================================================== |
220 | 217 |
221 // Constants. | 218 // Constants. |
222 Node* Int32Constant(int32_t value); | 219 Node* Int32Constant(int32_t value); |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 Factory* factory() const; | 461 Factory* factory() const; |
465 Isolate* isolate() const; | 462 Isolate* isolate() const; |
466 Zone* zone() const; | 463 Zone* zone() const; |
467 | 464 |
468 protected: | 465 protected: |
469 // Enables subclasses to perform operations before and after a call. | 466 // Enables subclasses to perform operations before and after a call. |
470 virtual void CallPrologue(); | 467 virtual void CallPrologue(); |
471 virtual void CallEpilogue(); | 468 virtual void CallEpilogue(); |
472 | 469 |
473 private: | 470 private: |
474 CodeAssembler(Isolate* isolate, Zone* zone, CallDescriptor* call_descriptor, | |
475 Code::Flags flags, const char* name); | |
476 | |
477 Node* CallN(CallDescriptor* descriptor, Node* code_target, Node** args); | 471 Node* CallN(CallDescriptor* descriptor, Node* code_target, Node** args); |
478 Node* TailCallN(CallDescriptor* descriptor, Node* code_target, Node** args); | 472 Node* TailCallN(CallDescriptor* descriptor, Node* code_target, Node** args); |
479 | 473 |
480 std::unique_ptr<RawMachineAssembler> raw_assembler_; | 474 RawMachineAssembler* raw_assembler() const; |
481 Code::Flags flags_; | 475 |
482 const char* name_; | 476 CodeAssemblerState* state_; |
483 bool code_generated_; | |
484 ZoneSet<Variable::Impl*> variables_; | |
485 | 477 |
486 DISALLOW_COPY_AND_ASSIGN(CodeAssembler); | 478 DISALLOW_COPY_AND_ASSIGN(CodeAssembler); |
487 }; | 479 }; |
488 | 480 |
489 class CodeAssembler::Label { | 481 class CodeAssembler::Label { |
490 public: | 482 public: |
491 enum Type { kDeferred, kNonDeferred }; | 483 enum Type { kDeferred, kNonDeferred }; |
492 | 484 |
493 explicit Label( | 485 explicit Label( |
494 CodeAssembler* assembler, | 486 CodeAssembler* assembler, |
(...skipping 11 matching lines...) Expand all Loading... |
506 ~Label() {} | 498 ~Label() {} |
507 | 499 |
508 private: | 500 private: |
509 friend class CodeAssembler; | 501 friend class CodeAssembler; |
510 | 502 |
511 void Bind(); | 503 void Bind(); |
512 void MergeVariables(); | 504 void MergeVariables(); |
513 | 505 |
514 bool bound_; | 506 bool bound_; |
515 size_t merge_count_; | 507 size_t merge_count_; |
516 CodeAssembler* assembler_; | 508 CodeAssemblerState* state_; |
517 RawMachineLabel* label_; | 509 RawMachineLabel* label_; |
518 // Map of variables that need to be merged to their phi nodes (or placeholders | 510 // Map of variables that need to be merged to their phi nodes (or placeholders |
519 // for those phis). | 511 // for those phis). |
520 std::map<Variable::Impl*, Node*> variable_phis_; | 512 std::map<Variable::Impl*, Node*> variable_phis_; |
521 // Map of variables to the list of value nodes that have been added from each | 513 // Map of variables to the list of value nodes that have been added from each |
522 // merge path in their order of merging. | 514 // merge path in their order of merging. |
523 std::map<Variable::Impl*, std::vector<Node*>> variable_merges_; | 515 std::map<Variable::Impl*, std::vector<Node*>> variable_merges_; |
524 }; | 516 }; |
525 | 517 |
| 518 class V8_EXPORT_PRIVATE CodeAssemblerState { |
| 519 public: |
| 520 // Create with CallStub linkage. |
| 521 // |result_size| specifies the number of results returned by the stub. |
| 522 // TODO(rmcilroy): move result_size to the CallInterfaceDescriptor. |
| 523 CodeAssemblerState(Isolate* isolate, Zone* zone, |
| 524 const CallInterfaceDescriptor& descriptor, |
| 525 Code::Flags flags, const char* name, |
| 526 size_t result_size = 1); |
| 527 |
| 528 // Create with JSCall linkage. |
| 529 CodeAssemblerState(Isolate* isolate, Zone* zone, int parameter_count, |
| 530 Code::Flags flags, const char* name); |
| 531 |
| 532 ~CodeAssemblerState(); |
| 533 |
| 534 private: |
| 535 friend class CodeAssembler; |
| 536 |
| 537 CodeAssemblerState(Isolate* isolate, Zone* zone, |
| 538 CallDescriptor* call_descriptor, Code::Flags flags, |
| 539 const char* name); |
| 540 |
| 541 std::unique_ptr<RawMachineAssembler> raw_assembler_; |
| 542 Code::Flags flags_; |
| 543 const char* name_; |
| 544 bool code_generated_; |
| 545 ZoneSet<CodeAssembler::Variable::Impl*> variables_; |
| 546 |
| 547 DISALLOW_COPY_AND_ASSIGN(CodeAssemblerState); |
| 548 }; |
| 549 |
526 } // namespace compiler | 550 } // namespace compiler |
527 } // namespace internal | 551 } // namespace internal |
528 } // namespace v8 | 552 } // namespace v8 |
529 | 553 |
530 #endif // V8_COMPILER_CODE_ASSEMBLER_H_ | 554 #endif // V8_COMPILER_CODE_ASSEMBLER_H_ |
OLD | NEW |