| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 // Store the value at the masked, scaled index. | 214 // Store the value at the masked, scaled index. |
| 215 const int kValueOffset = kElementsStartOffset + kPointerSize; | 215 const int kValueOffset = kElementsStartOffset + kPointerSize; |
| 216 __ lea(scratch1, Operand(elements, | 216 __ lea(scratch1, Operand(elements, |
| 217 scratch1, | 217 scratch1, |
| 218 times_pointer_size, | 218 times_pointer_size, |
| 219 kValueOffset - kHeapObjectTag)); | 219 kValueOffset - kHeapObjectTag)); |
| 220 __ movq(Operand(scratch1, 0), value); | 220 __ movq(Operand(scratch1, 0), value); |
| 221 | 221 |
| 222 // Update write barrier. Make sure not to clobber the value. | 222 // Update write barrier. Make sure not to clobber the value. |
| 223 __ movq(scratch0, value); | 223 __ movq(scratch0, value); |
| 224 __ RecordWrite(elements, scratch1, scratch0); | 224 __ RecordWrite(elements, scratch1, scratch0, kDontSaveFPRegs); |
| 225 } | 225 } |
| 226 | 226 |
| 227 | 227 |
| 228 void LoadIC::GenerateArrayLength(MacroAssembler* masm) { | 228 void LoadIC::GenerateArrayLength(MacroAssembler* masm) { |
| 229 // ----------- S t a t e ------------- | 229 // ----------- S t a t e ------------- |
| 230 // -- rax : receiver | 230 // -- rax : receiver |
| 231 // -- rcx : name | 231 // -- rcx : name |
| 232 // -- rsp[0] : return address | 232 // -- rsp[0] : return address |
| 233 // ----------------------------------- | 233 // ----------------------------------- |
| 234 Label miss; | 234 Label miss; |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 | 599 |
| 600 | 600 |
| 601 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, | 601 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, |
| 602 StrictModeFlag strict_mode) { | 602 StrictModeFlag strict_mode) { |
| 603 // ----------- S t a t e ------------- | 603 // ----------- S t a t e ------------- |
| 604 // -- rax : value | 604 // -- rax : value |
| 605 // -- rcx : key | 605 // -- rcx : key |
| 606 // -- rdx : receiver | 606 // -- rdx : receiver |
| 607 // -- rsp[0] : return address | 607 // -- rsp[0] : return address |
| 608 // ----------------------------------- | 608 // ----------------------------------- |
| 609 Label slow, slow_with_tagged_index, fast, array, extra; | 609 Label slow, slow_with_tagged_index, fast, array, extra, check_extra_double; |
| 610 Label fast_object_with_map_check, fast_object_without_map_check; |
| 611 Label fast_double_with_map_check, fast_double_without_map_check; |
| 610 | 612 |
| 611 // Check that the object isn't a smi. | 613 // Check that the object isn't a smi. |
| 612 __ JumpIfSmi(rdx, &slow_with_tagged_index); | 614 __ JumpIfSmi(rdx, &slow_with_tagged_index); |
| 613 // Get the map from the receiver. | 615 // Get the map from the receiver. |
| 614 __ movq(rbx, FieldOperand(rdx, HeapObject::kMapOffset)); | 616 __ movq(r9, FieldOperand(rdx, HeapObject::kMapOffset)); |
| 615 // Check that the receiver does not require access checks. We need | 617 // Check that the receiver does not require access checks. We need |
| 616 // to do this because this generic stub does not perform map checks. | 618 // to do this because this generic stub does not perform map checks. |
| 617 __ testb(FieldOperand(rbx, Map::kBitFieldOffset), | 619 __ testb(FieldOperand(r9, Map::kBitFieldOffset), |
| 618 Immediate(1 << Map::kIsAccessCheckNeeded)); | 620 Immediate(1 << Map::kIsAccessCheckNeeded)); |
| 619 __ j(not_zero, &slow_with_tagged_index); | 621 __ j(not_zero, &slow_with_tagged_index); |
| 620 // Check that the key is a smi. | 622 // Check that the key is a smi. |
| 621 __ JumpIfNotSmi(rcx, &slow_with_tagged_index); | 623 __ JumpIfNotSmi(rcx, &slow_with_tagged_index); |
| 622 __ SmiToInteger32(rcx, rcx); | 624 __ SmiToInteger32(rcx, rcx); |
| 623 | 625 |
| 624 __ CmpInstanceType(rbx, JS_ARRAY_TYPE); | 626 __ CmpInstanceType(r9, JS_ARRAY_TYPE); |
| 625 __ j(equal, &array); | 627 __ j(equal, &array); |
| 626 // Check that the object is some kind of JSObject. | 628 // Check that the object is some kind of JSObject. |
| 627 __ CmpInstanceType(rbx, FIRST_JS_RECEIVER_TYPE); | 629 __ CmpInstanceType(r9, FIRST_JS_OBJECT_TYPE); |
| 628 __ j(below, &slow); | 630 __ j(below, &slow); |
| 629 __ CmpInstanceType(rbx, JS_PROXY_TYPE); | |
| 630 __ j(equal, &slow); | |
| 631 __ CmpInstanceType(rbx, JS_FUNCTION_PROXY_TYPE); | |
| 632 __ j(equal, &slow); | |
| 633 | 631 |
| 634 // Object case: Check key against length in the elements array. | 632 // Object case: Check key against length in the elements array. |
| 635 // rax: value | 633 // rax: value |
| 636 // rdx: JSObject | 634 // rdx: JSObject |
| 637 // rcx: index | 635 // rcx: index |
| 638 __ movq(rbx, FieldOperand(rdx, JSObject::kElementsOffset)); | 636 __ movq(rbx, FieldOperand(rdx, JSObject::kElementsOffset)); |
| 639 // Check that the object is in fast mode and writable. | 637 // Check array bounds. |
| 640 __ CompareRoot(FieldOperand(rbx, HeapObject::kMapOffset), | |
| 641 Heap::kFixedArrayMapRootIndex); | |
| 642 __ j(not_equal, &slow); | |
| 643 __ SmiCompareInteger32(FieldOperand(rbx, FixedArray::kLengthOffset), rcx); | 638 __ SmiCompareInteger32(FieldOperand(rbx, FixedArray::kLengthOffset), rcx); |
| 644 // rax: value | 639 // rax: value |
| 645 // rbx: FixedArray | 640 // rbx: FixedArray |
| 646 // rcx: index | 641 // rcx: index |
| 647 __ j(above, &fast); | 642 __ j(above, &fast_object_with_map_check); |
| 648 | 643 |
| 649 // Slow case: call runtime. | 644 // Slow case: call runtime. |
| 650 __ bind(&slow); | 645 __ bind(&slow); |
| 651 __ Integer32ToSmi(rcx, rcx); | 646 __ Integer32ToSmi(rcx, rcx); |
| 652 __ bind(&slow_with_tagged_index); | 647 __ bind(&slow_with_tagged_index); |
| 653 GenerateRuntimeSetProperty(masm, strict_mode); | 648 GenerateRuntimeSetProperty(masm, strict_mode); |
| 654 // Never returns to here. | 649 // Never returns to here. |
| 655 | 650 |
| 656 // Extra capacity case: Check if there is extra capacity to | 651 // Extra capacity case: Check if there is extra capacity to |
| 657 // perform the store and update the length. Used for adding one | 652 // perform the store and update the length. Used for adding one |
| 658 // element to the array by writing to array[array.length]. | 653 // element to the array by writing to array[array.length]. |
| 659 __ bind(&extra); | 654 __ bind(&extra); |
| 660 // rax: value | 655 // rax: value |
| 661 // rdx: receiver (a JSArray) | 656 // rdx: receiver (a JSArray) |
| 662 // rbx: receiver's elements array (a FixedArray) | 657 // rbx: receiver's elements array (a FixedArray) |
| 663 // rcx: index | 658 // rcx: index |
| 664 // flags: smicompare (rdx.length(), rbx) | 659 // flags: smicompare (rdx.length(), rbx) |
| 665 __ j(not_equal, &slow); // do not leave holes in the array | 660 __ j(not_equal, &slow); // do not leave holes in the array |
| 666 __ SmiCompareInteger32(FieldOperand(rbx, FixedArray::kLengthOffset), rcx); | 661 __ SmiCompareInteger32(FieldOperand(rbx, FixedArray::kLengthOffset), rcx); |
| 667 __ j(below_equal, &slow); | 662 __ j(below_equal, &slow); |
| 668 // Increment index to get new length. | 663 // Increment index to get new length. |
| 664 __ movq(rdi, FieldOperand(rbx, HeapObject::kMapOffset)); |
| 665 __ CompareRoot(rdi, Heap::kFixedArrayMapRootIndex); |
| 666 __ j(not_equal, &check_extra_double); |
| 669 __ leal(rdi, Operand(rcx, 1)); | 667 __ leal(rdi, Operand(rcx, 1)); |
| 670 __ Integer32ToSmiField(FieldOperand(rdx, JSArray::kLengthOffset), rdi); | 668 __ Integer32ToSmiField(FieldOperand(rdx, JSArray::kLengthOffset), rdi); |
| 671 __ jmp(&fast); | 669 __ jmp(&fast_object_without_map_check); |
| 670 |
| 671 __ bind(&check_extra_double); |
| 672 // rdi: elements array's map |
| 673 __ CompareRoot(rdi, Heap::kFixedDoubleArrayMapRootIndex); |
| 674 __ j(not_equal, &slow); |
| 675 __ leal(rdi, Operand(rcx, 1)); |
| 676 __ Integer32ToSmiField(FieldOperand(rdx, JSArray::kLengthOffset), rdi); |
| 677 __ jmp(&fast_double_without_map_check); |
| 672 | 678 |
| 673 // Array case: Get the length and the elements array from the JS | 679 // Array case: Get the length and the elements array from the JS |
| 674 // array. Check that the array is in fast mode (and writable); if it | 680 // array. Check that the array is in fast mode (and writable); if it |
| 675 // is the length is always a smi. | 681 // is the length is always a smi. |
| 676 __ bind(&array); | 682 __ bind(&array); |
| 677 // rax: value | 683 // rax: value |
| 678 // rdx: receiver (a JSArray) | 684 // rdx: receiver (a JSArray) |
| 679 // rcx: index | 685 // rcx: index |
| 680 __ movq(rbx, FieldOperand(rdx, JSObject::kElementsOffset)); | 686 __ movq(rbx, FieldOperand(rdx, JSObject::kElementsOffset)); |
| 681 __ CompareRoot(FieldOperand(rbx, HeapObject::kMapOffset), | |
| 682 Heap::kFixedArrayMapRootIndex); | |
| 683 __ j(not_equal, &slow); | |
| 684 | 687 |
| 685 // Check the key against the length in the array, compute the | 688 // Check the key against the length in the array, compute the |
| 686 // address to store into and fall through to fast case. | 689 // address to store into and fall through to fast case. |
| 687 __ SmiCompareInteger32(FieldOperand(rdx, JSArray::kLengthOffset), rcx); | 690 __ SmiCompareInteger32(FieldOperand(rdx, JSArray::kLengthOffset), rcx); |
| 688 __ j(below_equal, &extra); | 691 __ j(below_equal, &extra); |
| 689 | 692 |
| 690 // Fast case: Do the store. | 693 // Fast case: Do the store. |
| 691 __ bind(&fast); | 694 __ bind(&fast_object_with_map_check); |
| 692 // rax: value | 695 // rax: value |
| 693 // rbx: receiver's elements array (a FixedArray) | 696 // rbx: receiver's elements array (a FixedArray) |
| 694 // rcx: index | 697 // rcx: index |
| 698 // rdx: receiver (a JSArray) |
| 699 __ movq(rdi, FieldOperand(rbx, HeapObject::kMapOffset)); |
| 700 __ CompareRoot(rdi, Heap::kFixedArrayMapRootIndex); |
| 701 __ j(not_equal, &fast_double_with_map_check); |
| 702 __ bind(&fast_object_without_map_check); |
| 703 // Smi stores don't require further checks. |
| 695 Label non_smi_value; | 704 Label non_smi_value; |
| 705 __ JumpIfNotSmi(rax, &non_smi_value); |
| 706 // It's irrelevant whether array is smi-only or not when writing a smi. |
| 696 __ movq(FieldOperand(rbx, rcx, times_pointer_size, FixedArray::kHeaderSize), | 707 __ movq(FieldOperand(rbx, rcx, times_pointer_size, FixedArray::kHeaderSize), |
| 697 rax); | 708 rax); |
| 698 __ JumpIfNotSmi(rax, &non_smi_value, Label::kNear); | |
| 699 __ ret(0); | 709 __ ret(0); |
| 710 |
| 700 __ bind(&non_smi_value); | 711 __ bind(&non_smi_value); |
| 701 // Slow case that needs to retain rcx for use by RecordWrite. | 712 if (FLAG_smi_only_arrays) { |
| 702 // Update write barrier for the elements array address. | 713 // Writing a non-smi, check whether array allows non-smi elements. |
| 714 // r9: receiver's map |
| 715 __ CheckFastObjectElements(r9, &slow, Label::kNear); |
| 716 } |
| 717 __ lea(rcx, |
| 718 FieldOperand(rbx, rcx, times_pointer_size, FixedArray::kHeaderSize)); |
| 719 __ movq(Operand(rcx, 0), rax); |
| 703 __ movq(rdx, rax); | 720 __ movq(rdx, rax); |
| 704 __ RecordWriteNonSmi(rbx, 0, rdx, rcx); | 721 __ RecordWrite( |
| 722 rbx, rcx, rdx, kDontSaveFPRegs, EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); |
| 723 __ ret(0); |
| 724 |
| 725 __ bind(&fast_double_with_map_check); |
| 726 // Check for fast double array case. If this fails, call through to the |
| 727 // runtime. |
| 728 // rdi: elements array's map |
| 729 __ CompareRoot(rdi, Heap::kFixedDoubleArrayMapRootIndex); |
| 730 __ j(not_equal, &slow); |
| 731 __ bind(&fast_double_without_map_check); |
| 732 // If the value is a number, store it as a double in the FastDoubleElements |
| 733 // array. |
| 734 __ StoreNumberToDoubleElements(rax, rbx, rcx, xmm0, &slow); |
| 705 __ ret(0); | 735 __ ret(0); |
| 706 } | 736 } |
| 707 | 737 |
| 708 | 738 |
| 709 // The generated code does not accept smi keys. | 739 // The generated code does not accept smi keys. |
| 710 // The generated code falls through if both probes miss. | 740 // The generated code falls through if both probes miss. |
| 711 static void GenerateMonomorphicCacheProbe(MacroAssembler* masm, | 741 static void GenerateMonomorphicCacheProbe(MacroAssembler* masm, |
| 712 int argc, | 742 int argc, |
| 713 Code::Kind kind, | 743 Code::Kind kind, |
| 714 Code::ExtraICState extra_ic_state) { | 744 Code::ExtraICState extra_ic_state) { |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 839 if (id == IC::kCallIC_Miss) { | 869 if (id == IC::kCallIC_Miss) { |
| 840 __ IncrementCounter(counters->call_miss(), 1); | 870 __ IncrementCounter(counters->call_miss(), 1); |
| 841 } else { | 871 } else { |
| 842 __ IncrementCounter(counters->keyed_call_miss(), 1); | 872 __ IncrementCounter(counters->keyed_call_miss(), 1); |
| 843 } | 873 } |
| 844 | 874 |
| 845 // Get the receiver of the function from the stack; 1 ~ return address. | 875 // Get the receiver of the function from the stack; 1 ~ return address. |
| 846 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); | 876 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); |
| 847 | 877 |
| 848 // Enter an internal frame. | 878 // Enter an internal frame. |
| 849 __ EnterInternalFrame(); | 879 { |
| 880 FrameScope scope(masm, StackFrame::INTERNAL); |
| 850 | 881 |
| 851 // Push the receiver and the name of the function. | 882 // Push the receiver and the name of the function. |
| 852 __ push(rdx); | 883 __ push(rdx); |
| 853 __ push(rcx); | 884 __ push(rcx); |
| 854 | 885 |
| 855 // Call the entry. | 886 // Call the entry. |
| 856 CEntryStub stub(1); | 887 CEntryStub stub(1); |
| 857 __ Set(rax, 2); | 888 __ Set(rax, 2); |
| 858 __ LoadAddress(rbx, ExternalReference(IC_Utility(id), masm->isolate())); | 889 __ LoadAddress(rbx, ExternalReference(IC_Utility(id), masm->isolate())); |
| 859 __ CallStub(&stub); | 890 __ CallStub(&stub); |
| 860 | 891 |
| 861 // Move result to rdi and exit the internal frame. | 892 // Move result to rdi and exit the internal frame. |
| 862 __ movq(rdi, rax); | 893 __ movq(rdi, rax); |
| 863 __ LeaveInternalFrame(); | 894 } |
| 864 | 895 |
| 865 // Check if the receiver is a global object of some sort. | 896 // Check if the receiver is a global object of some sort. |
| 866 // This can happen only for regular CallIC but not KeyedCallIC. | 897 // This can happen only for regular CallIC but not KeyedCallIC. |
| 867 if (id == IC::kCallIC_Miss) { | 898 if (id == IC::kCallIC_Miss) { |
| 868 Label invoke, global; | 899 Label invoke, global; |
| 869 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); // receiver | 900 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); // receiver |
| 870 __ JumpIfSmi(rdx, &invoke); | 901 __ JumpIfSmi(rdx, &invoke); |
| 871 __ CmpObjectType(rdx, JS_GLOBAL_OBJECT_TYPE, rcx); | 902 __ CmpObjectType(rdx, JS_GLOBAL_OBJECT_TYPE, rcx); |
| 872 __ j(equal, &global); | 903 __ j(equal, &global); |
| 873 __ CmpInstanceType(rcx, JS_BUILTINS_OBJECT_TYPE); | 904 __ CmpInstanceType(rcx, JS_BUILTINS_OBJECT_TYPE); |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 995 __ SmiToInteger32(rbx, rcx); | 1026 __ SmiToInteger32(rbx, rcx); |
| 996 // ebx: untagged index | 1027 // ebx: untagged index |
| 997 __ LoadFromNumberDictionary(&slow_load, rax, rcx, rbx, r9, rdi, rdi); | 1028 __ LoadFromNumberDictionary(&slow_load, rax, rcx, rbx, r9, rdi, rdi); |
| 998 __ IncrementCounter(counters->keyed_call_generic_smi_dict(), 1); | 1029 __ IncrementCounter(counters->keyed_call_generic_smi_dict(), 1); |
| 999 __ jmp(&do_call); | 1030 __ jmp(&do_call); |
| 1000 | 1031 |
| 1001 __ bind(&slow_load); | 1032 __ bind(&slow_load); |
| 1002 // This branch is taken when calling KeyedCallIC_Miss is neither required | 1033 // This branch is taken when calling KeyedCallIC_Miss is neither required |
| 1003 // nor beneficial. | 1034 // nor beneficial. |
| 1004 __ IncrementCounter(counters->keyed_call_generic_slow_load(), 1); | 1035 __ IncrementCounter(counters->keyed_call_generic_slow_load(), 1); |
| 1005 __ EnterInternalFrame(); | 1036 { |
| 1006 __ push(rcx); // save the key | 1037 FrameScope scope(masm, StackFrame::INTERNAL); |
| 1007 __ push(rdx); // pass the receiver | 1038 __ push(rcx); // save the key |
| 1008 __ push(rcx); // pass the key | 1039 __ push(rdx); // pass the receiver |
| 1009 __ CallRuntime(Runtime::kKeyedGetProperty, 2); | 1040 __ push(rcx); // pass the key |
| 1010 __ pop(rcx); // restore the key | 1041 __ CallRuntime(Runtime::kKeyedGetProperty, 2); |
| 1011 __ LeaveInternalFrame(); | 1042 __ pop(rcx); // restore the key |
| 1043 } |
| 1012 __ movq(rdi, rax); | 1044 __ movq(rdi, rax); |
| 1013 __ jmp(&do_call); | 1045 __ jmp(&do_call); |
| 1014 | 1046 |
| 1015 __ bind(&check_string); | 1047 __ bind(&check_string); |
| 1016 GenerateKeyStringCheck(masm, rcx, rax, rbx, &index_string, &slow_call); | 1048 GenerateKeyStringCheck(masm, rcx, rax, rbx, &index_string, &slow_call); |
| 1017 | 1049 |
| 1018 // The key is known to be a symbol. | 1050 // The key is known to be a symbol. |
| 1019 // If the receiver is a regular JS object with slow properties then do | 1051 // If the receiver is a regular JS object with slow properties then do |
| 1020 // a quick inline probe of the receiver's dictionary. | 1052 // a quick inline probe of the receiver's dictionary. |
| 1021 // Otherwise do the monomorphic cache probe. | 1053 // Otherwise do the monomorphic cache probe. |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1205 // -- rcx : key | 1237 // -- rcx : key |
| 1206 // -- rdx : receiver | 1238 // -- rdx : receiver |
| 1207 // -- rsp[0] : return address | 1239 // -- rsp[0] : return address |
| 1208 // ----------------------------------- | 1240 // ----------------------------------- |
| 1209 Label slow, notin; | 1241 Label slow, notin; |
| 1210 Operand mapped_location = GenerateMappedArgumentsLookup( | 1242 Operand mapped_location = GenerateMappedArgumentsLookup( |
| 1211 masm, rdx, rcx, rbx, rdi, r8, ¬in, &slow); | 1243 masm, rdx, rcx, rbx, rdi, r8, ¬in, &slow); |
| 1212 __ movq(mapped_location, rax); | 1244 __ movq(mapped_location, rax); |
| 1213 __ lea(r9, mapped_location); | 1245 __ lea(r9, mapped_location); |
| 1214 __ movq(r8, rax); | 1246 __ movq(r8, rax); |
| 1215 __ RecordWrite(rbx, r9, r8); | 1247 __ RecordWrite(rbx, |
| 1248 r9, |
| 1249 r8, |
| 1250 kDontSaveFPRegs, |
| 1251 EMIT_REMEMBERED_SET, |
| 1252 INLINE_SMI_CHECK); |
| 1216 __ Ret(); | 1253 __ Ret(); |
| 1217 __ bind(¬in); | 1254 __ bind(¬in); |
| 1218 // The unmapped lookup expects that the parameter map is in rbx. | 1255 // The unmapped lookup expects that the parameter map is in rbx. |
| 1219 Operand unmapped_location = | 1256 Operand unmapped_location = |
| 1220 GenerateUnmappedArgumentsLookup(masm, rcx, rbx, rdi, &slow); | 1257 GenerateUnmappedArgumentsLookup(masm, rcx, rbx, rdi, &slow); |
| 1221 __ movq(unmapped_location, rax); | 1258 __ movq(unmapped_location, rax); |
| 1222 __ lea(r9, unmapped_location); | 1259 __ lea(r9, unmapped_location); |
| 1223 __ movq(r8, rax); | 1260 __ movq(r8, rax); |
| 1224 __ RecordWrite(rbx, r9, r8); | 1261 __ RecordWrite(rbx, |
| 1262 r9, |
| 1263 r8, |
| 1264 kDontSaveFPRegs, |
| 1265 EMIT_REMEMBERED_SET, |
| 1266 INLINE_SMI_CHECK); |
| 1225 __ Ret(); | 1267 __ Ret(); |
| 1226 __ bind(&slow); | 1268 __ bind(&slow); |
| 1227 GenerateMiss(masm, false); | 1269 GenerateMiss(masm, false); |
| 1228 } | 1270 } |
| 1229 | 1271 |
| 1230 | 1272 |
| 1231 void KeyedCallIC::GenerateNonStrictArguments(MacroAssembler* masm, | 1273 void KeyedCallIC::GenerateNonStrictArguments(MacroAssembler* masm, |
| 1232 int argc) { | 1274 int argc) { |
| 1233 // ----------- S t a t e ------------- | 1275 // ----------- S t a t e ------------- |
| 1234 // rcx : function name | 1276 // rcx : function name |
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1657 Condition cc = *jmp_address == Assembler::kJncShortOpcode | 1699 Condition cc = *jmp_address == Assembler::kJncShortOpcode |
| 1658 ? not_zero | 1700 ? not_zero |
| 1659 : zero; | 1701 : zero; |
| 1660 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 1702 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); |
| 1661 } | 1703 } |
| 1662 | 1704 |
| 1663 | 1705 |
| 1664 } } // namespace v8::internal | 1706 } } // namespace v8::internal |
| 1665 | 1707 |
| 1666 #endif // V8_TARGET_ARCH_X64 | 1708 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |