OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 1 << Map::kHasFastElements); | 548 1 << Map::kHasFastElements); |
549 __ j(zero, &check_number_dictionary, not_taken); | 549 __ j(zero, &check_number_dictionary, not_taken); |
550 | 550 |
551 GenerateFastArrayLoad(masm, | 551 GenerateFastArrayLoad(masm, |
552 edx, | 552 edx, |
553 eax, | 553 eax, |
554 ecx, | 554 ecx, |
555 eax, | 555 eax, |
556 NULL, | 556 NULL, |
557 &slow); | 557 &slow); |
558 __ IncrementCounter(COUNTERS->keyed_load_generic_smi(), 1); | 558 Isolate* isolate = masm->isolate(); |
| 559 Counters* counters = isolate->counters(); |
| 560 __ IncrementCounter(counters->keyed_load_generic_smi(), 1); |
559 __ ret(0); | 561 __ ret(0); |
560 | 562 |
561 __ bind(&check_number_dictionary); | 563 __ bind(&check_number_dictionary); |
562 __ mov(ebx, eax); | 564 __ mov(ebx, eax); |
563 __ SmiUntag(ebx); | 565 __ SmiUntag(ebx); |
564 __ mov(ecx, FieldOperand(edx, JSObject::kElementsOffset)); | 566 __ mov(ecx, FieldOperand(edx, JSObject::kElementsOffset)); |
565 | 567 |
566 // Check whether the elements is a number dictionary. | 568 // Check whether the elements is a number dictionary. |
567 // edx: receiver | 569 // edx: receiver |
568 // ebx: untagged index | 570 // ebx: untagged index |
569 // eax: key | 571 // eax: key |
570 // ecx: elements | 572 // ecx: elements |
571 __ CheckMap(ecx, FACTORY->hash_table_map(), &slow, true); | 573 __ CheckMap(ecx, isolate->factory()->hash_table_map(), &slow, true); |
572 Label slow_pop_receiver; | 574 Label slow_pop_receiver; |
573 // Push receiver on the stack to free up a register for the dictionary | 575 // Push receiver on the stack to free up a register for the dictionary |
574 // probing. | 576 // probing. |
575 __ push(edx); | 577 __ push(edx); |
576 GenerateNumberDictionaryLoad(masm, | 578 GenerateNumberDictionaryLoad(masm, |
577 &slow_pop_receiver, | 579 &slow_pop_receiver, |
578 ecx, | 580 ecx, |
579 eax, | 581 eax, |
580 ebx, | 582 ebx, |
581 edx, | 583 edx, |
582 edi, | 584 edi, |
583 eax); | 585 eax); |
584 // Pop receiver before returning. | 586 // Pop receiver before returning. |
585 __ pop(edx); | 587 __ pop(edx); |
586 __ ret(0); | 588 __ ret(0); |
587 | 589 |
588 __ bind(&slow_pop_receiver); | 590 __ bind(&slow_pop_receiver); |
589 // Pop the receiver from the stack and jump to runtime. | 591 // Pop the receiver from the stack and jump to runtime. |
590 __ pop(edx); | 592 __ pop(edx); |
591 | 593 |
592 __ bind(&slow); | 594 __ bind(&slow); |
593 // Slow case: jump to runtime. | 595 // Slow case: jump to runtime. |
594 // edx: receiver | 596 // edx: receiver |
595 // eax: key | 597 // eax: key |
596 __ IncrementCounter(COUNTERS->keyed_load_generic_slow(), 1); | 598 __ IncrementCounter(counters->keyed_load_generic_slow(), 1); |
597 GenerateRuntimeGetProperty(masm); | 599 GenerateRuntimeGetProperty(masm); |
598 | 600 |
599 __ bind(&check_string); | 601 __ bind(&check_string); |
600 GenerateKeyStringCheck(masm, eax, ecx, ebx, &index_string, &slow); | 602 GenerateKeyStringCheck(masm, eax, ecx, ebx, &index_string, &slow); |
601 | 603 |
602 GenerateKeyedLoadReceiverCheck( | 604 GenerateKeyedLoadReceiverCheck( |
603 masm, edx, ecx, Map::kHasNamedInterceptor, &slow); | 605 masm, edx, ecx, Map::kHasNamedInterceptor, &slow); |
604 | 606 |
605 // If the receiver is a fast-case object, check the keyed lookup | 607 // If the receiver is a fast-case object, check the keyed lookup |
606 // cache. Otherwise probe the dictionary. | 608 // cache. Otherwise probe the dictionary. |
607 __ mov(ebx, FieldOperand(edx, JSObject::kPropertiesOffset)); | 609 __ mov(ebx, FieldOperand(edx, JSObject::kPropertiesOffset)); |
608 __ cmp(FieldOperand(ebx, HeapObject::kMapOffset), | 610 __ cmp(FieldOperand(ebx, HeapObject::kMapOffset), |
609 Immediate(FACTORY->hash_table_map())); | 611 Immediate(isolate->factory()->hash_table_map())); |
610 __ j(equal, &probe_dictionary); | 612 __ j(equal, &probe_dictionary); |
611 | 613 |
612 // Load the map of the receiver, compute the keyed lookup cache hash | 614 // Load the map of the receiver, compute the keyed lookup cache hash |
613 // based on 32 bits of the map pointer and the string hash. | 615 // based on 32 bits of the map pointer and the string hash. |
614 __ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset)); | 616 __ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset)); |
615 __ mov(ecx, ebx); | 617 __ mov(ecx, ebx); |
616 __ shr(ecx, KeyedLookupCache::kMapHashShift); | 618 __ shr(ecx, KeyedLookupCache::kMapHashShift); |
617 __ mov(edi, FieldOperand(eax, String::kHashFieldOffset)); | 619 __ mov(edi, FieldOperand(eax, String::kHashFieldOffset)); |
618 __ shr(edi, String::kHashShift); | 620 __ shr(edi, String::kHashShift); |
619 __ xor_(ecx, Operand(edi)); | 621 __ xor_(ecx, Operand(edi)); |
(...skipping 21 matching lines...) Expand all Loading... |
641 __ mov(edi, | 643 __ mov(edi, |
642 Operand::StaticArray(ecx, times_pointer_size, cache_field_offsets)); | 644 Operand::StaticArray(ecx, times_pointer_size, cache_field_offsets)); |
643 __ movzx_b(ecx, FieldOperand(ebx, Map::kInObjectPropertiesOffset)); | 645 __ movzx_b(ecx, FieldOperand(ebx, Map::kInObjectPropertiesOffset)); |
644 __ sub(edi, Operand(ecx)); | 646 __ sub(edi, Operand(ecx)); |
645 __ j(above_equal, &property_array_property); | 647 __ j(above_equal, &property_array_property); |
646 | 648 |
647 // Load in-object property. | 649 // Load in-object property. |
648 __ movzx_b(ecx, FieldOperand(ebx, Map::kInstanceSizeOffset)); | 650 __ movzx_b(ecx, FieldOperand(ebx, Map::kInstanceSizeOffset)); |
649 __ add(ecx, Operand(edi)); | 651 __ add(ecx, Operand(edi)); |
650 __ mov(eax, FieldOperand(edx, ecx, times_pointer_size, 0)); | 652 __ mov(eax, FieldOperand(edx, ecx, times_pointer_size, 0)); |
651 __ IncrementCounter(COUNTERS->keyed_load_generic_lookup_cache(), 1); | 653 __ IncrementCounter(counters->keyed_load_generic_lookup_cache(), 1); |
652 __ ret(0); | 654 __ ret(0); |
653 | 655 |
654 // Load property array property. | 656 // Load property array property. |
655 __ bind(&property_array_property); | 657 __ bind(&property_array_property); |
656 __ mov(eax, FieldOperand(edx, JSObject::kPropertiesOffset)); | 658 __ mov(eax, FieldOperand(edx, JSObject::kPropertiesOffset)); |
657 __ mov(eax, FieldOperand(eax, edi, times_pointer_size, | 659 __ mov(eax, FieldOperand(eax, edi, times_pointer_size, |
658 FixedArray::kHeaderSize)); | 660 FixedArray::kHeaderSize)); |
659 __ IncrementCounter(COUNTERS->keyed_load_generic_lookup_cache(), 1); | 661 __ IncrementCounter(counters->keyed_load_generic_lookup_cache(), 1); |
660 __ ret(0); | 662 __ ret(0); |
661 | 663 |
662 // Do a quick inline probe of the receiver's dictionary, if it | 664 // Do a quick inline probe of the receiver's dictionary, if it |
663 // exists. | 665 // exists. |
664 __ bind(&probe_dictionary); | 666 __ bind(&probe_dictionary); |
665 | 667 |
666 __ mov(ecx, FieldOperand(edx, JSObject::kMapOffset)); | 668 __ mov(ecx, FieldOperand(edx, JSObject::kMapOffset)); |
667 __ movzx_b(ecx, FieldOperand(ecx, Map::kInstanceTypeOffset)); | 669 __ movzx_b(ecx, FieldOperand(ecx, Map::kInstanceTypeOffset)); |
668 GenerateGlobalInstanceTypeCheck(masm, ecx, &slow); | 670 GenerateGlobalInstanceTypeCheck(masm, ecx, &slow); |
669 | 671 |
670 GenerateDictionaryLoad(masm, &slow, ebx, eax, ecx, edi, eax); | 672 GenerateDictionaryLoad(masm, &slow, ebx, eax, ecx, edi, eax); |
671 __ IncrementCounter(COUNTERS->keyed_load_generic_symbol(), 1); | 673 __ IncrementCounter(counters->keyed_load_generic_symbol(), 1); |
672 __ ret(0); | 674 __ ret(0); |
673 | 675 |
674 __ bind(&index_string); | 676 __ bind(&index_string); |
675 __ IndexFromHash(ebx, eax); | 677 __ IndexFromHash(ebx, eax); |
676 // Now jump to the place where smi keys are handled. | 678 // Now jump to the place where smi keys are handled. |
677 __ jmp(&index_smi); | 679 __ jmp(&index_smi); |
678 } | 680 } |
679 | 681 |
680 | 682 |
681 void KeyedLoadIC::GenerateString(MacroAssembler* masm) { | 683 void KeyedLoadIC::GenerateString(MacroAssembler* masm) { |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 int argc, | 962 int argc, |
961 IC::UtilityId id) { | 963 IC::UtilityId id) { |
962 // ----------- S t a t e ------------- | 964 // ----------- S t a t e ------------- |
963 // -- ecx : name | 965 // -- ecx : name |
964 // -- esp[0] : return address | 966 // -- esp[0] : return address |
965 // -- esp[(argc - n) * 4] : arg[n] (zero-based) | 967 // -- esp[(argc - n) * 4] : arg[n] (zero-based) |
966 // -- ... | 968 // -- ... |
967 // -- esp[(argc + 1) * 4] : receiver | 969 // -- esp[(argc + 1) * 4] : receiver |
968 // ----------------------------------- | 970 // ----------------------------------- |
969 | 971 |
| 972 Counters* counters = masm->isolate()->counters(); |
970 if (id == IC::kCallIC_Miss) { | 973 if (id == IC::kCallIC_Miss) { |
971 __ IncrementCounter(COUNTERS->call_miss(), 1); | 974 __ IncrementCounter(counters->call_miss(), 1); |
972 } else { | 975 } else { |
973 __ IncrementCounter(COUNTERS->keyed_call_miss(), 1); | 976 __ IncrementCounter(counters->keyed_call_miss(), 1); |
974 } | 977 } |
975 | 978 |
976 // Get the receiver of the function from the stack; 1 ~ return address. | 979 // Get the receiver of the function from the stack; 1 ~ return address. |
977 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 980 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
978 | 981 |
979 // Enter an internal frame. | 982 // Enter an internal frame. |
980 __ EnterInternalFrame(); | 983 __ EnterInternalFrame(); |
981 | 984 |
982 // Push the receiver and the name of the function. | 985 // Push the receiver and the name of the function. |
983 __ push(edx); | 986 __ push(edx); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1085 | 1088 |
1086 __ bind(&index_smi); | 1089 __ bind(&index_smi); |
1087 // Now the key is known to be a smi. This place is also jumped to from | 1090 // Now the key is known to be a smi. This place is also jumped to from |
1088 // where a numeric string is converted to a smi. | 1091 // where a numeric string is converted to a smi. |
1089 | 1092 |
1090 GenerateKeyedLoadReceiverCheck( | 1093 GenerateKeyedLoadReceiverCheck( |
1091 masm, edx, eax, Map::kHasIndexedInterceptor, &slow_call); | 1094 masm, edx, eax, Map::kHasIndexedInterceptor, &slow_call); |
1092 | 1095 |
1093 GenerateFastArrayLoad( | 1096 GenerateFastArrayLoad( |
1094 masm, edx, ecx, eax, edi, &check_number_dictionary, &slow_load); | 1097 masm, edx, ecx, eax, edi, &check_number_dictionary, &slow_load); |
1095 __ IncrementCounter(COUNTERS->keyed_call_generic_smi_fast(), 1); | 1098 Isolate* isolate = masm->isolate(); |
| 1099 Counters* counters = isolate->counters(); |
| 1100 __ IncrementCounter(counters->keyed_call_generic_smi_fast(), 1); |
1096 | 1101 |
1097 __ bind(&do_call); | 1102 __ bind(&do_call); |
1098 // receiver in edx is not used after this point. | 1103 // receiver in edx is not used after this point. |
1099 // ecx: key | 1104 // ecx: key |
1100 // edi: function | 1105 // edi: function |
1101 GenerateFunctionTailCall(masm, argc, &slow_call); | 1106 GenerateFunctionTailCall(masm, argc, &slow_call); |
1102 | 1107 |
1103 __ bind(&check_number_dictionary); | 1108 __ bind(&check_number_dictionary); |
1104 // eax: elements | 1109 // eax: elements |
1105 // ecx: smi key | 1110 // ecx: smi key |
1106 // Check whether the elements is a number dictionary. | 1111 // Check whether the elements is a number dictionary. |
1107 __ CheckMap(eax, FACTORY->hash_table_map(), &slow_load, true); | 1112 __ CheckMap(eax, isolate->factory()->hash_table_map(), &slow_load, true); |
1108 __ mov(ebx, ecx); | 1113 __ mov(ebx, ecx); |
1109 __ SmiUntag(ebx); | 1114 __ SmiUntag(ebx); |
1110 // ebx: untagged index | 1115 // ebx: untagged index |
1111 // Receiver in edx will be clobbered, need to reload it on miss. | 1116 // Receiver in edx will be clobbered, need to reload it on miss. |
1112 GenerateNumberDictionaryLoad( | 1117 GenerateNumberDictionaryLoad( |
1113 masm, &slow_reload_receiver, eax, ecx, ebx, edx, edi, edi); | 1118 masm, &slow_reload_receiver, eax, ecx, ebx, edx, edi, edi); |
1114 __ IncrementCounter(COUNTERS->keyed_call_generic_smi_dict(), 1); | 1119 __ IncrementCounter(counters->keyed_call_generic_smi_dict(), 1); |
1115 __ jmp(&do_call); | 1120 __ jmp(&do_call); |
1116 | 1121 |
1117 __ bind(&slow_reload_receiver); | 1122 __ bind(&slow_reload_receiver); |
1118 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 1123 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
1119 | 1124 |
1120 __ bind(&slow_load); | 1125 __ bind(&slow_load); |
1121 // This branch is taken when calling KeyedCallIC_Miss is neither required | 1126 // This branch is taken when calling KeyedCallIC_Miss is neither required |
1122 // nor beneficial. | 1127 // nor beneficial. |
1123 __ IncrementCounter(COUNTERS->keyed_call_generic_slow_load(), 1); | 1128 __ IncrementCounter(counters->keyed_call_generic_slow_load(), 1); |
1124 __ EnterInternalFrame(); | 1129 __ EnterInternalFrame(); |
1125 __ push(ecx); // save the key | 1130 __ push(ecx); // save the key |
1126 __ push(edx); // pass the receiver | 1131 __ push(edx); // pass the receiver |
1127 __ push(ecx); // pass the key | 1132 __ push(ecx); // pass the key |
1128 __ CallRuntime(Runtime::kKeyedGetProperty, 2); | 1133 __ CallRuntime(Runtime::kKeyedGetProperty, 2); |
1129 __ pop(ecx); // restore the key | 1134 __ pop(ecx); // restore the key |
1130 __ LeaveInternalFrame(); | 1135 __ LeaveInternalFrame(); |
1131 __ mov(edi, eax); | 1136 __ mov(edi, eax); |
1132 __ jmp(&do_call); | 1137 __ jmp(&do_call); |
1133 | 1138 |
1134 __ bind(&check_string); | 1139 __ bind(&check_string); |
1135 GenerateKeyStringCheck(masm, ecx, eax, ebx, &index_string, &slow_call); | 1140 GenerateKeyStringCheck(masm, ecx, eax, ebx, &index_string, &slow_call); |
1136 | 1141 |
1137 // The key is known to be a symbol. | 1142 // The key is known to be a symbol. |
1138 // If the receiver is a regular JS object with slow properties then do | 1143 // If the receiver is a regular JS object with slow properties then do |
1139 // a quick inline probe of the receiver's dictionary. | 1144 // a quick inline probe of the receiver's dictionary. |
1140 // Otherwise do the monomorphic cache probe. | 1145 // Otherwise do the monomorphic cache probe. |
1141 GenerateKeyedLoadReceiverCheck( | 1146 GenerateKeyedLoadReceiverCheck( |
1142 masm, edx, eax, Map::kHasNamedInterceptor, &lookup_monomorphic_cache); | 1147 masm, edx, eax, Map::kHasNamedInterceptor, &lookup_monomorphic_cache); |
1143 | 1148 |
1144 __ mov(ebx, FieldOperand(edx, JSObject::kPropertiesOffset)); | 1149 __ mov(ebx, FieldOperand(edx, JSObject::kPropertiesOffset)); |
1145 __ CheckMap(ebx, FACTORY->hash_table_map(), &lookup_monomorphic_cache, true); | 1150 __ CheckMap(ebx, |
| 1151 isolate->factory()->hash_table_map(), |
| 1152 &lookup_monomorphic_cache, |
| 1153 true); |
1146 | 1154 |
1147 GenerateDictionaryLoad(masm, &slow_load, ebx, ecx, eax, edi, edi); | 1155 GenerateDictionaryLoad(masm, &slow_load, ebx, ecx, eax, edi, edi); |
1148 __ IncrementCounter(COUNTERS->keyed_call_generic_lookup_dict(), 1); | 1156 __ IncrementCounter(counters->keyed_call_generic_lookup_dict(), 1); |
1149 __ jmp(&do_call); | 1157 __ jmp(&do_call); |
1150 | 1158 |
1151 __ bind(&lookup_monomorphic_cache); | 1159 __ bind(&lookup_monomorphic_cache); |
1152 __ IncrementCounter(COUNTERS->keyed_call_generic_lookup_cache(), 1); | 1160 __ IncrementCounter(counters->keyed_call_generic_lookup_cache(), 1); |
1153 GenerateMonomorphicCacheProbe(masm, argc, Code::KEYED_CALL_IC); | 1161 GenerateMonomorphicCacheProbe(masm, argc, Code::KEYED_CALL_IC); |
1154 // Fall through on miss. | 1162 // Fall through on miss. |
1155 | 1163 |
1156 __ bind(&slow_call); | 1164 __ bind(&slow_call); |
1157 // This branch is taken if: | 1165 // This branch is taken if: |
1158 // - the receiver requires boxing or access check, | 1166 // - the receiver requires boxing or access check, |
1159 // - the key is neither smi nor symbol, | 1167 // - the key is neither smi nor symbol, |
1160 // - the value loaded is not a function, | 1168 // - the value loaded is not a function, |
1161 // - there is hope that the runtime will create a monomorphic call stub | 1169 // - there is hope that the runtime will create a monomorphic call stub |
1162 // that will get fetched next time. | 1170 // that will get fetched next time. |
1163 __ IncrementCounter(COUNTERS->keyed_call_generic_slow(), 1); | 1171 __ IncrementCounter(counters->keyed_call_generic_slow(), 1); |
1164 GenerateMiss(masm, argc); | 1172 GenerateMiss(masm, argc); |
1165 | 1173 |
1166 __ bind(&index_string); | 1174 __ bind(&index_string); |
1167 __ IndexFromHash(ebx, ecx); | 1175 __ IndexFromHash(ebx, ecx); |
1168 // Now jump to the place where smi keys are handled. | 1176 // Now jump to the place where smi keys are handled. |
1169 __ jmp(&index_smi); | 1177 __ jmp(&index_smi); |
1170 } | 1178 } |
1171 | 1179 |
1172 | 1180 |
1173 void KeyedCallIC::GenerateNormal(MacroAssembler* masm, int argc) { | 1181 void KeyedCallIC::GenerateNormal(MacroAssembler* masm, int argc) { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1244 } | 1252 } |
1245 | 1253 |
1246 | 1254 |
1247 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 1255 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
1248 // ----------- S t a t e ------------- | 1256 // ----------- S t a t e ------------- |
1249 // -- eax : receiver | 1257 // -- eax : receiver |
1250 // -- ecx : name | 1258 // -- ecx : name |
1251 // -- esp[0] : return address | 1259 // -- esp[0] : return address |
1252 // ----------------------------------- | 1260 // ----------------------------------- |
1253 | 1261 |
1254 __ IncrementCounter(COUNTERS->load_miss(), 1); | 1262 __ IncrementCounter(masm->isolate()->counters()->load_miss(), 1); |
1255 | 1263 |
1256 __ pop(ebx); | 1264 __ pop(ebx); |
1257 __ push(eax); // receiver | 1265 __ push(eax); // receiver |
1258 __ push(ecx); // name | 1266 __ push(ecx); // name |
1259 __ push(ebx); // return address | 1267 __ push(ebx); // return address |
1260 | 1268 |
1261 // Perform tail call to the entry. | 1269 // Perform tail call to the entry. |
1262 ExternalReference ref = | 1270 ExternalReference ref = |
1263 ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate()); | 1271 ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate()); |
1264 __ TailCallExternalReference(ref, 2, 1); | 1272 __ TailCallExternalReference(ref, 2, 1); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1431 } | 1439 } |
1432 | 1440 |
1433 | 1441 |
1434 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { | 1442 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
1435 // ----------- S t a t e ------------- | 1443 // ----------- S t a t e ------------- |
1436 // -- eax : key | 1444 // -- eax : key |
1437 // -- edx : receiver | 1445 // -- edx : receiver |
1438 // -- esp[0] : return address | 1446 // -- esp[0] : return address |
1439 // ----------------------------------- | 1447 // ----------------------------------- |
1440 | 1448 |
1441 __ IncrementCounter(COUNTERS->keyed_load_miss(), 1); | 1449 __ IncrementCounter(masm->isolate()->counters()->keyed_load_miss(), 1); |
1442 | 1450 |
1443 __ pop(ebx); | 1451 __ pop(ebx); |
1444 __ push(edx); // receiver | 1452 __ push(edx); // receiver |
1445 __ push(eax); // name | 1453 __ push(eax); // name |
1446 __ push(ebx); // return address | 1454 __ push(ebx); // return address |
1447 | 1455 |
1448 // Perform tail call to the entry. | 1456 // Perform tail call to the entry. |
1449 ExternalReference ref = | 1457 ExternalReference ref = |
1450 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); | 1458 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); |
1451 __ TailCallExternalReference(ref, 2, 1); | 1459 __ TailCallExternalReference(ref, 2, 1); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1582 Label miss, restore_miss; | 1590 Label miss, restore_miss; |
1583 | 1591 |
1584 GenerateStringDictionaryReceiverCheck(masm, edx, ebx, edi, &miss); | 1592 GenerateStringDictionaryReceiverCheck(masm, edx, ebx, edi, &miss); |
1585 | 1593 |
1586 // A lot of registers are needed for storing to slow case | 1594 // A lot of registers are needed for storing to slow case |
1587 // objects. Push and restore receiver but rely on | 1595 // objects. Push and restore receiver but rely on |
1588 // GenerateDictionaryStore preserving the value and name. | 1596 // GenerateDictionaryStore preserving the value and name. |
1589 __ push(edx); | 1597 __ push(edx); |
1590 GenerateDictionaryStore(masm, &restore_miss, ebx, ecx, eax, edx, edi); | 1598 GenerateDictionaryStore(masm, &restore_miss, ebx, ecx, eax, edx, edi); |
1591 __ Drop(1); | 1599 __ Drop(1); |
1592 __ IncrementCounter(COUNTERS->store_normal_hit(), 1); | 1600 Counters* counters = masm->isolate()->counters(); |
| 1601 __ IncrementCounter(counters->store_normal_hit(), 1); |
1593 __ ret(0); | 1602 __ ret(0); |
1594 | 1603 |
1595 __ bind(&restore_miss); | 1604 __ bind(&restore_miss); |
1596 __ pop(edx); | 1605 __ pop(edx); |
1597 | 1606 |
1598 __ bind(&miss); | 1607 __ bind(&miss); |
1599 __ IncrementCounter(COUNTERS->store_normal_miss(), 1); | 1608 __ IncrementCounter(counters->store_normal_miss(), 1); |
1600 GenerateMiss(masm); | 1609 GenerateMiss(masm); |
1601 } | 1610 } |
1602 | 1611 |
1603 | 1612 |
1604 void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, | 1613 void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, |
1605 StrictModeFlag strict_mode) { | 1614 StrictModeFlag strict_mode) { |
1606 // ----------- S t a t e ------------- | 1615 // ----------- S t a t e ------------- |
1607 // -- eax : value | 1616 // -- eax : value |
1608 // -- ecx : name | 1617 // -- ecx : name |
1609 // -- edx : receiver | 1618 // -- edx : receiver |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1761 Condition cc = *jmp_address == Assembler::kJncShortOpcode | 1770 Condition cc = *jmp_address == Assembler::kJncShortOpcode |
1762 ? not_zero | 1771 ? not_zero |
1763 : zero; | 1772 : zero; |
1764 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 1773 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); |
1765 } | 1774 } |
1766 | 1775 |
1767 | 1776 |
1768 } } // namespace v8::internal | 1777 } } // namespace v8::internal |
1769 | 1778 |
1770 #endif // V8_TARGET_ARCH_IA32 | 1779 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |