OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 if (state.CouldCreateAllocationMementos()) { | 315 if (state.CouldCreateAllocationMementos()) { |
316 BinaryOpICWithAllocationSiteStub stub(isolate, state); | 316 BinaryOpICWithAllocationSiteStub stub(isolate, state); |
317 stub.GetCode(); | 317 stub.GetCode(); |
318 } | 318 } |
319 } | 319 } |
320 | 320 |
321 void StringAddStub::PrintBaseName(std::ostream& os) const { // NOLINT | 321 void StringAddStub::PrintBaseName(std::ostream& os) const { // NOLINT |
322 os << "StringAddStub_" << flags() << "_" << pretenure_flag(); | 322 os << "StringAddStub_" << flags() << "_" << pretenure_flag(); |
323 } | 323 } |
324 | 324 |
325 void StringAddStub::GenerateAssembly( | 325 void StringAddStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
326 compiler::CodeAssemblerState* state) const { | |
327 typedef compiler::Node Node; | 326 typedef compiler::Node Node; |
328 CodeStubAssembler assembler(state); | 327 Node* left = assembler->Parameter(Descriptor::kLeft); |
329 Node* left = assembler.Parameter(Descriptor::kLeft); | 328 Node* right = assembler->Parameter(Descriptor::kRight); |
330 Node* right = assembler.Parameter(Descriptor::kRight); | 329 Node* context = assembler->Parameter(Descriptor::kContext); |
331 Node* context = assembler.Parameter(Descriptor::kContext); | |
332 | 330 |
333 if ((flags() & STRING_ADD_CHECK_LEFT) != 0) { | 331 if ((flags() & STRING_ADD_CHECK_LEFT) != 0) { |
334 DCHECK((flags() & STRING_ADD_CONVERT) != 0); | 332 DCHECK((flags() & STRING_ADD_CONVERT) != 0); |
335 // TODO(danno): The ToString and JSReceiverToPrimitive below could be | 333 // TODO(danno): The ToString and JSReceiverToPrimitive below could be |
336 // combined to avoid duplicate smi and instance type checks. | 334 // combined to avoid duplicate smi and instance type checks. |
337 left = assembler.ToString(context, | 335 left = assembler->ToString(context, |
338 assembler.JSReceiverToPrimitive(context, left)); | 336 assembler->JSReceiverToPrimitive(context, left)); |
339 } | 337 } |
340 if ((flags() & STRING_ADD_CHECK_RIGHT) != 0) { | 338 if ((flags() & STRING_ADD_CHECK_RIGHT) != 0) { |
341 DCHECK((flags() & STRING_ADD_CONVERT) != 0); | 339 DCHECK((flags() & STRING_ADD_CONVERT) != 0); |
342 // TODO(danno): The ToString and JSReceiverToPrimitive below could be | 340 // TODO(danno): The ToString and JSReceiverToPrimitive below could be |
343 // combined to avoid duplicate smi and instance type checks. | 341 // combined to avoid duplicate smi and instance type checks. |
344 right = assembler.ToString(context, | 342 right = assembler->ToString( |
345 assembler.JSReceiverToPrimitive(context, right)); | 343 context, assembler->JSReceiverToPrimitive(context, right)); |
346 } | 344 } |
347 | 345 |
348 if ((flags() & STRING_ADD_CHECK_BOTH) == 0) { | 346 if ((flags() & STRING_ADD_CHECK_BOTH) == 0) { |
349 CodeStubAssembler::AllocationFlag flags = | 347 CodeStubAssembler::AllocationFlag flags = |
350 (pretenure_flag() == TENURED) ? CodeStubAssembler::kPretenured | 348 (pretenure_flag() == TENURED) ? CodeStubAssembler::kPretenured |
351 : CodeStubAssembler::kNone; | 349 : CodeStubAssembler::kNone; |
352 assembler.Return(assembler.StringAdd(context, left, right, flags)); | 350 assembler->Return(assembler->StringAdd(context, left, right, flags)); |
353 } else { | 351 } else { |
354 Callable callable = CodeFactory::StringAdd(isolate(), STRING_ADD_CHECK_NONE, | 352 Callable callable = CodeFactory::StringAdd(isolate(), STRING_ADD_CHECK_NONE, |
355 pretenure_flag()); | 353 pretenure_flag()); |
356 assembler.TailCallStub(callable, context, left, right); | 354 assembler->TailCallStub(callable, context, left, right); |
357 } | 355 } |
358 } | 356 } |
359 | 357 |
360 InlineCacheState CompareICStub::GetICState() const { | 358 InlineCacheState CompareICStub::GetICState() const { |
361 CompareICState::State state = Max(left(), right()); | 359 CompareICState::State state = Max(left(), right()); |
362 switch (state) { | 360 switch (state) { |
363 case CompareICState::UNINITIALIZED: | 361 case CompareICState::UNINITIALIZED: |
364 return ::v8::internal::UNINITIALIZED; | 362 return ::v8::internal::UNINITIALIZED; |
365 case CompareICState::BOOLEAN: | 363 case CompareICState::BOOLEAN: |
366 case CompareICState::SMI: | 364 case CompareICState::SMI: |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 case CompareICState::GENERIC: | 415 case CompareICState::GENERIC: |
418 GenerateGeneric(masm); | 416 GenerateGeneric(masm); |
419 break; | 417 break; |
420 } | 418 } |
421 } | 419 } |
422 | 420 |
423 Handle<Code> TurboFanCodeStub::GenerateCode() { | 421 Handle<Code> TurboFanCodeStub::GenerateCode() { |
424 const char* name = CodeStub::MajorName(MajorKey()); | 422 const char* name = CodeStub::MajorName(MajorKey()); |
425 Zone zone(isolate()->allocator(), ZONE_NAME); | 423 Zone zone(isolate()->allocator(), ZONE_NAME); |
426 CallInterfaceDescriptor descriptor(GetCallInterfaceDescriptor()); | 424 CallInterfaceDescriptor descriptor(GetCallInterfaceDescriptor()); |
427 compiler::CodeAssemblerState state(isolate(), &zone, descriptor, | 425 CodeStubAssembler assembler(isolate(), &zone, descriptor, GetCodeFlags(), |
428 GetCodeFlags(), name); | 426 name); |
429 GenerateAssembly(&state); | 427 GenerateAssembly(&assembler); |
430 return compiler::CodeAssembler::GenerateCode(&state); | 428 return assembler.GenerateCode(); |
431 } | 429 } |
432 | 430 |
433 void LoadICTrampolineStub::GenerateAssembly( | 431 void LoadICTrampolineStub::GenerateAssembly( |
434 compiler::CodeAssemblerState* state) const { | 432 CodeStubAssembler* assembler) const { |
435 typedef compiler::Node Node; | 433 typedef compiler::Node Node; |
436 CodeStubAssembler assembler(state); | 434 |
437 | 435 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
438 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 436 Node* name = assembler->Parameter(Descriptor::kName); |
439 Node* name = assembler.Parameter(Descriptor::kName); | 437 Node* slot = assembler->Parameter(Descriptor::kSlot); |
440 Node* slot = assembler.Parameter(Descriptor::kSlot); | 438 Node* context = assembler->Parameter(Descriptor::kContext); |
441 Node* context = assembler.Parameter(Descriptor::kContext); | 439 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); |
442 Node* vector = assembler.LoadTypeFeedbackVectorForStub(); | 440 |
443 | 441 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); |
444 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); | 442 assembler->LoadIC(&p); |
445 assembler.LoadIC(&p); | 443 } |
446 } | 444 |
447 | 445 void LoadICStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
448 void LoadICStub::GenerateAssembly(compiler::CodeAssemblerState* state) const { | 446 typedef compiler::Node Node; |
449 typedef compiler::Node Node; | 447 |
450 CodeStubAssembler assembler(state); | 448 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
451 | 449 Node* name = assembler->Parameter(Descriptor::kName); |
452 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 450 Node* slot = assembler->Parameter(Descriptor::kSlot); |
453 Node* name = assembler.Parameter(Descriptor::kName); | 451 Node* vector = assembler->Parameter(Descriptor::kVector); |
454 Node* slot = assembler.Parameter(Descriptor::kSlot); | 452 Node* context = assembler->Parameter(Descriptor::kContext); |
455 Node* vector = assembler.Parameter(Descriptor::kVector); | 453 |
456 Node* context = assembler.Parameter(Descriptor::kContext); | 454 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); |
457 | 455 assembler->LoadIC(&p); |
458 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); | |
459 assembler.LoadIC(&p); | |
460 } | 456 } |
461 | 457 |
462 void LoadICProtoArrayStub::GenerateAssembly( | 458 void LoadICProtoArrayStub::GenerateAssembly( |
463 compiler::CodeAssemblerState* state) const { | 459 CodeStubAssembler* assembler) const { |
464 typedef compiler::Node Node; | 460 typedef compiler::Node Node; |
465 CodeStubAssembler assembler(state); | 461 |
466 | 462 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
467 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 463 Node* name = assembler->Parameter(Descriptor::kName); |
468 Node* name = assembler.Parameter(Descriptor::kName); | 464 Node* slot = assembler->Parameter(Descriptor::kSlot); |
469 Node* slot = assembler.Parameter(Descriptor::kSlot); | 465 Node* vector = assembler->Parameter(Descriptor::kVector); |
470 Node* vector = assembler.Parameter(Descriptor::kVector); | 466 Node* handler = assembler->Parameter(Descriptor::kHandler); |
471 Node* handler = assembler.Parameter(Descriptor::kHandler); | 467 Node* context = assembler->Parameter(Descriptor::kContext); |
472 Node* context = assembler.Parameter(Descriptor::kContext); | 468 |
473 | 469 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); |
474 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); | 470 assembler->LoadICProtoArray(&p, handler); |
475 assembler.LoadICProtoArray(&p, handler); | |
476 } | 471 } |
477 | 472 |
478 void LoadGlobalICTrampolineStub::GenerateAssembly( | 473 void LoadGlobalICTrampolineStub::GenerateAssembly( |
479 compiler::CodeAssemblerState* state) const { | 474 CodeStubAssembler* assembler) const { |
480 typedef compiler::Node Node; | 475 typedef compiler::Node Node; |
481 CodeStubAssembler assembler(state); | 476 |
482 | 477 Node* slot = assembler->Parameter(Descriptor::kSlot); |
483 Node* slot = assembler.Parameter(Descriptor::kSlot); | 478 Node* context = assembler->Parameter(Descriptor::kContext); |
484 Node* context = assembler.Parameter(Descriptor::kContext); | 479 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); |
485 Node* vector = assembler.LoadTypeFeedbackVectorForStub(); | |
486 | 480 |
487 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, | 481 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, |
488 vector); | 482 vector); |
489 assembler.LoadGlobalIC(&p); | 483 assembler->LoadGlobalIC(&p); |
490 } | 484 } |
491 | 485 |
492 void LoadGlobalICStub::GenerateAssembly( | 486 void LoadGlobalICStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
493 compiler::CodeAssemblerState* state) const { | 487 typedef compiler::Node Node; |
494 typedef compiler::Node Node; | 488 |
495 CodeStubAssembler assembler(state); | 489 Node* slot = assembler->Parameter(Descriptor::kSlot); |
496 | 490 Node* vector = assembler->Parameter(Descriptor::kVector); |
497 Node* slot = assembler.Parameter(Descriptor::kSlot); | 491 Node* context = assembler->Parameter(Descriptor::kContext); |
498 Node* vector = assembler.Parameter(Descriptor::kVector); | |
499 Node* context = assembler.Parameter(Descriptor::kContext); | |
500 | 492 |
501 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, | 493 CodeStubAssembler::LoadICParameters p(context, nullptr, nullptr, slot, |
502 vector); | 494 vector); |
503 assembler.LoadGlobalIC(&p); | 495 assembler->LoadGlobalIC(&p); |
504 } | 496 } |
505 | 497 |
506 void KeyedLoadICTrampolineTFStub::GenerateAssembly( | 498 void KeyedLoadICTrampolineTFStub::GenerateAssembly( |
507 compiler::CodeAssemblerState* state) const { | 499 CodeStubAssembler* assembler) const { |
508 typedef compiler::Node Node; | 500 typedef compiler::Node Node; |
509 CodeStubAssembler assembler(state); | 501 |
510 | 502 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
511 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 503 Node* name = assembler->Parameter(Descriptor::kName); |
512 Node* name = assembler.Parameter(Descriptor::kName); | 504 Node* slot = assembler->Parameter(Descriptor::kSlot); |
513 Node* slot = assembler.Parameter(Descriptor::kSlot); | 505 Node* context = assembler->Parameter(Descriptor::kContext); |
514 Node* context = assembler.Parameter(Descriptor::kContext); | 506 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); |
515 Node* vector = assembler.LoadTypeFeedbackVectorForStub(); | 507 |
516 | 508 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); |
517 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); | 509 assembler->KeyedLoadIC(&p); |
518 assembler.KeyedLoadIC(&p); | 510 } |
519 } | 511 |
520 | 512 void KeyedLoadICTFStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
521 void KeyedLoadICTFStub::GenerateAssembly( | 513 typedef compiler::Node Node; |
522 compiler::CodeAssemblerState* state) const { | 514 |
523 typedef compiler::Node Node; | 515 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
524 CodeStubAssembler assembler(state); | 516 Node* name = assembler->Parameter(Descriptor::kName); |
525 | 517 Node* slot = assembler->Parameter(Descriptor::kSlot); |
526 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 518 Node* vector = assembler->Parameter(Descriptor::kVector); |
527 Node* name = assembler.Parameter(Descriptor::kName); | 519 Node* context = assembler->Parameter(Descriptor::kContext); |
528 Node* slot = assembler.Parameter(Descriptor::kSlot); | 520 |
529 Node* vector = assembler.Parameter(Descriptor::kVector); | 521 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); |
530 Node* context = assembler.Parameter(Descriptor::kContext); | 522 assembler->KeyedLoadIC(&p); |
531 | |
532 CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector); | |
533 assembler.KeyedLoadIC(&p); | |
534 } | 523 } |
535 | 524 |
536 void StoreICTrampolineStub::GenerateAssembly( | 525 void StoreICTrampolineStub::GenerateAssembly( |
537 compiler::CodeAssemblerState* state) const { | 526 CodeStubAssembler* assembler) const { |
538 typedef compiler::Node Node; | 527 typedef compiler::Node Node; |
539 CodeStubAssembler assembler(state); | 528 |
540 | 529 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
541 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 530 Node* name = assembler->Parameter(Descriptor::kName); |
542 Node* name = assembler.Parameter(Descriptor::kName); | 531 Node* value = assembler->Parameter(Descriptor::kValue); |
543 Node* value = assembler.Parameter(Descriptor::kValue); | 532 Node* slot = assembler->Parameter(Descriptor::kSlot); |
544 Node* slot = assembler.Parameter(Descriptor::kSlot); | 533 Node* context = assembler->Parameter(Descriptor::kContext); |
545 Node* context = assembler.Parameter(Descriptor::kContext); | 534 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); |
546 Node* vector = assembler.LoadTypeFeedbackVectorForStub(); | 535 |
547 | 536 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, |
548 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, | 537 vector); |
549 vector); | 538 assembler->StoreIC(&p); |
550 assembler.StoreIC(&p); | 539 } |
551 } | 540 |
552 | 541 void StoreICStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
553 void StoreICStub::GenerateAssembly(compiler::CodeAssemblerState* state) const { | 542 typedef compiler::Node Node; |
554 typedef compiler::Node Node; | 543 |
555 CodeStubAssembler assembler(state); | 544 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
556 | 545 Node* name = assembler->Parameter(Descriptor::kName); |
557 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 546 Node* value = assembler->Parameter(Descriptor::kValue); |
558 Node* name = assembler.Parameter(Descriptor::kName); | 547 Node* slot = assembler->Parameter(Descriptor::kSlot); |
559 Node* value = assembler.Parameter(Descriptor::kValue); | 548 Node* vector = assembler->Parameter(Descriptor::kVector); |
560 Node* slot = assembler.Parameter(Descriptor::kSlot); | 549 Node* context = assembler->Parameter(Descriptor::kContext); |
561 Node* vector = assembler.Parameter(Descriptor::kVector); | 550 |
562 Node* context = assembler.Parameter(Descriptor::kContext); | 551 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, |
563 | 552 vector); |
564 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, | 553 assembler->StoreIC(&p); |
565 vector); | |
566 assembler.StoreIC(&p); | |
567 } | 554 } |
568 | 555 |
569 void KeyedStoreICTrampolineTFStub::GenerateAssembly( | 556 void KeyedStoreICTrampolineTFStub::GenerateAssembly( |
570 compiler::CodeAssemblerState* state) const { | 557 CodeStubAssembler* assembler) const { |
571 typedef compiler::Node Node; | 558 typedef compiler::Node Node; |
572 CodeStubAssembler assembler(state); | 559 |
573 | 560 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
574 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 561 Node* name = assembler->Parameter(Descriptor::kName); |
575 Node* name = assembler.Parameter(Descriptor::kName); | 562 Node* value = assembler->Parameter(Descriptor::kValue); |
576 Node* value = assembler.Parameter(Descriptor::kValue); | 563 Node* slot = assembler->Parameter(Descriptor::kSlot); |
577 Node* slot = assembler.Parameter(Descriptor::kSlot); | 564 Node* context = assembler->Parameter(Descriptor::kContext); |
578 Node* context = assembler.Parameter(Descriptor::kContext); | 565 Node* vector = assembler->LoadTypeFeedbackVectorForStub(); |
579 Node* vector = assembler.LoadTypeFeedbackVectorForStub(); | 566 |
580 | 567 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, |
581 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, | 568 vector); |
582 vector); | 569 assembler->KeyedStoreIC(&p, StoreICState::GetLanguageMode(GetExtraICState())); |
583 assembler.KeyedStoreIC(&p, StoreICState::GetLanguageMode(GetExtraICState())); | 570 } |
584 } | 571 |
585 | 572 void KeyedStoreICTFStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
586 void KeyedStoreICTFStub::GenerateAssembly( | 573 typedef compiler::Node Node; |
587 compiler::CodeAssemblerState* state) const { | 574 |
588 typedef compiler::Node Node; | 575 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
589 CodeStubAssembler assembler(state); | 576 Node* name = assembler->Parameter(Descriptor::kName); |
590 | 577 Node* value = assembler->Parameter(Descriptor::kValue); |
591 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 578 Node* slot = assembler->Parameter(Descriptor::kSlot); |
592 Node* name = assembler.Parameter(Descriptor::kName); | 579 Node* vector = assembler->Parameter(Descriptor::kVector); |
593 Node* value = assembler.Parameter(Descriptor::kValue); | 580 Node* context = assembler->Parameter(Descriptor::kContext); |
594 Node* slot = assembler.Parameter(Descriptor::kSlot); | 581 |
595 Node* vector = assembler.Parameter(Descriptor::kVector); | 582 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, |
596 Node* context = assembler.Parameter(Descriptor::kContext); | 583 vector); |
597 | 584 assembler->KeyedStoreIC(&p, StoreICState::GetLanguageMode(GetExtraICState())); |
598 CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot, | 585 } |
599 vector); | 586 |
600 assembler.KeyedStoreIC(&p, StoreICState::GetLanguageMode(GetExtraICState())); | 587 void StoreMapStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
601 } | 588 typedef compiler::Node Node; |
602 | 589 |
603 void StoreMapStub::GenerateAssembly(compiler::CodeAssemblerState* state) const { | 590 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
604 typedef compiler::Node Node; | 591 Node* map = assembler->Parameter(Descriptor::kMap); |
605 CodeStubAssembler assembler(state); | 592 Node* value = assembler->Parameter(Descriptor::kValue); |
606 | 593 |
607 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 594 assembler->StoreObjectField(receiver, JSObject::kMapOffset, map); |
608 Node* map = assembler.Parameter(Descriptor::kMap); | 595 assembler->Return(value); |
609 Node* value = assembler.Parameter(Descriptor::kValue); | 596 } |
610 | 597 |
611 assembler.StoreObjectField(receiver, JSObject::kMapOffset, map); | 598 void StoreTransitionStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
612 assembler.Return(value); | |
613 } | |
614 | |
615 void StoreTransitionStub::GenerateAssembly( | |
616 compiler::CodeAssemblerState* state) const { | |
617 typedef CodeStubAssembler::Label Label; | 599 typedef CodeStubAssembler::Label Label; |
618 typedef compiler::Node Node; | 600 typedef compiler::Node Node; |
619 CodeStubAssembler assembler(state); | 601 |
620 | 602 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
621 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 603 Node* name = assembler->Parameter(Descriptor::kName); |
622 Node* name = assembler.Parameter(Descriptor::kName); | |
623 Node* offset = | 604 Node* offset = |
624 assembler.SmiUntag(assembler.Parameter(Descriptor::kFieldOffset)); | 605 assembler->SmiUntag(assembler->Parameter(Descriptor::kFieldOffset)); |
625 Node* value = assembler.Parameter(Descriptor::kValue); | 606 Node* value = assembler->Parameter(Descriptor::kValue); |
626 Node* map = assembler.Parameter(Descriptor::kMap); | 607 Node* map = assembler->Parameter(Descriptor::kMap); |
627 Node* slot = assembler.Parameter(Descriptor::kSlot); | 608 Node* slot = assembler->Parameter(Descriptor::kSlot); |
628 Node* vector = assembler.Parameter(Descriptor::kVector); | 609 Node* vector = assembler->Parameter(Descriptor::kVector); |
629 Node* context = assembler.Parameter(Descriptor::kContext); | 610 Node* context = assembler->Parameter(Descriptor::kContext); |
630 | 611 |
631 Label miss(&assembler); | 612 Label miss(assembler); |
632 | 613 |
633 Representation representation = this->representation(); | 614 Representation representation = this->representation(); |
634 assembler.Comment("StoreTransitionStub: is_inobject: %d: representation: %s", | 615 assembler->Comment("StoreTransitionStub: is_inobject: %d: representation: %s", |
635 is_inobject(), representation.Mnemonic()); | 616 is_inobject(), representation.Mnemonic()); |
636 | 617 |
637 Node* prepared_value = | 618 Node* prepared_value = |
638 assembler.PrepareValueForWrite(value, representation, &miss); | 619 assembler->PrepareValueForWrite(value, representation, &miss); |
639 | 620 |
640 if (store_mode() == StoreTransitionStub::ExtendStorageAndStoreMapAndValue) { | 621 if (store_mode() == StoreTransitionStub::ExtendStorageAndStoreMapAndValue) { |
641 assembler.Comment("Extend storage"); | 622 assembler->Comment("Extend storage"); |
642 assembler.ExtendPropertiesBackingStore(receiver); | 623 assembler->ExtendPropertiesBackingStore(receiver); |
643 } else { | 624 } else { |
644 DCHECK(store_mode() == StoreTransitionStub::StoreMapAndValue); | 625 DCHECK(store_mode() == StoreTransitionStub::StoreMapAndValue); |
645 } | 626 } |
646 | 627 |
647 // Store the new value into the "extended" object. | 628 // Store the new value into the "extended" object. |
648 assembler.Comment("Store value"); | 629 assembler->Comment("Store value"); |
649 assembler.StoreNamedField(receiver, offset, is_inobject(), representation, | 630 assembler->StoreNamedField(receiver, offset, is_inobject(), representation, |
650 prepared_value, true); | 631 prepared_value, true); |
651 | 632 |
652 // And finally update the map. | 633 // And finally update the map. |
653 assembler.Comment("Store map"); | 634 assembler->Comment("Store map"); |
654 assembler.StoreObjectField(receiver, JSObject::kMapOffset, map); | 635 assembler->StoreObjectField(receiver, JSObject::kMapOffset, map); |
655 assembler.Return(value); | 636 assembler->Return(value); |
656 | 637 |
657 // Only store to tagged field never bails out. | 638 // Only store to tagged field never bails out. |
658 if (!representation.IsTagged()) { | 639 if (!representation.IsTagged()) { |
659 assembler.Bind(&miss); | 640 assembler->Bind(&miss); |
660 { | 641 { |
661 assembler.Comment("Miss"); | 642 assembler->Comment("Miss"); |
662 assembler.TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, | 643 assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, |
663 vector, receiver, name); | 644 vector, receiver, name); |
664 } | 645 } |
665 } | 646 } |
666 } | 647 } |
667 | 648 |
668 void ElementsTransitionAndStoreStub::GenerateAssembly( | 649 void ElementsTransitionAndStoreStub::GenerateAssembly( |
669 compiler::CodeAssemblerState* state) const { | 650 CodeStubAssembler* assembler) const { |
670 typedef CodeStubAssembler::Label Label; | 651 typedef CodeStubAssembler::Label Label; |
671 typedef compiler::Node Node; | 652 typedef compiler::Node Node; |
672 CodeStubAssembler assembler(state); | 653 |
673 | 654 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
674 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 655 Node* key = assembler->Parameter(Descriptor::kName); |
675 Node* key = assembler.Parameter(Descriptor::kName); | 656 Node* value = assembler->Parameter(Descriptor::kValue); |
676 Node* value = assembler.Parameter(Descriptor::kValue); | 657 Node* map = assembler->Parameter(Descriptor::kMap); |
677 Node* map = assembler.Parameter(Descriptor::kMap); | 658 Node* slot = assembler->Parameter(Descriptor::kSlot); |
678 Node* slot = assembler.Parameter(Descriptor::kSlot); | 659 Node* vector = assembler->Parameter(Descriptor::kVector); |
679 Node* vector = assembler.Parameter(Descriptor::kVector); | 660 Node* context = assembler->Parameter(Descriptor::kContext); |
680 Node* context = assembler.Parameter(Descriptor::kContext); | 661 |
681 | 662 assembler->Comment( |
682 assembler.Comment( | |
683 "ElementsTransitionAndStoreStub: from_kind=%s, to_kind=%s," | 663 "ElementsTransitionAndStoreStub: from_kind=%s, to_kind=%s," |
684 " is_jsarray=%d, store_mode=%d", | 664 " is_jsarray=%d, store_mode=%d", |
685 ElementsKindToString(from_kind()), ElementsKindToString(to_kind()), | 665 ElementsKindToString(from_kind()), ElementsKindToString(to_kind()), |
686 is_jsarray(), store_mode()); | 666 is_jsarray(), store_mode()); |
687 | 667 |
688 Label miss(&assembler); | 668 Label miss(assembler); |
689 | 669 |
690 if (FLAG_trace_elements_transitions) { | 670 if (FLAG_trace_elements_transitions) { |
691 // Tracing elements transitions is the job of the runtime. | 671 // Tracing elements transitions is the job of the runtime. |
692 assembler.Goto(&miss); | 672 assembler->Goto(&miss); |
693 } else { | 673 } else { |
694 assembler.TransitionElementsKind(receiver, map, from_kind(), to_kind(), | 674 assembler->TransitionElementsKind(receiver, map, from_kind(), to_kind(), |
695 is_jsarray(), &miss); | 675 is_jsarray(), &miss); |
696 assembler.EmitElementStore(receiver, key, value, is_jsarray(), to_kind(), | 676 assembler->EmitElementStore(receiver, key, value, is_jsarray(), to_kind(), |
697 store_mode(), &miss); | 677 store_mode(), &miss); |
698 assembler.Return(value); | 678 assembler->Return(value); |
699 } | 679 } |
700 | 680 |
701 assembler.Bind(&miss); | 681 assembler->Bind(&miss); |
702 { | 682 { |
703 assembler.Comment("Miss"); | 683 assembler->Comment("Miss"); |
704 assembler.TailCallRuntime(Runtime::kElementsTransitionAndStoreIC_Miss, | 684 assembler->TailCallRuntime(Runtime::kElementsTransitionAndStoreIC_Miss, |
705 context, receiver, key, value, map, slot, vector); | 685 context, receiver, key, value, map, slot, |
| 686 vector); |
706 } | 687 } |
707 } | 688 } |
708 | 689 |
709 void AllocateHeapNumberStub::GenerateAssembly( | 690 void AllocateHeapNumberStub::GenerateAssembly( |
710 compiler::CodeAssemblerState* state) const { | 691 CodeStubAssembler* assembler) const { |
711 typedef compiler::Node Node; | 692 typedef compiler::Node Node; |
712 CodeStubAssembler assembler(state); | 693 |
713 | 694 Node* result = assembler->AllocateHeapNumber(); |
714 Node* result = assembler.AllocateHeapNumber(); | 695 assembler->Return(result); |
715 assembler.Return(result); | 696 } |
716 } | 697 |
717 | 698 #define SIMD128_GEN_ASM(TYPE, Type, type, lane_count, lane_type) \ |
718 #define SIMD128_GEN_ASM(TYPE, Type, type, lane_count, lane_type) \ | 699 void Allocate##Type##Stub::GenerateAssembly(CodeStubAssembler* assembler) \ |
719 void Allocate##Type##Stub::GenerateAssembly( \ | 700 const { \ |
720 compiler::CodeAssemblerState* state) const { \ | 701 compiler::Node* result = \ |
721 CodeStubAssembler assembler(state); \ | 702 assembler->Allocate(Simd128Value::kSize, CodeStubAssembler::kNone); \ |
722 compiler::Node* result = \ | 703 compiler::Node* map = assembler->LoadMap(result); \ |
723 assembler.Allocate(Simd128Value::kSize, CodeStubAssembler::kNone); \ | 704 assembler->StoreNoWriteBarrier( \ |
724 compiler::Node* map = assembler.LoadMap(result); \ | 705 MachineRepresentation::kTagged, map, \ |
725 assembler.StoreNoWriteBarrier( \ | 706 assembler->HeapConstant(isolate()->factory()->type##_map())); \ |
726 MachineRepresentation::kTagged, map, \ | 707 assembler->Return(result); \ |
727 assembler.HeapConstant(isolate()->factory()->type##_map())); \ | |
728 assembler.Return(result); \ | |
729 } | 708 } |
730 SIMD128_TYPES(SIMD128_GEN_ASM) | 709 SIMD128_TYPES(SIMD128_GEN_ASM) |
731 #undef SIMD128_GEN_ASM | 710 #undef SIMD128_GEN_ASM |
732 | 711 |
733 void StringLengthStub::GenerateAssembly( | 712 void StringLengthStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
734 compiler::CodeAssemblerState* state) const { | 713 compiler::Node* value = assembler->Parameter(0); |
735 CodeStubAssembler assembler(state); | 714 compiler::Node* string = assembler->LoadJSValueValue(value); |
736 compiler::Node* value = assembler.Parameter(0); | 715 compiler::Node* result = assembler->LoadStringLength(string); |
737 compiler::Node* string = assembler.LoadJSValueValue(value); | 716 assembler->Return(result); |
738 compiler::Node* result = assembler.LoadStringLength(string); | 717 } |
739 assembler.Return(result); | |
740 } | |
741 | |
742 #define BINARY_OP_STUB(Name) \ | |
743 void Name::GenerateAssembly(compiler::CodeAssemblerState* state) const { \ | |
744 typedef BinaryOpWithVectorDescriptor Descriptor; \ | |
745 CodeStubAssembler assembler(state); \ | |
746 assembler.Return(Generate(&assembler, \ | |
747 assembler.Parameter(Descriptor::kLeft), \ | |
748 assembler.Parameter(Descriptor::kRight), \ | |
749 assembler.Parameter(Descriptor::kSlot), \ | |
750 assembler.Parameter(Descriptor::kVector), \ | |
751 assembler.Parameter(Descriptor::kContext))); \ | |
752 } | |
753 BINARY_OP_STUB(AddWithFeedbackStub) | |
754 BINARY_OP_STUB(SubtractWithFeedbackStub) | |
755 BINARY_OP_STUB(MultiplyWithFeedbackStub) | |
756 BINARY_OP_STUB(DivideWithFeedbackStub) | |
757 BINARY_OP_STUB(ModulusWithFeedbackStub) | |
758 #undef BINARY_OP_STUB | |
759 | 718 |
760 // static | 719 // static |
761 compiler::Node* AddWithFeedbackStub::Generate( | 720 compiler::Node* AddWithFeedbackStub::Generate( |
762 CodeStubAssembler* assembler, compiler::Node* lhs, compiler::Node* rhs, | 721 CodeStubAssembler* assembler, compiler::Node* lhs, compiler::Node* rhs, |
763 compiler::Node* slot_id, compiler::Node* type_feedback_vector, | 722 compiler::Node* slot_id, compiler::Node* type_feedback_vector, |
764 compiler::Node* context) { | 723 compiler::Node* context) { |
765 typedef CodeStubAssembler::Label Label; | 724 typedef CodeStubAssembler::Label Label; |
766 typedef compiler::Node Node; | 725 typedef compiler::Node Node; |
767 typedef CodeStubAssembler::Variable Variable; | 726 typedef CodeStubAssembler::Variable Variable; |
768 | 727 |
(...skipping 931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1700 var_result.Bind(assembler->CallStub(callable, context, dividend, divisor)); | 1659 var_result.Bind(assembler->CallStub(callable, context, dividend, divisor)); |
1701 assembler->Goto(&end); | 1660 assembler->Goto(&end); |
1702 } | 1661 } |
1703 | 1662 |
1704 assembler->Bind(&end); | 1663 assembler->Bind(&end); |
1705 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, | 1664 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, |
1706 slot_id); | 1665 slot_id); |
1707 return var_result.value(); | 1666 return var_result.value(); |
1708 } | 1667 } |
1709 | 1668 |
1710 #define UNARY_OP_STUB(Name) \ | |
1711 void Name::GenerateAssembly(compiler::CodeAssemblerState* state) const { \ | |
1712 CodeStubAssembler assembler(state); \ | |
1713 assembler.Return(Generate(&assembler, assembler.Parameter(0), \ | |
1714 assembler.Parameter(1), assembler.Parameter(2), \ | |
1715 assembler.Parameter(3))); \ | |
1716 } | |
1717 UNARY_OP_STUB(IncStub) | |
1718 UNARY_OP_STUB(DecStub) | |
1719 #undef UNARY_OP_STUB | |
1720 | |
1721 // static | 1669 // static |
1722 compiler::Node* IncStub::Generate(CodeStubAssembler* assembler, | 1670 compiler::Node* IncStub::Generate(CodeStubAssembler* assembler, |
1723 compiler::Node* value, | 1671 compiler::Node* value, |
1724 compiler::Node* context, | 1672 compiler::Node* context, |
1725 compiler::Node* type_feedback_vector, | 1673 compiler::Node* type_feedback_vector, |
1726 compiler::Node* slot_id) { | 1674 compiler::Node* slot_id) { |
1727 typedef CodeStubAssembler::Label Label; | 1675 typedef CodeStubAssembler::Label Label; |
1728 typedef compiler::Node Node; | 1676 typedef compiler::Node Node; |
1729 typedef CodeStubAssembler::Variable Variable; | 1677 typedef CodeStubAssembler::Variable Variable; |
1730 | 1678 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1844 result_var.Bind(assembler->AllocateHeapNumberWithValue(finc_result)); | 1792 result_var.Bind(assembler->AllocateHeapNumberWithValue(finc_result)); |
1845 assembler->Goto(&end); | 1793 assembler->Goto(&end); |
1846 } | 1794 } |
1847 | 1795 |
1848 assembler->Bind(&end); | 1796 assembler->Bind(&end); |
1849 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, | 1797 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, |
1850 slot_id); | 1798 slot_id); |
1851 return result_var.value(); | 1799 return result_var.value(); |
1852 } | 1800 } |
1853 | 1801 |
1854 void NumberToStringStub::GenerateAssembly( | 1802 void NumberToStringStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
1855 compiler::CodeAssemblerState* state) const { | |
1856 typedef compiler::Node Node; | 1803 typedef compiler::Node Node; |
1857 CodeStubAssembler assembler(state); | 1804 Node* argument = assembler->Parameter(Descriptor::kArgument); |
1858 Node* argument = assembler.Parameter(Descriptor::kArgument); | 1805 Node* context = assembler->Parameter(Descriptor::kContext); |
1859 Node* context = assembler.Parameter(Descriptor::kContext); | 1806 assembler->Return(assembler->NumberToString(context, argument)); |
1860 assembler.Return(assembler.NumberToString(context, argument)); | |
1861 } | 1807 } |
1862 | 1808 |
1863 // static | 1809 // static |
1864 compiler::Node* DecStub::Generate(CodeStubAssembler* assembler, | 1810 compiler::Node* DecStub::Generate(CodeStubAssembler* assembler, |
1865 compiler::Node* value, | 1811 compiler::Node* value, |
1866 compiler::Node* context, | 1812 compiler::Node* context, |
1867 compiler::Node* type_feedback_vector, | 1813 compiler::Node* type_feedback_vector, |
1868 compiler::Node* slot_id) { | 1814 compiler::Node* slot_id) { |
1869 typedef CodeStubAssembler::Label Label; | 1815 typedef CodeStubAssembler::Label Label; |
1870 typedef compiler::Node Node; | 1816 typedef compiler::Node Node; |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1995 | 1941 |
1996 // ES6 section 21.1.3.19 String.prototype.substring ( start, end ) | 1942 // ES6 section 21.1.3.19 String.prototype.substring ( start, end ) |
1997 compiler::Node* SubStringStub::Generate(CodeStubAssembler* assembler, | 1943 compiler::Node* SubStringStub::Generate(CodeStubAssembler* assembler, |
1998 compiler::Node* string, | 1944 compiler::Node* string, |
1999 compiler::Node* from, | 1945 compiler::Node* from, |
2000 compiler::Node* to, | 1946 compiler::Node* to, |
2001 compiler::Node* context) { | 1947 compiler::Node* context) { |
2002 return assembler->SubString(context, string, from, to); | 1948 return assembler->SubString(context, string, from, to); |
2003 } | 1949 } |
2004 | 1950 |
2005 void SubStringStub::GenerateAssembly( | 1951 void LoadApiGetterStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
2006 compiler::CodeAssemblerState* state) const { | |
2007 CodeStubAssembler assembler(state); | |
2008 assembler.Return(Generate(&assembler, | |
2009 assembler.Parameter(Descriptor::kString), | |
2010 assembler.Parameter(Descriptor::kFrom), | |
2011 assembler.Parameter(Descriptor::kTo), | |
2012 assembler.Parameter(Descriptor::kContext))); | |
2013 } | |
2014 | |
2015 void LoadApiGetterStub::GenerateAssembly( | |
2016 compiler::CodeAssemblerState* state) const { | |
2017 typedef compiler::Node Node; | 1952 typedef compiler::Node Node; |
2018 CodeStubAssembler assembler(state); | 1953 Node* context = assembler->Parameter(Descriptor::kContext); |
2019 Node* context = assembler.Parameter(Descriptor::kContext); | 1954 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
2020 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | |
2021 // For now we only support receiver_is_holder. | 1955 // For now we only support receiver_is_holder. |
2022 DCHECK(receiver_is_holder()); | 1956 DCHECK(receiver_is_holder()); |
2023 Node* holder = receiver; | 1957 Node* holder = receiver; |
2024 Node* map = assembler.LoadMap(receiver); | 1958 Node* map = assembler->LoadMap(receiver); |
2025 Node* descriptors = assembler.LoadMapDescriptors(map); | 1959 Node* descriptors = assembler->LoadMapDescriptors(map); |
2026 Node* value_index = | 1960 Node* value_index = |
2027 assembler.IntPtrConstant(DescriptorArray::ToValueIndex(index())); | 1961 assembler->IntPtrConstant(DescriptorArray::ToValueIndex(index())); |
2028 Node* callback = assembler.LoadFixedArrayElement( | 1962 Node* callback = assembler->LoadFixedArrayElement( |
2029 descriptors, value_index, 0, CodeStubAssembler::INTPTR_PARAMETERS); | 1963 descriptors, value_index, 0, CodeStubAssembler::INTPTR_PARAMETERS); |
2030 assembler.TailCallStub(CodeFactory::ApiGetter(isolate()), context, receiver, | 1964 assembler->TailCallStub(CodeFactory::ApiGetter(isolate()), context, receiver, |
2031 holder, callback); | 1965 holder, callback); |
2032 } | 1966 } |
2033 | 1967 |
2034 void StoreFieldStub::GenerateAssembly( | 1968 void StoreFieldStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
2035 compiler::CodeAssemblerState* state) const { | |
2036 typedef CodeStubAssembler::Label Label; | 1969 typedef CodeStubAssembler::Label Label; |
2037 typedef compiler::Node Node; | 1970 typedef compiler::Node Node; |
2038 CodeStubAssembler assembler(state); | |
2039 | 1971 |
2040 FieldIndex index = this->index(); | 1972 FieldIndex index = this->index(); |
2041 Representation representation = this->representation(); | 1973 Representation representation = this->representation(); |
2042 | 1974 |
2043 assembler.Comment("StoreFieldStub: inobject=%d, offset=%d, rep=%s", | 1975 assembler->Comment("StoreFieldStub: inobject=%d, offset=%d, rep=%s", |
2044 index.is_inobject(), index.offset(), | 1976 index.is_inobject(), index.offset(), |
2045 representation.Mnemonic()); | 1977 representation.Mnemonic()); |
2046 | 1978 |
2047 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 1979 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
2048 Node* name = assembler.Parameter(Descriptor::kName); | 1980 Node* name = assembler->Parameter(Descriptor::kName); |
2049 Node* value = assembler.Parameter(Descriptor::kValue); | 1981 Node* value = assembler->Parameter(Descriptor::kValue); |
2050 Node* slot = assembler.Parameter(Descriptor::kSlot); | 1982 Node* slot = assembler->Parameter(Descriptor::kSlot); |
2051 Node* vector = assembler.Parameter(Descriptor::kVector); | 1983 Node* vector = assembler->Parameter(Descriptor::kVector); |
2052 Node* context = assembler.Parameter(Descriptor::kContext); | 1984 Node* context = assembler->Parameter(Descriptor::kContext); |
2053 | 1985 |
2054 Label miss(&assembler); | 1986 Label miss(assembler); |
2055 | 1987 |
2056 Node* prepared_value = | 1988 Node* prepared_value = |
2057 assembler.PrepareValueForWrite(value, representation, &miss); | 1989 assembler->PrepareValueForWrite(value, representation, &miss); |
2058 assembler.StoreNamedField(receiver, index, representation, prepared_value, | 1990 assembler->StoreNamedField(receiver, index, representation, prepared_value, |
2059 false); | 1991 false); |
2060 assembler.Return(value); | 1992 assembler->Return(value); |
2061 | 1993 |
2062 // Only stores to tagged field can't bailout. | 1994 // Only stores to tagged field can't bailout. |
2063 if (!representation.IsTagged()) { | 1995 if (!representation.IsTagged()) { |
2064 assembler.Bind(&miss); | 1996 assembler->Bind(&miss); |
2065 { | 1997 { |
2066 assembler.Comment("Miss"); | 1998 assembler->Comment("Miss"); |
2067 assembler.TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, | 1999 assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, |
2068 vector, receiver, name); | 2000 vector, receiver, name); |
2069 } | 2001 } |
2070 } | 2002 } |
2071 } | 2003 } |
2072 | 2004 |
2073 void StoreGlobalStub::GenerateAssembly( | 2005 void StoreGlobalStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
2074 compiler::CodeAssemblerState* state) const { | |
2075 typedef CodeStubAssembler::Label Label; | 2006 typedef CodeStubAssembler::Label Label; |
2076 typedef compiler::Node Node; | 2007 typedef compiler::Node Node; |
2077 CodeStubAssembler assembler(state); | |
2078 | 2008 |
2079 assembler.Comment( | 2009 assembler->Comment( |
2080 "StoreGlobalStub: cell_type=%d, constant_type=%d, check_global=%d", | 2010 "StoreGlobalStub: cell_type=%d, constant_type=%d, check_global=%d", |
2081 cell_type(), PropertyCellType::kConstantType == cell_type() | 2011 cell_type(), PropertyCellType::kConstantType == cell_type() |
2082 ? static_cast<int>(constant_type()) | 2012 ? static_cast<int>(constant_type()) |
2083 : -1, | 2013 : -1, |
2084 check_global()); | 2014 check_global()); |
2085 | 2015 |
2086 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 2016 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
2087 Node* name = assembler.Parameter(Descriptor::kName); | 2017 Node* name = assembler->Parameter(Descriptor::kName); |
2088 Node* value = assembler.Parameter(Descriptor::kValue); | 2018 Node* value = assembler->Parameter(Descriptor::kValue); |
2089 Node* slot = assembler.Parameter(Descriptor::kSlot); | 2019 Node* slot = assembler->Parameter(Descriptor::kSlot); |
2090 Node* vector = assembler.Parameter(Descriptor::kVector); | 2020 Node* vector = assembler->Parameter(Descriptor::kVector); |
2091 Node* context = assembler.Parameter(Descriptor::kContext); | 2021 Node* context = assembler->Parameter(Descriptor::kContext); |
2092 | 2022 |
2093 Label miss(&assembler); | 2023 Label miss(assembler); |
2094 | 2024 |
2095 if (check_global()) { | 2025 if (check_global()) { |
2096 // Check that the map of the global has not changed: use a placeholder map | 2026 // Check that the map of the global has not changed: use a placeholder map |
2097 // that will be replaced later with the global object's map. | 2027 // that will be replaced later with the global object's map. |
2098 Node* proxy_map = assembler.LoadMap(receiver); | 2028 Node* proxy_map = assembler->LoadMap(receiver); |
2099 Node* global = assembler.LoadObjectField(proxy_map, Map::kPrototypeOffset); | 2029 Node* global = assembler->LoadObjectField(proxy_map, Map::kPrototypeOffset); |
2100 Node* map_cell = assembler.HeapConstant(isolate()->factory()->NewWeakCell( | 2030 Node* map_cell = assembler->HeapConstant(isolate()->factory()->NewWeakCell( |
2101 StoreGlobalStub::global_map_placeholder(isolate()))); | 2031 StoreGlobalStub::global_map_placeholder(isolate()))); |
2102 Node* expected_map = assembler.LoadWeakCellValueUnchecked(map_cell); | 2032 Node* expected_map = assembler->LoadWeakCellValueUnchecked(map_cell); |
2103 Node* map = assembler.LoadMap(global); | 2033 Node* map = assembler->LoadMap(global); |
2104 assembler.GotoIf(assembler.WordNotEqual(expected_map, map), &miss); | 2034 assembler->GotoIf(assembler->WordNotEqual(expected_map, map), &miss); |
2105 } | 2035 } |
2106 | 2036 |
2107 Node* weak_cell = assembler.HeapConstant(isolate()->factory()->NewWeakCell( | 2037 Node* weak_cell = assembler->HeapConstant(isolate()->factory()->NewWeakCell( |
2108 StoreGlobalStub::property_cell_placeholder(isolate()))); | 2038 StoreGlobalStub::property_cell_placeholder(isolate()))); |
2109 Node* cell = assembler.LoadWeakCellValue(weak_cell); | 2039 Node* cell = assembler->LoadWeakCellValue(weak_cell); |
2110 assembler.GotoIf(assembler.TaggedIsSmi(cell), &miss); | 2040 assembler->GotoIf(assembler->TaggedIsSmi(cell), &miss); |
2111 | 2041 |
2112 // Load the payload of the global parameter cell. A hole indicates that the | 2042 // Load the payload of the global parameter cell. A hole indicates that the |
2113 // cell has been invalidated and that the store must be handled by the | 2043 // cell has been invalidated and that the store must be handled by the |
2114 // runtime. | 2044 // runtime. |
2115 Node* cell_contents = | 2045 Node* cell_contents = |
2116 assembler.LoadObjectField(cell, PropertyCell::kValueOffset); | 2046 assembler->LoadObjectField(cell, PropertyCell::kValueOffset); |
2117 | 2047 |
2118 PropertyCellType cell_type = this->cell_type(); | 2048 PropertyCellType cell_type = this->cell_type(); |
2119 if (cell_type == PropertyCellType::kConstant || | 2049 if (cell_type == PropertyCellType::kConstant || |
2120 cell_type == PropertyCellType::kUndefined) { | 2050 cell_type == PropertyCellType::kUndefined) { |
2121 // This is always valid for all states a cell can be in. | 2051 // This is always valid for all states a cell can be in. |
2122 assembler.GotoIf(assembler.WordNotEqual(cell_contents, value), &miss); | 2052 assembler->GotoIf(assembler->WordNotEqual(cell_contents, value), &miss); |
2123 } else { | 2053 } else { |
2124 assembler.GotoIf(assembler.IsTheHole(cell_contents), &miss); | 2054 assembler->GotoIf(assembler->IsTheHole(cell_contents), &miss); |
2125 | 2055 |
2126 // When dealing with constant types, the type may be allowed to change, as | 2056 // When dealing with constant types, the type may be allowed to change, as |
2127 // long as optimized code remains valid. | 2057 // long as optimized code remains valid. |
2128 bool value_is_smi = false; | 2058 bool value_is_smi = false; |
2129 if (cell_type == PropertyCellType::kConstantType) { | 2059 if (cell_type == PropertyCellType::kConstantType) { |
2130 switch (constant_type()) { | 2060 switch (constant_type()) { |
2131 case PropertyCellConstantType::kSmi: | 2061 case PropertyCellConstantType::kSmi: |
2132 assembler.GotoUnless(assembler.TaggedIsSmi(value), &miss); | 2062 assembler->GotoUnless(assembler->TaggedIsSmi(value), &miss); |
2133 value_is_smi = true; | 2063 value_is_smi = true; |
2134 break; | 2064 break; |
2135 case PropertyCellConstantType::kStableMap: { | 2065 case PropertyCellConstantType::kStableMap: { |
2136 // It is sufficient here to check that the value and cell contents | 2066 // It is sufficient here to check that the value and cell contents |
2137 // have identical maps, no matter if they are stable or not or if they | 2067 // have identical maps, no matter if they are stable or not or if they |
2138 // are the maps that were originally in the cell or not. If optimized | 2068 // are the maps that were originally in the cell or not. If optimized |
2139 // code will deopt when a cell has a unstable map and if it has a | 2069 // code will deopt when a cell has a unstable map and if it has a |
2140 // dependency on a stable map, it will deopt if the map destabilizes. | 2070 // dependency on a stable map, it will deopt if the map destabilizes. |
2141 assembler.GotoIf(assembler.TaggedIsSmi(value), &miss); | 2071 assembler->GotoIf(assembler->TaggedIsSmi(value), &miss); |
2142 assembler.GotoIf(assembler.TaggedIsSmi(cell_contents), &miss); | 2072 assembler->GotoIf(assembler->TaggedIsSmi(cell_contents), &miss); |
2143 Node* expected_map = assembler.LoadMap(cell_contents); | 2073 Node* expected_map = assembler->LoadMap(cell_contents); |
2144 Node* map = assembler.LoadMap(value); | 2074 Node* map = assembler->LoadMap(value); |
2145 assembler.GotoIf(assembler.WordNotEqual(expected_map, map), &miss); | 2075 assembler->GotoIf(assembler->WordNotEqual(expected_map, map), &miss); |
2146 break; | 2076 break; |
2147 } | 2077 } |
2148 } | 2078 } |
2149 } | 2079 } |
2150 if (value_is_smi) { | 2080 if (value_is_smi) { |
2151 assembler.StoreObjectFieldNoWriteBarrier(cell, PropertyCell::kValueOffset, | 2081 assembler->StoreObjectFieldNoWriteBarrier( |
2152 value); | 2082 cell, PropertyCell::kValueOffset, value); |
2153 } else { | 2083 } else { |
2154 assembler.StoreObjectField(cell, PropertyCell::kValueOffset, value); | 2084 assembler->StoreObjectField(cell, PropertyCell::kValueOffset, value); |
2155 } | 2085 } |
2156 } | 2086 } |
2157 | 2087 |
2158 assembler.Return(value); | 2088 assembler->Return(value); |
2159 | 2089 |
2160 assembler.Bind(&miss); | 2090 assembler->Bind(&miss); |
2161 { | 2091 { |
2162 assembler.Comment("Miss"); | 2092 assembler->Comment("Miss"); |
2163 assembler.TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, | 2093 assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, |
2164 vector, receiver, name); | 2094 vector, receiver, name); |
2165 } | 2095 } |
2166 } | 2096 } |
2167 | 2097 |
2168 void KeyedLoadSloppyArgumentsStub::GenerateAssembly( | 2098 void KeyedLoadSloppyArgumentsStub::GenerateAssembly( |
2169 compiler::CodeAssemblerState* state) const { | 2099 CodeStubAssembler* assembler) const { |
2170 typedef CodeStubAssembler::Label Label; | 2100 typedef CodeStubAssembler::Label Label; |
2171 typedef compiler::Node Node; | 2101 typedef compiler::Node Node; |
2172 CodeStubAssembler assembler(state); | |
2173 | 2102 |
2174 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 2103 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
2175 Node* key = assembler.Parameter(Descriptor::kName); | 2104 Node* key = assembler->Parameter(Descriptor::kName); |
2176 Node* slot = assembler.Parameter(Descriptor::kSlot); | 2105 Node* slot = assembler->Parameter(Descriptor::kSlot); |
2177 Node* vector = assembler.Parameter(Descriptor::kVector); | 2106 Node* vector = assembler->Parameter(Descriptor::kVector); |
2178 Node* context = assembler.Parameter(Descriptor::kContext); | 2107 Node* context = assembler->Parameter(Descriptor::kContext); |
2179 | 2108 |
2180 Label miss(&assembler); | 2109 Label miss(assembler); |
2181 | 2110 |
2182 Node* result = assembler.LoadKeyedSloppyArguments(receiver, key, &miss); | 2111 Node* result = assembler->LoadKeyedSloppyArguments(receiver, key, &miss); |
2183 assembler.Return(result); | 2112 assembler->Return(result); |
2184 | 2113 |
2185 assembler.Bind(&miss); | 2114 assembler->Bind(&miss); |
2186 { | 2115 { |
2187 assembler.Comment("Miss"); | 2116 assembler->Comment("Miss"); |
2188 assembler.TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, | 2117 assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, |
2189 key, slot, vector); | 2118 key, slot, vector); |
2190 } | 2119 } |
2191 } | 2120 } |
2192 | 2121 |
2193 void KeyedStoreSloppyArgumentsStub::GenerateAssembly( | 2122 void KeyedStoreSloppyArgumentsStub::GenerateAssembly( |
2194 compiler::CodeAssemblerState* state) const { | 2123 CodeStubAssembler* assembler) const { |
2195 typedef CodeStubAssembler::Label Label; | 2124 typedef CodeStubAssembler::Label Label; |
2196 typedef compiler::Node Node; | 2125 typedef compiler::Node Node; |
2197 CodeStubAssembler assembler(state); | |
2198 | 2126 |
2199 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 2127 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
2200 Node* key = assembler.Parameter(Descriptor::kName); | 2128 Node* key = assembler->Parameter(Descriptor::kName); |
2201 Node* value = assembler.Parameter(Descriptor::kValue); | 2129 Node* value = assembler->Parameter(Descriptor::kValue); |
2202 Node* slot = assembler.Parameter(Descriptor::kSlot); | 2130 Node* slot = assembler->Parameter(Descriptor::kSlot); |
2203 Node* vector = assembler.Parameter(Descriptor::kVector); | 2131 Node* vector = assembler->Parameter(Descriptor::kVector); |
2204 Node* context = assembler.Parameter(Descriptor::kContext); | 2132 Node* context = assembler->Parameter(Descriptor::kContext); |
2205 | 2133 |
2206 Label miss(&assembler); | 2134 Label miss(assembler); |
2207 | 2135 |
2208 assembler.StoreKeyedSloppyArguments(receiver, key, value, &miss); | 2136 assembler->StoreKeyedSloppyArguments(receiver, key, value, &miss); |
2209 assembler.Return(value); | 2137 assembler->Return(value); |
2210 | 2138 |
2211 assembler.Bind(&miss); | 2139 assembler->Bind(&miss); |
2212 { | 2140 { |
2213 assembler.Comment("Miss"); | 2141 assembler->Comment("Miss"); |
2214 assembler.TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, value, slot, | 2142 assembler->TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, value, |
2215 vector, receiver, key); | 2143 slot, vector, receiver, key); |
2216 } | 2144 } |
2217 } | 2145 } |
2218 | 2146 |
2219 void LoadScriptContextFieldStub::GenerateAssembly( | 2147 void LoadScriptContextFieldStub::GenerateAssembly( |
2220 compiler::CodeAssemblerState* state) const { | 2148 CodeStubAssembler* assembler) const { |
2221 typedef compiler::Node Node; | 2149 typedef compiler::Node Node; |
2222 CodeStubAssembler assembler(state); | |
2223 | 2150 |
2224 assembler.Comment("LoadScriptContextFieldStub: context_index=%d, slot=%d", | 2151 assembler->Comment("LoadScriptContextFieldStub: context_index=%d, slot=%d", |
2225 context_index(), slot_index()); | 2152 context_index(), slot_index()); |
2226 | 2153 |
2227 Node* context = assembler.Parameter(Descriptor::kContext); | 2154 Node* context = assembler->Parameter(Descriptor::kContext); |
2228 | 2155 |
2229 Node* script_context = assembler.LoadScriptContext(context, context_index()); | 2156 Node* script_context = assembler->LoadScriptContext(context, context_index()); |
2230 Node* result = assembler.LoadFixedArrayElement( | 2157 Node* result = assembler->LoadFixedArrayElement( |
2231 script_context, assembler.IntPtrConstant(slot_index()), 0, | 2158 script_context, assembler->IntPtrConstant(slot_index()), 0, |
2232 CodeStubAssembler::INTPTR_PARAMETERS); | 2159 CodeStubAssembler::INTPTR_PARAMETERS); |
2233 assembler.Return(result); | 2160 assembler->Return(result); |
2234 } | 2161 } |
2235 | 2162 |
2236 void StoreScriptContextFieldStub::GenerateAssembly( | 2163 void StoreScriptContextFieldStub::GenerateAssembly( |
2237 compiler::CodeAssemblerState* state) const { | 2164 CodeStubAssembler* assembler) const { |
2238 typedef compiler::Node Node; | 2165 typedef compiler::Node Node; |
2239 CodeStubAssembler assembler(state); | |
2240 | 2166 |
2241 assembler.Comment("StoreScriptContextFieldStub: context_index=%d, slot=%d", | 2167 assembler->Comment("StoreScriptContextFieldStub: context_index=%d, slot=%d", |
2242 context_index(), slot_index()); | 2168 context_index(), slot_index()); |
2243 | 2169 |
2244 Node* value = assembler.Parameter(Descriptor::kValue); | 2170 Node* value = assembler->Parameter(Descriptor::kValue); |
2245 Node* context = assembler.Parameter(Descriptor::kContext); | 2171 Node* context = assembler->Parameter(Descriptor::kContext); |
2246 | 2172 |
2247 Node* script_context = assembler.LoadScriptContext(context, context_index()); | 2173 Node* script_context = assembler->LoadScriptContext(context, context_index()); |
2248 assembler.StoreFixedArrayElement( | 2174 assembler->StoreFixedArrayElement( |
2249 script_context, assembler.IntPtrConstant(slot_index()), value, | 2175 script_context, assembler->IntPtrConstant(slot_index()), value, |
2250 UPDATE_WRITE_BARRIER, CodeStubAssembler::INTPTR_PARAMETERS); | 2176 UPDATE_WRITE_BARRIER, CodeStubAssembler::INTPTR_PARAMETERS); |
2251 assembler.Return(value); | 2177 assembler->Return(value); |
2252 } | 2178 } |
2253 | 2179 |
2254 void StoreInterceptorStub::GenerateAssembly( | 2180 void StoreInterceptorStub::GenerateAssembly( |
2255 compiler::CodeAssemblerState* state) const { | 2181 CodeStubAssembler* assembler) const { |
2256 typedef compiler::Node Node; | 2182 typedef compiler::Node Node; |
2257 CodeStubAssembler assembler(state); | |
2258 | 2183 |
2259 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 2184 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
2260 Node* name = assembler.Parameter(Descriptor::kName); | 2185 Node* name = assembler->Parameter(Descriptor::kName); |
2261 Node* value = assembler.Parameter(Descriptor::kValue); | 2186 Node* value = assembler->Parameter(Descriptor::kValue); |
2262 Node* context = assembler.Parameter(Descriptor::kContext); | 2187 Node* context = assembler->Parameter(Descriptor::kContext); |
2263 assembler.TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, | 2188 assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, |
2264 receiver, name, value); | 2189 receiver, name, value); |
2265 } | 2190 } |
2266 | 2191 |
2267 void LoadIndexedInterceptorStub::GenerateAssembly( | 2192 void LoadIndexedInterceptorStub::GenerateAssembly( |
2268 compiler::CodeAssemblerState* state) const { | 2193 CodeStubAssembler* assembler) const { |
2269 typedef compiler::Node Node; | 2194 typedef compiler::Node Node; |
2270 typedef CodeStubAssembler::Label Label; | 2195 typedef CodeStubAssembler::Label Label; |
2271 CodeStubAssembler assembler(state); | |
2272 | 2196 |
2273 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 2197 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
2274 Node* key = assembler.Parameter(Descriptor::kName); | 2198 Node* key = assembler->Parameter(Descriptor::kName); |
2275 Node* slot = assembler.Parameter(Descriptor::kSlot); | 2199 Node* slot = assembler->Parameter(Descriptor::kSlot); |
2276 Node* vector = assembler.Parameter(Descriptor::kVector); | 2200 Node* vector = assembler->Parameter(Descriptor::kVector); |
2277 Node* context = assembler.Parameter(Descriptor::kContext); | 2201 Node* context = assembler->Parameter(Descriptor::kContext); |
2278 | 2202 |
2279 Label if_keyispositivesmi(&assembler), if_keyisinvalid(&assembler); | 2203 Label if_keyispositivesmi(assembler), if_keyisinvalid(assembler); |
2280 assembler.Branch(assembler.WordIsPositiveSmi(key), &if_keyispositivesmi, | 2204 assembler->Branch(assembler->WordIsPositiveSmi(key), &if_keyispositivesmi, |
2281 &if_keyisinvalid); | 2205 &if_keyisinvalid); |
2282 assembler.Bind(&if_keyispositivesmi); | 2206 assembler->Bind(&if_keyispositivesmi); |
2283 assembler.TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, | 2207 assembler->TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, |
2284 receiver, key); | 2208 receiver, key); |
2285 | 2209 |
2286 assembler.Bind(&if_keyisinvalid); | 2210 assembler->Bind(&if_keyisinvalid); |
2287 assembler.TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, | 2211 assembler->TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, |
2288 slot, vector); | 2212 slot, vector); |
2289 } | 2213 } |
2290 | 2214 |
2291 // static | 2215 // static |
2292 bool FastCloneShallowObjectStub::IsSupported(ObjectLiteral* expr) { | 2216 bool FastCloneShallowObjectStub::IsSupported(ObjectLiteral* expr) { |
2293 // FastCloneShallowObjectStub doesn't copy elements, and object literals don't | 2217 // FastCloneShallowObjectStub doesn't copy elements, and object literals don't |
2294 // support copy-on-write (COW) elements for now. | 2218 // support copy-on-write (COW) elements for now. |
2295 // TODO(mvstanton): make object literals support COW elements. | 2219 // TODO(mvstanton): make object literals support COW elements. |
2296 return expr->fast_elements() && expr->has_shallow_properties() && | 2220 return expr->fast_elements() && expr->has_shallow_properties() && |
2297 expr->properties_count() <= kMaximumClonedProperties; | 2221 expr->properties_count() <= kMaximumClonedProperties; |
2298 } | 2222 } |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2385 assembler->StoreObjectFieldNoWriteBarrier( | 2309 assembler->StoreObjectFieldNoWriteBarrier( |
2386 allocation_site, AllocationSite::kPretenureCreateCountOffset, | 2310 allocation_site, AllocationSite::kPretenureCreateCountOffset, |
2387 memento_create_count); | 2311 memento_create_count); |
2388 } | 2312 } |
2389 | 2313 |
2390 // TODO(verwaest): Allocate and fill in double boxes. | 2314 // TODO(verwaest): Allocate and fill in double boxes. |
2391 return copy; | 2315 return copy; |
2392 } | 2316 } |
2393 | 2317 |
2394 void FastCloneShallowObjectStub::GenerateAssembly( | 2318 void FastCloneShallowObjectStub::GenerateAssembly( |
2395 compiler::CodeAssemblerState* state) const { | 2319 CodeStubAssembler* assembler) const { |
2396 typedef CodeStubAssembler::Label Label; | 2320 typedef CodeStubAssembler::Label Label; |
2397 typedef compiler::Node Node; | 2321 typedef compiler::Node Node; |
2398 CodeStubAssembler assembler(state); | 2322 Label call_runtime(assembler); |
2399 | 2323 Node* closure = assembler->Parameter(0); |
2400 Label call_runtime(&assembler); | 2324 Node* literals_index = assembler->Parameter(1); |
2401 Node* closure = assembler.Parameter(0); | |
2402 Node* literals_index = assembler.Parameter(1); | |
2403 | 2325 |
2404 Node* properties_count = | 2326 Node* properties_count = |
2405 assembler.IntPtrConstant(PropertiesCount(this->length())); | 2327 assembler->IntPtrConstant(PropertiesCount(this->length())); |
2406 Node* copy = GenerateFastPath(&assembler, &call_runtime, closure, | 2328 Node* copy = GenerateFastPath(assembler, &call_runtime, closure, |
2407 literals_index, properties_count); | 2329 literals_index, properties_count); |
2408 assembler.Return(copy); | 2330 assembler->Return(copy); |
2409 | 2331 |
2410 assembler.Bind(&call_runtime); | 2332 assembler->Bind(&call_runtime); |
2411 Node* constant_properties = assembler.Parameter(2); | 2333 Node* constant_properties = assembler->Parameter(2); |
2412 Node* flags = assembler.Parameter(3); | 2334 Node* flags = assembler->Parameter(3); |
2413 Node* context = assembler.Parameter(4); | 2335 Node* context = assembler->Parameter(4); |
2414 assembler.TailCallRuntime(Runtime::kCreateObjectLiteral, context, closure, | 2336 assembler->TailCallRuntime(Runtime::kCreateObjectLiteral, context, closure, |
2415 literals_index, constant_properties, flags); | 2337 literals_index, constant_properties, flags); |
2416 } | 2338 } |
2417 | 2339 |
2418 template<class StateType> | 2340 template<class StateType> |
2419 void HydrogenCodeStub::TraceTransition(StateType from, StateType to) { | 2341 void HydrogenCodeStub::TraceTransition(StateType from, StateType to) { |
2420 // Note: Although a no-op transition is semantically OK, it is hinting at a | 2342 // Note: Although a no-op transition is semantically OK, it is hinting at a |
2421 // bug somewhere in our state transition machinery. | 2343 // bug somewhere in our state transition machinery. |
2422 DCHECK(from != to); | 2344 DCHECK(from != to); |
2423 if (!FLAG_trace_ic) return; | 2345 if (!FLAG_trace_ic) return; |
2424 OFStream os(stdout); | 2346 OFStream os(stdout); |
2425 os << "["; | 2347 os << "["; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2498 descriptor->SetMissHandler(Runtime::kBinaryOpIC_Miss); | 2420 descriptor->SetMissHandler(Runtime::kBinaryOpIC_Miss); |
2499 } | 2421 } |
2500 | 2422 |
2501 | 2423 |
2502 void BinaryOpWithAllocationSiteStub::InitializeDescriptor( | 2424 void BinaryOpWithAllocationSiteStub::InitializeDescriptor( |
2503 CodeStubDescriptor* descriptor) { | 2425 CodeStubDescriptor* descriptor) { |
2504 descriptor->Initialize( | 2426 descriptor->Initialize( |
2505 FUNCTION_ADDR(Runtime_BinaryOpIC_MissWithAllocationSite)); | 2427 FUNCTION_ADDR(Runtime_BinaryOpIC_MissWithAllocationSite)); |
2506 } | 2428 } |
2507 | 2429 |
2508 void GetPropertyStub::GenerateAssembly( | 2430 void GetPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
2509 compiler::CodeAssemblerState* state) const { | |
2510 typedef compiler::Node Node; | 2431 typedef compiler::Node Node; |
2511 typedef CodeStubAssembler::Label Label; | 2432 typedef CodeStubAssembler::Label Label; |
2512 typedef CodeStubAssembler::Variable Variable; | 2433 typedef CodeStubAssembler::Variable Variable; |
2513 CodeStubAssembler assembler(state); | |
2514 | 2434 |
2515 Label call_runtime(&assembler, Label::kDeferred), | 2435 Label call_runtime(assembler, Label::kDeferred), return_undefined(assembler), |
2516 return_undefined(&assembler), end(&assembler); | 2436 end(assembler); |
2517 | 2437 |
2518 Node* object = assembler.Parameter(0); | 2438 Node* object = assembler->Parameter(0); |
2519 Node* key = assembler.Parameter(1); | 2439 Node* key = assembler->Parameter(1); |
2520 Node* context = assembler.Parameter(2); | 2440 Node* context = assembler->Parameter(2); |
2521 Variable var_result(&assembler, MachineRepresentation::kTagged); | 2441 Variable var_result(assembler, MachineRepresentation::kTagged); |
2522 | 2442 |
2523 CodeStubAssembler::LookupInHolder lookup_property_in_holder = | 2443 CodeStubAssembler::LookupInHolder lookup_property_in_holder = |
2524 [&assembler, context, &var_result, &end]( | 2444 [assembler, context, &var_result, &end]( |
2525 Node* receiver, Node* holder, Node* holder_map, | 2445 Node* receiver, Node* holder, Node* holder_map, |
2526 Node* holder_instance_type, Node* unique_name, Label* next_holder, | 2446 Node* holder_instance_type, Node* unique_name, Label* next_holder, |
2527 Label* if_bailout) { | 2447 Label* if_bailout) { |
2528 Variable var_value(&assembler, MachineRepresentation::kTagged); | 2448 Variable var_value(assembler, MachineRepresentation::kTagged); |
2529 Label if_found(&assembler); | 2449 Label if_found(assembler); |
2530 assembler.TryGetOwnProperty( | 2450 assembler->TryGetOwnProperty( |
2531 context, receiver, holder, holder_map, holder_instance_type, | 2451 context, receiver, holder, holder_map, holder_instance_type, |
2532 unique_name, &if_found, &var_value, next_holder, if_bailout); | 2452 unique_name, &if_found, &var_value, next_holder, if_bailout); |
2533 assembler.Bind(&if_found); | 2453 assembler->Bind(&if_found); |
2534 { | 2454 { |
2535 var_result.Bind(var_value.value()); | 2455 var_result.Bind(var_value.value()); |
2536 assembler.Goto(&end); | 2456 assembler->Goto(&end); |
2537 } | 2457 } |
2538 }; | 2458 }; |
2539 | 2459 |
2540 CodeStubAssembler::LookupInHolder lookup_element_in_holder = | 2460 CodeStubAssembler::LookupInHolder lookup_element_in_holder = |
2541 [&assembler, context, &var_result, &end]( | 2461 [assembler, context, &var_result, &end]( |
2542 Node* receiver, Node* holder, Node* holder_map, | 2462 Node* receiver, Node* holder, Node* holder_map, |
2543 Node* holder_instance_type, Node* index, Label* next_holder, | 2463 Node* holder_instance_type, Node* index, Label* next_holder, |
2544 Label* if_bailout) { | 2464 Label* if_bailout) { |
2545 // Not supported yet. | 2465 // Not supported yet. |
2546 assembler.Use(next_holder); | 2466 assembler->Use(next_holder); |
2547 assembler.Goto(if_bailout); | 2467 assembler->Goto(if_bailout); |
2548 }; | 2468 }; |
2549 | 2469 |
2550 assembler.TryPrototypeChainLookup(object, key, lookup_property_in_holder, | 2470 assembler->TryPrototypeChainLookup(object, key, lookup_property_in_holder, |
2551 lookup_element_in_holder, &return_undefined, | 2471 lookup_element_in_holder, |
2552 &call_runtime); | 2472 &return_undefined, &call_runtime); |
2553 | 2473 |
2554 assembler.Bind(&return_undefined); | 2474 assembler->Bind(&return_undefined); |
2555 { | 2475 { |
2556 var_result.Bind(assembler.UndefinedConstant()); | 2476 var_result.Bind(assembler->UndefinedConstant()); |
2557 assembler.Goto(&end); | 2477 assembler->Goto(&end); |
2558 } | 2478 } |
2559 | 2479 |
2560 assembler.Bind(&call_runtime); | 2480 assembler->Bind(&call_runtime); |
2561 { | 2481 { |
2562 var_result.Bind( | 2482 var_result.Bind( |
2563 assembler.CallRuntime(Runtime::kGetProperty, context, object, key)); | 2483 assembler->CallRuntime(Runtime::kGetProperty, context, object, key)); |
2564 assembler.Goto(&end); | 2484 assembler->Goto(&end); |
2565 } | 2485 } |
2566 | 2486 |
2567 assembler.Bind(&end); | 2487 assembler->Bind(&end); |
2568 assembler.Return(var_result.value()); | 2488 assembler->Return(var_result.value()); |
2569 } | 2489 } |
2570 | 2490 |
2571 // static | 2491 // static |
2572 compiler::Node* FastNewClosureStub::Generate(CodeStubAssembler* assembler, | 2492 compiler::Node* FastNewClosureStub::Generate(CodeStubAssembler* assembler, |
2573 compiler::Node* shared_info, | 2493 compiler::Node* shared_info, |
2574 compiler::Node* context) { | 2494 compiler::Node* context) { |
2575 typedef compiler::Node Node; | 2495 typedef compiler::Node Node; |
2576 typedef compiler::CodeAssembler::Label Label; | 2496 typedef compiler::CodeAssembler::Label Label; |
2577 typedef compiler::CodeAssembler::Variable Variable; | 2497 typedef compiler::CodeAssembler::Variable Variable; |
2578 | 2498 |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2712 assembler->IntPtrConstant(Code::kHeaderSize - kHeapObjectTag)); | 2632 assembler->IntPtrConstant(Code::kHeaderSize - kHeapObjectTag)); |
2713 assembler->StoreObjectFieldNoWriteBarrier( | 2633 assembler->StoreObjectFieldNoWriteBarrier( |
2714 result, JSFunction::kCodeEntryOffset, lazy_builtin_entry); | 2634 result, JSFunction::kCodeEntryOffset, lazy_builtin_entry); |
2715 assembler->StoreObjectFieldNoWriteBarrier(result, | 2635 assembler->StoreObjectFieldNoWriteBarrier(result, |
2716 JSFunction::kNextFunctionLinkOffset, | 2636 JSFunction::kNextFunctionLinkOffset, |
2717 assembler->UndefinedConstant()); | 2637 assembler->UndefinedConstant()); |
2718 | 2638 |
2719 return result; | 2639 return result; |
2720 } | 2640 } |
2721 | 2641 |
2722 void FastNewClosureStub::GenerateAssembly( | 2642 void FastNewClosureStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
2723 compiler::CodeAssemblerState* state) const { | 2643 assembler->Return( |
2724 CodeStubAssembler assembler(state); | 2644 Generate(assembler, assembler->Parameter(0), assembler->Parameter(1))); |
2725 assembler.Return( | |
2726 Generate(&assembler, assembler.Parameter(0), assembler.Parameter(1))); | |
2727 } | 2645 } |
2728 | 2646 |
2729 // static | 2647 // static |
2730 compiler::Node* FastNewFunctionContextStub::Generate( | 2648 compiler::Node* FastNewFunctionContextStub::Generate( |
2731 CodeStubAssembler* assembler, compiler::Node* function, | 2649 CodeStubAssembler* assembler, compiler::Node* function, |
2732 compiler::Node* slots, compiler::Node* context) { | 2650 compiler::Node* slots, compiler::Node* context) { |
2733 typedef compiler::Node Node; | 2651 typedef compiler::Node Node; |
2734 | 2652 |
2735 Node* min_context_slots = | 2653 Node* min_context_slots = |
2736 assembler->Int32Constant(Context::MIN_CONTEXT_SLOTS); | 2654 assembler->Int32Constant(Context::MIN_CONTEXT_SLOTS); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2773 function_context, FAST_ELEMENTS, min_context_slots, length, | 2691 function_context, FAST_ELEMENTS, min_context_slots, length, |
2774 [undefined](CodeStubAssembler* assembler, Node* context, Node* offset) { | 2692 [undefined](CodeStubAssembler* assembler, Node* context, Node* offset) { |
2775 assembler->StoreNoWriteBarrier(MachineType::PointerRepresentation(), | 2693 assembler->StoreNoWriteBarrier(MachineType::PointerRepresentation(), |
2776 context, offset, undefined); | 2694 context, offset, undefined); |
2777 }); | 2695 }); |
2778 | 2696 |
2779 return function_context; | 2697 return function_context; |
2780 } | 2698 } |
2781 | 2699 |
2782 void FastNewFunctionContextStub::GenerateAssembly( | 2700 void FastNewFunctionContextStub::GenerateAssembly( |
2783 compiler::CodeAssemblerState* state) const { | 2701 CodeStubAssembler* assembler) const { |
2784 typedef compiler::Node Node; | 2702 typedef compiler::Node Node; |
2785 CodeStubAssembler assembler(state); | 2703 Node* function = assembler->Parameter(Descriptor::kFunction); |
2786 Node* function = assembler.Parameter(Descriptor::kFunction); | 2704 Node* slots = assembler->Parameter(FastNewFunctionContextDescriptor::kSlots); |
2787 Node* slots = assembler.Parameter(FastNewFunctionContextDescriptor::kSlots); | 2705 Node* context = assembler->Parameter(Descriptor::kContext); |
2788 Node* context = assembler.Parameter(Descriptor::kContext); | |
2789 | 2706 |
2790 assembler.Return(Generate(&assembler, function, slots, context)); | 2707 assembler->Return(Generate(assembler, function, slots, context)); |
2791 } | 2708 } |
2792 | 2709 |
2793 // static | 2710 // static |
2794 compiler::Node* FastCloneRegExpStub::Generate(CodeStubAssembler* assembler, | 2711 compiler::Node* FastCloneRegExpStub::Generate(CodeStubAssembler* assembler, |
2795 compiler::Node* closure, | 2712 compiler::Node* closure, |
2796 compiler::Node* literal_index, | 2713 compiler::Node* literal_index, |
2797 compiler::Node* pattern, | 2714 compiler::Node* pattern, |
2798 compiler::Node* flags, | 2715 compiler::Node* flags, |
2799 compiler::Node* context) { | 2716 compiler::Node* context) { |
2800 typedef CodeStubAssembler::Label Label; | 2717 typedef CodeStubAssembler::Label Label; |
(...skipping 27 matching lines...) Expand all Loading... |
2828 { | 2745 { |
2829 result.Bind(assembler->CallRuntime(Runtime::kCreateRegExpLiteral, context, | 2746 result.Bind(assembler->CallRuntime(Runtime::kCreateRegExpLiteral, context, |
2830 closure, literal_index, pattern, flags)); | 2747 closure, literal_index, pattern, flags)); |
2831 assembler->Goto(&end); | 2748 assembler->Goto(&end); |
2832 } | 2749 } |
2833 | 2750 |
2834 assembler->Bind(&end); | 2751 assembler->Bind(&end); |
2835 return result.value(); | 2752 return result.value(); |
2836 } | 2753 } |
2837 | 2754 |
2838 void FastCloneRegExpStub::GenerateAssembly( | 2755 void FastCloneRegExpStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
2839 compiler::CodeAssemblerState* state) const { | |
2840 typedef compiler::Node Node; | 2756 typedef compiler::Node Node; |
2841 CodeStubAssembler assembler(state); | 2757 Node* closure = assembler->Parameter(Descriptor::kClosure); |
2842 Node* closure = assembler.Parameter(Descriptor::kClosure); | 2758 Node* literal_index = assembler->Parameter(Descriptor::kLiteralIndex); |
2843 Node* literal_index = assembler.Parameter(Descriptor::kLiteralIndex); | 2759 Node* pattern = assembler->Parameter(Descriptor::kPattern); |
2844 Node* pattern = assembler.Parameter(Descriptor::kPattern); | 2760 Node* flags = assembler->Parameter(Descriptor::kFlags); |
2845 Node* flags = assembler.Parameter(Descriptor::kFlags); | 2761 Node* context = assembler->Parameter(Descriptor::kContext); |
2846 Node* context = assembler.Parameter(Descriptor::kContext); | |
2847 | 2762 |
2848 assembler.Return( | 2763 assembler->Return( |
2849 Generate(&assembler, closure, literal_index, pattern, flags, context)); | 2764 Generate(assembler, closure, literal_index, pattern, flags, context)); |
2850 } | 2765 } |
2851 | 2766 |
2852 namespace { | 2767 namespace { |
2853 | 2768 |
2854 compiler::Node* NonEmptyShallowClone(CodeStubAssembler* assembler, | 2769 compiler::Node* NonEmptyShallowClone(CodeStubAssembler* assembler, |
2855 compiler::Node* boilerplate, | 2770 compiler::Node* boilerplate, |
2856 compiler::Node* boilerplate_map, | 2771 compiler::Node* boilerplate_map, |
2857 compiler::Node* boilerplate_elements, | 2772 compiler::Node* boilerplate_elements, |
2858 compiler::Node* allocation_site, | 2773 compiler::Node* allocation_site, |
2859 compiler::Node* capacity, | 2774 compiler::Node* capacity, |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3004 elements.value()); | 2919 elements.value()); |
3005 result.Bind(array); | 2920 result.Bind(array); |
3006 assembler->Goto(&return_result); | 2921 assembler->Goto(&return_result); |
3007 } | 2922 } |
3008 | 2923 |
3009 assembler->Bind(&return_result); | 2924 assembler->Bind(&return_result); |
3010 return result.value(); | 2925 return result.value(); |
3011 } | 2926 } |
3012 | 2927 |
3013 void FastCloneShallowArrayStub::GenerateAssembly( | 2928 void FastCloneShallowArrayStub::GenerateAssembly( |
3014 compiler::CodeAssemblerState* state) const { | 2929 CodeStubAssembler* assembler) const { |
3015 typedef compiler::Node Node; | 2930 typedef compiler::Node Node; |
3016 typedef CodeStubAssembler::Label Label; | 2931 typedef CodeStubAssembler::Label Label; |
3017 CodeStubAssembler assembler(state); | 2932 Node* closure = assembler->Parameter(Descriptor::kClosure); |
| 2933 Node* literal_index = assembler->Parameter(Descriptor::kLiteralIndex); |
| 2934 Node* constant_elements = assembler->Parameter(Descriptor::kConstantElements); |
| 2935 Node* context = assembler->Parameter(Descriptor::kContext); |
| 2936 Label call_runtime(assembler, Label::kDeferred); |
| 2937 assembler->Return(Generate(assembler, closure, literal_index, context, |
| 2938 &call_runtime, allocation_site_mode())); |
3018 | 2939 |
3019 Node* closure = assembler.Parameter(Descriptor::kClosure); | 2940 assembler->Bind(&call_runtime); |
3020 Node* literal_index = assembler.Parameter(Descriptor::kLiteralIndex); | |
3021 Node* constant_elements = assembler.Parameter(Descriptor::kConstantElements); | |
3022 Node* context = assembler.Parameter(Descriptor::kContext); | |
3023 Label call_runtime(&assembler, Label::kDeferred); | |
3024 assembler.Return(Generate(&assembler, closure, literal_index, context, | |
3025 &call_runtime, allocation_site_mode())); | |
3026 | |
3027 assembler.Bind(&call_runtime); | |
3028 { | 2941 { |
3029 assembler.Comment("call runtime"); | 2942 assembler->Comment("call runtime"); |
3030 Node* flags = assembler.SmiConstant( | 2943 Node* flags = assembler->SmiConstant( |
3031 Smi::FromInt(ArrayLiteral::kShallowElements | | 2944 Smi::FromInt(ArrayLiteral::kShallowElements | |
3032 (allocation_site_mode() == TRACK_ALLOCATION_SITE | 2945 (allocation_site_mode() == TRACK_ALLOCATION_SITE |
3033 ? 0 | 2946 ? 0 |
3034 : ArrayLiteral::kDisableMementos))); | 2947 : ArrayLiteral::kDisableMementos))); |
3035 assembler.Return(assembler.CallRuntime(Runtime::kCreateArrayLiteral, | 2948 assembler->Return(assembler->CallRuntime(Runtime::kCreateArrayLiteral, |
3036 context, closure, literal_index, | 2949 context, closure, literal_index, |
3037 constant_elements, flags)); | 2950 constant_elements, flags)); |
3038 } | 2951 } |
3039 } | 2952 } |
3040 | 2953 |
3041 void CreateAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) { | 2954 void CreateAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) { |
3042 CreateAllocationSiteStub stub(isolate); | 2955 CreateAllocationSiteStub stub(isolate); |
3043 stub.GetCode(); | 2956 stub.GetCode(); |
3044 } | 2957 } |
3045 | 2958 |
3046 | 2959 |
3047 void CreateWeakCellStub::GenerateAheadOfTime(Isolate* isolate) { | 2960 void CreateWeakCellStub::GenerateAheadOfTime(Isolate* isolate) { |
3048 CreateWeakCellStub stub(isolate); | 2961 CreateWeakCellStub stub(isolate); |
3049 stub.GetCode(); | 2962 stub.GetCode(); |
3050 } | 2963 } |
3051 | 2964 |
3052 | 2965 |
3053 void StoreElementStub::Generate(MacroAssembler* masm) { | 2966 void StoreElementStub::Generate(MacroAssembler* masm) { |
3054 DCHECK_EQ(DICTIONARY_ELEMENTS, elements_kind()); | 2967 DCHECK_EQ(DICTIONARY_ELEMENTS, elements_kind()); |
3055 KeyedStoreIC::GenerateSlow(masm); | 2968 KeyedStoreIC::GenerateSlow(masm); |
3056 } | 2969 } |
3057 | 2970 |
3058 void StoreFastElementStub::GenerateAssembly( | 2971 void StoreFastElementStub::GenerateAssembly( |
3059 compiler::CodeAssemblerState* state) const { | 2972 CodeStubAssembler* assembler) const { |
3060 typedef CodeStubAssembler::Label Label; | 2973 typedef CodeStubAssembler::Label Label; |
3061 typedef compiler::Node Node; | 2974 typedef compiler::Node Node; |
3062 CodeStubAssembler assembler(state); | |
3063 | 2975 |
3064 assembler.Comment( | 2976 assembler->Comment( |
3065 "StoreFastElementStub: js_array=%d, elements_kind=%s, store_mode=%d", | 2977 "StoreFastElementStub: js_array=%d, elements_kind=%s, store_mode=%d", |
3066 is_js_array(), ElementsKindToString(elements_kind()), store_mode()); | 2978 is_js_array(), ElementsKindToString(elements_kind()), store_mode()); |
3067 | 2979 |
3068 Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 2980 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
3069 Node* key = assembler.Parameter(Descriptor::kName); | 2981 Node* key = assembler->Parameter(Descriptor::kName); |
3070 Node* value = assembler.Parameter(Descriptor::kValue); | 2982 Node* value = assembler->Parameter(Descriptor::kValue); |
3071 Node* slot = assembler.Parameter(Descriptor::kSlot); | 2983 Node* slot = assembler->Parameter(Descriptor::kSlot); |
3072 Node* vector = assembler.Parameter(Descriptor::kVector); | 2984 Node* vector = assembler->Parameter(Descriptor::kVector); |
3073 Node* context = assembler.Parameter(Descriptor::kContext); | 2985 Node* context = assembler->Parameter(Descriptor::kContext); |
3074 | 2986 |
3075 Label miss(&assembler); | 2987 Label miss(assembler); |
3076 | 2988 |
3077 assembler.EmitElementStore(receiver, key, value, is_js_array(), | 2989 assembler->EmitElementStore(receiver, key, value, is_js_array(), |
3078 elements_kind(), store_mode(), &miss); | 2990 elements_kind(), store_mode(), &miss); |
3079 assembler.Return(value); | 2991 assembler->Return(value); |
3080 | 2992 |
3081 assembler.Bind(&miss); | 2993 assembler->Bind(&miss); |
3082 { | 2994 { |
3083 assembler.Comment("Miss"); | 2995 assembler->Comment("Miss"); |
3084 assembler.TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, value, slot, | 2996 assembler->TailCallRuntime(Runtime::kKeyedStoreIC_Miss, context, value, |
3085 vector, receiver, key); | 2997 slot, vector, receiver, key); |
3086 } | 2998 } |
3087 } | 2999 } |
3088 | 3000 |
3089 // static | 3001 // static |
3090 void StoreFastElementStub::GenerateAheadOfTime(Isolate* isolate) { | 3002 void StoreFastElementStub::GenerateAheadOfTime(Isolate* isolate) { |
3091 if (FLAG_minimal) return; | 3003 if (FLAG_minimal) return; |
3092 StoreFastElementStub(isolate, false, FAST_HOLEY_ELEMENTS, STANDARD_STORE) | 3004 StoreFastElementStub(isolate, false, FAST_HOLEY_ELEMENTS, STANDARD_STORE) |
3093 .GetCode(); | 3005 .GetCode(); |
3094 StoreFastElementStub(isolate, false, FAST_HOLEY_ELEMENTS, | 3006 StoreFastElementStub(isolate, false, FAST_HOLEY_ELEMENTS, |
3095 STORE_AND_GROW_NO_TRANSITION).GetCode(); | 3007 STORE_AND_GROW_NO_TRANSITION).GetCode(); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3159 | 3071 |
3160 void ProfileEntryHookStub::EntryHookTrampoline(intptr_t function, | 3072 void ProfileEntryHookStub::EntryHookTrampoline(intptr_t function, |
3161 intptr_t stack_pointer, | 3073 intptr_t stack_pointer, |
3162 Isolate* isolate) { | 3074 Isolate* isolate) { |
3163 FunctionEntryHook entry_hook = isolate->function_entry_hook(); | 3075 FunctionEntryHook entry_hook = isolate->function_entry_hook(); |
3164 DCHECK(entry_hook != NULL); | 3076 DCHECK(entry_hook != NULL); |
3165 entry_hook(function, stack_pointer); | 3077 entry_hook(function, stack_pointer); |
3166 } | 3078 } |
3167 | 3079 |
3168 void CreateAllocationSiteStub::GenerateAssembly( | 3080 void CreateAllocationSiteStub::GenerateAssembly( |
3169 compiler::CodeAssemblerState* state) const { | 3081 CodeStubAssembler* assembler) const { |
3170 CodeStubAssembler assembler(state); | 3082 assembler->Return(assembler->CreateAllocationSiteInFeedbackVector( |
3171 assembler.Return(assembler.CreateAllocationSiteInFeedbackVector( | 3083 assembler->Parameter(Descriptor::kVector), |
3172 assembler.Parameter(Descriptor::kVector), | 3084 assembler->Parameter(Descriptor::kSlot))); |
3173 assembler.Parameter(Descriptor::kSlot))); | |
3174 } | 3085 } |
3175 | 3086 |
3176 void CreateWeakCellStub::GenerateAssembly( | 3087 void CreateWeakCellStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
3177 compiler::CodeAssemblerState* state) const { | 3088 assembler->Return(assembler->CreateWeakCellInFeedbackVector( |
3178 CodeStubAssembler assembler(state); | 3089 assembler->Parameter(Descriptor::kVector), |
3179 assembler.Return(assembler.CreateWeakCellInFeedbackVector( | 3090 assembler->Parameter(Descriptor::kSlot), |
3180 assembler.Parameter(Descriptor::kVector), | 3091 assembler->Parameter(Descriptor::kValue))); |
3181 assembler.Parameter(Descriptor::kSlot), | |
3182 assembler.Parameter(Descriptor::kValue))); | |
3183 } | 3092 } |
3184 | 3093 |
3185 void ArrayNoArgumentConstructorStub::GenerateAssembly( | 3094 void ArrayNoArgumentConstructorStub::GenerateAssembly( |
3186 compiler::CodeAssemblerState* state) const { | 3095 CodeStubAssembler* assembler) const { |
3187 typedef compiler::Node Node; | 3096 typedef compiler::Node Node; |
3188 CodeStubAssembler assembler(state); | 3097 Node* native_context = assembler->LoadObjectField( |
3189 Node* native_context = assembler.LoadObjectField( | 3098 assembler->Parameter(Descriptor::kFunction), JSFunction::kContextOffset); |
3190 assembler.Parameter(Descriptor::kFunction), JSFunction::kContextOffset); | |
3191 bool track_allocation_site = | 3099 bool track_allocation_site = |
3192 AllocationSite::GetMode(elements_kind()) == TRACK_ALLOCATION_SITE && | 3100 AllocationSite::GetMode(elements_kind()) == TRACK_ALLOCATION_SITE && |
3193 override_mode() != DISABLE_ALLOCATION_SITES; | 3101 override_mode() != DISABLE_ALLOCATION_SITES; |
3194 Node* allocation_site = track_allocation_site | 3102 Node* allocation_site = |
3195 ? assembler.Parameter(Descriptor::kAllocationSite) | 3103 track_allocation_site ? assembler->Parameter(Descriptor::kAllocationSite) |
3196 : nullptr; | 3104 : nullptr; |
3197 Node* array_map = | 3105 Node* array_map = |
3198 assembler.LoadJSArrayElementsMap(elements_kind(), native_context); | 3106 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); |
3199 Node* array = assembler.AllocateJSArray( | 3107 Node* array = assembler->AllocateJSArray( |
3200 elements_kind(), array_map, | 3108 elements_kind(), array_map, |
3201 assembler.IntPtrConstant(JSArray::kPreallocatedArrayElements), | 3109 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), |
3202 assembler.SmiConstant(Smi::kZero), allocation_site); | 3110 assembler->SmiConstant(Smi::kZero), allocation_site); |
3203 assembler.Return(array); | 3111 assembler->Return(array); |
3204 } | 3112 } |
3205 | 3113 |
3206 void InternalArrayNoArgumentConstructorStub::GenerateAssembly( | 3114 void InternalArrayNoArgumentConstructorStub::GenerateAssembly( |
3207 compiler::CodeAssemblerState* state) const { | 3115 CodeStubAssembler* assembler) const { |
3208 typedef compiler::Node Node; | 3116 typedef compiler::Node Node; |
3209 CodeStubAssembler assembler(state); | |
3210 Node* array_map = | 3117 Node* array_map = |
3211 assembler.LoadObjectField(assembler.Parameter(Descriptor::kFunction), | 3118 assembler->LoadObjectField(assembler->Parameter(Descriptor::kFunction), |
3212 JSFunction::kPrototypeOrInitialMapOffset); | 3119 JSFunction::kPrototypeOrInitialMapOffset); |
3213 Node* array = assembler.AllocateJSArray( | 3120 Node* array = assembler->AllocateJSArray( |
3214 elements_kind(), array_map, | 3121 elements_kind(), array_map, |
3215 assembler.IntPtrConstant(JSArray::kPreallocatedArrayElements), | 3122 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), |
3216 assembler.SmiConstant(Smi::kZero), nullptr); | 3123 assembler->SmiConstant(Smi::kZero), nullptr); |
3217 assembler.Return(array); | 3124 assembler->Return(array); |
3218 } | 3125 } |
3219 | 3126 |
3220 namespace { | 3127 namespace { |
3221 | 3128 |
3222 template <typename Descriptor> | 3129 template <typename Descriptor> |
3223 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, | 3130 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, |
3224 ElementsKind elements_kind, | 3131 ElementsKind elements_kind, |
3225 compiler::Node* array_map, | 3132 compiler::Node* array_map, |
3226 compiler::Node* allocation_site, | 3133 compiler::Node* allocation_site, |
3227 AllocationSiteMode mode) { | 3134 AllocationSiteMode mode) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3277 Node* function = assembler->Parameter(Descriptor::kFunction); | 3184 Node* function = assembler->Parameter(Descriptor::kFunction); |
3278 Node* array_size = assembler->Parameter(Descriptor::kArraySizeSmiParameter); | 3185 Node* array_size = assembler->Parameter(Descriptor::kArraySizeSmiParameter); |
3279 Node* allocation_site = assembler->Parameter(Descriptor::kAllocationSite); | 3186 Node* allocation_site = assembler->Parameter(Descriptor::kAllocationSite); |
3280 assembler->TailCallRuntime(Runtime::kNewArray, context, function, | 3187 assembler->TailCallRuntime(Runtime::kNewArray, context, function, |
3281 array_size, function, allocation_site); | 3188 array_size, function, allocation_site); |
3282 } | 3189 } |
3283 } | 3190 } |
3284 } // namespace | 3191 } // namespace |
3285 | 3192 |
3286 void ArraySingleArgumentConstructorStub::GenerateAssembly( | 3193 void ArraySingleArgumentConstructorStub::GenerateAssembly( |
3287 compiler::CodeAssemblerState* state) const { | 3194 CodeStubAssembler* assembler) const { |
3288 typedef compiler::Node Node; | 3195 typedef compiler::Node Node; |
3289 CodeStubAssembler assembler(state); | 3196 Node* function = assembler->Parameter(Descriptor::kFunction); |
3290 Node* function = assembler.Parameter(Descriptor::kFunction); | |
3291 Node* native_context = | 3197 Node* native_context = |
3292 assembler.LoadObjectField(function, JSFunction::kContextOffset); | 3198 assembler->LoadObjectField(function, JSFunction::kContextOffset); |
3293 Node* array_map = | 3199 Node* array_map = |
3294 assembler.LoadJSArrayElementsMap(elements_kind(), native_context); | 3200 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); |
3295 AllocationSiteMode mode = override_mode() == DISABLE_ALLOCATION_SITES | 3201 AllocationSiteMode mode = override_mode() == DISABLE_ALLOCATION_SITES |
3296 ? DONT_TRACK_ALLOCATION_SITE | 3202 ? DONT_TRACK_ALLOCATION_SITE |
3297 : AllocationSite::GetMode(elements_kind()); | 3203 : AllocationSite::GetMode(elements_kind()); |
3298 Node* allocation_site = assembler.Parameter(Descriptor::kAllocationSite); | 3204 Node* allocation_site = assembler->Parameter(Descriptor::kAllocationSite); |
3299 SingleArgumentConstructorCommon<Descriptor>(&assembler, elements_kind(), | 3205 SingleArgumentConstructorCommon<Descriptor>(assembler, elements_kind(), |
3300 array_map, allocation_site, mode); | 3206 array_map, allocation_site, mode); |
3301 } | 3207 } |
3302 | 3208 |
3303 void InternalArraySingleArgumentConstructorStub::GenerateAssembly( | 3209 void InternalArraySingleArgumentConstructorStub::GenerateAssembly( |
3304 compiler::CodeAssemblerState* state) const { | 3210 CodeStubAssembler* assembler) const { |
3305 typedef compiler::Node Node; | 3211 typedef compiler::Node Node; |
3306 CodeStubAssembler assembler(state); | 3212 Node* function = assembler->Parameter(Descriptor::kFunction); |
3307 Node* function = assembler.Parameter(Descriptor::kFunction); | 3213 Node* array_map = assembler->LoadObjectField( |
3308 Node* array_map = assembler.LoadObjectField( | |
3309 function, JSFunction::kPrototypeOrInitialMapOffset); | 3214 function, JSFunction::kPrototypeOrInitialMapOffset); |
3310 SingleArgumentConstructorCommon<Descriptor>( | 3215 SingleArgumentConstructorCommon<Descriptor>( |
3311 &assembler, elements_kind(), array_map, assembler.UndefinedConstant(), | 3216 assembler, elements_kind(), array_map, assembler->UndefinedConstant(), |
3312 DONT_TRACK_ALLOCATION_SITE); | 3217 DONT_TRACK_ALLOCATION_SITE); |
3313 } | 3218 } |
3314 | 3219 |
3315 void GrowArrayElementsStub::GenerateAssembly( | 3220 void GrowArrayElementsStub::GenerateAssembly( |
3316 compiler::CodeAssemblerState* state) const { | 3221 CodeStubAssembler* assembler) const { |
3317 typedef compiler::Node Node; | 3222 typedef compiler::Node Node; |
3318 CodeStubAssembler assembler(state); | 3223 CodeStubAssembler::Label runtime(assembler, |
3319 CodeStubAssembler::Label runtime(&assembler, | |
3320 CodeStubAssembler::Label::kDeferred); | 3224 CodeStubAssembler::Label::kDeferred); |
3321 | 3225 |
3322 Node* object = assembler.Parameter(Descriptor::kObject); | 3226 Node* object = assembler->Parameter(Descriptor::kObject); |
3323 Node* key = assembler.Parameter(Descriptor::kKey); | 3227 Node* key = assembler->Parameter(Descriptor::kKey); |
3324 Node* context = assembler.Parameter(Descriptor::kContext); | 3228 Node* context = assembler->Parameter(Descriptor::kContext); |
3325 ElementsKind kind = elements_kind(); | 3229 ElementsKind kind = elements_kind(); |
3326 | 3230 |
3327 Node* elements = assembler.LoadElements(object); | 3231 Node* elements = assembler->LoadElements(object); |
3328 Node* new_elements = | 3232 Node* new_elements = |
3329 assembler.TryGrowElementsCapacity(object, elements, kind, key, &runtime); | 3233 assembler->TryGrowElementsCapacity(object, elements, kind, key, &runtime); |
3330 assembler.Return(new_elements); | 3234 assembler->Return(new_elements); |
3331 | 3235 |
3332 assembler.Bind(&runtime); | 3236 assembler->Bind(&runtime); |
3333 // TODO(danno): Make this a tail call when the stub is only used from TurboFan | 3237 // TODO(danno): Make this a tail call when the stub is only used from TurboFan |
3334 // code. This musn't be a tail call for now, since the caller site in lithium | 3238 // code. This musn't be a tail call for now, since the caller site in lithium |
3335 // creates a safepoint. This safepoint musn't have a different number of | 3239 // creates a safepoint. This safepoint musn't have a different number of |
3336 // arguments on the stack in the case that a GC happens from the slow-case | 3240 // arguments on the stack in the case that a GC happens from the slow-case |
3337 // allocation path (zero, since all the stubs inputs are in registers) and | 3241 // allocation path (zero, since all the stubs inputs are in registers) and |
3338 // when the call happens (it would be two in the tail call case due to the | 3242 // when the call happens (it would be two in the tail call case due to the |
3339 // tail call pushing the arguments on the stack for the runtime call). By not | 3243 // tail call pushing the arguments on the stack for the runtime call). By not |
3340 // tail-calling, the runtime call case also has zero arguments on the stack | 3244 // tail-calling, the runtime call case also has zero arguments on the stack |
3341 // for the stub frame. | 3245 // for the stub frame. |
3342 assembler.Return( | 3246 assembler->Return(assembler->CallRuntime(Runtime::kGrowArrayElements, context, |
3343 assembler.CallRuntime(Runtime::kGrowArrayElements, context, object, key)); | 3247 object, key)); |
3344 } | 3248 } |
3345 | 3249 |
3346 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 3250 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) |
3347 : PlatformCodeStub(isolate) {} | 3251 : PlatformCodeStub(isolate) {} |
3348 | 3252 |
3349 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) | 3253 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) |
3350 : PlatformCodeStub(isolate) {} | 3254 : PlatformCodeStub(isolate) {} |
3351 | 3255 |
3352 } // namespace internal | 3256 } // namespace internal |
3353 } // namespace v8 | 3257 } // namespace v8 |
OLD | NEW |