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 <fstream> | 7 #include <fstream> |
8 | 8 |
9 #include "src/ast/prettyprinter.h" | 9 #include "src/ast/prettyprinter.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 // LdaSmi <imm> | 282 // LdaSmi <imm> |
283 // | 283 // |
284 // Load an integer literal into the accumulator as a Smi. | 284 // Load an integer literal into the accumulator as a Smi. |
285 void Interpreter::DoLdaSmi(InterpreterAssembler* assembler) { | 285 void Interpreter::DoLdaSmi(InterpreterAssembler* assembler) { |
286 Node* raw_int = __ BytecodeOperandImm(0); | 286 Node* raw_int = __ BytecodeOperandImm(0); |
287 Node* smi_int = __ SmiTag(raw_int); | 287 Node* smi_int = __ SmiTag(raw_int); |
288 __ SetAccumulator(smi_int); | 288 __ SetAccumulator(smi_int); |
289 __ Dispatch(); | 289 __ Dispatch(); |
290 } | 290 } |
291 | 291 |
292 void Interpreter::DoLoadConstant(InterpreterAssembler* assembler) { | |
293 Node* index = __ BytecodeOperandIdx(0); | |
294 Node* constant = __ LoadConstantPoolEntry(index); | |
295 __ SetAccumulator(constant); | |
296 __ Dispatch(); | |
297 } | |
298 | |
299 // LdaConstant <idx> | 292 // LdaConstant <idx> |
300 // | 293 // |
301 // Load constant literal at |idx| in the constant pool into the accumulator. | 294 // Load constant literal at |idx| in the constant pool into the accumulator. |
302 void Interpreter::DoLdaConstant(InterpreterAssembler* assembler) { | 295 void Interpreter::DoLdaConstant(InterpreterAssembler* assembler) { |
303 DoLoadConstant(assembler); | 296 Node* index = __ BytecodeOperandIdx(0); |
| 297 Node* constant = __ LoadConstantPoolEntry(index); |
| 298 __ SetAccumulator(constant); |
| 299 __ Dispatch(); |
304 } | 300 } |
305 | 301 |
306 // LdaUndefined | 302 // LdaUndefined |
307 // | 303 // |
308 // Load Undefined into the accumulator. | 304 // Load Undefined into the accumulator. |
309 void Interpreter::DoLdaUndefined(InterpreterAssembler* assembler) { | 305 void Interpreter::DoLdaUndefined(InterpreterAssembler* assembler) { |
310 Node* undefined_value = | 306 Node* undefined_value = |
311 __ HeapConstant(isolate_->factory()->undefined_value()); | 307 __ HeapConstant(isolate_->factory()->undefined_value()); |
312 __ SetAccumulator(undefined_value); | 308 __ SetAccumulator(undefined_value); |
313 __ Dispatch(); | 309 __ Dispatch(); |
314 } | 310 } |
315 | 311 |
| 312 // LdrUndefined <reg> |
| 313 // |
| 314 // Loads undefined into the accumulator and |reg|. |
| 315 void Interpreter::DoLdrUndefined(InterpreterAssembler* assembler) { |
| 316 Node* undefined_value = |
| 317 __ HeapConstant(isolate_->factory()->undefined_value()); |
| 318 Node* destination = __ BytecodeOperandReg(0); |
| 319 __ StoreRegister(undefined_value, destination); |
| 320 __ Dispatch(); |
| 321 } |
| 322 |
316 // LdaNull | 323 // LdaNull |
317 // | 324 // |
318 // Load Null into the accumulator. | 325 // Load Null into the accumulator. |
319 void Interpreter::DoLdaNull(InterpreterAssembler* assembler) { | 326 void Interpreter::DoLdaNull(InterpreterAssembler* assembler) { |
320 Node* null_value = __ HeapConstant(isolate_->factory()->null_value()); | 327 Node* null_value = __ HeapConstant(isolate_->factory()->null_value()); |
321 __ SetAccumulator(null_value); | 328 __ SetAccumulator(null_value); |
322 __ Dispatch(); | 329 __ Dispatch(); |
323 } | 330 } |
324 | 331 |
325 // LdaTheHole | 332 // LdaTheHole |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 // | 380 // |
374 // Stores the value of register <src> to register <dst>. | 381 // Stores the value of register <src> to register <dst>. |
375 void Interpreter::DoMov(InterpreterAssembler* assembler) { | 382 void Interpreter::DoMov(InterpreterAssembler* assembler) { |
376 Node* src_index = __ BytecodeOperandReg(0); | 383 Node* src_index = __ BytecodeOperandReg(0); |
377 Node* src_value = __ LoadRegister(src_index); | 384 Node* src_value = __ LoadRegister(src_index); |
378 Node* dst_index = __ BytecodeOperandReg(1); | 385 Node* dst_index = __ BytecodeOperandReg(1); |
379 __ StoreRegister(src_value, dst_index); | 386 __ StoreRegister(src_value, dst_index); |
380 __ Dispatch(); | 387 __ Dispatch(); |
381 } | 388 } |
382 | 389 |
383 void Interpreter::DoLoadGlobal(Callable ic, InterpreterAssembler* assembler) { | 390 Node* Interpreter::BuildLoadGlobal(Callable ic, |
| 391 InterpreterAssembler* assembler) { |
384 // Get the global object. | 392 // Get the global object. |
385 Node* context = __ GetContext(); | 393 Node* context = __ GetContext(); |
386 Node* native_context = | 394 Node* native_context = |
387 __ LoadContextSlot(context, Context::NATIVE_CONTEXT_INDEX); | 395 __ LoadContextSlot(context, Context::NATIVE_CONTEXT_INDEX); |
388 Node* global = __ LoadContextSlot(native_context, Context::EXTENSION_INDEX); | 396 Node* global = __ LoadContextSlot(native_context, Context::EXTENSION_INDEX); |
389 | 397 |
390 // Load the global via the LoadIC. | 398 // Load the global via the LoadIC. |
391 Node* code_target = __ HeapConstant(ic.code()); | 399 Node* code_target = __ HeapConstant(ic.code()); |
392 Node* constant_index = __ BytecodeOperandIdx(0); | 400 Node* constant_index = __ BytecodeOperandIdx(0); |
393 Node* name = __ LoadConstantPoolEntry(constant_index); | 401 Node* name = __ LoadConstantPoolEntry(constant_index); |
394 Node* raw_slot = __ BytecodeOperandIdx(1); | 402 Node* raw_slot = __ BytecodeOperandIdx(1); |
395 Node* smi_slot = __ SmiTag(raw_slot); | 403 Node* smi_slot = __ SmiTag(raw_slot); |
396 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 404 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
397 Node* result = __ CallStub(ic.descriptor(), code_target, context, global, | 405 return __ CallStub(ic.descriptor(), code_target, context, global, name, |
398 name, smi_slot, type_feedback_vector); | 406 smi_slot, type_feedback_vector); |
399 __ SetAccumulator(result); | |
400 __ Dispatch(); | |
401 } | 407 } |
402 | 408 |
403 // LdaGlobal <name_index> <slot> | 409 // LdaGlobal <name_index> <slot> |
404 // | 410 // |
405 // Load the global with name in constant pool entry <name_index> into the | 411 // Load the global with name in constant pool entry <name_index> into the |
406 // accumulator using FeedBackVector slot <slot> outside of a typeof. | 412 // accumulator using FeedBackVector slot <slot> outside of a typeof. |
407 void Interpreter::DoLdaGlobal(InterpreterAssembler* assembler) { | 413 void Interpreter::DoLdaGlobal(InterpreterAssembler* assembler) { |
408 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, | 414 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
409 UNINITIALIZED); | 415 UNINITIALIZED); |
410 DoLoadGlobal(ic, assembler); | 416 Node* result = BuildLoadGlobal(ic, assembler); |
| 417 __ SetAccumulator(result); |
| 418 __ Dispatch(); |
| 419 } |
| 420 |
| 421 // LdrGlobal <name_index> <slot> <reg> |
| 422 // |
| 423 // Load the global with name in constant pool entry <name_index> into |
| 424 // register <reg> using FeedBackVector slot <slot> outside of a typeof. |
| 425 void Interpreter::DoLdrGlobal(InterpreterAssembler* assembler) { |
| 426 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
| 427 UNINITIALIZED); |
| 428 Node* result = BuildLoadGlobal(ic, assembler); |
| 429 Node* destination = __ BytecodeOperandReg(2); |
| 430 __ StoreRegister(result, destination); |
| 431 __ Dispatch(); |
411 } | 432 } |
412 | 433 |
413 // LdaGlobalInsideTypeof <name_index> <slot> | 434 // LdaGlobalInsideTypeof <name_index> <slot> |
414 // | 435 // |
415 // Load the global with name in constant pool entry <name_index> into the | 436 // Load the global with name in constant pool entry <name_index> into the |
416 // accumulator using FeedBackVector slot <slot> inside of a typeof. | 437 // accumulator using FeedBackVector slot <slot> inside of a typeof. |
417 void Interpreter::DoLdaGlobalInsideTypeof(InterpreterAssembler* assembler) { | 438 void Interpreter::DoLdaGlobalInsideTypeof(InterpreterAssembler* assembler) { |
418 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, INSIDE_TYPEOF, | 439 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, INSIDE_TYPEOF, |
419 UNINITIALIZED); | 440 UNINITIALIZED); |
420 DoLoadGlobal(ic, assembler); | 441 Node* result = BuildLoadGlobal(ic, assembler); |
| 442 __ SetAccumulator(result); |
| 443 __ Dispatch(); |
421 } | 444 } |
422 | 445 |
423 void Interpreter::DoStoreGlobal(Callable ic, InterpreterAssembler* assembler) { | 446 void Interpreter::DoStaGlobal(Callable ic, InterpreterAssembler* assembler) { |
424 // Get the global object. | 447 // Get the global object. |
425 Node* context = __ GetContext(); | 448 Node* context = __ GetContext(); |
426 Node* native_context = | 449 Node* native_context = |
427 __ LoadContextSlot(context, Context::NATIVE_CONTEXT_INDEX); | 450 __ LoadContextSlot(context, Context::NATIVE_CONTEXT_INDEX); |
428 Node* global = __ LoadContextSlot(native_context, Context::EXTENSION_INDEX); | 451 Node* global = __ LoadContextSlot(native_context, Context::EXTENSION_INDEX); |
429 | 452 |
430 // Store the global via the StoreIC. | 453 // Store the global via the StoreIC. |
431 Node* code_target = __ HeapConstant(ic.code()); | 454 Node* code_target = __ HeapConstant(ic.code()); |
432 Node* constant_index = __ BytecodeOperandIdx(0); | 455 Node* constant_index = __ BytecodeOperandIdx(0); |
433 Node* name = __ LoadConstantPoolEntry(constant_index); | 456 Node* name = __ LoadConstantPoolEntry(constant_index); |
434 Node* value = __ GetAccumulator(); | 457 Node* value = __ GetAccumulator(); |
435 Node* raw_slot = __ BytecodeOperandIdx(1); | 458 Node* raw_slot = __ BytecodeOperandIdx(1); |
436 Node* smi_slot = __ SmiTag(raw_slot); | 459 Node* smi_slot = __ SmiTag(raw_slot); |
437 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 460 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
438 __ CallStub(ic.descriptor(), code_target, context, global, name, value, | 461 __ CallStub(ic.descriptor(), code_target, context, global, name, value, |
439 smi_slot, type_feedback_vector); | 462 smi_slot, type_feedback_vector); |
440 __ Dispatch(); | 463 __ Dispatch(); |
441 } | 464 } |
442 | 465 |
443 // StaGlobalSloppy <name_index> <slot> | 466 // StaGlobalSloppy <name_index> <slot> |
444 // | 467 // |
445 // Store the value in the accumulator into the global with name in constant pool | 468 // Store the value in the accumulator into the global with name in constant pool |
446 // entry <name_index> using FeedBackVector slot <slot> in sloppy mode. | 469 // entry <name_index> using FeedBackVector slot <slot> in sloppy mode. |
447 void Interpreter::DoStaGlobalSloppy(InterpreterAssembler* assembler) { | 470 void Interpreter::DoStaGlobalSloppy(InterpreterAssembler* assembler) { |
448 Callable ic = | 471 Callable ic = |
449 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); | 472 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
450 DoStoreGlobal(ic, assembler); | 473 DoStaGlobal(ic, assembler); |
451 } | 474 } |
452 | 475 |
453 // StaGlobalStrict <name_index> <slot> | 476 // StaGlobalStrict <name_index> <slot> |
454 // | 477 // |
455 // Store the value in the accumulator into the global with name in constant pool | 478 // Store the value in the accumulator into the global with name in constant pool |
456 // entry <name_index> using FeedBackVector slot <slot> in strict mode. | 479 // entry <name_index> using FeedBackVector slot <slot> in strict mode. |
457 void Interpreter::DoStaGlobalStrict(InterpreterAssembler* assembler) { | 480 void Interpreter::DoStaGlobalStrict(InterpreterAssembler* assembler) { |
458 Callable ic = | 481 Callable ic = |
459 CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); | 482 CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
460 DoStoreGlobal(ic, assembler); | 483 DoStaGlobal(ic, assembler); |
| 484 } |
| 485 |
| 486 compiler::Node* Interpreter::BuildLoadContextSlot( |
| 487 InterpreterAssembler* assembler) { |
| 488 Node* reg_index = __ BytecodeOperandReg(0); |
| 489 Node* context = __ LoadRegister(reg_index); |
| 490 Node* slot_index = __ BytecodeOperandIdx(1); |
| 491 return __ LoadContextSlot(context, slot_index); |
461 } | 492 } |
462 | 493 |
463 // LdaContextSlot <context> <slot_index> | 494 // LdaContextSlot <context> <slot_index> |
464 // | 495 // |
465 // Load the object in |slot_index| of |context| into the accumulator. | 496 // Load the object in |slot_index| of |context| into the accumulator. |
466 void Interpreter::DoLdaContextSlot(InterpreterAssembler* assembler) { | 497 void Interpreter::DoLdaContextSlot(InterpreterAssembler* assembler) { |
467 Node* reg_index = __ BytecodeOperandReg(0); | 498 Node* result = BuildLoadContextSlot(assembler); |
468 Node* context = __ LoadRegister(reg_index); | |
469 Node* slot_index = __ BytecodeOperandIdx(1); | |
470 Node* result = __ LoadContextSlot(context, slot_index); | |
471 __ SetAccumulator(result); | 499 __ SetAccumulator(result); |
472 __ Dispatch(); | 500 __ Dispatch(); |
473 } | 501 } |
474 | 502 |
| 503 // LdrContextSlot <context> <slot_index> <reg> |
| 504 // |
| 505 // Load the object in <slot_index> of <context> into register <reg>. |
| 506 void Interpreter::DoLdrContextSlot(InterpreterAssembler* assembler) { |
| 507 Node* result = BuildLoadContextSlot(assembler); |
| 508 Node* destination = __ BytecodeOperandReg(2); |
| 509 __ StoreRegister(result, destination); |
| 510 __ Dispatch(); |
| 511 } |
| 512 |
475 // StaContextSlot <context> <slot_index> | 513 // StaContextSlot <context> <slot_index> |
476 // | 514 // |
477 // Stores the object in the accumulator into |slot_index| of |context|. | 515 // Stores the object in the accumulator into |slot_index| of |context|. |
478 void Interpreter::DoStaContextSlot(InterpreterAssembler* assembler) { | 516 void Interpreter::DoStaContextSlot(InterpreterAssembler* assembler) { |
479 Node* value = __ GetAccumulator(); | 517 Node* value = __ GetAccumulator(); |
480 Node* reg_index = __ BytecodeOperandReg(0); | 518 Node* reg_index = __ BytecodeOperandReg(0); |
481 Node* context = __ LoadRegister(reg_index); | 519 Node* context = __ LoadRegister(reg_index); |
482 Node* slot_index = __ BytecodeOperandIdx(1); | 520 Node* slot_index = __ BytecodeOperandIdx(1); |
483 __ StoreContextSlot(context, slot_index, value); | 521 __ StoreContextSlot(context, slot_index, value); |
484 __ Dispatch(); | 522 __ Dispatch(); |
485 } | 523 } |
486 | 524 |
487 void Interpreter::DoLoadLookupSlot(Runtime::FunctionId function_id, | 525 void Interpreter::DoLdaLookupSlot(Runtime::FunctionId function_id, |
488 InterpreterAssembler* assembler) { | 526 InterpreterAssembler* assembler) { |
489 Node* index = __ BytecodeOperandIdx(0); | 527 Node* index = __ BytecodeOperandIdx(0); |
490 Node* name = __ LoadConstantPoolEntry(index); | 528 Node* name = __ LoadConstantPoolEntry(index); |
491 Node* context = __ GetContext(); | 529 Node* context = __ GetContext(); |
492 Node* result = __ CallRuntime(function_id, context, name); | 530 Node* result = __ CallRuntime(function_id, context, name); |
493 __ SetAccumulator(result); | 531 __ SetAccumulator(result); |
494 __ Dispatch(); | 532 __ Dispatch(); |
495 } | 533 } |
496 | 534 |
497 // LdaLookupSlot <name_index> | 535 // LdaLookupSlot <name_index> |
498 // | 536 // |
499 // Lookup the object with the name in constant pool entry |name_index| | 537 // Lookup the object with the name in constant pool entry |name_index| |
500 // dynamically. | 538 // dynamically. |
501 void Interpreter::DoLdaLookupSlot(InterpreterAssembler* assembler) { | 539 void Interpreter::DoLdaLookupSlot(InterpreterAssembler* assembler) { |
502 DoLoadLookupSlot(Runtime::kLoadLookupSlot, assembler); | 540 DoLdaLookupSlot(Runtime::kLoadLookupSlot, assembler); |
503 } | 541 } |
504 | 542 |
505 // LdaLookupSlotInsideTypeof <name_index> | 543 // LdaLookupSlotInsideTypeof <name_index> |
506 // | 544 // |
507 // Lookup the object with the name in constant pool entry |name_index| | 545 // Lookup the object with the name in constant pool entry |name_index| |
508 // dynamically without causing a NoReferenceError. | 546 // dynamically without causing a NoReferenceError. |
509 void Interpreter::DoLdaLookupSlotInsideTypeof(InterpreterAssembler* assembler) { | 547 void Interpreter::DoLdaLookupSlotInsideTypeof(InterpreterAssembler* assembler) { |
510 DoLoadLookupSlot(Runtime::kLoadLookupSlotInsideTypeof, assembler); | 548 DoLdaLookupSlot(Runtime::kLoadLookupSlotInsideTypeof, assembler); |
511 } | 549 } |
512 | 550 |
513 void Interpreter::DoStoreLookupSlot(LanguageMode language_mode, | 551 void Interpreter::DoStaLookupSlot(LanguageMode language_mode, |
514 InterpreterAssembler* assembler) { | 552 InterpreterAssembler* assembler) { |
515 Node* value = __ GetAccumulator(); | 553 Node* value = __ GetAccumulator(); |
516 Node* index = __ BytecodeOperandIdx(0); | 554 Node* index = __ BytecodeOperandIdx(0); |
517 Node* name = __ LoadConstantPoolEntry(index); | 555 Node* name = __ LoadConstantPoolEntry(index); |
518 Node* context = __ GetContext(); | 556 Node* context = __ GetContext(); |
519 Node* result = __ CallRuntime(is_strict(language_mode) | 557 Node* result = __ CallRuntime(is_strict(language_mode) |
520 ? Runtime::kStoreLookupSlot_Strict | 558 ? Runtime::kStoreLookupSlot_Strict |
521 : Runtime::kStoreLookupSlot_Sloppy, | 559 : Runtime::kStoreLookupSlot_Sloppy, |
522 context, name, value); | 560 context, name, value); |
523 __ SetAccumulator(result); | 561 __ SetAccumulator(result); |
524 __ Dispatch(); | 562 __ Dispatch(); |
525 } | 563 } |
526 | 564 |
527 // StaLookupSlotSloppy <name_index> | 565 // StaLookupSlotSloppy <name_index> |
528 // | 566 // |
529 // Store the object in accumulator to the object with the name in constant | 567 // Store the object in accumulator to the object with the name in constant |
530 // pool entry |name_index| in sloppy mode. | 568 // pool entry |name_index| in sloppy mode. |
531 void Interpreter::DoStaLookupSlotSloppy(InterpreterAssembler* assembler) { | 569 void Interpreter::DoStaLookupSlotSloppy(InterpreterAssembler* assembler) { |
532 DoStoreLookupSlot(LanguageMode::SLOPPY, assembler); | 570 DoStaLookupSlot(LanguageMode::SLOPPY, assembler); |
533 } | 571 } |
534 | 572 |
535 // StaLookupSlotStrict <name_index> | 573 // StaLookupSlotStrict <name_index> |
536 // | 574 // |
537 // Store the object in accumulator to the object with the name in constant | 575 // Store the object in accumulator to the object with the name in constant |
538 // pool entry |name_index| in strict mode. | 576 // pool entry |name_index| in strict mode. |
539 void Interpreter::DoStaLookupSlotStrict(InterpreterAssembler* assembler) { | 577 void Interpreter::DoStaLookupSlotStrict(InterpreterAssembler* assembler) { |
540 DoStoreLookupSlot(LanguageMode::STRICT, assembler); | 578 DoStaLookupSlot(LanguageMode::STRICT, assembler); |
541 } | 579 } |
542 | 580 |
543 void Interpreter::DoLoadIC(Callable ic, InterpreterAssembler* assembler) { | 581 Node* Interpreter::BuildLoadNamedProperty(Callable ic, |
| 582 InterpreterAssembler* assembler) { |
544 Node* code_target = __ HeapConstant(ic.code()); | 583 Node* code_target = __ HeapConstant(ic.code()); |
545 Node* register_index = __ BytecodeOperandReg(0); | 584 Node* register_index = __ BytecodeOperandReg(0); |
546 Node* object = __ LoadRegister(register_index); | 585 Node* object = __ LoadRegister(register_index); |
547 Node* constant_index = __ BytecodeOperandIdx(1); | 586 Node* constant_index = __ BytecodeOperandIdx(1); |
548 Node* name = __ LoadConstantPoolEntry(constant_index); | 587 Node* name = __ LoadConstantPoolEntry(constant_index); |
549 Node* raw_slot = __ BytecodeOperandIdx(2); | 588 Node* raw_slot = __ BytecodeOperandIdx(2); |
550 Node* smi_slot = __ SmiTag(raw_slot); | 589 Node* smi_slot = __ SmiTag(raw_slot); |
551 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 590 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
552 Node* context = __ GetContext(); | 591 Node* context = __ GetContext(); |
553 Node* result = __ CallStub(ic.descriptor(), code_target, context, object, | 592 return __ CallStub(ic.descriptor(), code_target, context, object, name, |
554 name, smi_slot, type_feedback_vector); | 593 smi_slot, type_feedback_vector); |
555 __ SetAccumulator(result); | |
556 __ Dispatch(); | |
557 } | 594 } |
558 | 595 |
559 // LoadIC <object> <name_index> <slot> | 596 // LoadIC <object> <name_index> <slot> |
560 // | 597 // |
561 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at | 598 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at |
562 // constant pool entry <name_index>. | 599 // constant pool entry <name_index>. |
563 void Interpreter::DoLoadIC(InterpreterAssembler* assembler) { | 600 void Interpreter::DoLoadIC(InterpreterAssembler* assembler) { |
564 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, | 601 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
565 UNINITIALIZED); | 602 UNINITIALIZED); |
566 DoLoadIC(ic, assembler); | 603 Node* result = BuildLoadNamedProperty(ic, assembler); |
| 604 __ SetAccumulator(result); |
| 605 __ Dispatch(); |
567 } | 606 } |
568 | 607 |
569 void Interpreter::DoKeyedLoadIC(Callable ic, InterpreterAssembler* assembler) { | 608 // LdrNamedProperty <object> <name_index> <slot> <reg> |
| 609 // |
| 610 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at |
| 611 // constant pool entry <name_index> and puts the result into register <reg>. |
| 612 void Interpreter::DoLdrNamedProperty(InterpreterAssembler* assembler) { |
| 613 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
| 614 UNINITIALIZED); |
| 615 Node* result = BuildLoadNamedProperty(ic, assembler); |
| 616 Node* destination = __ BytecodeOperandReg(3); |
| 617 __ StoreRegister(result, destination); |
| 618 __ Dispatch(); |
| 619 } |
| 620 |
| 621 Node* Interpreter::BuildLoadKeyedProperty(Callable ic, |
| 622 InterpreterAssembler* assembler) { |
570 Node* code_target = __ HeapConstant(ic.code()); | 623 Node* code_target = __ HeapConstant(ic.code()); |
571 Node* reg_index = __ BytecodeOperandReg(0); | 624 Node* reg_index = __ BytecodeOperandReg(0); |
572 Node* object = __ LoadRegister(reg_index); | 625 Node* object = __ LoadRegister(reg_index); |
573 Node* name = __ GetAccumulator(); | 626 Node* name = __ GetAccumulator(); |
574 Node* raw_slot = __ BytecodeOperandIdx(1); | 627 Node* raw_slot = __ BytecodeOperandIdx(1); |
575 Node* smi_slot = __ SmiTag(raw_slot); | 628 Node* smi_slot = __ SmiTag(raw_slot); |
576 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 629 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
577 Node* context = __ GetContext(); | 630 Node* context = __ GetContext(); |
578 Node* result = __ CallStub(ic.descriptor(), code_target, context, object, | 631 return __ CallStub(ic.descriptor(), code_target, context, object, name, |
579 name, smi_slot, type_feedback_vector); | 632 smi_slot, type_feedback_vector); |
580 __ SetAccumulator(result); | |
581 __ Dispatch(); | |
582 } | 633 } |
583 | 634 |
584 // KeyedLoadIC <object> <slot> | 635 // KeyedLoadIC <object> <slot> |
585 // | 636 // |
586 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key | 637 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key |
587 // in the accumulator. | 638 // in the accumulator. |
588 void Interpreter::DoKeyedLoadIC(InterpreterAssembler* assembler) { | 639 void Interpreter::DoKeyedLoadIC(InterpreterAssembler* assembler) { |
589 Callable ic = | 640 Callable ic = |
590 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, UNINITIALIZED); | 641 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, UNINITIALIZED); |
591 DoKeyedLoadIC(ic, assembler); | 642 Node* result = BuildLoadKeyedProperty(ic, assembler); |
| 643 __ SetAccumulator(result); |
| 644 __ Dispatch(); |
| 645 } |
| 646 |
| 647 // LdrKeyedProperty <object> <slot> <reg> |
| 648 // |
| 649 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key |
| 650 // in the accumulator and puts the result in register <reg>. |
| 651 void Interpreter::DoLdrKeyedProperty(InterpreterAssembler* assembler) { |
| 652 Callable ic = |
| 653 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, UNINITIALIZED); |
| 654 Node* result = BuildLoadKeyedProperty(ic, assembler); |
| 655 Node* destination = __ BytecodeOperandReg(2); |
| 656 __ StoreRegister(result, destination); |
| 657 __ Dispatch(); |
592 } | 658 } |
593 | 659 |
594 void Interpreter::DoStoreIC(Callable ic, InterpreterAssembler* assembler) { | 660 void Interpreter::DoStoreIC(Callable ic, InterpreterAssembler* assembler) { |
595 Node* code_target = __ HeapConstant(ic.code()); | 661 Node* code_target = __ HeapConstant(ic.code()); |
596 Node* object_reg_index = __ BytecodeOperandReg(0); | 662 Node* object_reg_index = __ BytecodeOperandReg(0); |
597 Node* object = __ LoadRegister(object_reg_index); | 663 Node* object = __ LoadRegister(object_reg_index); |
598 Node* constant_index = __ BytecodeOperandIdx(1); | 664 Node* constant_index = __ BytecodeOperandIdx(1); |
599 Node* name = __ LoadConstantPoolEntry(constant_index); | 665 Node* name = __ LoadConstantPoolEntry(constant_index); |
600 Node* value = __ GetAccumulator(); | 666 Node* value = __ GetAccumulator(); |
601 Node* raw_slot = __ BytecodeOperandIdx(2); | 667 Node* raw_slot = __ BytecodeOperandIdx(2); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 // KeyedStoreICSloppy <object> <key> <slot> | 714 // KeyedStoreICSloppy <object> <key> <slot> |
649 // | 715 // |
650 // Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object> | 716 // Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object> |
651 // and the key <key> with the value in the accumulator. | 717 // and the key <key> with the value in the accumulator. |
652 void Interpreter::DoKeyedStoreICSloppy(InterpreterAssembler* assembler) { | 718 void Interpreter::DoKeyedStoreICSloppy(InterpreterAssembler* assembler) { |
653 Callable ic = | 719 Callable ic = |
654 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); | 720 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
655 DoKeyedStoreIC(ic, assembler); | 721 DoKeyedStoreIC(ic, assembler); |
656 } | 722 } |
657 | 723 |
658 // KeyedStoreICStore <object> <key> <slot> | 724 // KeyedStoreICStrict <object> <key> <slot> |
659 // | 725 // |
660 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object> | 726 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object> |
661 // and the key <key> with the value in the accumulator. | 727 // and the key <key> with the value in the accumulator. |
662 void Interpreter::DoKeyedStoreICStrict(InterpreterAssembler* assembler) { | 728 void Interpreter::DoKeyedStoreICStrict(InterpreterAssembler* assembler) { |
663 Callable ic = | 729 Callable ic = |
664 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); | 730 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
665 DoKeyedStoreIC(ic, assembler); | 731 DoKeyedStoreIC(ic, assembler); |
666 } | 732 } |
667 | 733 |
668 // PushContext <context> | 734 // PushContext <context> |
(...skipping 1115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1784 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, | 1850 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
1785 __ SmiTag(new_state)); | 1851 __ SmiTag(new_state)); |
1786 __ SetAccumulator(old_state); | 1852 __ SetAccumulator(old_state); |
1787 | 1853 |
1788 __ Dispatch(); | 1854 __ Dispatch(); |
1789 } | 1855 } |
1790 | 1856 |
1791 } // namespace interpreter | 1857 } // namespace interpreter |
1792 } // namespace internal | 1858 } // namespace internal |
1793 } // namespace v8 | 1859 } // namespace v8 |
OLD | NEW |