OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 | 5 |
6 #include "src/v8.h" | 6 #include "src/v8.h" |
7 | 7 |
8 #if V8_TARGET_ARCH_MIPS64 | 8 #if V8_TARGET_ARCH_MIPS64 |
9 | 9 |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 STATIC_ASSERT(kInternalizedTag == 0); | 243 STATIC_ASSERT(kInternalizedTag == 0); |
244 __ And(at, hash, Operand(kIsNotInternalizedMask)); | 244 __ And(at, hash, Operand(kIsNotInternalizedMask)); |
245 __ Branch(not_unique, ne, at, Operand(zero_reg)); | 245 __ Branch(not_unique, ne, at, Operand(zero_reg)); |
246 | 246 |
247 __ bind(&unique); | 247 __ bind(&unique); |
248 } | 248 } |
249 | 249 |
250 | 250 |
251 void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { | 251 void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { |
252 // The return address is in lr. | 252 // The return address is in lr. |
253 Register receiver = LoadConvention::ReceiverRegister(); | 253 Register receiver = LoadDescriptor::ReceiverRegister(); |
254 Register name = LoadConvention::NameRegister(); | 254 Register name = LoadDescriptor::NameRegister(); |
255 DCHECK(receiver.is(a1)); | 255 DCHECK(receiver.is(a1)); |
256 DCHECK(name.is(a2)); | 256 DCHECK(name.is(a2)); |
257 | 257 |
258 // Probe the stub cache. | 258 // Probe the stub cache. |
259 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 259 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( |
260 Code::ComputeHandlerFlags(Code::LOAD_IC)); | 260 Code::ComputeHandlerFlags(Code::LOAD_IC)); |
261 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, a3, | 261 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, a3, |
262 a4, a5, a6); | 262 a4, a5, a6); |
263 | 263 |
264 // Cache miss: Jump to runtime. | 264 // Cache miss: Jump to runtime. |
265 GenerateMiss(masm); | 265 GenerateMiss(masm); |
266 } | 266 } |
267 | 267 |
268 | 268 |
269 void LoadIC::GenerateNormal(MacroAssembler* masm) { | 269 void LoadIC::GenerateNormal(MacroAssembler* masm) { |
270 Register dictionary = a0; | 270 Register dictionary = a0; |
271 DCHECK(!dictionary.is(LoadConvention::ReceiverRegister())); | 271 DCHECK(!dictionary.is(LoadDescriptor::ReceiverRegister())); |
272 DCHECK(!dictionary.is(LoadConvention::NameRegister())); | 272 DCHECK(!dictionary.is(LoadDescriptor::NameRegister())); |
273 Label slow; | 273 Label slow; |
274 | 274 |
275 __ ld(dictionary, FieldMemOperand(LoadConvention::ReceiverRegister(), | 275 __ ld(dictionary, FieldMemOperand(LoadDescriptor::ReceiverRegister(), |
276 JSObject::kPropertiesOffset)); | 276 JSObject::kPropertiesOffset)); |
277 GenerateDictionaryLoad(masm, &slow, dictionary, | 277 GenerateDictionaryLoad(masm, &slow, dictionary, |
278 LoadConvention::NameRegister(), v0, a3, a4); | 278 LoadDescriptor::NameRegister(), v0, a3, a4); |
279 __ Ret(); | 279 __ Ret(); |
280 | 280 |
281 // Dictionary load failed, go slow (but don't miss). | 281 // Dictionary load failed, go slow (but don't miss). |
282 __ bind(&slow); | 282 __ bind(&slow); |
283 GenerateRuntimeGetProperty(masm); | 283 GenerateRuntimeGetProperty(masm); |
284 } | 284 } |
285 | 285 |
286 | 286 |
287 // A register that isn't one of the parameters to the load ic. | 287 // A register that isn't one of the parameters to the load ic. |
288 static const Register LoadIC_TempRegister() { return a3; } | 288 static const Register LoadIC_TempRegister() { return a3; } |
289 | 289 |
290 | 290 |
291 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 291 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
292 // The return address is on the stack. | 292 // The return address is on the stack. |
293 Isolate* isolate = masm->isolate(); | 293 Isolate* isolate = masm->isolate(); |
294 | 294 |
295 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, a3, a4); | 295 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, a3, a4); |
296 | 296 |
297 __ mov(LoadIC_TempRegister(), LoadConvention::ReceiverRegister()); | 297 __ mov(LoadIC_TempRegister(), LoadDescriptor::ReceiverRegister()); |
298 __ Push(LoadIC_TempRegister(), LoadConvention::NameRegister()); | 298 __ Push(LoadIC_TempRegister(), LoadDescriptor::NameRegister()); |
299 | 299 |
300 // Perform tail call to the entry. | 300 // Perform tail call to the entry. |
301 ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss), isolate); | 301 ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss), isolate); |
302 __ TailCallExternalReference(ref, 2, 1); | 302 __ TailCallExternalReference(ref, 2, 1); |
303 } | 303 } |
304 | 304 |
305 | 305 |
306 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 306 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
307 // The return address is in ra. | 307 // The return address is in ra. |
308 | 308 |
309 __ mov(LoadIC_TempRegister(), LoadConvention::ReceiverRegister()); | 309 __ mov(LoadIC_TempRegister(), LoadDescriptor::ReceiverRegister()); |
310 __ Push(LoadIC_TempRegister(), LoadConvention::NameRegister()); | 310 __ Push(LoadIC_TempRegister(), LoadDescriptor::NameRegister()); |
311 | 311 |
312 __ TailCallRuntime(Runtime::kGetProperty, 2, 1); | 312 __ TailCallRuntime(Runtime::kGetProperty, 2, 1); |
313 } | 313 } |
314 | 314 |
315 | 315 |
316 static MemOperand GenerateMappedArgumentsLookup( | 316 static MemOperand GenerateMappedArgumentsLookup( |
317 MacroAssembler* masm, Register object, Register key, Register scratch1, | 317 MacroAssembler* masm, Register object, Register key, Register scratch1, |
318 Register scratch2, Register scratch3, Label* unmapped_case, | 318 Register scratch2, Register scratch3, Label* unmapped_case, |
319 Label* slow_case) { | 319 Label* slow_case) { |
320 Heap* heap = masm->isolate()->heap(); | 320 Heap* heap = masm->isolate()->heap(); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 __ SmiUntag(scratch, key); | 385 __ SmiUntag(scratch, key); |
386 __ dsll(scratch, scratch, kPointerSizeLog2); | 386 __ dsll(scratch, scratch, kPointerSizeLog2); |
387 __ Daddu(scratch, scratch, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 387 __ Daddu(scratch, scratch, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
388 __ Daddu(scratch, backing_store, scratch); | 388 __ Daddu(scratch, backing_store, scratch); |
389 return MemOperand(scratch); | 389 return MemOperand(scratch); |
390 } | 390 } |
391 | 391 |
392 | 392 |
393 void KeyedLoadIC::GenerateSloppyArguments(MacroAssembler* masm) { | 393 void KeyedLoadIC::GenerateSloppyArguments(MacroAssembler* masm) { |
394 // The return address is in ra. | 394 // The return address is in ra. |
395 Register receiver = LoadConvention::ReceiverRegister(); | 395 Register receiver = LoadDescriptor::ReceiverRegister(); |
396 Register key = LoadConvention::NameRegister(); | 396 Register key = LoadDescriptor::NameRegister(); |
397 DCHECK(receiver.is(a1)); | 397 DCHECK(receiver.is(a1)); |
398 DCHECK(key.is(a2)); | 398 DCHECK(key.is(a2)); |
399 | 399 |
400 Label slow, notin; | 400 Label slow, notin; |
401 MemOperand mapped_location = GenerateMappedArgumentsLookup( | 401 MemOperand mapped_location = GenerateMappedArgumentsLookup( |
402 masm, receiver, key, a0, a3, a4, ¬in, &slow); | 402 masm, receiver, key, a0, a3, a4, ¬in, &slow); |
403 __ Ret(USE_DELAY_SLOT); | 403 __ Ret(USE_DELAY_SLOT); |
404 __ ld(v0, mapped_location); | 404 __ ld(v0, mapped_location); |
405 __ bind(¬in); | 405 __ bind(¬in); |
406 // The unmapped lookup expects that the parameter map is in a2. | 406 // The unmapped lookup expects that the parameter map is in a2. |
407 MemOperand unmapped_location = | 407 MemOperand unmapped_location = |
408 GenerateUnmappedArgumentsLookup(masm, key, a0, a3, &slow); | 408 GenerateUnmappedArgumentsLookup(masm, key, a0, a3, &slow); |
409 __ ld(a0, unmapped_location); | 409 __ ld(a0, unmapped_location); |
410 __ LoadRoot(a3, Heap::kTheHoleValueRootIndex); | 410 __ LoadRoot(a3, Heap::kTheHoleValueRootIndex); |
411 __ Branch(&slow, eq, a0, Operand(a3)); | 411 __ Branch(&slow, eq, a0, Operand(a3)); |
412 __ Ret(USE_DELAY_SLOT); | 412 __ Ret(USE_DELAY_SLOT); |
413 __ mov(v0, a0); | 413 __ mov(v0, a0); |
414 __ bind(&slow); | 414 __ bind(&slow); |
415 GenerateMiss(masm); | 415 GenerateMiss(masm); |
416 } | 416 } |
417 | 417 |
418 | 418 |
419 void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) { | 419 void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) { |
420 Register receiver = StoreConvention::ReceiverRegister(); | 420 Register receiver = StoreDescriptor::ReceiverRegister(); |
421 Register key = StoreConvention::NameRegister(); | 421 Register key = StoreDescriptor::NameRegister(); |
422 Register value = StoreConvention::ValueRegister(); | 422 Register value = StoreDescriptor::ValueRegister(); |
423 DCHECK(value.is(a0)); | 423 DCHECK(value.is(a0)); |
424 | 424 |
425 Label slow, notin; | 425 Label slow, notin; |
426 // Store address is returned in register (of MemOperand) mapped_location. | 426 // Store address is returned in register (of MemOperand) mapped_location. |
427 MemOperand mapped_location = GenerateMappedArgumentsLookup( | 427 MemOperand mapped_location = GenerateMappedArgumentsLookup( |
428 masm, receiver, key, a3, a4, a5, ¬in, &slow); | 428 masm, receiver, key, a3, a4, a5, ¬in, &slow); |
429 __ sd(value, mapped_location); | 429 __ sd(value, mapped_location); |
430 __ mov(t1, value); | 430 __ mov(t1, value); |
431 DCHECK_EQ(mapped_location.offset(), 0); | 431 DCHECK_EQ(mapped_location.offset(), 0); |
432 __ RecordWrite(a3, mapped_location.rm(), t1, kRAHasNotBeenSaved, | 432 __ RecordWrite(a3, mapped_location.rm(), t1, kRAHasNotBeenSaved, |
(...skipping 16 matching lines...) Expand all Loading... |
449 GenerateMiss(masm); | 449 GenerateMiss(masm); |
450 } | 450 } |
451 | 451 |
452 | 452 |
453 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { | 453 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
454 // The return address is in ra. | 454 // The return address is in ra. |
455 Isolate* isolate = masm->isolate(); | 455 Isolate* isolate = masm->isolate(); |
456 | 456 |
457 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, a3, a4); | 457 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, a3, a4); |
458 | 458 |
459 __ Push(LoadConvention::ReceiverRegister(), LoadConvention::NameRegister()); | 459 __ Push(LoadDescriptor::ReceiverRegister(), LoadDescriptor::NameRegister()); |
460 | 460 |
461 // Perform tail call to the entry. | 461 // Perform tail call to the entry. |
462 ExternalReference ref = | 462 ExternalReference ref = |
463 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate); | 463 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate); |
464 | 464 |
465 __ TailCallExternalReference(ref, 2, 1); | 465 __ TailCallExternalReference(ref, 2, 1); |
466 } | 466 } |
467 | 467 |
468 | 468 |
469 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 469 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
470 // The return address is in ra. | 470 // The return address is in ra. |
471 | 471 |
472 __ Push(LoadConvention::ReceiverRegister(), LoadConvention::NameRegister()); | 472 __ Push(LoadDescriptor::ReceiverRegister(), LoadDescriptor::NameRegister()); |
473 | 473 |
474 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); | 474 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); |
475 } | 475 } |
476 | 476 |
477 | 477 |
478 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { | 478 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { |
479 // The return address is in ra. | 479 // The return address is in ra. |
480 Label slow, check_name, index_smi, index_name, property_array_property; | 480 Label slow, check_name, index_smi, index_name, property_array_property; |
481 Label probe_dictionary, check_number_dictionary; | 481 Label probe_dictionary, check_number_dictionary; |
482 | 482 |
483 Register key = LoadConvention::NameRegister(); | 483 Register key = LoadDescriptor::NameRegister(); |
484 Register receiver = LoadConvention::ReceiverRegister(); | 484 Register receiver = LoadDescriptor::ReceiverRegister(); |
485 DCHECK(key.is(a2)); | 485 DCHECK(key.is(a2)); |
486 DCHECK(receiver.is(a1)); | 486 DCHECK(receiver.is(a1)); |
487 | 487 |
488 Isolate* isolate = masm->isolate(); | 488 Isolate* isolate = masm->isolate(); |
489 | 489 |
490 // Check that the key is a smi. | 490 // Check that the key is a smi. |
491 __ JumpIfNotSmi(key, &check_name); | 491 __ JumpIfNotSmi(key, &check_name); |
492 __ bind(&index_smi); | 492 __ bind(&index_smi); |
493 // Now the key is known to be a smi. This place is also jumped to from below | 493 // Now the key is known to be a smi. This place is also jumped to from below |
494 // where a numeric string is converted to a smi. | 494 // where a numeric string is converted to a smi. |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
640 __ IndexFromHash(a3, key); | 640 __ IndexFromHash(a3, key); |
641 // Now jump to the place where smi keys are handled. | 641 // Now jump to the place where smi keys are handled. |
642 __ Branch(&index_smi); | 642 __ Branch(&index_smi); |
643 } | 643 } |
644 | 644 |
645 | 645 |
646 void KeyedLoadIC::GenerateString(MacroAssembler* masm) { | 646 void KeyedLoadIC::GenerateString(MacroAssembler* masm) { |
647 // Return address is in ra. | 647 // Return address is in ra. |
648 Label miss; | 648 Label miss; |
649 | 649 |
650 Register receiver = LoadConvention::ReceiverRegister(); | 650 Register receiver = LoadDescriptor::ReceiverRegister(); |
651 Register index = LoadConvention::NameRegister(); | 651 Register index = LoadDescriptor::NameRegister(); |
652 Register scratch = a3; | 652 Register scratch = a3; |
653 Register result = v0; | 653 Register result = v0; |
654 DCHECK(!scratch.is(receiver) && !scratch.is(index)); | 654 DCHECK(!scratch.is(receiver) && !scratch.is(index)); |
655 | 655 |
656 StringCharAtGenerator char_at_generator(receiver, index, scratch, result, | 656 StringCharAtGenerator char_at_generator(receiver, index, scratch, result, |
657 &miss, // When not a string. | 657 &miss, // When not a string. |
658 &miss, // When not a number. | 658 &miss, // When not a number. |
659 &miss, // When index out of range. | 659 &miss, // When index out of range. |
660 STRING_INDEX_IS_ARRAY_INDEX); | 660 STRING_INDEX_IS_ARRAY_INDEX); |
661 char_at_generator.GenerateFast(masm); | 661 char_at_generator.GenerateFast(masm); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
825 // -- a0 : value | 825 // -- a0 : value |
826 // -- a1 : key | 826 // -- a1 : key |
827 // -- a2 : receiver | 827 // -- a2 : receiver |
828 // -- ra : return address | 828 // -- ra : return address |
829 // ----------------------------------- | 829 // ----------------------------------- |
830 Label slow, fast_object, fast_object_grow; | 830 Label slow, fast_object, fast_object_grow; |
831 Label fast_double, fast_double_grow; | 831 Label fast_double, fast_double_grow; |
832 Label array, extra, check_if_double_array; | 832 Label array, extra, check_if_double_array; |
833 | 833 |
834 // Register usage. | 834 // Register usage. |
835 Register value = StoreConvention::ValueRegister(); | 835 Register value = StoreDescriptor::ValueRegister(); |
836 Register key = StoreConvention::NameRegister(); | 836 Register key = StoreDescriptor::NameRegister(); |
837 Register receiver = StoreConvention::ReceiverRegister(); | 837 Register receiver = StoreDescriptor::ReceiverRegister(); |
838 DCHECK(value.is(a0)); | 838 DCHECK(value.is(a0)); |
839 Register receiver_map = a3; | 839 Register receiver_map = a3; |
840 Register elements_map = a6; | 840 Register elements_map = a6; |
841 Register elements = a7; // Elements array of the receiver. | 841 Register elements = a7; // Elements array of the receiver. |
842 // a4 and a5 are used as general scratch registers. | 842 // a4 and a5 are used as general scratch registers. |
843 | 843 |
844 // Check that the key is a smi. | 844 // Check that the key is a smi. |
845 __ JumpIfNotSmi(key, &slow); | 845 __ JumpIfNotSmi(key, &slow); |
846 // Check that the object isn't a smi. | 846 // Check that the object isn't a smi. |
847 __ JumpIfSmi(receiver, &slow); | 847 __ JumpIfSmi(receiver, &slow); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
911 &slow, kDontCheckMap, kIncrementLength, value, | 911 &slow, kDontCheckMap, kIncrementLength, value, |
912 key, receiver, receiver_map, elements_map, | 912 key, receiver, receiver_map, elements_map, |
913 elements); | 913 elements); |
914 } | 914 } |
915 | 915 |
916 | 916 |
917 void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { | 917 void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { |
918 // Return address is in ra. | 918 // Return address is in ra. |
919 Label slow; | 919 Label slow; |
920 | 920 |
921 Register receiver = LoadConvention::ReceiverRegister(); | 921 Register receiver = LoadDescriptor::ReceiverRegister(); |
922 Register key = LoadConvention::NameRegister(); | 922 Register key = LoadDescriptor::NameRegister(); |
923 Register scratch1 = a3; | 923 Register scratch1 = a3; |
924 Register scratch2 = a4; | 924 Register scratch2 = a4; |
925 DCHECK(!scratch1.is(receiver) && !scratch1.is(key)); | 925 DCHECK(!scratch1.is(receiver) && !scratch1.is(key)); |
926 DCHECK(!scratch2.is(receiver) && !scratch2.is(key)); | 926 DCHECK(!scratch2.is(receiver) && !scratch2.is(key)); |
927 | 927 |
928 // Check that the receiver isn't a smi. | 928 // Check that the receiver isn't a smi. |
929 __ JumpIfSmi(receiver, &slow); | 929 __ JumpIfSmi(receiver, &slow); |
930 | 930 |
931 // Check that the key is an array index, that is Uint32. | 931 // Check that the key is an array index, that is Uint32. |
932 __ And(a4, key, Operand(kSmiTagMask | kSmiSignMask)); | 932 __ And(a4, key, Operand(kSmiTagMask | kSmiSignMask)); |
(...skipping 16 matching lines...) Expand all Loading... |
949 masm->isolate()), | 949 masm->isolate()), |
950 2, 1); | 950 2, 1); |
951 | 951 |
952 __ bind(&slow); | 952 __ bind(&slow); |
953 GenerateMiss(masm); | 953 GenerateMiss(masm); |
954 } | 954 } |
955 | 955 |
956 | 956 |
957 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { | 957 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { |
958 // Push receiver, key and value for runtime call. | 958 // Push receiver, key and value for runtime call. |
959 __ Push(StoreConvention::ReceiverRegister(), StoreConvention::NameRegister(), | 959 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), |
960 StoreConvention::ValueRegister()); | 960 StoreDescriptor::ValueRegister()); |
961 | 961 |
962 ExternalReference ref = | 962 ExternalReference ref = |
963 ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); | 963 ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); |
964 __ TailCallExternalReference(ref, 3, 1); | 964 __ TailCallExternalReference(ref, 3, 1); |
965 } | 965 } |
966 | 966 |
967 | 967 |
968 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { | 968 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { |
969 Register receiver = StoreConvention::ReceiverRegister(); | 969 Register receiver = StoreDescriptor::ReceiverRegister(); |
970 Register name = StoreConvention::NameRegister(); | 970 Register name = StoreDescriptor::NameRegister(); |
971 DCHECK(receiver.is(a1)); | 971 DCHECK(receiver.is(a1)); |
972 DCHECK(name.is(a2)); | 972 DCHECK(name.is(a2)); |
973 DCHECK(StoreConvention::ValueRegister().is(a0)); | 973 DCHECK(StoreDescriptor::ValueRegister().is(a0)); |
974 | 974 |
975 // Get the receiver from the stack and probe the stub cache. | 975 // Get the receiver from the stack and probe the stub cache. |
976 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 976 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( |
977 Code::ComputeHandlerFlags(Code::STORE_IC)); | 977 Code::ComputeHandlerFlags(Code::STORE_IC)); |
978 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, a3, | 978 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, receiver, name, a3, |
979 a4, a5, a6); | 979 a4, a5, a6); |
980 | 980 |
981 // Cache miss: Jump to runtime. | 981 // Cache miss: Jump to runtime. |
982 GenerateMiss(masm); | 982 GenerateMiss(masm); |
983 } | 983 } |
984 | 984 |
985 | 985 |
986 void StoreIC::GenerateMiss(MacroAssembler* masm) { | 986 void StoreIC::GenerateMiss(MacroAssembler* masm) { |
987 __ Push(StoreConvention::ReceiverRegister(), StoreConvention::NameRegister(), | 987 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), |
988 StoreConvention::ValueRegister()); | 988 StoreDescriptor::ValueRegister()); |
989 // Perform tail call to the entry. | 989 // Perform tail call to the entry. |
990 ExternalReference ref = | 990 ExternalReference ref = |
991 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); | 991 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); |
992 __ TailCallExternalReference(ref, 3, 1); | 992 __ TailCallExternalReference(ref, 3, 1); |
993 } | 993 } |
994 | 994 |
995 | 995 |
996 void StoreIC::GenerateNormal(MacroAssembler* masm) { | 996 void StoreIC::GenerateNormal(MacroAssembler* masm) { |
997 Label miss; | 997 Label miss; |
998 Register receiver = StoreConvention::ReceiverRegister(); | 998 Register receiver = StoreDescriptor::ReceiverRegister(); |
999 Register name = StoreConvention::NameRegister(); | 999 Register name = StoreDescriptor::NameRegister(); |
1000 Register value = StoreConvention::ValueRegister(); | 1000 Register value = StoreDescriptor::ValueRegister(); |
1001 Register dictionary = a3; | 1001 Register dictionary = a3; |
1002 DCHECK(!AreAliased(value, receiver, name, dictionary, a4, a5)); | 1002 DCHECK(!AreAliased(value, receiver, name, dictionary, a4, a5)); |
1003 | 1003 |
1004 __ ld(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset)); | 1004 __ ld(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset)); |
1005 | 1005 |
1006 GenerateDictionaryStore(masm, &miss, a3, name, value, a4, a5); | 1006 GenerateDictionaryStore(masm, &miss, a3, name, value, a4, a5); |
1007 Counters* counters = masm->isolate()->counters(); | 1007 Counters* counters = masm->isolate()->counters(); |
1008 __ IncrementCounter(counters->store_normal_hit(), 1, a4, a5); | 1008 __ IncrementCounter(counters->store_normal_hit(), 1, a4, a5); |
1009 __ Ret(); | 1009 __ Ret(); |
1010 | 1010 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 patcher.ChangeBranchCondition(ne); | 1106 patcher.ChangeBranchCondition(ne); |
1107 } else { | 1107 } else { |
1108 DCHECK(Assembler::IsBne(branch_instr)); | 1108 DCHECK(Assembler::IsBne(branch_instr)); |
1109 patcher.ChangeBranchCondition(eq); | 1109 patcher.ChangeBranchCondition(eq); |
1110 } | 1110 } |
1111 } | 1111 } |
1112 } | 1112 } |
1113 } // namespace v8::internal | 1113 } // namespace v8::internal |
1114 | 1114 |
1115 #endif // V8_TARGET_ARCH_MIPS64 | 1115 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |