OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 // Check that the receiver does not require access checks. We need | 417 // Check that the receiver does not require access checks. We need |
418 // to do this because this generic stub does not perform map checks. | 418 // to do this because this generic stub does not perform map checks. |
419 __ testb(FieldOperand(rcx, Map::kBitFieldOffset), | 419 __ testb(FieldOperand(rcx, Map::kBitFieldOffset), |
420 Immediate(1 << Map::kIsAccessCheckNeeded)); | 420 Immediate(1 << Map::kIsAccessCheckNeeded)); |
421 __ j(not_zero, &slow); | 421 __ j(not_zero, &slow); |
422 // Get the key from the stack. | 422 // Get the key from the stack. |
423 __ movq(rbx, Operand(rsp, 1 * kPointerSize)); // 1 ~ return address | 423 __ movq(rbx, Operand(rsp, 1 * kPointerSize)); // 1 ~ return address |
424 // Check that the key is a smi. | 424 // Check that the key is a smi. |
425 __ testl(rbx, Immediate(kSmiTagMask)); | 425 __ testl(rbx, Immediate(kSmiTagMask)); |
426 __ j(not_zero, &slow); | 426 __ j(not_zero, &slow); |
| 427 // If it is a smi, make sure it is zero-extended, so it can be |
| 428 // used as an index in a memory operand. |
| 429 __ movl(rbx, rbx); // Clear the high bits of rbx. |
427 | 430 |
428 __ CmpInstanceType(rcx, JS_ARRAY_TYPE); | 431 __ CmpInstanceType(rcx, JS_ARRAY_TYPE); |
429 __ j(equal, &array); | 432 __ j(equal, &array); |
430 // Check that the object is some kind of JS object. | 433 // Check that the object is some kind of JS object. |
431 __ CmpInstanceType(rcx, FIRST_JS_OBJECT_TYPE); | 434 __ CmpInstanceType(rcx, FIRST_JS_OBJECT_TYPE); |
432 __ j(below, &slow); | 435 __ j(below, &slow); |
433 | 436 |
434 // Object case: Check key against length in the elements array. | 437 // Object case: Check key against length in the elements array. |
435 // rax: value | 438 // rax: value |
436 // rdx: JSObject | 439 // rdx: JSObject |
437 // rbx: index (as a smi) | 440 // rbx: index (as a smi), zero-extended. |
438 __ movq(rcx, FieldOperand(rdx, JSObject::kElementsOffset)); | 441 __ movq(rcx, FieldOperand(rdx, JSObject::kElementsOffset)); |
439 // Check that the object is in fast mode (not dictionary). | 442 // Check that the object is in fast mode (not dictionary). |
440 __ Cmp(FieldOperand(rcx, HeapObject::kMapOffset), Factory::fixed_array_map()); | 443 __ Cmp(FieldOperand(rcx, HeapObject::kMapOffset), Factory::fixed_array_map()); |
441 __ j(not_equal, &slow); | 444 __ j(not_equal, &slow); |
442 // Untag the key (for checking against untagged length in the fixed array). | 445 // Untag the key (for checking against untagged length in the fixed array). |
443 __ movl(rdx, rbx); | 446 __ movl(rdx, rbx); |
444 __ sarl(rdx, Immediate(kSmiTagSize)); | 447 __ sarl(rdx, Immediate(kSmiTagSize)); |
445 __ cmpl(rdx, FieldOperand(rcx, Array::kLengthOffset)); | 448 __ cmpl(rdx, FieldOperand(rcx, Array::kLengthOffset)); |
446 // rax: value | 449 // rax: value |
447 // rcx: FixedArray | 450 // rcx: FixedArray |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
715 | 718 |
716 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { | 719 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { |
717 Generate(masm, ExternalReference(IC_Utility(kStoreIC_Miss))); | 720 Generate(masm, ExternalReference(IC_Utility(kStoreIC_Miss))); |
718 } | 721 } |
719 | 722 |
720 | 723 |
721 #undef __ | 724 #undef __ |
722 | 725 |
723 | 726 |
724 } } // namespace v8::internal | 727 } } // namespace v8::internal |
OLD | NEW |