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