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