OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/raw-machine-assembler.h" | 5 #include "src/compiler/raw-machine-assembler.h" |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/compiler/pipeline.h" | 8 #include "src/compiler/pipeline.h" |
9 #include "src/compiler/scheduler.h" | 9 #include "src/compiler/scheduler.h" |
10 | 10 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 Node* ret = graph()->NewNode(common()->Return(), value); | 97 Node* ret = graph()->NewNode(common()->Return(), value); |
98 schedule()->AddReturn(CurrentBlock(), ret); | 98 schedule()->AddReturn(CurrentBlock(), ret); |
99 current_block_ = nullptr; | 99 current_block_ = nullptr; |
100 } | 100 } |
101 | 101 |
102 | 102 |
103 Node* RawMachineAssembler::CallN(CallDescriptor* desc, Node* function, | 103 Node* RawMachineAssembler::CallN(CallDescriptor* desc, Node* function, |
104 Node** args) { | 104 Node** args) { |
105 int param_count = | 105 int param_count = |
106 static_cast<int>(desc->GetMachineSignature()->parameter_count()); | 106 static_cast<int>(desc->GetMachineSignature()->parameter_count()); |
107 Node** buffer = zone()->NewArray<Node*>(param_count + 1); | 107 Node** buffer = zone()->NewArray<Node*>(param_count + 3); |
108 int index = 0; | 108 int index = 0; |
109 buffer[index++] = function; | 109 buffer[index++] = function; |
110 for (int i = 0; i < param_count; i++) { | 110 for (int i = 0; i < param_count; i++) { |
111 buffer[index++] = args[i]; | 111 buffer[index++] = args[i]; |
112 } | 112 } |
113 Node* call = graph()->NewNode(common()->Call(desc), param_count + 1, buffer); | 113 buffer[index++] = graph()->start(); |
| 114 buffer[index++] = graph()->start(); |
| 115 Node* call = graph()->NewNode(common()->Call(desc), param_count + 3, buffer); |
114 schedule()->AddNode(CurrentBlock(), call); | 116 schedule()->AddNode(CurrentBlock(), call); |
115 return call; | 117 return call; |
116 } | 118 } |
117 | 119 |
118 | 120 |
119 Node* RawMachineAssembler::CallFunctionStub0(Node* function, Node* receiver, | 121 Node* RawMachineAssembler::CallFunctionStub0(Node* function, Node* receiver, |
120 Node* context, Node* frame_state, | 122 Node* context, Node* frame_state, |
121 CallFunctionFlags flags) { | 123 CallFunctionFlags flags) { |
122 Callable callable = CodeFactory::CallFunction(isolate(), 0, flags); | 124 Callable callable = CodeFactory::CallFunction(isolate(), 0, flags); |
123 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 125 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
124 isolate(), zone(), callable.descriptor(), 1, | 126 isolate(), zone(), callable.descriptor(), 1, |
125 CallDescriptor::kNeedsFrameState, Operator::kNoProperties); | 127 CallDescriptor::kNeedsFrameState, Operator::kNoProperties); |
126 Node* stub_code = HeapConstant(callable.code()); | 128 Node* stub_code = HeapConstant(callable.code()); |
127 Node* call = graph()->NewNode(common()->Call(desc), stub_code, function, | 129 Node* call = graph()->NewNode(common()->Call(desc), stub_code, function, |
128 receiver, context, frame_state); | 130 receiver, context, frame_state, |
| 131 graph()->start(), graph()->start()); |
129 schedule()->AddNode(CurrentBlock(), call); | 132 schedule()->AddNode(CurrentBlock(), call); |
130 return call; | 133 return call; |
131 } | 134 } |
132 | 135 |
133 | 136 |
134 Node* RawMachineAssembler::CallJS0(Node* function, Node* receiver, | 137 Node* RawMachineAssembler::CallJS0(Node* function, Node* receiver, |
135 Node* context, Node* frame_state) { | 138 Node* context, Node* frame_state) { |
136 CallDescriptor* descriptor = Linkage::GetJSCallDescriptor( | 139 CallDescriptor* descriptor = Linkage::GetJSCallDescriptor( |
137 zone(), false, 1, CallDescriptor::kNeedsFrameState); | 140 zone(), false, 1, CallDescriptor::kNeedsFrameState); |
138 Node* call = graph()->NewNode(common()->Call(descriptor), function, receiver, | 141 Node* call = |
139 context, frame_state); | 142 graph()->NewNode(common()->Call(descriptor), function, receiver, context, |
| 143 frame_state, graph()->start(), graph()->start()); |
140 schedule()->AddNode(CurrentBlock(), call); | 144 schedule()->AddNode(CurrentBlock(), call); |
141 return call; | 145 return call; |
142 } | 146 } |
143 | 147 |
144 | 148 |
145 Node* RawMachineAssembler::CallRuntime1(Runtime::FunctionId function, | 149 Node* RawMachineAssembler::CallRuntime1(Runtime::FunctionId function, |
146 Node* arg0, Node* context, | 150 Node* arg0, Node* context, |
147 Node* frame_state) { | 151 Node* frame_state) { |
148 CallDescriptor* descriptor = Linkage::GetRuntimeCallDescriptor( | 152 CallDescriptor* descriptor = Linkage::GetRuntimeCallDescriptor( |
149 zone(), function, 1, Operator::kNoProperties); | 153 zone(), function, 1, Operator::kNoProperties); |
150 | 154 |
151 Node* centry = HeapConstant(CEntryStub(isolate(), 1).GetCode()); | 155 Node* centry = HeapConstant(CEntryStub(isolate(), 1).GetCode()); |
152 Node* ref = NewNode( | 156 Node* ref = NewNode( |
153 common()->ExternalConstant(ExternalReference(function, isolate()))); | 157 common()->ExternalConstant(ExternalReference(function, isolate()))); |
154 Node* arity = Int32Constant(1); | 158 Node* arity = Int32Constant(1); |
155 | 159 |
156 Node* call = graph()->NewNode(common()->Call(descriptor), centry, arg0, ref, | 160 Node* call = graph()->NewNode(common()->Call(descriptor), centry, arg0, ref, |
157 arity, context, frame_state); | 161 arity, context, frame_state, graph()->start(), |
| 162 graph()->start()); |
158 schedule()->AddNode(CurrentBlock(), call); | 163 schedule()->AddNode(CurrentBlock(), call); |
159 return call; | 164 return call; |
160 } | 165 } |
161 | 166 |
162 | 167 |
163 Node* RawMachineAssembler::CallCFunction0(MachineType return_type, | 168 Node* RawMachineAssembler::CallCFunction0(MachineType return_type, |
164 Node* function) { | 169 Node* function) { |
165 MachineSignature::Builder builder(zone(), 1, 0); | 170 MachineSignature::Builder builder(zone(), 1, 0); |
166 builder.AddReturn(return_type); | 171 builder.AddReturn(return_type); |
167 const CallDescriptor* descriptor = | 172 const CallDescriptor* descriptor = |
168 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); | 173 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); |
169 | 174 |
170 Node* call = graph()->NewNode(common()->Call(descriptor), function); | 175 Node* call = graph()->NewNode(common()->Call(descriptor), function, |
| 176 graph()->start(), graph()->start()); |
171 schedule()->AddNode(CurrentBlock(), call); | 177 schedule()->AddNode(CurrentBlock(), call); |
172 return call; | 178 return call; |
173 } | 179 } |
174 | 180 |
175 | 181 |
176 Node* RawMachineAssembler::CallCFunction1(MachineType return_type, | 182 Node* RawMachineAssembler::CallCFunction1(MachineType return_type, |
177 MachineType arg0_type, Node* function, | 183 MachineType arg0_type, Node* function, |
178 Node* arg0) { | 184 Node* arg0) { |
179 MachineSignature::Builder builder(zone(), 1, 1); | 185 MachineSignature::Builder builder(zone(), 1, 1); |
180 builder.AddReturn(return_type); | 186 builder.AddReturn(return_type); |
181 builder.AddParam(arg0_type); | 187 builder.AddParam(arg0_type); |
182 const CallDescriptor* descriptor = | 188 const CallDescriptor* descriptor = |
183 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); | 189 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); |
184 | 190 |
185 Node* call = graph()->NewNode(common()->Call(descriptor), function, arg0); | 191 Node* call = graph()->NewNode(common()->Call(descriptor), function, arg0, |
| 192 graph()->start(), graph()->start()); |
186 schedule()->AddNode(CurrentBlock(), call); | 193 schedule()->AddNode(CurrentBlock(), call); |
187 return call; | 194 return call; |
188 } | 195 } |
189 | 196 |
190 | 197 |
191 Node* RawMachineAssembler::CallCFunction2(MachineType return_type, | 198 Node* RawMachineAssembler::CallCFunction2(MachineType return_type, |
192 MachineType arg0_type, | 199 MachineType arg0_type, |
193 MachineType arg1_type, Node* function, | 200 MachineType arg1_type, Node* function, |
194 Node* arg0, Node* arg1) { | 201 Node* arg0, Node* arg1) { |
195 MachineSignature::Builder builder(zone(), 1, 2); | 202 MachineSignature::Builder builder(zone(), 1, 2); |
196 builder.AddReturn(return_type); | 203 builder.AddReturn(return_type); |
197 builder.AddParam(arg0_type); | 204 builder.AddParam(arg0_type); |
198 builder.AddParam(arg1_type); | 205 builder.AddParam(arg1_type); |
199 const CallDescriptor* descriptor = | 206 const CallDescriptor* descriptor = |
200 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); | 207 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); |
201 | 208 |
202 Node* call = | 209 Node* call = graph()->NewNode(common()->Call(descriptor), function, arg0, |
203 graph()->NewNode(common()->Call(descriptor), function, arg0, arg1); | 210 arg1, graph()->start(), graph()->start()); |
204 schedule()->AddNode(CurrentBlock(), call); | 211 schedule()->AddNode(CurrentBlock(), call); |
205 return call; | 212 return call; |
206 } | 213 } |
207 | 214 |
208 | 215 |
209 Node* RawMachineAssembler::CallCFunction8( | 216 Node* RawMachineAssembler::CallCFunction8( |
210 MachineType return_type, MachineType arg0_type, MachineType arg1_type, | 217 MachineType return_type, MachineType arg0_type, MachineType arg1_type, |
211 MachineType arg2_type, MachineType arg3_type, MachineType arg4_type, | 218 MachineType arg2_type, MachineType arg3_type, MachineType arg4_type, |
212 MachineType arg5_type, MachineType arg6_type, MachineType arg7_type, | 219 MachineType arg5_type, MachineType arg6_type, MachineType arg7_type, |
213 Node* function, Node* arg0, Node* arg1, Node* arg2, Node* arg3, Node* arg4, | 220 Node* function, Node* arg0, Node* arg1, Node* arg2, Node* arg3, Node* arg4, |
214 Node* arg5, Node* arg6, Node* arg7) { | 221 Node* arg5, Node* arg6, Node* arg7) { |
215 MachineSignature::Builder builder(zone(), 1, 8); | 222 MachineSignature::Builder builder(zone(), 1, 8); |
216 builder.AddReturn(return_type); | 223 builder.AddReturn(return_type); |
217 builder.AddParam(arg0_type); | 224 builder.AddParam(arg0_type); |
218 builder.AddParam(arg1_type); | 225 builder.AddParam(arg1_type); |
219 builder.AddParam(arg2_type); | 226 builder.AddParam(arg2_type); |
220 builder.AddParam(arg3_type); | 227 builder.AddParam(arg3_type); |
221 builder.AddParam(arg4_type); | 228 builder.AddParam(arg4_type); |
222 builder.AddParam(arg5_type); | 229 builder.AddParam(arg5_type); |
223 builder.AddParam(arg6_type); | 230 builder.AddParam(arg6_type); |
224 builder.AddParam(arg7_type); | 231 builder.AddParam(arg7_type); |
| 232 Node* args[] = {function, |
| 233 arg0, |
| 234 arg1, |
| 235 arg2, |
| 236 arg3, |
| 237 arg4, |
| 238 arg5, |
| 239 arg6, |
| 240 arg7, |
| 241 graph()->start(), |
| 242 graph()->start()}; |
225 const CallDescriptor* descriptor = | 243 const CallDescriptor* descriptor = |
226 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); | 244 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); |
227 | 245 Node* call = |
228 Node* call = graph()->NewNode(common()->Call(descriptor), function, arg0, | 246 graph()->NewNode(common()->Call(descriptor), arraysize(args), args); |
229 arg1, arg2, arg3, arg4, arg5, arg6, arg7); | |
230 schedule()->AddNode(CurrentBlock(), call); | 247 schedule()->AddNode(CurrentBlock(), call); |
231 return call; | 248 return call; |
232 } | 249 } |
233 | 250 |
234 | 251 |
235 Node* RawMachineAssembler::TailCallInterpreterDispatch( | 252 Node* RawMachineAssembler::TailCallInterpreterDispatch( |
236 const CallDescriptor* call_descriptor, Node* target, Node* arg1, Node* arg2, | 253 const CallDescriptor* call_descriptor, Node* target, Node* arg1, Node* arg2, |
237 Node* arg3, Node* arg4, Node* arg5) { | 254 Node* arg3, Node* arg4, Node* arg5) { |
238 Node* tail_call = | 255 Node* tail_call = |
239 graph()->NewNode(common()->TailCall(call_descriptor), target, arg1, arg2, | 256 graph()->NewNode(common()->TailCall(call_descriptor), target, arg1, arg2, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 DCHECK_NOT_NULL(schedule_); | 291 DCHECK_NOT_NULL(schedule_); |
275 DCHECK(current_block_ != nullptr); | 292 DCHECK(current_block_ != nullptr); |
276 Node* node = graph()->NewNode(op, input_count, inputs); | 293 Node* node = graph()->NewNode(op, input_count, inputs); |
277 schedule()->AddNode(CurrentBlock(), node); | 294 schedule()->AddNode(CurrentBlock(), node); |
278 return node; | 295 return node; |
279 } | 296 } |
280 | 297 |
281 } // namespace compiler | 298 } // namespace compiler |
282 } // namespace internal | 299 } // namespace internal |
283 } // namespace v8 | 300 } // namespace v8 |
OLD | NEW |