OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/interpreter/interpreter.h" | 5 #include "src/interpreter/interpreter.h" |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/compiler.h" | 8 #include "src/compiler.h" |
9 #include "src/compiler/interpreter-assembler.h" | 9 #include "src/compiler/interpreter-assembler.h" |
10 #include "src/factory.h" | 10 #include "src/factory.h" |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 Node* raw_slot = __ BytecodeOperandIdx8(1); | 212 Node* raw_slot = __ BytecodeOperandIdx8(1); |
213 Node* smi_slot = __ SmiTag(raw_slot); | 213 Node* smi_slot = __ SmiTag(raw_slot); |
214 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 214 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
215 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, smi_slot, | 215 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, smi_slot, |
216 type_feedback_vector); | 216 type_feedback_vector); |
217 __ SetAccumulator(result); | 217 __ SetAccumulator(result); |
218 __ Dispatch(); | 218 __ Dispatch(); |
219 } | 219 } |
220 | 220 |
221 | 221 |
222 // LoadIC <object> <slot> | 222 // LoadICSloppy <object> <slot> |
223 // | 223 // |
224 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name | 224 // Calls the sloppy mode LoadIC at FeedBackVector slot <slot> for <object> and |
225 // in the accumulator. | 225 // the name in the accumulator. |
226 void Interpreter::DoLoadIC(compiler::InterpreterAssembler* assembler) { | 226 void Interpreter::DoLoadICSloppy(compiler::InterpreterAssembler* assembler) { |
227 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, | 227 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
228 SLOPPY, UNINITIALIZED); | 228 SLOPPY, UNINITIALIZED); |
229 DoPropertyLoadIC(ic, assembler); | 229 DoPropertyLoadIC(ic, assembler); |
230 } | 230 } |
231 | 231 |
232 | 232 |
233 // KeyedLoadIC <object> <slot> | 233 // LoadICStrict <object> <slot> |
234 // | 234 // |
235 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key | 235 // Calls the strict mode LoadIC at FeedBackVector slot <slot> for <object> and |
236 // in the accumulator. | 236 // the name in the accumulator. |
237 void Interpreter::DoKeyedLoadIC(compiler::InterpreterAssembler* assembler) { | 237 void Interpreter::DoLoadICStrict(compiler::InterpreterAssembler* assembler) { |
| 238 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
| 239 STRICT, UNINITIALIZED); |
| 240 DoPropertyLoadIC(ic, assembler); |
| 241 } |
| 242 |
| 243 |
| 244 // KeyedLoadICSloppy <object> <slot> |
| 245 // |
| 246 // Calls the sloppy mode KeyedLoadIC at FeedBackVector slot <slot> for <object> |
| 247 // and the key in the accumulator. |
| 248 void Interpreter::DoKeyedLoadICSloppy( |
| 249 compiler::InterpreterAssembler* assembler) { |
238 Callable ic = | 250 Callable ic = |
239 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); | 251 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
240 DoPropertyLoadIC(ic, assembler); | 252 DoPropertyLoadIC(ic, assembler); |
241 } | 253 } |
242 | 254 |
243 | 255 |
| 256 // KeyedLoadICStrict <object> <slot> |
| 257 // |
| 258 // Calls the strict mode KeyedLoadIC at FeedBackVector slot <slot> for <object> |
| 259 // and the key in the accumulator. |
| 260 void Interpreter::DoKeyedLoadICStrict( |
| 261 compiler::InterpreterAssembler* assembler) { |
| 262 Callable ic = |
| 263 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
| 264 DoPropertyLoadIC(ic, assembler); |
| 265 } |
| 266 |
| 267 |
244 void Interpreter::DoPropertyStoreIC(Callable ic, | 268 void Interpreter::DoPropertyStoreIC(Callable ic, |
245 compiler::InterpreterAssembler* assembler) { | 269 compiler::InterpreterAssembler* assembler) { |
246 Node* code_target = __ HeapConstant(ic.code()); | 270 Node* code_target = __ HeapConstant(ic.code()); |
247 Node* object_reg_index = __ BytecodeOperandReg8(0); | 271 Node* object_reg_index = __ BytecodeOperandReg8(0); |
248 Node* object = __ LoadRegister(object_reg_index); | 272 Node* object = __ LoadRegister(object_reg_index); |
249 Node* name_reg_index = __ BytecodeOperandReg8(1); | 273 Node* name_reg_index = __ BytecodeOperandReg8(1); |
250 Node* name = __ LoadRegister(name_reg_index); | 274 Node* name = __ LoadRegister(name_reg_index); |
251 Node* value = __ GetAccumulator(); | 275 Node* value = __ GetAccumulator(); |
252 Node* raw_slot = __ BytecodeOperandIdx8(2); | 276 Node* raw_slot = __ BytecodeOperandIdx8(2); |
253 Node* smi_slot = __ SmiTag(raw_slot); | 277 Node* smi_slot = __ SmiTag(raw_slot); |
254 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 278 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
255 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, value, | 279 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, value, |
256 smi_slot, type_feedback_vector); | 280 smi_slot, type_feedback_vector); |
257 __ SetAccumulator(result); | 281 __ SetAccumulator(result); |
258 __ Dispatch(); | 282 __ Dispatch(); |
259 } | 283 } |
260 | 284 |
261 | 285 |
262 // StoreIC <object> <name> <slot> | 286 // StoreICSloppy <object> <name> <slot> |
263 // | 287 // |
264 // Calls the StoreIC at FeedBackVector slot <slot> for <object> and the name | 288 // Calls the sloppy mode StoreIC at FeedBackVector slot <slot> for <object> and |
265 // <name> with the value in the accumulator. | 289 // the name <name> with the value in the accumulator. |
266 void Interpreter::DoStoreIC(compiler::InterpreterAssembler* assembler) { | 290 void Interpreter::DoStoreICSloppy(compiler::InterpreterAssembler* assembler) { |
267 Callable ic = | 291 Callable ic = |
268 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); | 292 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
269 DoPropertyStoreIC(ic, assembler); | 293 DoPropertyStoreIC(ic, assembler); |
270 } | 294 } |
271 | 295 |
272 | 296 |
273 // KeyedStoreIC <object> <key> <slot> | 297 // StoreICStrict <object> <name> <slot> |
274 // | 298 // |
275 // Calls the KeyStoreIC at FeedBackVector slot <slot> for <object> and the key | 299 // Calls the strict mode StoreIC at FeedBackVector slot <slot> for <object> and |
276 // <key> with the value in the accumulator. | 300 // the name <name> with the value in the accumulator. |
277 void Interpreter::DoKeyedStoreIC(compiler::InterpreterAssembler* assembler) { | 301 void Interpreter::DoStoreICStrict(compiler::InterpreterAssembler* assembler) { |
| 302 Callable ic = |
| 303 CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
| 304 DoPropertyStoreIC(ic, assembler); |
| 305 } |
| 306 |
| 307 |
| 308 // KeyedStoreICSloppy <object> <key> <slot> |
| 309 // |
| 310 // Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object> |
| 311 // and the key <key> with the value in the accumulator. |
| 312 void Interpreter::DoKeyedStoreICSloppy( |
| 313 compiler::InterpreterAssembler* assembler) { |
278 Callable ic = | 314 Callable ic = |
279 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); | 315 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
280 DoPropertyStoreIC(ic, assembler); | 316 DoPropertyStoreIC(ic, assembler); |
281 } | 317 } |
282 | 318 |
283 | 319 |
| 320 // KeyedStoreICStore <object> <key> <slot> |
| 321 // |
| 322 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object> |
| 323 // and the key <key> with the value in the accumulator. |
| 324 void Interpreter::DoKeyedStoreICStrict( |
| 325 compiler::InterpreterAssembler* assembler) { |
| 326 Callable ic = |
| 327 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
| 328 DoPropertyStoreIC(ic, assembler); |
| 329 } |
| 330 |
| 331 |
284 void Interpreter::DoBinaryOp(Runtime::FunctionId function_id, | 332 void Interpreter::DoBinaryOp(Runtime::FunctionId function_id, |
285 compiler::InterpreterAssembler* assembler) { | 333 compiler::InterpreterAssembler* assembler) { |
286 // TODO(rmcilroy): Call ICs which back-patch bytecode with type specialized | 334 // TODO(rmcilroy): Call ICs which back-patch bytecode with type specialized |
287 // operations, instead of calling builtins directly. | 335 // operations, instead of calling builtins directly. |
288 Node* reg_index = __ BytecodeOperandReg8(0); | 336 Node* reg_index = __ BytecodeOperandReg8(0); |
289 Node* lhs = __ LoadRegister(reg_index); | 337 Node* lhs = __ LoadRegister(reg_index); |
290 Node* rhs = __ GetAccumulator(); | 338 Node* rhs = __ GetAccumulator(); |
291 Node* result = __ CallRuntime(function_id, lhs, rhs); | 339 Node* result = __ CallRuntime(function_id, lhs, rhs); |
292 __ SetAccumulator(result); | 340 __ SetAccumulator(result); |
293 __ Dispatch(); | 341 __ Dispatch(); |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 // | 615 // |
568 // Return the value in the accumulator. | 616 // Return the value in the accumulator. |
569 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) { | 617 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) { |
570 __ Return(); | 618 __ Return(); |
571 } | 619 } |
572 | 620 |
573 | 621 |
574 } // namespace interpreter | 622 } // namespace interpreter |
575 } // namespace internal | 623 } // namespace internal |
576 } // namespace v8 | 624 } // namespace v8 |
OLD | NEW |