Home | History | Annotate | Download | only in x64
      1 // Copyright 2011 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_X64_CODEGEN_X64_H_
      6 #define V8_X64_CODEGEN_X64_H_
      7 
      8 #include "src/ast.h"
      9 #include "src/macro-assembler.h"
     10 
     11 namespace v8 {
     12 namespace internal {
     13 
     14 
     15 enum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF };
     16 
     17 
     18 class StringCharLoadGenerator : public AllStatic {
     19  public:
     20   // Generates the code for handling different string types and loading the
     21   // indexed character into |result|.  We expect |index| as untagged input and
     22   // |result| as untagged output.
     23   static void Generate(MacroAssembler* masm,
     24                        Register string,
     25                        Register index,
     26                        Register result,
     27                        Label* call_runtime);
     28 
     29  private:
     30   DISALLOW_COPY_AND_ASSIGN(StringCharLoadGenerator);
     31 };
     32 
     33 
     34 class MathExpGenerator : public AllStatic {
     35  public:
     36   static void EmitMathExp(MacroAssembler* masm,
     37                           XMMRegister input,
     38                           XMMRegister result,
     39                           XMMRegister double_scratch,
     40                           Register temp1,
     41                           Register temp2);
     42 
     43  private:
     44   DISALLOW_COPY_AND_ASSIGN(MathExpGenerator);
     45 };
     46 
     47 
     48 enum StackArgumentsAccessorReceiverMode {
     49   ARGUMENTS_CONTAIN_RECEIVER,
     50   ARGUMENTS_DONT_CONTAIN_RECEIVER
     51 };
     52 
     53 
     54 class StackArgumentsAccessor BASE_EMBEDDED {
     55  public:
     56   StackArgumentsAccessor(
     57       Register base_reg,
     58       int argument_count_immediate,
     59       StackArgumentsAccessorReceiverMode receiver_mode =
     60           ARGUMENTS_CONTAIN_RECEIVER,
     61       int extra_displacement_to_last_argument = 0)
     62       : base_reg_(base_reg),
     63         argument_count_reg_(no_reg),
     64         argument_count_immediate_(argument_count_immediate),
     65         receiver_mode_(receiver_mode),
     66         extra_displacement_to_last_argument_(
     67             extra_displacement_to_last_argument) { }
     68 
     69   StackArgumentsAccessor(
     70       Register base_reg,
     71       Register argument_count_reg,
     72       StackArgumentsAccessorReceiverMode receiver_mode =
     73           ARGUMENTS_CONTAIN_RECEIVER,
     74       int extra_displacement_to_last_argument = 0)
     75       : base_reg_(base_reg),
     76         argument_count_reg_(argument_count_reg),
     77         argument_count_immediate_(0),
     78         receiver_mode_(receiver_mode),
     79         extra_displacement_to_last_argument_(
     80             extra_displacement_to_last_argument) { }
     81 
     82   StackArgumentsAccessor(
     83       Register base_reg,
     84       const ParameterCount& parameter_count,
     85       StackArgumentsAccessorReceiverMode receiver_mode =
     86           ARGUMENTS_CONTAIN_RECEIVER,
     87       int extra_displacement_to_last_argument = 0)
     88       : base_reg_(base_reg),
     89         argument_count_reg_(parameter_count.is_reg() ?
     90                             parameter_count.reg() : no_reg),
     91         argument_count_immediate_(parameter_count.is_immediate() ?
     92                                   parameter_count.immediate() : 0),
     93         receiver_mode_(receiver_mode),
     94         extra_displacement_to_last_argument_(
     95             extra_displacement_to_last_argument) { }
     96 
     97   Operand GetArgumentOperand(int index);
     98   Operand GetReceiverOperand() {
     99     DCHECK(receiver_mode_ == ARGUMENTS_CONTAIN_RECEIVER);
    100     return GetArgumentOperand(0);
    101   }
    102 
    103  private:
    104   const Register base_reg_;
    105   const Register argument_count_reg_;
    106   const int argument_count_immediate_;
    107   const StackArgumentsAccessorReceiverMode receiver_mode_;
    108   const int extra_displacement_to_last_argument_;
    109 
    110   DISALLOW_IMPLICIT_CONSTRUCTORS(StackArgumentsAccessor);
    111 };
    112 
    113 
    114 } }  // namespace v8::internal
    115 
    116 #endif  // V8_X64_CODEGEN_X64_H_
    117