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 Handle<Code> GenerateCode(); | |
Michael Starzinger
2016/11/15 15:09:47
nit: Implementation is gone, lets drop the declara
Jakob Kummerow
2016/11/15 15:21:13
Done.
| |
535 | |
536 private: | |
537 friend class CodeAssembler; | |
538 | |
539 CodeAssemblerState(Isolate* isolate, Zone* zone, | |
540 CallDescriptor* call_descriptor, Code::Flags flags, | |
541 const char* name); | |
542 | |
543 std::unique_ptr<RawMachineAssembler> raw_assembler_; | |
544 Code::Flags flags_; | |
545 const char* name_; | |
546 bool code_generated_; | |
547 ZoneSet<CodeAssembler::Variable::Impl*> variables_; | |
548 | |
549 DISALLOW_COPY_AND_ASSIGN(CodeAssemblerState); | |
550 }; | |
551 | |
526 } // namespace compiler | 552 } // namespace compiler |
527 } // namespace internal | 553 } // namespace internal |
528 } // namespace v8 | 554 } // namespace v8 |
529 | 555 |
530 #endif // V8_COMPILER_CODE_ASSEMBLER_H_ | 556 #endif // V8_COMPILER_CODE_ASSEMBLER_H_ |
OLD | NEW |