183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 25c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redistribution and use in source and binary forms, with or without 35c838251403b0be9a882540f1922577abba4c872ager@chromium.org// modification, are permitted provided that the following conditions are 45c838251403b0be9a882540f1922577abba4c872ager@chromium.org// met: 55c838251403b0be9a882540f1922577abba4c872ager@chromium.org// 65c838251403b0be9a882540f1922577abba4c872ager@chromium.org// * Redistributions of source code must retain the above copyright 75c838251403b0be9a882540f1922577abba4c872ager@chromium.org// notice, this list of conditions and the following disclaimer. 85c838251403b0be9a882540f1922577abba4c872ager@chromium.org// * Redistributions in binary form must reproduce the above 95c838251403b0be9a882540f1922577abba4c872ager@chromium.org// copyright notice, this list of conditions and the following 105c838251403b0be9a882540f1922577abba4c872ager@chromium.org// disclaimer in the documentation and/or other materials provided 115c838251403b0be9a882540f1922577abba4c872ager@chromium.org// with the distribution. 125c838251403b0be9a882540f1922577abba4c872ager@chromium.org// * Neither the name of Google Inc. nor the names of its 135c838251403b0be9a882540f1922577abba4c872ager@chromium.org// contributors may be used to endorse or promote products derived 145c838251403b0be9a882540f1922577abba4c872ager@chromium.org// from this software without specific prior written permission. 155c838251403b0be9a882540f1922577abba4c872ager@chromium.org// 165c838251403b0be9a882540f1922577abba4c872ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175c838251403b0be9a882540f1922577abba4c872ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185c838251403b0be9a882540f1922577abba4c872ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195c838251403b0be9a882540f1922577abba4c872ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205c838251403b0be9a882540f1922577abba4c872ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215c838251403b0be9a882540f1922577abba4c872ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225c838251403b0be9a882540f1922577abba4c872ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235c838251403b0be9a882540f1922577abba4c872ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245c838251403b0be9a882540f1922577abba4c872ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255c838251403b0be9a882540f1922577abba4c872ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265c838251403b0be9a882540f1922577abba4c872ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275c838251403b0be9a882540f1922577abba4c872ager@chromium.org 285c838251403b0be9a882540f1922577abba4c872ager@chromium.org 295c838251403b0be9a882540f1922577abba4c872ager@chromium.org#ifndef V8_MIPS_CODEGEN_MIPS_H_ 305c838251403b0be9a882540f1922577abba4c872ager@chromium.org#define V8_MIPS_CODEGEN_MIPS_H_ 315c838251403b0be9a882540f1922577abba4c872ager@chromium.org 327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#include "ast.h" 347516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#include "ic-inl.h" 357516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 365c838251403b0be9a882540f1922577abba4c872ager@chromium.orgnamespace v8 { 375c838251403b0be9a882540f1922577abba4c872ager@chromium.orgnamespace internal { 385c838251403b0be9a882540f1922577abba4c872ager@chromium.org 395c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Forward declarations 405c838251403b0be9a882540f1922577abba4c872ager@chromium.orgclass CompilationInfo; 415c838251403b0be9a882540f1922577abba4c872ager@chromium.org 425c838251403b0be9a882540f1922577abba4c872ager@chromium.orgenum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF }; 437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org// ------------------------------------------------------------------------- 455c838251403b0be9a882540f1922577abba4c872ager@chromium.org// CodeGenerator 465c838251403b0be9a882540f1922577abba4c872ager@chromium.org 475c838251403b0be9a882540f1922577abba4c872ager@chromium.orgclass CodeGenerator: public AstVisitor { 485c838251403b0be9a882540f1922577abba4c872ager@chromium.org public: 498fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org explicit CodeGenerator(Isolate* isolate) { 508fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org InitializeAstVisitor(isolate); 5159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 5259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org static bool MakeCode(CompilationInfo* info); 545c838251403b0be9a882540f1922577abba4c872ager@chromium.org 555c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Printing of AST, etc. as requested by flags. 56a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org static void MakeCodePrologue(CompilationInfo* info, const char* kind); 575c838251403b0be9a882540f1922577abba4c872ager@chromium.org 585c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Allocate and install the code. 595c838251403b0be9a882540f1922577abba4c872ager@chromium.org static Handle<Code> MakeCodeEpilogue(MacroAssembler* masm, 605c838251403b0be9a882540f1922577abba4c872ager@chromium.org Code::Flags flags, 615c838251403b0be9a882540f1922577abba4c872ager@chromium.org CompilationInfo* info); 625c838251403b0be9a882540f1922577abba4c872ager@chromium.org 637516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org // Print the code after compiling it. 647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org static void PrintCode(Handle<Code> code, CompilationInfo* info); 657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org 66e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org static bool ShouldGenerateLog(Isolate* isolate, Expression* type); 675c838251403b0be9a882540f1922577abba4c872ager@chromium.org 685c838251403b0be9a882540f1922577abba4c872ager@chromium.org static void SetFunctionInfo(Handle<JSFunction> fun, 695c838251403b0be9a882540f1922577abba4c872ager@chromium.org FunctionLiteral* lit, 705c838251403b0be9a882540f1922577abba4c872ager@chromium.org bool is_toplevel, 715c838251403b0be9a882540f1922577abba4c872ager@chromium.org Handle<Script> script); 725c838251403b0be9a882540f1922577abba4c872ager@chromium.org 737516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org static bool RecordPositions(MacroAssembler* masm, 747516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org int pos, 757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org bool right_here = false); 765c838251403b0be9a882540f1922577abba4c872ager@chromium.org 7759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); 78a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 797516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org private: 805c838251403b0be9a882540f1922577abba4c872ager@chromium.org DISALLOW_COPY_AND_ASSIGN(CodeGenerator); 815c838251403b0be9a882540f1922577abba4c872ager@chromium.org}; 825c838251403b0be9a882540f1922577abba4c872ager@chromium.org 835c838251403b0be9a882540f1922577abba4c872ager@chromium.org 8464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgclass StringCharLoadGenerator : public AllStatic { 8564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org public: 8664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // Generates the code for handling different string types and loading the 8764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // indexed character into |result|. We expect |index| as untagged input and 8864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org // |result| as untagged output. 8964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org static void Generate(MacroAssembler* masm, 9064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Register string, 9164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Register index, 9264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Register result, 9364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Label* call_runtime); 9464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 9564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org private: 9664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org DISALLOW_COPY_AND_ASSIGN(StringCharLoadGenerator); 9764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}; 9864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 9983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 10083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.orgclass MathExpGenerator : public AllStatic { 10183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org public: 1028e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // Register input isn't modified. All other registers are clobbered. 10383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org static void EmitMathExp(MacroAssembler* masm, 10483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org DoubleRegister input, 10583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org DoubleRegister result, 10683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org DoubleRegister double_scratch1, 10783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org DoubleRegister double_scratch2, 10883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org Register temp1, 10983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org Register temp2, 11083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org Register temp3); 11183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 11283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org private: 11383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org DISALLOW_COPY_AND_ASSIGN(MathExpGenerator); 11483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org}; 11583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 1165c838251403b0be9a882540f1922577abba4c872ager@chromium.org} } // namespace v8::internal 1175c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1185c838251403b0be9a882540f1922577abba4c872ager@chromium.org#endif // V8_MIPS_CODEGEN_MIPS_H_ 119