15d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
25ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// Redistribution and use in source and binary forms, with or without
35ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// modification, are permitted provided that the following conditions are
45ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// met:
55ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org//
65ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org//     * Redistributions of source code must retain the above copyright
75ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org//       notice, this list of conditions and the following disclaimer.
85ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org//     * Redistributions in binary form must reproduce the above
95ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org//       copyright notice, this list of conditions and the following
105ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org//       disclaimer in the documentation and/or other materials provided
115ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org//       with the distribution.
125ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org//     * Neither the name of Google Inc. nor the names of its
135ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org//       contributors may be used to endorse or promote products derived
145ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org//       from this software without specific prior written permission.
155ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org//
165ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org
289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#ifndef V8_X64_CODEGEN_X64_H_
299085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#define V8_X64_CODEGEN_X64_H_
309085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
31dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org#include "ast.h"
32cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org#include "ic-inl.h"
33cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
3471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
3571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
369085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
379085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// Forward declarations
38b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgclass CompilationInfo;
399085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
409085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgenum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF };
419085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
429085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// -------------------------------------------------------------------------
439085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// CodeGenerator
449085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
459085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass CodeGenerator: public AstVisitor {
469085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org public:
478fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org  explicit CodeGenerator(Isolate* isolate) {
488fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org    InitializeAstVisitor(isolate);
49a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
50a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
51b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  static bool MakeCode(CompilationInfo* info);
529085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
539d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  // Printing of AST, etc. as requested by flags.
54a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  static void MakeCodePrologue(CompilationInfo* info, const char* kind);
559d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
569d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  // Allocate and install the code.
575c838251403b0be9a882540f1922577abba4c872ager@chromium.org  static Handle<Code> MakeCodeEpilogue(MacroAssembler* masm,
589d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com                                       Code::Flags flags,
595c838251403b0be9a882540f1922577abba4c872ager@chromium.org                                       CompilationInfo* info);
609d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
61a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Print the code after compiling it.
62a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static void PrintCode(Handle<Code> code, CompilationInfo* info);
63a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
64e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  static bool ShouldGenerateLog(Isolate* isolate, Expression* type);
659085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
662356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  static bool RecordPositions(MacroAssembler* masm,
672356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org                              int pos,
682356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org                              bool right_here = false);
699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
70a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
71a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
729085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org private:
739085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  DISALLOW_COPY_AND_ASSIGN(CodeGenerator);
749085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org};
759085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
769085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
771b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgclass StringCharLoadGenerator : public AllStatic {
781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org public:
791b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // Generates the code for handling different string types and loading the
801b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // indexed character into |result|.  We expect |index| as untagged input and
811b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // |result| as untagged output.
821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  static void Generate(MacroAssembler* masm,
831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                       Register string,
841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                       Register index,
851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                       Register result,
861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                       Label* call_runtime);
871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
881b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org private:
891b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  DISALLOW_COPY_AND_ASSIGN(StringCharLoadGenerator);
901b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
921f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
931f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgclass MathExpGenerator : public AllStatic {
941f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org public:
951f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  static void EmitMathExp(MacroAssembler* masm,
961f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org                          XMMRegister input,
971f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org                          XMMRegister result,
981f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org                          XMMRegister double_scratch,
991f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org                          Register temp1,
1001f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org                          Register temp2);
1011f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
1021f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org private:
1031f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  DISALLOW_COPY_AND_ASSIGN(MathExpGenerator);
1041f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org};
1051f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
106662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
107662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgenum StackArgumentsAccessorReceiverMode {
108662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  ARGUMENTS_CONTAIN_RECEIVER,
109662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  ARGUMENTS_DONT_CONTAIN_RECEIVER
110662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org};
111662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
112662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
113662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgclass StackArgumentsAccessor BASE_EMBEDDED {
114662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org public:
115662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  StackArgumentsAccessor(
116662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      Register base_reg,
117662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      int argument_count_immediate,
118662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      StackArgumentsAccessorReceiverMode receiver_mode =
119662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org          ARGUMENTS_CONTAIN_RECEIVER,
120662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      int extra_displacement_to_last_argument = 0)
121662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      : base_reg_(base_reg),
122662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        argument_count_reg_(no_reg),
123662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        argument_count_immediate_(argument_count_immediate),
124662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        receiver_mode_(receiver_mode),
125662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        extra_displacement_to_last_argument_(
126662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org            extra_displacement_to_last_argument) { }
127662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
128662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  StackArgumentsAccessor(
129662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      Register base_reg,
130662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      Register argument_count_reg,
131662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      StackArgumentsAccessorReceiverMode receiver_mode =
132662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org          ARGUMENTS_CONTAIN_RECEIVER,
133662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      int extra_displacement_to_last_argument = 0)
134662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      : base_reg_(base_reg),
135662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        argument_count_reg_(argument_count_reg),
136662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        argument_count_immediate_(0),
137662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        receiver_mode_(receiver_mode),
138662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        extra_displacement_to_last_argument_(
139662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org            extra_displacement_to_last_argument) { }
140662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
141662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  StackArgumentsAccessor(
142662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      Register base_reg,
143662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      const ParameterCount& parameter_count,
144662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      StackArgumentsAccessorReceiverMode receiver_mode =
145662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org          ARGUMENTS_CONTAIN_RECEIVER,
146662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      int extra_displacement_to_last_argument = 0)
147662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      : base_reg_(base_reg),
148662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        argument_count_reg_(parameter_count.is_reg() ?
149662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org                            parameter_count.reg() : no_reg),
150662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        argument_count_immediate_(parameter_count.is_immediate() ?
151662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org                                  parameter_count.immediate() : 0),
152662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        receiver_mode_(receiver_mode),
153662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        extra_displacement_to_last_argument_(
154662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org            extra_displacement_to_last_argument) { }
155662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
156662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  Operand GetArgumentOperand(int index);
157662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  Operand GetReceiverOperand() {
158662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    ASSERT(receiver_mode_ == ARGUMENTS_CONTAIN_RECEIVER);
159d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org    return GetArgumentOperand(0);
160662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  }
161662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
162662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org private:
163662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  const Register base_reg_;
164662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  const Register argument_count_reg_;
165662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  const int argument_count_immediate_;
166662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  const StackArgumentsAccessorReceiverMode receiver_mode_;
167662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  const int extra_displacement_to_last_argument_;
168662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
169662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  DISALLOW_IMPLICIT_CONSTRUCTORS(StackArgumentsAccessor);
170662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org};
171662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
172662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1739085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org} }  // namespace v8::internal
1749085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
1759085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#endif  // V8_X64_CODEGEN_X64_H_
176