Index: src/compiler/raw-machine-assembler.h |
diff --git a/src/compiler/raw-machine-assembler.h b/src/compiler/raw-machine-assembler.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..16aa1eff9bea53fdc7182189f6dd75181465e5ad |
--- /dev/null |
+++ b/src/compiler/raw-machine-assembler.h |
@@ -0,0 +1,130 @@ |
+// Copyright 2014 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_ |
+#define V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_ |
+ |
+#include "src/v8.h" |
+ |
+#include "src/compiler/common-operator.h" |
+#include "src/compiler/graph-builder.h" |
+#include "src/compiler/machine-node-factory.h" |
+#include "src/compiler/machine-operator.h" |
+#include "src/compiler/node.h" |
+#include "src/compiler/operator.h" |
+ |
+ |
+namespace v8 { |
+namespace internal { |
+namespace compiler { |
+ |
+class BasicBlock; |
+class Schedule; |
+ |
+ |
+class RawMachineAssembler : public GraphBuilder, |
+ public MachineNodeFactory<RawMachineAssembler> { |
+ public: |
+ class Label { |
+ public: |
+ Label() : block_(NULL), used_(false), bound_(false) {} |
+ ~Label() { ASSERT(bound_ || !used_); } |
+ |
+ BasicBlock* block() { return block_; } |
+ |
+ private: |
+ // Private constructor for exit label. |
+ explicit Label(BasicBlock* block) |
+ : block_(block), used_(false), bound_(false) {} |
+ |
+ BasicBlock* block_; |
+ bool used_; |
+ bool bound_; |
+ friend class RawMachineAssembler; |
+ DISALLOW_COPY_AND_ASSIGN(Label); |
+ }; |
+ |
+ RawMachineAssembler( |
+ Graph* graph, MachineCallDescriptorBuilder* call_descriptor_builder, |
+ MachineRepresentation word = MachineOperatorBuilder::pointer_rep()); |
+ virtual ~RawMachineAssembler() {} |
+ |
+ Isolate* isolate() const { return zone()->isolate(); } |
+ Zone* zone() const { return graph()->zone(); } |
+ MachineOperatorBuilder* machine() { return &machine_; } |
+ CommonOperatorBuilder* common() { return &common_; } |
+ CallDescriptor* call_descriptor() const { |
+ return call_descriptor_builder_->BuildCallDescriptor(zone()); |
+ } |
+ int parameter_count() const { |
+ return call_descriptor_builder_->parameter_count(); |
+ } |
+ const MachineRepresentation* parameter_types() const { |
+ return call_descriptor_builder_->parameter_types(); |
+ } |
+ |
+ // Parameters. |
+ Node* Parameter(int index); |
+ |
+ // Control flow. |
+ Label* Exit(); |
+ void Goto(Label* label); |
+ void Branch(Node* condition, Label* true_val, Label* false_val); |
+ // Call to a JS function with zero parameters. |
+ Node* CallJS0(Node* function, Node* receiver, Label* continuation, |
+ Label* deoptimization); |
+ // Call to a runtime function with zero parameters. |
+ Node* CallRuntime1(Runtime::FunctionId function, Node* arg0, |
+ Label* continuation, Label* deoptimization); |
+ void Return(Node* value); |
+ void Bind(Label* label); |
+ void Deoptimize(Node* state); |
+ |
+ // Variables. |
+ Node* Phi(Node* n1, Node* n2) { return NewNode(common()->Phi(2), n1, n2); } |
+ Node* Phi(Node* n1, Node* n2, Node* n3) { |
+ return NewNode(common()->Phi(3), n1, n2, n3); |
+ } |
+ Node* Phi(Node* n1, Node* n2, Node* n3, Node* n4) { |
+ return NewNode(common()->Phi(4), n1, n2, n3, n4); |
+ } |
+ |
+ // MachineAssembler is invalid after export. |
+ Schedule* Export(); |
+ |
+ protected: |
+ virtual Node* MakeNode(Operator* op, int input_count, Node** inputs); |
+ |
+ Schedule* schedule() { |
+ ASSERT(ScheduleValid()); |
+ return schedule_; |
+ } |
+ |
+ private: |
+ bool ScheduleValid() { return schedule_ != NULL; } |
+ |
+ BasicBlock* Use(Label* label); |
+ BasicBlock* EnsureBlock(Label* label); |
+ BasicBlock* CurrentBlock(); |
+ |
+ typedef std::vector<MachineRepresentation, |
+ zone_allocator<MachineRepresentation> > |
+ RepresentationVector; |
+ |
+ Schedule* schedule_; |
+ MachineOperatorBuilder machine_; |
+ CommonOperatorBuilder common_; |
+ MachineCallDescriptorBuilder* call_descriptor_builder_; |
+ Node** parameters_; |
+ Label exit_label_; |
+ BasicBlock* current_block_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RawMachineAssembler); |
+}; |
+ |
+} // namespace compiler |
+} // namespace internal |
+} // namespace v8 |
+ |
+#endif // V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_ |