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