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