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