Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / v8 / src / x64 / codegen-x64.h
1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 //     * Redistributions of source code must retain the above copyright
7 //       notice, this list of conditions and the following disclaimer.
8 //     * Redistributions in binary form must reproduce the above
9 //       copyright notice, this list of conditions and the following
10 //       disclaimer in the documentation and/or other materials provided
11 //       with the distribution.
12 //     * Neither the name of Google Inc. nor the names of its
13 //       contributors may be used to endorse or promote products derived
14 //       from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28 #ifndef V8_X64_CODEGEN_X64_H_
29 #define V8_X64_CODEGEN_X64_H_
30
31 #include "ast.h"
32 #include "ic-inl.h"
33
34 namespace v8 {
35 namespace internal {
36
37
38 enum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF };
39
40
41 class StringCharLoadGenerator : public AllStatic {
42  public:
43   // Generates the code for handling different string types and loading the
44   // indexed character into |result|.  We expect |index| as untagged input and
45   // |result| as untagged output.
46   static void Generate(MacroAssembler* masm,
47                        Register string,
48                        Register index,
49                        Register result,
50                        Label* call_runtime);
51
52  private:
53   DISALLOW_COPY_AND_ASSIGN(StringCharLoadGenerator);
54 };
55
56
57 class MathExpGenerator : public AllStatic {
58  public:
59   static void EmitMathExp(MacroAssembler* masm,
60                           XMMRegister input,
61                           XMMRegister result,
62                           XMMRegister double_scratch,
63                           Register temp1,
64                           Register temp2);
65
66  private:
67   DISALLOW_COPY_AND_ASSIGN(MathExpGenerator);
68 };
69
70
71 enum StackArgumentsAccessorReceiverMode {
72   ARGUMENTS_CONTAIN_RECEIVER,
73   ARGUMENTS_DONT_CONTAIN_RECEIVER
74 };
75
76
77 class StackArgumentsAccessor BASE_EMBEDDED {
78  public:
79   StackArgumentsAccessor(
80       Register base_reg,
81       int argument_count_immediate,
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_(no_reg),
87         argument_count_immediate_(argument_count_immediate),
88         receiver_mode_(receiver_mode),
89         extra_displacement_to_last_argument_(
90             extra_displacement_to_last_argument) { }
91
92   StackArgumentsAccessor(
93       Register base_reg,
94       Register argument_count_reg,
95       StackArgumentsAccessorReceiverMode receiver_mode =
96           ARGUMENTS_CONTAIN_RECEIVER,
97       int extra_displacement_to_last_argument = 0)
98       : base_reg_(base_reg),
99         argument_count_reg_(argument_count_reg),
100         argument_count_immediate_(0),
101         receiver_mode_(receiver_mode),
102         extra_displacement_to_last_argument_(
103             extra_displacement_to_last_argument) { }
104
105   StackArgumentsAccessor(
106       Register base_reg,
107       const ParameterCount& parameter_count,
108       StackArgumentsAccessorReceiverMode receiver_mode =
109           ARGUMENTS_CONTAIN_RECEIVER,
110       int extra_displacement_to_last_argument = 0)
111       : base_reg_(base_reg),
112         argument_count_reg_(parameter_count.is_reg() ?
113                             parameter_count.reg() : no_reg),
114         argument_count_immediate_(parameter_count.is_immediate() ?
115                                   parameter_count.immediate() : 0),
116         receiver_mode_(receiver_mode),
117         extra_displacement_to_last_argument_(
118             extra_displacement_to_last_argument) { }
119
120   Operand GetArgumentOperand(int index);
121   Operand GetReceiverOperand() {
122     ASSERT(receiver_mode_ == ARGUMENTS_CONTAIN_RECEIVER);
123     return GetArgumentOperand(0);
124   }
125
126  private:
127   const Register base_reg_;
128   const Register argument_count_reg_;
129   const int argument_count_immediate_;
130   const StackArgumentsAccessorReceiverMode receiver_mode_;
131   const int extra_displacement_to_last_argument_;
132
133   DISALLOW_IMPLICIT_CONSTRUCTORS(StackArgumentsAccessor);
134 };
135
136
137 } }  // namespace v8::internal
138
139 #endif  // V8_X64_CODEGEN_X64_H_