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 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 __ j(zero, &check_number_dictionary); | 572 __ j(zero, &check_number_dictionary); |
573 | 573 |
574 GenerateFastArrayLoad(masm, | 574 GenerateFastArrayLoad(masm, |
575 rdx, | 575 rdx, |
576 rax, | 576 rax, |
577 rcx, | 577 rcx, |
578 rbx, | 578 rbx, |
579 rax, | 579 rax, |
580 NULL, | 580 NULL, |
581 &slow); | 581 &slow); |
582 __ IncrementCounter(COUNTERS->keyed_load_generic_smi(), 1); | 582 Counters* counters = masm->isolate()->counters(); |
| 583 __ IncrementCounter(counters->keyed_load_generic_smi(), 1); |
583 __ ret(0); | 584 __ ret(0); |
584 | 585 |
585 __ bind(&check_number_dictionary); | 586 __ bind(&check_number_dictionary); |
586 __ SmiToInteger32(rbx, rax); | 587 __ SmiToInteger32(rbx, rax); |
587 __ movq(rcx, FieldOperand(rdx, JSObject::kElementsOffset)); | 588 __ movq(rcx, FieldOperand(rdx, JSObject::kElementsOffset)); |
588 | 589 |
589 // Check whether the elements is a number dictionary. | 590 // Check whether the elements is a number dictionary. |
590 // rdx: receiver | 591 // rdx: receiver |
591 // rax: key | 592 // rax: key |
592 // rbx: key as untagged int32 | 593 // rbx: key as untagged int32 |
593 // rcx: elements | 594 // rcx: elements |
594 __ CompareRoot(FieldOperand(rcx, HeapObject::kMapOffset), | 595 __ CompareRoot(FieldOperand(rcx, HeapObject::kMapOffset), |
595 Heap::kHashTableMapRootIndex); | 596 Heap::kHashTableMapRootIndex); |
596 __ j(not_equal, &slow); | 597 __ j(not_equal, &slow); |
597 GenerateNumberDictionaryLoad(masm, &slow, rcx, rax, rbx, r9, rdi, rax); | 598 GenerateNumberDictionaryLoad(masm, &slow, rcx, rax, rbx, r9, rdi, rax); |
598 __ ret(0); | 599 __ ret(0); |
599 | 600 |
600 __ bind(&slow); | 601 __ bind(&slow); |
601 // Slow case: Jump to runtime. | 602 // Slow case: Jump to runtime. |
602 // rdx: receiver | 603 // rdx: receiver |
603 // rax: key | 604 // rax: key |
604 __ IncrementCounter(COUNTERS->keyed_load_generic_slow(), 1); | 605 __ IncrementCounter(counters->keyed_load_generic_slow(), 1); |
605 GenerateRuntimeGetProperty(masm); | 606 GenerateRuntimeGetProperty(masm); |
606 | 607 |
607 __ bind(&check_string); | 608 __ bind(&check_string); |
608 GenerateKeyStringCheck(masm, rax, rcx, rbx, &index_string, &slow); | 609 GenerateKeyStringCheck(masm, rax, rcx, rbx, &index_string, &slow); |
609 | 610 |
610 GenerateKeyedLoadReceiverCheck( | 611 GenerateKeyedLoadReceiverCheck( |
611 masm, rdx, rcx, Map::kHasNamedInterceptor, &slow); | 612 masm, rdx, rcx, Map::kHasNamedInterceptor, &slow); |
612 | 613 |
613 // If the receiver is a fast-case object, check the keyed lookup | 614 // If the receiver is a fast-case object, check the keyed lookup |
614 // cache. Otherwise probe the dictionary leaving result in rcx. | 615 // cache. Otherwise probe the dictionary leaving result in rcx. |
(...skipping 30 matching lines...) Expand all Loading... |
645 __ LoadAddress(kScratchRegister, cache_field_offsets); | 646 __ LoadAddress(kScratchRegister, cache_field_offsets); |
646 __ movl(rdi, Operand(kScratchRegister, rcx, times_4, 0)); | 647 __ movl(rdi, Operand(kScratchRegister, rcx, times_4, 0)); |
647 __ movzxbq(rcx, FieldOperand(rbx, Map::kInObjectPropertiesOffset)); | 648 __ movzxbq(rcx, FieldOperand(rbx, Map::kInObjectPropertiesOffset)); |
648 __ subq(rdi, rcx); | 649 __ subq(rdi, rcx); |
649 __ j(above_equal, &property_array_property); | 650 __ j(above_equal, &property_array_property); |
650 | 651 |
651 // Load in-object property. | 652 // Load in-object property. |
652 __ movzxbq(rcx, FieldOperand(rbx, Map::kInstanceSizeOffset)); | 653 __ movzxbq(rcx, FieldOperand(rbx, Map::kInstanceSizeOffset)); |
653 __ addq(rcx, rdi); | 654 __ addq(rcx, rdi); |
654 __ movq(rax, FieldOperand(rdx, rcx, times_pointer_size, 0)); | 655 __ movq(rax, FieldOperand(rdx, rcx, times_pointer_size, 0)); |
655 __ IncrementCounter(COUNTERS->keyed_load_generic_lookup_cache(), 1); | 656 __ IncrementCounter(counters->keyed_load_generic_lookup_cache(), 1); |
656 __ ret(0); | 657 __ ret(0); |
657 | 658 |
658 // Load property array property. | 659 // Load property array property. |
659 __ bind(&property_array_property); | 660 __ bind(&property_array_property); |
660 __ movq(rax, FieldOperand(rdx, JSObject::kPropertiesOffset)); | 661 __ movq(rax, FieldOperand(rdx, JSObject::kPropertiesOffset)); |
661 __ movq(rax, FieldOperand(rax, rdi, times_pointer_size, | 662 __ movq(rax, FieldOperand(rax, rdi, times_pointer_size, |
662 FixedArray::kHeaderSize)); | 663 FixedArray::kHeaderSize)); |
663 __ IncrementCounter(COUNTERS->keyed_load_generic_lookup_cache(), 1); | 664 __ IncrementCounter(counters->keyed_load_generic_lookup_cache(), 1); |
664 __ ret(0); | 665 __ ret(0); |
665 | 666 |
666 // Do a quick inline probe of the receiver's dictionary, if it | 667 // Do a quick inline probe of the receiver's dictionary, if it |
667 // exists. | 668 // exists. |
668 __ bind(&probe_dictionary); | 669 __ bind(&probe_dictionary); |
669 // rdx: receiver | 670 // rdx: receiver |
670 // rax: key | 671 // rax: key |
671 // rbx: elements | 672 // rbx: elements |
672 | 673 |
673 __ movq(rcx, FieldOperand(rdx, JSObject::kMapOffset)); | 674 __ movq(rcx, FieldOperand(rdx, JSObject::kMapOffset)); |
674 __ movb(rcx, FieldOperand(rcx, Map::kInstanceTypeOffset)); | 675 __ movb(rcx, FieldOperand(rcx, Map::kInstanceTypeOffset)); |
675 GenerateGlobalInstanceTypeCheck(masm, rcx, &slow); | 676 GenerateGlobalInstanceTypeCheck(masm, rcx, &slow); |
676 | 677 |
677 GenerateDictionaryLoad(masm, &slow, rbx, rax, rcx, rdi, rax); | 678 GenerateDictionaryLoad(masm, &slow, rbx, rax, rcx, rdi, rax); |
678 __ IncrementCounter(COUNTERS->keyed_load_generic_symbol(), 1); | 679 __ IncrementCounter(counters->keyed_load_generic_symbol(), 1); |
679 __ ret(0); | 680 __ ret(0); |
680 | 681 |
681 __ bind(&index_string); | 682 __ bind(&index_string); |
682 __ IndexFromHash(rbx, rax); | 683 __ IndexFromHash(rbx, rax); |
683 __ jmp(&index_smi); | 684 __ jmp(&index_smi); |
684 } | 685 } |
685 | 686 |
686 | 687 |
687 void KeyedLoadIC::GenerateString(MacroAssembler* masm) { | 688 void KeyedLoadIC::GenerateString(MacroAssembler* masm) { |
688 // ----------- S t a t e ------------- | 689 // ----------- S t a t e ------------- |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
983 // ----------- S t a t e ------------- | 984 // ----------- S t a t e ------------- |
984 // rcx : function name | 985 // rcx : function name |
985 // rsp[0] : return address | 986 // rsp[0] : return address |
986 // rsp[8] : argument argc | 987 // rsp[8] : argument argc |
987 // rsp[16] : argument argc - 1 | 988 // rsp[16] : argument argc - 1 |
988 // ... | 989 // ... |
989 // rsp[argc * 8] : argument 1 | 990 // rsp[argc * 8] : argument 1 |
990 // rsp[(argc + 1) * 8] : argument 0 = receiver | 991 // rsp[(argc + 1) * 8] : argument 0 = receiver |
991 // ----------------------------------- | 992 // ----------------------------------- |
992 | 993 |
| 994 Counters* counters = masm->isolate()->counters(); |
993 if (id == IC::kCallIC_Miss) { | 995 if (id == IC::kCallIC_Miss) { |
994 __ IncrementCounter(COUNTERS->call_miss(), 1); | 996 __ IncrementCounter(counters->call_miss(), 1); |
995 } else { | 997 } else { |
996 __ IncrementCounter(COUNTERS->keyed_call_miss(), 1); | 998 __ IncrementCounter(counters->keyed_call_miss(), 1); |
997 } | 999 } |
998 | 1000 |
999 // Get the receiver of the function from the stack; 1 ~ return address. | 1001 // Get the receiver of the function from the stack; 1 ~ return address. |
1000 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); | 1002 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); |
1001 | 1003 |
1002 // Enter an internal frame. | 1004 // Enter an internal frame. |
1003 __ EnterInternalFrame(); | 1005 __ EnterInternalFrame(); |
1004 | 1006 |
1005 // Push the receiver and the name of the function. | 1007 // Push the receiver and the name of the function. |
1006 __ push(rdx); | 1008 __ push(rdx); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1112 | 1114 |
1113 __ bind(&index_smi); | 1115 __ bind(&index_smi); |
1114 // Now the key is known to be a smi. This place is also jumped to from below | 1116 // Now the key is known to be a smi. This place is also jumped to from below |
1115 // where a numeric string is converted to a smi. | 1117 // where a numeric string is converted to a smi. |
1116 | 1118 |
1117 GenerateKeyedLoadReceiverCheck( | 1119 GenerateKeyedLoadReceiverCheck( |
1118 masm, rdx, rax, Map::kHasIndexedInterceptor, &slow_call); | 1120 masm, rdx, rax, Map::kHasIndexedInterceptor, &slow_call); |
1119 | 1121 |
1120 GenerateFastArrayLoad( | 1122 GenerateFastArrayLoad( |
1121 masm, rdx, rcx, rax, rbx, rdi, &check_number_dictionary, &slow_load); | 1123 masm, rdx, rcx, rax, rbx, rdi, &check_number_dictionary, &slow_load); |
1122 __ IncrementCounter(COUNTERS->keyed_call_generic_smi_fast(), 1); | 1124 Counters* counters = masm->isolate()->counters(); |
| 1125 __ IncrementCounter(counters->keyed_call_generic_smi_fast(), 1); |
1123 | 1126 |
1124 __ bind(&do_call); | 1127 __ bind(&do_call); |
1125 // receiver in rdx is not used after this point. | 1128 // receiver in rdx is not used after this point. |
1126 // rcx: key | 1129 // rcx: key |
1127 // rdi: function | 1130 // rdi: function |
1128 GenerateFunctionTailCall(masm, argc, &slow_call); | 1131 GenerateFunctionTailCall(masm, argc, &slow_call); |
1129 | 1132 |
1130 __ bind(&check_number_dictionary); | 1133 __ bind(&check_number_dictionary); |
1131 // rax: elements | 1134 // rax: elements |
1132 // rcx: smi key | 1135 // rcx: smi key |
1133 // Check whether the elements is a number dictionary. | 1136 // Check whether the elements is a number dictionary. |
1134 __ CompareRoot(FieldOperand(rax, HeapObject::kMapOffset), | 1137 __ CompareRoot(FieldOperand(rax, HeapObject::kMapOffset), |
1135 Heap::kHashTableMapRootIndex); | 1138 Heap::kHashTableMapRootIndex); |
1136 __ j(not_equal, &slow_load); | 1139 __ j(not_equal, &slow_load); |
1137 __ SmiToInteger32(rbx, rcx); | 1140 __ SmiToInteger32(rbx, rcx); |
1138 // ebx: untagged index | 1141 // ebx: untagged index |
1139 GenerateNumberDictionaryLoad(masm, &slow_load, rax, rcx, rbx, r9, rdi, rdi); | 1142 GenerateNumberDictionaryLoad(masm, &slow_load, rax, rcx, rbx, r9, rdi, rdi); |
1140 __ IncrementCounter(COUNTERS->keyed_call_generic_smi_dict(), 1); | 1143 __ IncrementCounter(counters->keyed_call_generic_smi_dict(), 1); |
1141 __ jmp(&do_call); | 1144 __ jmp(&do_call); |
1142 | 1145 |
1143 __ bind(&slow_load); | 1146 __ bind(&slow_load); |
1144 // This branch is taken when calling KeyedCallIC_Miss is neither required | 1147 // This branch is taken when calling KeyedCallIC_Miss is neither required |
1145 // nor beneficial. | 1148 // nor beneficial. |
1146 __ IncrementCounter(COUNTERS->keyed_call_generic_slow_load(), 1); | 1149 __ IncrementCounter(counters->keyed_call_generic_slow_load(), 1); |
1147 __ EnterInternalFrame(); | 1150 __ EnterInternalFrame(); |
1148 __ push(rcx); // save the key | 1151 __ push(rcx); // save the key |
1149 __ push(rdx); // pass the receiver | 1152 __ push(rdx); // pass the receiver |
1150 __ push(rcx); // pass the key | 1153 __ push(rcx); // pass the key |
1151 __ CallRuntime(Runtime::kKeyedGetProperty, 2); | 1154 __ CallRuntime(Runtime::kKeyedGetProperty, 2); |
1152 __ pop(rcx); // restore the key | 1155 __ pop(rcx); // restore the key |
1153 __ LeaveInternalFrame(); | 1156 __ LeaveInternalFrame(); |
1154 __ movq(rdi, rax); | 1157 __ movq(rdi, rax); |
1155 __ jmp(&do_call); | 1158 __ jmp(&do_call); |
1156 | 1159 |
1157 __ bind(&check_string); | 1160 __ bind(&check_string); |
1158 GenerateKeyStringCheck(masm, rcx, rax, rbx, &index_string, &slow_call); | 1161 GenerateKeyStringCheck(masm, rcx, rax, rbx, &index_string, &slow_call); |
1159 | 1162 |
1160 // The key is known to be a symbol. | 1163 // The key is known to be a symbol. |
1161 // If the receiver is a regular JS object with slow properties then do | 1164 // If the receiver is a regular JS object with slow properties then do |
1162 // a quick inline probe of the receiver's dictionary. | 1165 // a quick inline probe of the receiver's dictionary. |
1163 // Otherwise do the monomorphic cache probe. | 1166 // Otherwise do the monomorphic cache probe. |
1164 GenerateKeyedLoadReceiverCheck( | 1167 GenerateKeyedLoadReceiverCheck( |
1165 masm, rdx, rax, Map::kHasNamedInterceptor, &lookup_monomorphic_cache); | 1168 masm, rdx, rax, Map::kHasNamedInterceptor, &lookup_monomorphic_cache); |
1166 | 1169 |
1167 __ movq(rbx, FieldOperand(rdx, JSObject::kPropertiesOffset)); | 1170 __ movq(rbx, FieldOperand(rdx, JSObject::kPropertiesOffset)); |
1168 __ CompareRoot(FieldOperand(rbx, HeapObject::kMapOffset), | 1171 __ CompareRoot(FieldOperand(rbx, HeapObject::kMapOffset), |
1169 Heap::kHashTableMapRootIndex); | 1172 Heap::kHashTableMapRootIndex); |
1170 __ j(not_equal, &lookup_monomorphic_cache); | 1173 __ j(not_equal, &lookup_monomorphic_cache); |
1171 | 1174 |
1172 GenerateDictionaryLoad(masm, &slow_load, rbx, rcx, rax, rdi, rdi); | 1175 GenerateDictionaryLoad(masm, &slow_load, rbx, rcx, rax, rdi, rdi); |
1173 __ IncrementCounter(COUNTERS->keyed_call_generic_lookup_dict(), 1); | 1176 __ IncrementCounter(counters->keyed_call_generic_lookup_dict(), 1); |
1174 __ jmp(&do_call); | 1177 __ jmp(&do_call); |
1175 | 1178 |
1176 __ bind(&lookup_monomorphic_cache); | 1179 __ bind(&lookup_monomorphic_cache); |
1177 __ IncrementCounter(COUNTERS->keyed_call_generic_lookup_cache(), 1); | 1180 __ IncrementCounter(counters->keyed_call_generic_lookup_cache(), 1); |
1178 GenerateMonomorphicCacheProbe(masm, argc, Code::KEYED_CALL_IC); | 1181 GenerateMonomorphicCacheProbe(masm, argc, Code::KEYED_CALL_IC); |
1179 // Fall through on miss. | 1182 // Fall through on miss. |
1180 | 1183 |
1181 __ bind(&slow_call); | 1184 __ bind(&slow_call); |
1182 // This branch is taken if: | 1185 // This branch is taken if: |
1183 // - the receiver requires boxing or access check, | 1186 // - the receiver requires boxing or access check, |
1184 // - the key is neither smi nor symbol, | 1187 // - the key is neither smi nor symbol, |
1185 // - the value loaded is not a function, | 1188 // - the value loaded is not a function, |
1186 // - there is hope that the runtime will create a monomorphic call stub | 1189 // - there is hope that the runtime will create a monomorphic call stub |
1187 // that will get fetched next time. | 1190 // that will get fetched next time. |
1188 __ IncrementCounter(COUNTERS->keyed_call_generic_slow(), 1); | 1191 __ IncrementCounter(counters->keyed_call_generic_slow(), 1); |
1189 GenerateMiss(masm, argc); | 1192 GenerateMiss(masm, argc); |
1190 | 1193 |
1191 __ bind(&index_string); | 1194 __ bind(&index_string); |
1192 __ IndexFromHash(rbx, rcx); | 1195 __ IndexFromHash(rbx, rcx); |
1193 // Now jump to the place where smi keys are handled. | 1196 // Now jump to the place where smi keys are handled. |
1194 __ jmp(&index_smi); | 1197 __ jmp(&index_smi); |
1195 } | 1198 } |
1196 | 1199 |
1197 | 1200 |
1198 void KeyedCallIC::GenerateNormal(MacroAssembler* masm, int argc) { | 1201 void KeyedCallIC::GenerateNormal(MacroAssembler* masm, int argc) { |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1272 } | 1275 } |
1273 | 1276 |
1274 | 1277 |
1275 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 1278 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
1276 // ----------- S t a t e ------------- | 1279 // ----------- S t a t e ------------- |
1277 // -- rax : receiver | 1280 // -- rax : receiver |
1278 // -- rcx : name | 1281 // -- rcx : name |
1279 // -- rsp[0] : return address | 1282 // -- rsp[0] : return address |
1280 // ----------------------------------- | 1283 // ----------------------------------- |
1281 | 1284 |
1282 __ IncrementCounter(COUNTERS->load_miss(), 1); | 1285 Counters* counters = masm->isolate()->counters(); |
| 1286 __ IncrementCounter(counters->load_miss(), 1); |
1283 | 1287 |
1284 __ pop(rbx); | 1288 __ pop(rbx); |
1285 __ push(rax); // receiver | 1289 __ push(rax); // receiver |
1286 __ push(rcx); // name | 1290 __ push(rcx); // name |
1287 __ push(rbx); // return address | 1291 __ push(rbx); // return address |
1288 | 1292 |
1289 // Perform tail call to the entry. | 1293 // Perform tail call to the entry. |
1290 ExternalReference ref = | 1294 ExternalReference ref = |
1291 ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate()); | 1295 ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate()); |
1292 __ TailCallExternalReference(ref, 2, 1); | 1296 __ TailCallExternalReference(ref, 2, 1); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1417 } | 1421 } |
1418 | 1422 |
1419 | 1423 |
1420 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { | 1424 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
1421 // ----------- S t a t e ------------- | 1425 // ----------- S t a t e ------------- |
1422 // -- rax : key | 1426 // -- rax : key |
1423 // -- rdx : receiver | 1427 // -- rdx : receiver |
1424 // -- rsp[0] : return address | 1428 // -- rsp[0] : return address |
1425 // ----------------------------------- | 1429 // ----------------------------------- |
1426 | 1430 |
1427 __ IncrementCounter(COUNTERS->keyed_load_miss(), 1); | 1431 Counters* counters = masm->isolate()->counters(); |
| 1432 __ IncrementCounter(counters->keyed_load_miss(), 1); |
1428 | 1433 |
1429 __ pop(rbx); | 1434 __ pop(rbx); |
1430 __ push(rdx); // receiver | 1435 __ push(rdx); // receiver |
1431 __ push(rax); // name | 1436 __ push(rax); // name |
1432 __ push(rbx); // return address | 1437 __ push(rbx); // return address |
1433 | 1438 |
1434 // Perform tail call to the entry. | 1439 // Perform tail call to the entry. |
1435 ExternalReference ref | 1440 ExternalReference ref |
1436 = ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); | 1441 = ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); |
1437 __ TailCallExternalReference(ref, 2, 1); | 1442 __ TailCallExternalReference(ref, 2, 1); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1562 // -- rcx : name | 1567 // -- rcx : name |
1563 // -- rdx : receiver | 1568 // -- rdx : receiver |
1564 // -- rsp[0] : return address | 1569 // -- rsp[0] : return address |
1565 // ----------------------------------- | 1570 // ----------------------------------- |
1566 | 1571 |
1567 Label miss; | 1572 Label miss; |
1568 | 1573 |
1569 GenerateStringDictionaryReceiverCheck(masm, rdx, rbx, rdi, &miss); | 1574 GenerateStringDictionaryReceiverCheck(masm, rdx, rbx, rdi, &miss); |
1570 | 1575 |
1571 GenerateDictionaryStore(masm, &miss, rbx, rcx, rax, r8, r9); | 1576 GenerateDictionaryStore(masm, &miss, rbx, rcx, rax, r8, r9); |
1572 __ IncrementCounter(COUNTERS->store_normal_hit(), 1); | 1577 Counters* counters = masm->isolate()->counters(); |
| 1578 __ IncrementCounter(counters->store_normal_hit(), 1); |
1573 __ ret(0); | 1579 __ ret(0); |
1574 | 1580 |
1575 __ bind(&miss); | 1581 __ bind(&miss); |
1576 __ IncrementCounter(COUNTERS->store_normal_miss(), 1); | 1582 __ IncrementCounter(counters->store_normal_miss(), 1); |
1577 GenerateMiss(masm); | 1583 GenerateMiss(masm); |
1578 } | 1584 } |
1579 | 1585 |
1580 | 1586 |
1581 void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, | 1587 void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, |
1582 StrictModeFlag strict_mode) { | 1588 StrictModeFlag strict_mode) { |
1583 // ----------- S t a t e ------------- | 1589 // ----------- S t a t e ------------- |
1584 // -- rax : value | 1590 // -- rax : value |
1585 // -- rcx : name | 1591 // -- rcx : name |
1586 // -- rdx : receiver | 1592 // -- rdx : receiver |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1737 Condition cc = *jmp_address == Assembler::kJncShortOpcode | 1743 Condition cc = *jmp_address == Assembler::kJncShortOpcode |
1738 ? not_zero | 1744 ? not_zero |
1739 : zero; | 1745 : zero; |
1740 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 1746 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); |
1741 } | 1747 } |
1742 | 1748 |
1743 | 1749 |
1744 } } // namespace v8::internal | 1750 } } // namespace v8::internal |
1745 | 1751 |
1746 #endif // V8_TARGET_ARCH_X64 | 1752 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |