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 |
314 | |
315 // LdaNull | 312 // LdaNull |
316 // | 313 // |
317 // Load Null into the accumulator. | 314 // Load Null into the accumulator. |
318 void Interpreter::DoLdaNull(InterpreterAssembler* assembler) { | 315 void Interpreter::DoLdaNull(InterpreterAssembler* assembler) { |
319 Node* null_value = __ HeapConstant(isolate_->factory()->null_value()); | 316 Node* null_value = __ HeapConstant(isolate_->factory()->null_value()); |
320 __ SetAccumulator(null_value); | 317 __ SetAccumulator(null_value); |
321 __ Dispatch(); | 318 __ Dispatch(); |
322 } | 319 } |
323 | 320 |
324 | 321 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
378 // | 375 // |
379 // Stores the value of register <src> to register <dst>. | 376 // Stores the value of register <src> to register <dst>. |
380 void Interpreter::DoMov(InterpreterAssembler* assembler) { | 377 void Interpreter::DoMov(InterpreterAssembler* assembler) { |
381 Node* src_index = __ BytecodeOperandReg(0); | 378 Node* src_index = __ BytecodeOperandReg(0); |
382 Node* src_value = __ LoadRegister(src_index); | 379 Node* src_value = __ LoadRegister(src_index); |
383 Node* dst_index = __ BytecodeOperandReg(1); | 380 Node* dst_index = __ BytecodeOperandReg(1); |
384 __ StoreRegister(src_value, dst_index); | 381 __ StoreRegister(src_value, dst_index); |
385 __ Dispatch(); | 382 __ Dispatch(); |
386 } | 383 } |
387 | 384 |
388 | 385 Node* Interpreter::BuildLoadGlobal(Callable ic, |
389 void Interpreter::DoLoadGlobal(Callable ic, InterpreterAssembler* assembler) { | 386 InterpreterAssembler* assembler) { |
390 // Get the global object. | 387 // Get the global object. |
391 Node* context = __ GetContext(); | 388 Node* context = __ GetContext(); |
392 Node* native_context = | 389 Node* native_context = |
393 __ LoadContextSlot(context, Context::NATIVE_CONTEXT_INDEX); | 390 __ LoadContextSlot(context, Context::NATIVE_CONTEXT_INDEX); |
394 Node* global = __ LoadContextSlot(native_context, Context::EXTENSION_INDEX); | 391 Node* global = __ LoadContextSlot(native_context, Context::EXTENSION_INDEX); |
395 | 392 |
396 // Load the global via the LoadIC. | 393 // Load the global via the LoadIC. |
397 Node* code_target = __ HeapConstant(ic.code()); | 394 Node* code_target = __ HeapConstant(ic.code()); |
398 Node* constant_index = __ BytecodeOperandIdx(0); | 395 Node* constant_index = __ BytecodeOperandIdx(0); |
399 Node* name = __ LoadConstantPoolEntry(constant_index); | 396 Node* name = __ LoadConstantPoolEntry(constant_index); |
400 Node* raw_slot = __ BytecodeOperandIdx(1); | 397 Node* raw_slot = __ BytecodeOperandIdx(1); |
401 Node* smi_slot = __ SmiTag(raw_slot); | 398 Node* smi_slot = __ SmiTag(raw_slot); |
402 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 399 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
403 Node* result = __ CallStub(ic.descriptor(), code_target, context, global, | 400 return __ CallStub(ic.descriptor(), code_target, context, global, name, |
404 name, smi_slot, type_feedback_vector); | 401 smi_slot, type_feedback_vector); |
402 } | |
403 | |
404 void Interpreter::DoLdaGlobal(Callable ic, InterpreterAssembler* assembler) { | |
rmcilroy
2016/05/17 15:49:33
I'd just remove these existing helpers - it's not
oth
2016/05/18 20:22:25
Done.
| |
405 Node* result = BuildLoadGlobal(ic, assembler); | |
405 __ SetAccumulator(result); | 406 __ SetAccumulator(result); |
406 __ Dispatch(); | 407 __ Dispatch(); |
407 } | 408 } |
408 | 409 |
409 // LdaGlobal <name_index> <slot> | 410 // LdaGlobal <name_index> <slot> |
410 // | 411 // |
411 // Load the global with name in constant pool entry <name_index> into the | 412 // Load the global with name in constant pool entry <name_index> into the |
412 // accumulator using FeedBackVector slot <slot> outside of a typeof. | 413 // accumulator using FeedBackVector slot <slot> outside of a typeof. |
413 void Interpreter::DoLdaGlobal(InterpreterAssembler* assembler) { | 414 void Interpreter::DoLdaGlobal(InterpreterAssembler* assembler) { |
414 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, | 415 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
415 UNINITIALIZED); | 416 UNINITIALIZED); |
416 DoLoadGlobal(ic, assembler); | 417 DoLdaGlobal(ic, assembler); |
417 } | 418 } |
418 | 419 |
419 // LdaGlobalInsideTypeof <name_index> <slot> | 420 // LdaGlobalInsideTypeof <name_index> <slot> |
420 // | 421 // |
421 // Load the global with name in constant pool entry <name_index> into the | 422 // Load the global with name in constant pool entry <name_index> into the |
422 // accumulator using FeedBackVector slot <slot> inside of a typeof. | 423 // accumulator using FeedBackVector slot <slot> inside of a typeof. |
423 void Interpreter::DoLdaGlobalInsideTypeof(InterpreterAssembler* assembler) { | 424 void Interpreter::DoLdaGlobalInsideTypeof(InterpreterAssembler* assembler) { |
424 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, INSIDE_TYPEOF, | 425 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, INSIDE_TYPEOF, |
425 UNINITIALIZED); | 426 UNINITIALIZED); |
426 DoLoadGlobal(ic, assembler); | 427 DoLdaGlobal(ic, assembler); |
427 } | 428 } |
428 | 429 |
429 void Interpreter::DoStoreGlobal(Callable ic, InterpreterAssembler* assembler) { | 430 void Interpreter::DoStaGlobal(Callable ic, InterpreterAssembler* assembler) { |
430 // Get the global object. | 431 // Get the global object. |
431 Node* context = __ GetContext(); | 432 Node* context = __ GetContext(); |
432 Node* native_context = | 433 Node* native_context = |
433 __ LoadContextSlot(context, Context::NATIVE_CONTEXT_INDEX); | 434 __ LoadContextSlot(context, Context::NATIVE_CONTEXT_INDEX); |
434 Node* global = __ LoadContextSlot(native_context, Context::EXTENSION_INDEX); | 435 Node* global = __ LoadContextSlot(native_context, Context::EXTENSION_INDEX); |
435 | 436 |
436 // Store the global via the StoreIC. | 437 // Store the global via the StoreIC. |
437 Node* code_target = __ HeapConstant(ic.code()); | 438 Node* code_target = __ HeapConstant(ic.code()); |
438 Node* constant_index = __ BytecodeOperandIdx(0); | 439 Node* constant_index = __ BytecodeOperandIdx(0); |
439 Node* name = __ LoadConstantPoolEntry(constant_index); | 440 Node* name = __ LoadConstantPoolEntry(constant_index); |
440 Node* value = __ GetAccumulator(); | 441 Node* value = __ GetAccumulator(); |
441 Node* raw_slot = __ BytecodeOperandIdx(1); | 442 Node* raw_slot = __ BytecodeOperandIdx(1); |
442 Node* smi_slot = __ SmiTag(raw_slot); | 443 Node* smi_slot = __ SmiTag(raw_slot); |
443 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 444 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
444 __ CallStub(ic.descriptor(), code_target, context, global, name, value, | 445 __ CallStub(ic.descriptor(), code_target, context, global, name, value, |
445 smi_slot, type_feedback_vector); | 446 smi_slot, type_feedback_vector); |
446 __ Dispatch(); | 447 __ Dispatch(); |
447 } | 448 } |
448 | 449 |
449 | 450 |
450 // StaGlobalSloppy <name_index> <slot> | 451 // StaGlobalSloppy <name_index> <slot> |
451 // | 452 // |
452 // Store the value in the accumulator into the global with name in constant pool | 453 // 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. | 454 // entry <name_index> using FeedBackVector slot <slot> in sloppy mode. |
454 void Interpreter::DoStaGlobalSloppy(InterpreterAssembler* assembler) { | 455 void Interpreter::DoStaGlobalSloppy(InterpreterAssembler* assembler) { |
455 Callable ic = | 456 Callable ic = |
456 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); | 457 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
457 DoStoreGlobal(ic, assembler); | 458 DoStaGlobal(ic, assembler); |
458 } | 459 } |
459 | 460 |
460 | 461 |
461 // StaGlobalStrict <name_index> <slot> | 462 // StaGlobalStrict <name_index> <slot> |
462 // | 463 // |
463 // Store the value in the accumulator into the global with name in constant pool | 464 // 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. | 465 // entry <name_index> using FeedBackVector slot <slot> in strict mode. |
465 void Interpreter::DoStaGlobalStrict(InterpreterAssembler* assembler) { | 466 void Interpreter::DoStaGlobalStrict(InterpreterAssembler* assembler) { |
466 Callable ic = | 467 Callable ic = |
467 CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); | 468 CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
468 DoStoreGlobal(ic, assembler); | 469 DoStaGlobal(ic, assembler); |
470 } | |
471 | |
472 compiler::Node* Interpreter::BuildLoadContextSlot( | |
473 InterpreterAssembler* assembler) { | |
474 Node* reg_index = __ BytecodeOperandReg(0); | |
475 Node* context = __ LoadRegister(reg_index); | |
476 Node* slot_index = __ BytecodeOperandIdx(1); | |
477 return __ LoadContextSlot(context, slot_index); | |
469 } | 478 } |
470 | 479 |
471 // LdaContextSlot <context> <slot_index> | 480 // LdaContextSlot <context> <slot_index> |
472 // | 481 // |
473 // Load the object in |slot_index| of |context| into the accumulator. | 482 // Load the object in |slot_index| of |context| into the accumulator. |
474 void Interpreter::DoLdaContextSlot(InterpreterAssembler* assembler) { | 483 void Interpreter::DoLdaContextSlot(InterpreterAssembler* assembler) { |
475 Node* reg_index = __ BytecodeOperandReg(0); | 484 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); | 485 __ SetAccumulator(result); |
480 __ Dispatch(); | 486 __ Dispatch(); |
481 } | 487 } |
482 | 488 |
483 // StaContextSlot <context> <slot_index> | 489 // StaContextSlot <context> <slot_index> |
484 // | 490 // |
485 // Stores the object in the accumulator into |slot_index| of |context|. | 491 // Stores the object in the accumulator into |slot_index| of |context|. |
486 void Interpreter::DoStaContextSlot(InterpreterAssembler* assembler) { | 492 void Interpreter::DoStaContextSlot(InterpreterAssembler* assembler) { |
487 Node* value = __ GetAccumulator(); | 493 Node* value = __ GetAccumulator(); |
488 Node* reg_index = __ BytecodeOperandReg(0); | 494 Node* reg_index = __ BytecodeOperandReg(0); |
489 Node* context = __ LoadRegister(reg_index); | 495 Node* context = __ LoadRegister(reg_index); |
490 Node* slot_index = __ BytecodeOperandIdx(1); | 496 Node* slot_index = __ BytecodeOperandIdx(1); |
491 __ StoreContextSlot(context, slot_index, value); | 497 __ StoreContextSlot(context, slot_index, value); |
492 __ Dispatch(); | 498 __ Dispatch(); |
493 } | 499 } |
494 | 500 |
495 void Interpreter::DoLoadLookupSlot(Runtime::FunctionId function_id, | 501 void Interpreter::DoLdaLookupSlot(Runtime::FunctionId function_id, |
496 InterpreterAssembler* assembler) { | 502 InterpreterAssembler* assembler) { |
497 Node* index = __ BytecodeOperandIdx(0); | 503 Node* index = __ BytecodeOperandIdx(0); |
498 Node* name = __ LoadConstantPoolEntry(index); | 504 Node* name = __ LoadConstantPoolEntry(index); |
499 Node* context = __ GetContext(); | 505 Node* context = __ GetContext(); |
500 Node* result = __ CallRuntime(function_id, context, name); | 506 Node* result = __ CallRuntime(function_id, context, name); |
501 __ SetAccumulator(result); | 507 __ SetAccumulator(result); |
502 __ Dispatch(); | 508 __ Dispatch(); |
503 } | 509 } |
504 | 510 |
505 // LdaLookupSlot <name_index> | 511 // LdaLookupSlot <name_index> |
506 // | 512 // |
507 // Lookup the object with the name in constant pool entry |name_index| | 513 // Lookup the object with the name in constant pool entry |name_index| |
508 // dynamically. | 514 // dynamically. |
509 void Interpreter::DoLdaLookupSlot(InterpreterAssembler* assembler) { | 515 void Interpreter::DoLdaLookupSlot(InterpreterAssembler* assembler) { |
510 DoLoadLookupSlot(Runtime::kLoadLookupSlot, assembler); | 516 DoLdaLookupSlot(Runtime::kLoadLookupSlot, assembler); |
511 } | 517 } |
512 | 518 |
513 // LdaLookupSlotInsideTypeof <name_index> | 519 // LdaLookupSlotInsideTypeof <name_index> |
514 // | 520 // |
515 // Lookup the object with the name in constant pool entry |name_index| | 521 // Lookup the object with the name in constant pool entry |name_index| |
516 // dynamically without causing a NoReferenceError. | 522 // dynamically without causing a NoReferenceError. |
517 void Interpreter::DoLdaLookupSlotInsideTypeof(InterpreterAssembler* assembler) { | 523 void Interpreter::DoLdaLookupSlotInsideTypeof(InterpreterAssembler* assembler) { |
518 DoLoadLookupSlot(Runtime::kLoadLookupSlotInsideTypeof, assembler); | 524 DoLdaLookupSlot(Runtime::kLoadLookupSlotInsideTypeof, assembler); |
519 } | 525 } |
520 | 526 |
521 void Interpreter::DoStoreLookupSlot(LanguageMode language_mode, | 527 void Interpreter::DoStaLookupSlot(LanguageMode language_mode, |
522 InterpreterAssembler* assembler) { | 528 InterpreterAssembler* assembler) { |
523 Node* value = __ GetAccumulator(); | 529 Node* value = __ GetAccumulator(); |
524 Node* index = __ BytecodeOperandIdx(0); | 530 Node* index = __ BytecodeOperandIdx(0); |
525 Node* name = __ LoadConstantPoolEntry(index); | 531 Node* name = __ LoadConstantPoolEntry(index); |
526 Node* context = __ GetContext(); | 532 Node* context = __ GetContext(); |
527 Node* result = __ CallRuntime(is_strict(language_mode) | 533 Node* result = __ CallRuntime(is_strict(language_mode) |
528 ? Runtime::kStoreLookupSlot_Strict | 534 ? Runtime::kStoreLookupSlot_Strict |
529 : Runtime::kStoreLookupSlot_Sloppy, | 535 : Runtime::kStoreLookupSlot_Sloppy, |
530 context, name, value); | 536 context, name, value); |
531 __ SetAccumulator(result); | 537 __ SetAccumulator(result); |
532 __ Dispatch(); | 538 __ Dispatch(); |
533 } | 539 } |
534 | 540 |
535 // StaLookupSlotSloppy <name_index> | 541 // StaLookupSlotSloppy <name_index> |
536 // | 542 // |
537 // Store the object in accumulator to the object with the name in constant | 543 // Store the object in accumulator to the object with the name in constant |
538 // pool entry |name_index| in sloppy mode. | 544 // pool entry |name_index| in sloppy mode. |
539 void Interpreter::DoStaLookupSlotSloppy(InterpreterAssembler* assembler) { | 545 void Interpreter::DoStaLookupSlotSloppy(InterpreterAssembler* assembler) { |
540 DoStoreLookupSlot(LanguageMode::SLOPPY, assembler); | 546 DoStaLookupSlot(LanguageMode::SLOPPY, assembler); |
541 } | 547 } |
542 | 548 |
543 | 549 |
544 // StaLookupSlotStrict <name_index> | 550 // StaLookupSlotStrict <name_index> |
545 // | 551 // |
546 // Store the object in accumulator to the object with the name in constant | 552 // Store the object in accumulator to the object with the name in constant |
547 // pool entry |name_index| in strict mode. | 553 // pool entry |name_index| in strict mode. |
548 void Interpreter::DoStaLookupSlotStrict(InterpreterAssembler* assembler) { | 554 void Interpreter::DoStaLookupSlotStrict(InterpreterAssembler* assembler) { |
549 DoStoreLookupSlot(LanguageMode::STRICT, assembler); | 555 DoStaLookupSlot(LanguageMode::STRICT, assembler); |
550 } | 556 } |
551 | 557 |
552 void Interpreter::DoLoadIC(Callable ic, InterpreterAssembler* assembler) { | 558 Node* Interpreter::BuildLoadNamedProperty(Callable ic, |
559 InterpreterAssembler* assembler) { | |
553 Node* code_target = __ HeapConstant(ic.code()); | 560 Node* code_target = __ HeapConstant(ic.code()); |
554 Node* register_index = __ BytecodeOperandReg(0); | 561 Node* register_index = __ BytecodeOperandReg(0); |
555 Node* object = __ LoadRegister(register_index); | 562 Node* object = __ LoadRegister(register_index); |
556 Node* constant_index = __ BytecodeOperandIdx(1); | 563 Node* constant_index = __ BytecodeOperandIdx(1); |
557 Node* name = __ LoadConstantPoolEntry(constant_index); | 564 Node* name = __ LoadConstantPoolEntry(constant_index); |
558 Node* raw_slot = __ BytecodeOperandIdx(2); | 565 Node* raw_slot = __ BytecodeOperandIdx(2); |
559 Node* smi_slot = __ SmiTag(raw_slot); | 566 Node* smi_slot = __ SmiTag(raw_slot); |
560 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 567 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
561 Node* context = __ GetContext(); | 568 Node* context = __ GetContext(); |
562 Node* result = __ CallStub(ic.descriptor(), code_target, context, object, | 569 return __ CallStub(ic.descriptor(), code_target, context, object, name, |
563 name, smi_slot, type_feedback_vector); | 570 smi_slot, type_feedback_vector); |
571 } | |
572 | |
573 // LdaNamedProperty <object> <name_index> <slot> | |
574 // | |
575 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at | |
576 // constant pool entry <name_index>. | |
577 void Interpreter::DoLdaNamedProperty(InterpreterAssembler* assembler) { | |
578 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, | |
579 UNINITIALIZED); | |
580 Node* result = BuildLoadNamedProperty(ic, assembler); | |
564 __ SetAccumulator(result); | 581 __ SetAccumulator(result); |
565 __ Dispatch(); | 582 __ Dispatch(); |
566 } | 583 } |
567 | 584 |
568 // LoadIC <object> <name_index> <slot> | 585 Node* Interpreter::BuildLoadKeyedProperty(Callable ic, |
569 // | 586 InterpreterAssembler* assembler) { |
570 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at | |
571 // constant pool entry <name_index>. | |
572 void Interpreter::DoLoadIC(InterpreterAssembler* assembler) { | |
573 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, | |
574 UNINITIALIZED); | |
575 DoLoadIC(ic, assembler); | |
576 } | |
577 | |
578 void Interpreter::DoKeyedLoadIC(Callable ic, InterpreterAssembler* assembler) { | |
579 Node* code_target = __ HeapConstant(ic.code()); | 587 Node* code_target = __ HeapConstant(ic.code()); |
580 Node* reg_index = __ BytecodeOperandReg(0); | 588 Node* reg_index = __ BytecodeOperandReg(0); |
581 Node* object = __ LoadRegister(reg_index); | 589 Node* object = __ LoadRegister(reg_index); |
582 Node* name = __ GetAccumulator(); | 590 Node* name = __ GetAccumulator(); |
583 Node* raw_slot = __ BytecodeOperandIdx(1); | 591 Node* raw_slot = __ BytecodeOperandIdx(1); |
584 Node* smi_slot = __ SmiTag(raw_slot); | 592 Node* smi_slot = __ SmiTag(raw_slot); |
585 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 593 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
586 Node* context = __ GetContext(); | 594 Node* context = __ GetContext(); |
587 Node* result = __ CallStub(ic.descriptor(), code_target, context, object, | 595 return __ CallStub(ic.descriptor(), code_target, context, object, name, |
588 name, smi_slot, type_feedback_vector); | 596 smi_slot, type_feedback_vector); |
597 } | |
598 | |
599 // LdaKeyedProperty <object> <slot> | |
600 // | |
601 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key | |
602 // in the accumulator. | |
603 void Interpreter::DoLdaKeyedProperty(InterpreterAssembler* assembler) { | |
604 Callable ic = | |
605 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, UNINITIALIZED); | |
606 Node* result = BuildLoadKeyedProperty(ic, assembler); | |
589 __ SetAccumulator(result); | 607 __ SetAccumulator(result); |
590 __ Dispatch(); | 608 __ Dispatch(); |
591 } | 609 } |
592 | 610 |
593 // KeyedLoadIC <object> <slot> | 611 void Interpreter::DoStaNamedProperty(Callable ic, |
594 // | 612 InterpreterAssembler* assembler) { |
595 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key | |
596 // in the accumulator. | |
597 void Interpreter::DoKeyedLoadIC(InterpreterAssembler* assembler) { | |
598 Callable ic = | |
599 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, UNINITIALIZED); | |
600 DoKeyedLoadIC(ic, assembler); | |
601 } | |
602 | |
603 void Interpreter::DoStoreIC(Callable ic, InterpreterAssembler* assembler) { | |
604 Node* code_target = __ HeapConstant(ic.code()); | 613 Node* code_target = __ HeapConstant(ic.code()); |
605 Node* object_reg_index = __ BytecodeOperandReg(0); | 614 Node* object_reg_index = __ BytecodeOperandReg(0); |
606 Node* object = __ LoadRegister(object_reg_index); | 615 Node* object = __ LoadRegister(object_reg_index); |
607 Node* constant_index = __ BytecodeOperandIdx(1); | 616 Node* constant_index = __ BytecodeOperandIdx(1); |
608 Node* name = __ LoadConstantPoolEntry(constant_index); | 617 Node* name = __ LoadConstantPoolEntry(constant_index); |
609 Node* value = __ GetAccumulator(); | 618 Node* value = __ GetAccumulator(); |
610 Node* raw_slot = __ BytecodeOperandIdx(2); | 619 Node* raw_slot = __ BytecodeOperandIdx(2); |
611 Node* smi_slot = __ SmiTag(raw_slot); | 620 Node* smi_slot = __ SmiTag(raw_slot); |
612 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 621 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
613 Node* context = __ GetContext(); | 622 Node* context = __ GetContext(); |
614 __ CallStub(ic.descriptor(), code_target, context, object, name, value, | 623 __ CallStub(ic.descriptor(), code_target, context, object, name, value, |
615 smi_slot, type_feedback_vector); | 624 smi_slot, type_feedback_vector); |
616 __ Dispatch(); | 625 __ Dispatch(); |
617 } | 626 } |
618 | 627 |
619 | 628 // StaNamedPropertySloppy <object> <name_index> <slot> |
620 // StoreICSloppy <object> <name_index> <slot> | |
621 // | 629 // |
622 // Calls the sloppy mode StoreIC at FeedBackVector slot <slot> for <object> and | 630 // 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 | 631 // the name in constant pool entry <name_index> with the value in the |
624 // accumulator. | 632 // accumulator. |
625 void Interpreter::DoStoreICSloppy(InterpreterAssembler* assembler) { | 633 void Interpreter::DoStaNamedPropertySloppy(InterpreterAssembler* assembler) { |
626 Callable ic = | 634 Callable ic = |
627 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); | 635 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
628 DoStoreIC(ic, assembler); | 636 DoStaNamedProperty(ic, assembler); |
629 } | 637 } |
630 | 638 |
631 | 639 // StaNamedPropertyStrict <object> <name_index> <slot> |
632 // StoreICStrict <object> <name_index> <slot> | |
633 // | 640 // |
634 // Calls the strict mode StoreIC at FeedBackVector slot <slot> for <object> and | 641 // 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 | 642 // the name in constant pool entry <name_index> with the value in the |
636 // accumulator. | 643 // accumulator. |
637 void Interpreter::DoStoreICStrict(InterpreterAssembler* assembler) { | 644 void Interpreter::DoStaNamedPropertyStrict(InterpreterAssembler* assembler) { |
638 Callable ic = | 645 Callable ic = |
639 CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); | 646 CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
640 DoStoreIC(ic, assembler); | 647 DoStaNamedProperty(ic, assembler); |
641 } | 648 } |
642 | 649 |
643 void Interpreter::DoKeyedStoreIC(Callable ic, InterpreterAssembler* assembler) { | 650 void Interpreter::DoStaKeyedProperty(Callable ic, |
651 InterpreterAssembler* assembler) { | |
644 Node* code_target = __ HeapConstant(ic.code()); | 652 Node* code_target = __ HeapConstant(ic.code()); |
645 Node* object_reg_index = __ BytecodeOperandReg(0); | 653 Node* object_reg_index = __ BytecodeOperandReg(0); |
646 Node* object = __ LoadRegister(object_reg_index); | 654 Node* object = __ LoadRegister(object_reg_index); |
647 Node* name_reg_index = __ BytecodeOperandReg(1); | 655 Node* name_reg_index = __ BytecodeOperandReg(1); |
648 Node* name = __ LoadRegister(name_reg_index); | 656 Node* name = __ LoadRegister(name_reg_index); |
649 Node* value = __ GetAccumulator(); | 657 Node* value = __ GetAccumulator(); |
650 Node* raw_slot = __ BytecodeOperandIdx(2); | 658 Node* raw_slot = __ BytecodeOperandIdx(2); |
651 Node* smi_slot = __ SmiTag(raw_slot); | 659 Node* smi_slot = __ SmiTag(raw_slot); |
652 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 660 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
653 Node* context = __ GetContext(); | 661 Node* context = __ GetContext(); |
654 __ CallStub(ic.descriptor(), code_target, context, object, name, value, | 662 __ CallStub(ic.descriptor(), code_target, context, object, name, value, |
655 smi_slot, type_feedback_vector); | 663 smi_slot, type_feedback_vector); |
656 __ Dispatch(); | 664 __ Dispatch(); |
657 } | 665 } |
658 | 666 |
659 | 667 // StaKeyedPropertySloppy <object> <key> <slot> |
660 // KeyedStoreICSloppy <object> <key> <slot> | |
661 // | 668 // |
662 // Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object> | 669 // Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object> |
663 // and the key <key> with the value in the accumulator. | 670 // and the key <key> with the value in the accumulator. |
664 void Interpreter::DoKeyedStoreICSloppy(InterpreterAssembler* assembler) { | 671 void Interpreter::DoStaKeyedPropertySloppy(InterpreterAssembler* assembler) { |
665 Callable ic = | 672 Callable ic = |
666 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); | 673 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
667 DoKeyedStoreIC(ic, assembler); | 674 DoStaKeyedProperty(ic, assembler); |
668 } | 675 } |
669 | 676 |
670 | 677 // StaKeyedPropertyStrict <object> <key> <slot> |
671 // KeyedStoreICStore <object> <key> <slot> | |
672 // | 678 // |
673 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object> | 679 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object> |
674 // and the key <key> with the value in the accumulator. | 680 // and the key <key> with the value in the accumulator. |
675 void Interpreter::DoKeyedStoreICStrict(InterpreterAssembler* assembler) { | 681 void Interpreter::DoStaKeyedPropertyStrict(InterpreterAssembler* assembler) { |
676 Callable ic = | 682 Callable ic = |
677 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); | 683 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
678 DoKeyedStoreIC(ic, assembler); | 684 DoStaKeyedProperty(ic, assembler); |
679 } | 685 } |
680 | 686 |
681 // PushContext <context> | 687 // PushContext <context> |
682 // | 688 // |
683 // Saves the current context in <context>, and pushes the accumulator as the | 689 // Saves the current context in <context>, and pushes the accumulator as the |
684 // new current context. | 690 // new current context. |
685 void Interpreter::DoPushContext(InterpreterAssembler* assembler) { | 691 void Interpreter::DoPushContext(InterpreterAssembler* assembler) { |
686 Node* reg_index = __ BytecodeOperandReg(0); | 692 Node* reg_index = __ BytecodeOperandReg(0); |
687 Node* new_context = __ GetAccumulator(); | 693 Node* new_context = __ GetAccumulator(); |
688 Node* old_context = __ GetContext(); | 694 Node* old_context = __ GetContext(); |
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1784 // An invalid bytecode aborting execution if dispatched. | 1790 // An invalid bytecode aborting execution if dispatched. |
1785 void Interpreter::DoIllegal(InterpreterAssembler* assembler) { | 1791 void Interpreter::DoIllegal(InterpreterAssembler* assembler) { |
1786 __ Abort(kInvalidBytecode); | 1792 __ Abort(kInvalidBytecode); |
1787 } | 1793 } |
1788 | 1794 |
1789 // Nop | 1795 // Nop |
1790 // | 1796 // |
1791 // No operation. | 1797 // No operation. |
1792 void Interpreter::DoNop(InterpreterAssembler* assembler) { __ Dispatch(); } | 1798 void Interpreter::DoNop(InterpreterAssembler* assembler) { __ Dispatch(); } |
1793 | 1799 |
1800 // LdrUndefined <reg> | |
1801 // | |
1802 // Loads undefined into the accumulator and |reg|. | |
rmcilroy
2016/05/17 15:49:33
nit - also group these near Lda variants please
oth
2016/05/18 20:22:25
Done.
| |
1803 void Interpreter::DoLdrUndefined(InterpreterAssembler* assembler) { | |
1804 Node* result = BuildLoadUndefined(assembler); | |
1805 Node* destination = __ BytecodeOperandReg(0); | |
1806 __ StoreRegister(result, destination); | |
1807 __ Dispatch(); | |
1808 } | |
1809 | |
1810 // LdrContextSlot <context> <slot_index> <reg> | |
1811 // | |
1812 // Load the object in <slot_index> of <context> into register <reg>. | |
1813 void Interpreter::DoLdrContextSlot(InterpreterAssembler* assembler) { | |
1814 Node* result = BuildLoadContextSlot(assembler); | |
1815 Node* destination = __ BytecodeOperandReg(2); | |
1816 __ StoreRegister(result, destination); | |
1817 __ Dispatch(); | |
1818 } | |
1819 | |
1820 // LdrGlobal <name_index> <slot> <reg> | |
1821 // | |
1822 // Load the global with name in constant pool entry <name_index> into | |
1823 // register <reg> using FeedBackVector slot <slot> outside of a typeof. | |
1824 void Interpreter::DoLdrGlobal(InterpreterAssembler* assembler) { | |
1825 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, | |
1826 UNINITIALIZED); | |
1827 Node* result = BuildLoadGlobal(ic, assembler); | |
1828 Node* destination = __ BytecodeOperandReg(2); | |
1829 __ StoreRegister(result, destination); | |
1830 __ Dispatch(); | |
1831 } | |
1832 | |
1833 // LdrNamedProperty <object> <name_index> <slot> <reg> | |
1834 // | |
1835 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at | |
1836 // constant pool entry <name_index> and puts the result into register <reg>. | |
1837 void Interpreter::DoLdrNamedProperty(InterpreterAssembler* assembler) { | |
1838 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, | |
1839 UNINITIALIZED); | |
1840 Node* result = BuildLoadNamedProperty(ic, assembler); | |
1841 Node* destination = __ BytecodeOperandReg(3); | |
1842 __ StoreRegister(result, destination); | |
1843 __ Dispatch(); | |
1844 } | |
1845 | |
1846 // LdrKeyedProperty <object> <slot> <reg> | |
1847 // | |
1848 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key | |
1849 // in the accumulator and puts the result in register <reg>. | |
1850 void Interpreter::DoLdrKeyedProperty(InterpreterAssembler* assembler) { | |
1851 Callable ic = | |
1852 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, UNINITIALIZED); | |
1853 Node* result = BuildLoadKeyedProperty(ic, assembler); | |
1854 Node* destination = __ BytecodeOperandReg(2); | |
1855 __ StoreRegister(result, destination); | |
1856 __ Dispatch(); | |
1857 } | |
1858 | |
1794 // SuspendGenerator <generator> | 1859 // SuspendGenerator <generator> |
1795 // | 1860 // |
1796 // Exports the register file and stores it into the generator. Also stores the | 1861 // Exports the register file and stores it into the generator. Also stores the |
1797 // current context and the state given in the accumulator into the generator. | 1862 // current context and the state given in the accumulator into the generator. |
1798 void Interpreter::DoSuspendGenerator(InterpreterAssembler* assembler) { | 1863 void Interpreter::DoSuspendGenerator(InterpreterAssembler* assembler) { |
1799 Node* generator_reg = __ BytecodeOperandReg(0); | 1864 Node* generator_reg = __ BytecodeOperandReg(0); |
1800 Node* generator = __ LoadRegister(generator_reg); | 1865 Node* generator = __ LoadRegister(generator_reg); |
1801 | 1866 |
1802 Node* array = | 1867 Node* array = |
1803 __ LoadObjectField(generator, JSGeneratorObject::kOperandStackOffset); | 1868 __ LoadObjectField(generator, JSGeneratorObject::kOperandStackOffset); |
(...skipping 25 matching lines...) Expand all Loading... | |
1829 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, | 1894 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
1830 __ SmiTag(new_state)); | 1895 __ SmiTag(new_state)); |
1831 __ SetAccumulator(old_state); | 1896 __ SetAccumulator(old_state); |
1832 | 1897 |
1833 __ Dispatch(); | 1898 __ Dispatch(); |
1834 } | 1899 } |
1835 | 1900 |
1836 } // namespace interpreter | 1901 } // namespace interpreter |
1837 } // namespace internal | 1902 } // namespace internal |
1838 } // namespace v8 | 1903 } // namespace v8 |
OLD | NEW |