| 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 |