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