blob: 1403781c67b3425aca71d4c84b6d8e623560ac02 [file] [log] [blame]
Ben Murdoche0cee9b2011-05-25 10:26:03 +01001// Copyright 2011 the V8 project authors. All rights reserved.
Ben Murdochb8a8cc12014-11-26 15:28:44 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Steve Blocka7e24c12009-10-30 11:49:00 +00004
5#ifndef V8_X64_CODEGEN_X64_H_
6#define V8_X64_CODEGEN_X64_H_
7
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00008#include "src/ast/ast.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00009#include "src/macro-assembler.h"
Steve Block6ded16b2010-05-10 14:33:55 +010010
Steve Blocka7e24c12009-10-30 11:49:00 +000011namespace v8 {
12namespace internal {
13
Steve Blocka7e24c12009-10-30 11:49:00 +000014
Ben Murdoch3ef787d2012-04-12 10:51:47 +010015class 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
Ben Murdochb8a8cc12014-11-26 15:28:44 +000030
31class 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
45enum StackArgumentsAccessorReceiverMode {
46 ARGUMENTS_CONTAIN_RECEIVER,
47 ARGUMENTS_DONT_CONTAIN_RECEIVER
48};
49
50
51class 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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000111} // namespace internal
112} // namespace v8
Steve Blocka7e24c12009-10-30 11:49:00 +0000113
114#endif // V8_X64_CODEGEN_X64_H_