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 |