| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
| 8 | 8 |
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 | 326 |
| 327 __ Add(backing_store, backing_store, | 327 __ Add(backing_store, backing_store, |
| 328 FixedArray::kHeaderSize - kHeapObjectTag); | 328 FixedArray::kHeaderSize - kHeapObjectTag); |
| 329 __ SmiUntag(scratch, key); | 329 __ SmiUntag(scratch, key); |
| 330 return MemOperand(backing_store, scratch, LSL, kPointerSizeLog2); | 330 return MemOperand(backing_store, scratch, LSL, kPointerSizeLog2); |
| 331 } | 331 } |
| 332 | 332 |
| 333 | 333 |
| 334 void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { | 334 void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { |
| 335 // The return address is in lr. | 335 // The return address is in lr. |
| 336 Register receiver = LoadConvention::ReceiverRegister(); | 336 Register receiver = LoadDescriptor::ReceiverRegister(); |
| 337 Register name = LoadConvention::NameRegister(); | 337 Register name = LoadDescriptor::NameRegister(); |
| 338 DCHECK(receiver.is(x1)); | 338 DCHECK(receiver.is(x1)); |
| 339 DCHECK(name.is(x2)); | 339 DCHECK(name.is(x2)); |
| 340 | 340 |
| 341 // Probe the stub cache. | 341 // Probe the stub cache. |
| 342 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 342 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( |
| 343 Code::ComputeHandlerFlags(Code::LOAD_IC)); | 343 Code::ComputeHandlerFlags(Code::LOAD_IC)); |
| 344 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, x3, | 344 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, x3, |
| 345 x4, x5, x6); | 345 x4, x5, x6); |
| 346 | 346 |
| 347 // Cache miss: Jump to runtime. | 347 // Cache miss: Jump to runtime. |
| 348 GenerateMiss(masm); | 348 GenerateMiss(masm); |
| 349 } | 349 } |
| 350 | 350 |
| 351 | 351 |
| 352 void LoadIC::GenerateNormal(MacroAssembler* masm) { | 352 void LoadIC::GenerateNormal(MacroAssembler* masm) { |
| 353 Register dictionary = x0; | 353 Register dictionary = x0; |
| 354 DCHECK(!dictionary.is(LoadConvention::ReceiverRegister())); | 354 DCHECK(!dictionary.is(LoadDescriptor::ReceiverRegister())); |
| 355 DCHECK(!dictionary.is(LoadConvention::NameRegister())); | 355 DCHECK(!dictionary.is(LoadDescriptor::NameRegister())); |
| 356 Label slow; | 356 Label slow; |
| 357 | 357 |
| 358 __ Ldr(dictionary, FieldMemOperand(LoadConvention::ReceiverRegister(), | 358 __ Ldr(dictionary, FieldMemOperand(LoadDescriptor::ReceiverRegister(), |
| 359 JSObject::kPropertiesOffset)); | 359 JSObject::kPropertiesOffset)); |
| 360 GenerateDictionaryLoad(masm, &slow, dictionary, | 360 GenerateDictionaryLoad(masm, &slow, dictionary, |
| 361 LoadConvention::NameRegister(), x0, x3, x4); | 361 LoadDescriptor::NameRegister(), x0, x3, x4); |
| 362 __ Ret(); | 362 __ Ret(); |
| 363 | 363 |
| 364 // Dictionary load failed, go slow (but don't miss). | 364 // Dictionary load failed, go slow (but don't miss). |
| 365 __ Bind(&slow); | 365 __ Bind(&slow); |
| 366 GenerateRuntimeGetProperty(masm); | 366 GenerateRuntimeGetProperty(masm); |
| 367 } | 367 } |
| 368 | 368 |
| 369 | 369 |
| 370 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 370 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
| 371 // The return address is in lr. | 371 // The return address is in lr. |
| 372 Isolate* isolate = masm->isolate(); | 372 Isolate* isolate = masm->isolate(); |
| 373 ASM_LOCATION("LoadIC::GenerateMiss"); | 373 ASM_LOCATION("LoadIC::GenerateMiss"); |
| 374 | 374 |
| 375 __ IncrementCounter(isolate->counters()->load_miss(), 1, x3, x4); | 375 __ IncrementCounter(isolate->counters()->load_miss(), 1, x3, x4); |
| 376 | 376 |
| 377 // Perform tail call to the entry. | 377 // Perform tail call to the entry. |
| 378 __ Push(LoadConvention::ReceiverRegister(), LoadConvention::NameRegister()); | 378 __ Push(LoadDescriptor::ReceiverRegister(), LoadDescriptor::NameRegister()); |
| 379 ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss), isolate); | 379 ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss), isolate); |
| 380 __ TailCallExternalReference(ref, 2, 1); | 380 __ TailCallExternalReference(ref, 2, 1); |
| 381 } | 381 } |
| 382 | 382 |
| 383 | 383 |
| 384 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 384 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
| 385 // The return address is in lr. | 385 // The return address is in lr. |
| 386 __ Push(LoadConvention::ReceiverRegister(), LoadConvention::NameRegister()); | 386 __ Push(LoadDescriptor::ReceiverRegister(), LoadDescriptor::NameRegister()); |
| 387 __ TailCallRuntime(Runtime::kGetProperty, 2, 1); | 387 __ TailCallRuntime(Runtime::kGetProperty, 2, 1); |
| 388 } | 388 } |
| 389 | 389 |
| 390 | 390 |
| 391 void KeyedLoadIC::GenerateSloppyArguments(MacroAssembler* masm) { | 391 void KeyedLoadIC::GenerateSloppyArguments(MacroAssembler* masm) { |
| 392 // The return address is in lr. | 392 // The return address is in lr. |
| 393 Register result = x0; | 393 Register result = x0; |
| 394 Register receiver = LoadConvention::ReceiverRegister(); | 394 Register receiver = LoadDescriptor::ReceiverRegister(); |
| 395 Register key = LoadConvention::NameRegister(); | 395 Register key = LoadDescriptor::NameRegister(); |
| 396 DCHECK(receiver.is(x1)); | 396 DCHECK(receiver.is(x1)); |
| 397 DCHECK(key.is(x2)); | 397 DCHECK(key.is(x2)); |
| 398 | 398 |
| 399 Label miss, unmapped; | 399 Label miss, unmapped; |
| 400 | 400 |
| 401 Register map_scratch = x0; | 401 Register map_scratch = x0; |
| 402 MemOperand mapped_location = GenerateMappedArgumentsLookup( | 402 MemOperand mapped_location = GenerateMappedArgumentsLookup( |
| 403 masm, receiver, key, map_scratch, x3, x4, &unmapped, &miss); | 403 masm, receiver, key, map_scratch, x3, x4, &unmapped, &miss); |
| 404 __ Ldr(result, mapped_location); | 404 __ Ldr(result, mapped_location); |
| 405 __ Ret(); | 405 __ Ret(); |
| 406 | 406 |
| 407 __ Bind(&unmapped); | 407 __ Bind(&unmapped); |
| 408 // Parameter map is left in map_scratch when a jump on unmapped is done. | 408 // Parameter map is left in map_scratch when a jump on unmapped is done. |
| 409 MemOperand unmapped_location = | 409 MemOperand unmapped_location = |
| 410 GenerateUnmappedArgumentsLookup(masm, key, map_scratch, x3, &miss); | 410 GenerateUnmappedArgumentsLookup(masm, key, map_scratch, x3, &miss); |
| 411 __ Ldr(result, unmapped_location); | 411 __ Ldr(result, unmapped_location); |
| 412 __ JumpIfRoot(result, Heap::kTheHoleValueRootIndex, &miss); | 412 __ JumpIfRoot(result, Heap::kTheHoleValueRootIndex, &miss); |
| 413 __ Ret(); | 413 __ Ret(); |
| 414 | 414 |
| 415 __ Bind(&miss); | 415 __ Bind(&miss); |
| 416 GenerateMiss(masm); | 416 GenerateMiss(masm); |
| 417 } | 417 } |
| 418 | 418 |
| 419 | 419 |
| 420 void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) { | 420 void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) { |
| 421 ASM_LOCATION("KeyedStoreIC::GenerateSloppyArguments"); | 421 ASM_LOCATION("KeyedStoreIC::GenerateSloppyArguments"); |
| 422 Label slow, notin; | 422 Label slow, notin; |
| 423 Register value = StoreConvention::ValueRegister(); | 423 Register value = StoreDescriptor::ValueRegister(); |
| 424 Register key = StoreConvention::NameRegister(); | 424 Register key = StoreDescriptor::NameRegister(); |
| 425 Register receiver = StoreConvention::ReceiverRegister(); | 425 Register receiver = StoreDescriptor::ReceiverRegister(); |
| 426 DCHECK(receiver.is(x1)); | 426 DCHECK(receiver.is(x1)); |
| 427 DCHECK(key.is(x2)); | 427 DCHECK(key.is(x2)); |
| 428 DCHECK(value.is(x0)); | 428 DCHECK(value.is(x0)); |
| 429 | 429 |
| 430 Register map = x3; | 430 Register map = x3; |
| 431 | 431 |
| 432 // These registers are used by GenerateMappedArgumentsLookup to build a | 432 // These registers are used by GenerateMappedArgumentsLookup to build a |
| 433 // MemOperand. They are live for as long as the MemOperand is live. | 433 // MemOperand. They are live for as long as the MemOperand is live. |
| 434 Register mapped1 = x4; | 434 Register mapped1 = x4; |
| 435 Register mapped2 = x5; | 435 Register mapped2 = x5; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 462 GenerateMiss(masm); | 462 GenerateMiss(masm); |
| 463 } | 463 } |
| 464 | 464 |
| 465 | 465 |
| 466 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { | 466 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
| 467 // The return address is in lr. | 467 // The return address is in lr. |
| 468 Isolate* isolate = masm->isolate(); | 468 Isolate* isolate = masm->isolate(); |
| 469 | 469 |
| 470 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, x10, x11); | 470 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, x10, x11); |
| 471 | 471 |
| 472 __ Push(LoadConvention::ReceiverRegister(), LoadConvention::NameRegister()); | 472 __ Push(LoadDescriptor::ReceiverRegister(), LoadDescriptor::NameRegister()); |
| 473 | 473 |
| 474 // Perform tail call to the entry. | 474 // Perform tail call to the entry. |
| 475 ExternalReference ref = | 475 ExternalReference ref = |
| 476 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate); | 476 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate); |
| 477 | 477 |
| 478 __ TailCallExternalReference(ref, 2, 1); | 478 __ TailCallExternalReference(ref, 2, 1); |
| 479 } | 479 } |
| 480 | 480 |
| 481 | 481 |
| 482 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 482 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
| 483 // The return address is in lr. | 483 // The return address is in lr. |
| 484 __ Push(LoadConvention::ReceiverRegister(), LoadConvention::NameRegister()); | 484 __ Push(LoadDescriptor::ReceiverRegister(), LoadDescriptor::NameRegister()); |
| 485 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); | 485 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); |
| 486 } | 486 } |
| 487 | 487 |
| 488 | 488 |
| 489 static void GenerateKeyedLoadWithSmiKey(MacroAssembler* masm, Register key, | 489 static void GenerateKeyedLoadWithSmiKey(MacroAssembler* masm, Register key, |
| 490 Register receiver, Register scratch1, | 490 Register receiver, Register scratch1, |
| 491 Register scratch2, Register scratch3, | 491 Register scratch2, Register scratch3, |
| 492 Register scratch4, Register scratch5, | 492 Register scratch4, Register scratch5, |
| 493 Label* slow) { | 493 Label* slow) { |
| 494 DCHECK(!AreAliased(key, receiver, scratch1, scratch2, scratch3, scratch4, | 494 DCHECK(!AreAliased(key, receiver, scratch1, scratch2, scratch3, scratch4, |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 __ IncrementCounter(isolate->counters()->keyed_load_generic_symbol(), 1, | 638 __ IncrementCounter(isolate->counters()->keyed_load_generic_symbol(), 1, |
| 639 scratch1, scratch2); | 639 scratch1, scratch2); |
| 640 __ Ret(); | 640 __ Ret(); |
| 641 } | 641 } |
| 642 | 642 |
| 643 | 643 |
| 644 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { | 644 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { |
| 645 // The return address is in lr. | 645 // The return address is in lr. |
| 646 Label slow, check_name, index_smi, index_name; | 646 Label slow, check_name, index_smi, index_name; |
| 647 | 647 |
| 648 Register key = LoadConvention::NameRegister(); | 648 Register key = LoadDescriptor::NameRegister(); |
| 649 Register receiver = LoadConvention::ReceiverRegister(); | 649 Register receiver = LoadDescriptor::ReceiverRegister(); |
| 650 DCHECK(key.is(x2)); | 650 DCHECK(key.is(x2)); |
| 651 DCHECK(receiver.is(x1)); | 651 DCHECK(receiver.is(x1)); |
| 652 | 652 |
| 653 __ JumpIfNotSmi(key, &check_name); | 653 __ JumpIfNotSmi(key, &check_name); |
| 654 __ Bind(&index_smi); | 654 __ Bind(&index_smi); |
| 655 // Now the key is known to be a smi. This place is also jumped to from below | 655 // Now the key is known to be a smi. This place is also jumped to from below |
| 656 // where a numeric string is converted to a smi. | 656 // where a numeric string is converted to a smi. |
| 657 GenerateKeyedLoadWithSmiKey(masm, key, receiver, x7, x3, x4, x5, x6, &slow); | 657 GenerateKeyedLoadWithSmiKey(masm, key, receiver, x7, x3, x4, x5, x6, &slow); |
| 658 | 658 |
| 659 // Slow case. | 659 // Slow case. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 671 __ IndexFromHash(x3, key); | 671 __ IndexFromHash(x3, key); |
| 672 // Now jump to the place where smi keys are handled. | 672 // Now jump to the place where smi keys are handled. |
| 673 __ B(&index_smi); | 673 __ B(&index_smi); |
| 674 } | 674 } |
| 675 | 675 |
| 676 | 676 |
| 677 void KeyedLoadIC::GenerateString(MacroAssembler* masm) { | 677 void KeyedLoadIC::GenerateString(MacroAssembler* masm) { |
| 678 // Return address is in lr. | 678 // Return address is in lr. |
| 679 Label miss; | 679 Label miss; |
| 680 | 680 |
| 681 Register receiver = LoadConvention::ReceiverRegister(); | 681 Register receiver = LoadDescriptor::ReceiverRegister(); |
| 682 Register index = LoadConvention::NameRegister(); | 682 Register index = LoadDescriptor::NameRegister(); |
| 683 Register result = x0; | 683 Register result = x0; |
| 684 Register scratch = x3; | 684 Register scratch = x3; |
| 685 DCHECK(!scratch.is(receiver) && !scratch.is(index)); | 685 DCHECK(!scratch.is(receiver) && !scratch.is(index)); |
| 686 | 686 |
| 687 StringCharAtGenerator char_at_generator(receiver, index, scratch, result, | 687 StringCharAtGenerator char_at_generator(receiver, index, scratch, result, |
| 688 &miss, // When not a string. | 688 &miss, // When not a string. |
| 689 &miss, // When not a number. | 689 &miss, // When not a number. |
| 690 &miss, // When index out of range. | 690 &miss, // When index out of range. |
| 691 STRING_INDEX_IS_ARRAY_INDEX); | 691 STRING_INDEX_IS_ARRAY_INDEX); |
| 692 char_at_generator.GenerateFast(masm); | 692 char_at_generator.GenerateFast(masm); |
| 693 __ Ret(); | 693 __ Ret(); |
| 694 | 694 |
| 695 StubRuntimeCallHelper call_helper; | 695 StubRuntimeCallHelper call_helper; |
| 696 char_at_generator.GenerateSlow(masm, call_helper); | 696 char_at_generator.GenerateSlow(masm, call_helper); |
| 697 | 697 |
| 698 __ Bind(&miss); | 698 __ Bind(&miss); |
| 699 GenerateMiss(masm); | 699 GenerateMiss(masm); |
| 700 } | 700 } |
| 701 | 701 |
| 702 | 702 |
| 703 void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { | 703 void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { |
| 704 // Return address is in lr. | 704 // Return address is in lr. |
| 705 Label slow; | 705 Label slow; |
| 706 | 706 |
| 707 Register receiver = LoadConvention::ReceiverRegister(); | 707 Register receiver = LoadDescriptor::ReceiverRegister(); |
| 708 Register key = LoadConvention::NameRegister(); | 708 Register key = LoadDescriptor::NameRegister(); |
| 709 Register scratch1 = x3; | 709 Register scratch1 = x3; |
| 710 Register scratch2 = x4; | 710 Register scratch2 = x4; |
| 711 DCHECK(!AreAliased(scratch1, scratch2, receiver, key)); | 711 DCHECK(!AreAliased(scratch1, scratch2, receiver, key)); |
| 712 | 712 |
| 713 // Check that the receiver isn't a smi. | 713 // Check that the receiver isn't a smi. |
| 714 __ JumpIfSmi(receiver, &slow); | 714 __ JumpIfSmi(receiver, &slow); |
| 715 | 715 |
| 716 // Check that the key is an array index, that is Uint32. | 716 // Check that the key is an array index, that is Uint32. |
| 717 __ TestAndBranchIfAnySet(key, kSmiTagMask | kSmiSignMask, &slow); | 717 __ TestAndBranchIfAnySet(key, kSmiTagMask | kSmiSignMask, &slow); |
| 718 | 718 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 737 | 737 |
| 738 __ Bind(&slow); | 738 __ Bind(&slow); |
| 739 GenerateMiss(masm); | 739 GenerateMiss(masm); |
| 740 } | 740 } |
| 741 | 741 |
| 742 | 742 |
| 743 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { | 743 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { |
| 744 ASM_LOCATION("KeyedStoreIC::GenerateMiss"); | 744 ASM_LOCATION("KeyedStoreIC::GenerateMiss"); |
| 745 | 745 |
| 746 // Push receiver, key and value for runtime call. | 746 // Push receiver, key and value for runtime call. |
| 747 __ Push(StoreConvention::ReceiverRegister(), StoreConvention::NameRegister(), | 747 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), |
| 748 StoreConvention::ValueRegister()); | 748 StoreDescriptor::ValueRegister()); |
| 749 | 749 |
| 750 ExternalReference ref = | 750 ExternalReference ref = |
| 751 ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); | 751 ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); |
| 752 __ TailCallExternalReference(ref, 3, 1); | 752 __ TailCallExternalReference(ref, 3, 1); |
| 753 } | 753 } |
| 754 | 754 |
| 755 | 755 |
| 756 static void KeyedStoreGenerateGenericHelper( | 756 static void KeyedStoreGenerateGenericHelper( |
| 757 MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow, | 757 MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow, |
| 758 KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length, | 758 KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length, |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 StrictMode strict_mode) { | 889 StrictMode strict_mode) { |
| 890 ASM_LOCATION("KeyedStoreIC::GenerateGeneric"); | 890 ASM_LOCATION("KeyedStoreIC::GenerateGeneric"); |
| 891 Label slow; | 891 Label slow; |
| 892 Label array; | 892 Label array; |
| 893 Label fast_object; | 893 Label fast_object; |
| 894 Label extra; | 894 Label extra; |
| 895 Label fast_object_grow; | 895 Label fast_object_grow; |
| 896 Label fast_double_grow; | 896 Label fast_double_grow; |
| 897 Label fast_double; | 897 Label fast_double; |
| 898 | 898 |
| 899 Register value = StoreConvention::ValueRegister(); | 899 Register value = StoreDescriptor::ValueRegister(); |
| 900 Register key = StoreConvention::NameRegister(); | 900 Register key = StoreDescriptor::NameRegister(); |
| 901 Register receiver = StoreConvention::ReceiverRegister(); | 901 Register receiver = StoreDescriptor::ReceiverRegister(); |
| 902 DCHECK(receiver.is(x1)); | 902 DCHECK(receiver.is(x1)); |
| 903 DCHECK(key.is(x2)); | 903 DCHECK(key.is(x2)); |
| 904 DCHECK(value.is(x0)); | 904 DCHECK(value.is(x0)); |
| 905 | 905 |
| 906 Register receiver_map = x3; | 906 Register receiver_map = x3; |
| 907 Register elements = x4; | 907 Register elements = x4; |
| 908 Register elements_map = x5; | 908 Register elements_map = x5; |
| 909 | 909 |
| 910 __ JumpIfNotSmi(key, &slow); | 910 __ JumpIfNotSmi(key, &slow); |
| 911 __ JumpIfSmi(receiver, &slow); | 911 __ JumpIfSmi(receiver, &slow); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 979 masm, &fast_object, &fast_double, &slow, kCheckMap, kDontIncrementLength, | 979 masm, &fast_object, &fast_double, &slow, kCheckMap, kDontIncrementLength, |
| 980 value, key, receiver, receiver_map, elements_map, elements); | 980 value, key, receiver, receiver_map, elements_map, elements); |
| 981 KeyedStoreGenerateGenericHelper(masm, &fast_object_grow, &fast_double_grow, | 981 KeyedStoreGenerateGenericHelper(masm, &fast_object_grow, &fast_double_grow, |
| 982 &slow, kDontCheckMap, kIncrementLength, value, | 982 &slow, kDontCheckMap, kIncrementLength, value, |
| 983 key, receiver, receiver_map, elements_map, | 983 key, receiver, receiver_map, elements_map, |
| 984 elements); | 984 elements); |
| 985 } | 985 } |
| 986 | 986 |
| 987 | 987 |
| 988 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { | 988 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { |
| 989 Register receiver = StoreConvention::ReceiverRegister(); | 989 Register receiver = StoreDescriptor::ReceiverRegister(); |
| 990 Register name = StoreConvention::NameRegister(); | 990 Register name = StoreDescriptor::NameRegister(); |
| 991 DCHECK(!AreAliased(receiver, name, StoreConvention::ValueRegister(), x3, x4, | 991 DCHECK(!AreAliased(receiver, name, StoreDescriptor::ValueRegister(), x3, x4, |
| 992 x5, x6)); | 992 x5, x6)); |
| 993 | 993 |
| 994 // Probe the stub cache. | 994 // Probe the stub cache. |
| 995 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 995 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( |
| 996 Code::ComputeHandlerFlags(Code::STORE_IC)); | 996 Code::ComputeHandlerFlags(Code::STORE_IC)); |
| 997 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, x3, | 997 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, x3, |
| 998 x4, x5, x6); | 998 x4, x5, x6); |
| 999 | 999 |
| 1000 // Cache miss: Jump to runtime. | 1000 // Cache miss: Jump to runtime. |
| 1001 GenerateMiss(masm); | 1001 GenerateMiss(masm); |
| 1002 } | 1002 } |
| 1003 | 1003 |
| 1004 | 1004 |
| 1005 void StoreIC::GenerateMiss(MacroAssembler* masm) { | 1005 void StoreIC::GenerateMiss(MacroAssembler* masm) { |
| 1006 __ Push(StoreConvention::ReceiverRegister(), StoreConvention::NameRegister(), | 1006 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), |
| 1007 StoreConvention::ValueRegister()); | 1007 StoreDescriptor::ValueRegister()); |
| 1008 | 1008 |
| 1009 // Tail call to the entry. | 1009 // Tail call to the entry. |
| 1010 ExternalReference ref = | 1010 ExternalReference ref = |
| 1011 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); | 1011 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); |
| 1012 __ TailCallExternalReference(ref, 3, 1); | 1012 __ TailCallExternalReference(ref, 3, 1); |
| 1013 } | 1013 } |
| 1014 | 1014 |
| 1015 | 1015 |
| 1016 void StoreIC::GenerateNormal(MacroAssembler* masm) { | 1016 void StoreIC::GenerateNormal(MacroAssembler* masm) { |
| 1017 Label miss; | 1017 Label miss; |
| 1018 Register value = StoreConvention::ValueRegister(); | 1018 Register value = StoreDescriptor::ValueRegister(); |
| 1019 Register receiver = StoreConvention::ReceiverRegister(); | 1019 Register receiver = StoreDescriptor::ReceiverRegister(); |
| 1020 Register name = StoreConvention::NameRegister(); | 1020 Register name = StoreDescriptor::NameRegister(); |
| 1021 Register dictionary = x3; | 1021 Register dictionary = x3; |
| 1022 DCHECK(!AreAliased(value, receiver, name, x3, x4, x5)); | 1022 DCHECK(!AreAliased(value, receiver, name, x3, x4, x5)); |
| 1023 | 1023 |
| 1024 __ Ldr(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset)); | 1024 __ Ldr(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset)); |
| 1025 | 1025 |
| 1026 GenerateDictionaryStore(masm, &miss, dictionary, name, value, x4, x5); | 1026 GenerateDictionaryStore(masm, &miss, dictionary, name, value, x4, x5); |
| 1027 Counters* counters = masm->isolate()->counters(); | 1027 Counters* counters = masm->isolate()->counters(); |
| 1028 __ IncrementCounter(counters->store_normal_hit(), 1, x4, x5); | 1028 __ IncrementCounter(counters->store_normal_hit(), 1, x4, x5); |
| 1029 __ Ret(); | 1029 __ Ret(); |
| 1030 | 1030 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1117 } else { | 1117 } else { |
| 1118 DCHECK(to_patch->Mask(TestBranchMask) == TBNZ); | 1118 DCHECK(to_patch->Mask(TestBranchMask) == TBNZ); |
| 1119 // This is JumpIfSmi(smi_reg, branch_imm). | 1119 // This is JumpIfSmi(smi_reg, branch_imm). |
| 1120 patcher.tbz(smi_reg, 0, branch_imm); | 1120 patcher.tbz(smi_reg, 0, branch_imm); |
| 1121 } | 1121 } |
| 1122 } | 1122 } |
| 1123 } | 1123 } |
| 1124 } // namespace v8::internal | 1124 } // namespace v8::internal |
| 1125 | 1125 |
| 1126 #endif // V8_TARGET_ARCH_ARM64 | 1126 #endif // V8_TARGET_ARCH_ARM64 |
| OLD | NEW |