Index: src/code-stubs-hydrogen.cc |
diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3d32b0ed3528276f9824dfb705a953c46976ab24 |
--- /dev/null |
+++ b/src/code-stubs-hydrogen.cc |
@@ -0,0 +1,136 @@ |
+// Copyright 2012 the V8 project authors. All rights reserved. |
+// Redistribution and use in source and binary forms, with or without |
+// modification, are permitted provided that the following conditions are |
+// met: |
+// |
+// * Redistributions of source code must retain the above copyright |
+// notice, this list of conditions and the following disclaimer. |
+// * Redistributions in binary form must reproduce the above |
+// copyright notice, this list of conditions and the following |
+// disclaimer in the documentation and/or other materials provided |
+// with the distribution. |
+// * Neither the name of Google Inc. nor the names of its |
+// contributors may be used to endorse or promote products derived |
+// from this software without specific prior written permission. |
+// |
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+#include "v8.h" |
+ |
+#include "code-stubs.h" |
+#include "hydrogen.h" |
+#include "lithium.h" |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+ |
+Handle<Code> HydrogenCodeStub::CodeFromGraph(HGraph* graph) { |
+ graph->OrderBlocks(); |
+ graph->AssignDominators(); |
+ graph->CollectPhis(); |
+ graph->InsertRepresentationChanges(); |
+ graph->EliminateRedundantBoundsChecks(); |
+ LChunk* chunk = LChunk::NewChunk(graph); |
+ ASSERT(chunk != NULL); |
+ Handle<Code> stub = chunk->Codegen(Code::COMPILED_STUB); |
+ return stub; |
+} |
+ |
+ |
+class CodeStubGraphBuilderBase : public HGraphBuilder { |
+ public: |
+ explicit CodeStubGraphBuilderBase(Isolate* isolate, |
Jakob Kummerow
2012/11/28 16:28:22
nit: no need for "explicit"
danno
2012/11/30 16:23:24
Done.
|
+ HydrogenCodeStub* stub) |
+ : HGraphBuilder(&info_), info_(stub, isolate) {} |
+ virtual bool BuildGraph(); |
+ protected: |
Jakob Kummerow
2012/11/28 16:28:22
nit: empty line before visibility sections (doesn'
danno
2012/11/30 16:23:24
Nope. Runs clean.
Done.
|
+ virtual void BuildCodeStub() = 0; |
+ HParameter* GetParameter(int parameter) { return parameters_[parameter]; } |
+ HydrogenCodeStub* stub() { return info_.code_stub(); } |
+ private: |
Jakob Kummerow
2012/11/28 16:28:22
nit: empty line before visibility sections
danno
2012/11/30 16:23:24
Done.
|
+ SmartArrayPointer<HParameter*> parameters_; |
+ CompilationInfoWithZone info_; |
+}; |
+ |
+ |
+bool CodeStubGraphBuilderBase::BuildGraph() { |
+ if (FLAG_trace_hydrogen) { |
+ PrintF("-----------------------------------------------------------\n"); |
+ PrintF("Compiling stub using hydrogen\n"); |
+ HTracer::Instance()->TraceCompilation(&info_); |
+ } |
+ HBasicBlock* next_block = graph()->CreateBasicBlock(); |
+ next_block->SetInitialEnvironment(graph()->start_environment()); |
+ HGoto* jump = new(zone()) HGoto(next_block); |
+ graph()->entry_block()->Finish(jump); |
+ set_current_block(next_block); |
+ |
+ int major_key = stub()->MajorKey(); |
+ CodeStubInterfaceDescriptor** decsriptors = |
Jakob Kummerow
2012/11/28 16:28:22
nit: descriptors
danno
2012/11/30 16:23:24
Done.
|
+ info_.isolate()->code_stub_interface_descriptors(); |
+ if (decsriptors[major_key] == NULL) { |
+ decsriptors[major_key] = stub()->GetInterfaceDescriptor(info_.isolate()); |
+ } |
+ |
+ CodeStubInterfaceDescriptor* descriptor = decsriptors[major_key]; |
+ parameters_.Reset(new HParameter*[descriptor->number_of_register_params]); |
+ |
+ HGraph* graph = this->graph(); |
+ Zone* zone = this->zone(); |
+ for (int i = 0; i < descriptor->number_of_register_params; ++i) { |
+ HParameter* param = new(zone) HParameter(i); |
+ AddInstruction(param); |
+ graph->start_environment()->Push(param); |
+ parameters_[i] = param; |
+ } |
+ AddSimulate(BailoutId::StubEntry()); |
+ |
+ BuildCodeStub(); |
+ |
+ return true; |
+} |
+ |
+template <class Stub> |
+class CodeStubGraphBuilder: public CodeStubGraphBuilderBase { |
+ public: |
+ explicit CodeStubGraphBuilder(Stub* stub) |
+ : CodeStubGraphBuilderBase(Isolate::Current(), stub) {} |
+ protected: |
+ virtual void BuildCodeStub(); |
+ Stub* casted_stub() { return static_cast<Stub*>(stub()); } |
+ private: |
Jakob Kummerow
2012/11/28 16:28:22
nit: don't need an empty "private:" section
danno
2012/11/30 16:23:24
Done.
|
+}; |
+ |
+ |
+template <> |
+void CodeStubGraphBuilder<KeyedLoadFastElementStub>::BuildCodeStub() { |
+ Zone* zone = this->zone(); |
+ |
+ HInstruction* load = BuildUncheckedMonomorphicElementAccess( |
+ GetParameter(0), GetParameter(1), NULL, NULL, |
+ casted_stub()->is_js_array(), casted_stub()->elements_kind(), false); |
+ AddInstruction(load); |
+ |
+ HReturn* ret = new(zone) HReturn(load); |
+ current_block()->Finish(ret); |
+} |
+ |
+ |
+Handle<Code> KeyedLoadFastElementStub::GenerateCode() { |
+ CodeStubGraphBuilder<KeyedLoadFastElementStub> builder(this); |
+ return CodeFromGraph(builder.CreateGraph()); |
+} |
+ |
+ |
+} } // namespace v8::internal |