OLD | NEW |
---|---|
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
8 | 8 |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" |
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
650 // Check that the receiver does not require access checks and is not observed. | 650 // Check that the receiver does not require access checks and is not observed. |
651 // The generic stub does not perform map checks or handle observed objects. | 651 // The generic stub does not perform map checks or handle observed objects. |
652 __ Ldrb(x10, FieldMemOperand(receiver_map, Map::kBitFieldOffset)); | 652 __ Ldrb(x10, FieldMemOperand(receiver_map, Map::kBitFieldOffset)); |
653 __ TestAndBranchIfAnySet( | 653 __ TestAndBranchIfAnySet( |
654 x10, (1 << Map::kIsAccessCheckNeeded) | (1 << Map::kIsObserved), &slow); | 654 x10, (1 << Map::kIsAccessCheckNeeded) | (1 << Map::kIsObserved), &slow); |
655 | 655 |
656 // Check if the object is a JS array or not. | 656 // Check if the object is a JS array or not. |
657 Register instance_type = x10; | 657 Register instance_type = x10; |
658 __ CompareInstanceType(receiver_map, instance_type, JS_ARRAY_TYPE); | 658 __ CompareInstanceType(receiver_map, instance_type, JS_ARRAY_TYPE); |
659 __ B(eq, &array); | 659 __ B(eq, &array); |
660 // Check that the object is some kind of JSObject. | 660 // Check that the object is some kind of JS object EXCEPT JS Value type. In |
661 __ Cmp(instance_type, FIRST_JS_OBJECT_TYPE); | 661 // the case that the object is a value-wrapper object, we enter the runtime |
662 // system to make sure that indexing into string objects works as intended. | |
663 DCHECK(JS_VALUE_TYPE < JS_OBJECT_TYPE); | |
664 __ Cmp(instance_type, JS_OBJECT_TYPE); | |
662 __ B(lt, &slow); | 665 __ B(lt, &slow); |
Jakob Kummerow
2015/07/13 15:00:58
s/lt/lo/ for unsigned comparison
| |
663 | 666 |
664 // Object case: Check key against length in the elements array. | 667 // Object case: Check key against length in the elements array. |
665 __ Ldr(elements, FieldMemOperand(receiver, JSObject::kElementsOffset)); | 668 __ Ldr(elements, FieldMemOperand(receiver, JSObject::kElementsOffset)); |
666 // Check array bounds. Both the key and the length of FixedArray are smis. | 669 // Check array bounds. Both the key and the length of FixedArray are smis. |
667 __ Ldrsw(x10, UntagSmiFieldMemOperand(elements, FixedArray::kLengthOffset)); | 670 __ Ldrsw(x10, UntagSmiFieldMemOperand(elements, FixedArray::kLengthOffset)); |
668 __ Cmp(x10, Operand::UntagSmi(key)); | 671 __ Cmp(x10, Operand::UntagSmi(key)); |
669 __ B(hi, &fast_object); | 672 __ B(hi, &fast_object); |
670 | 673 |
671 | 674 |
672 __ Bind(&slow); | 675 __ Bind(&slow); |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
881 } else { | 884 } else { |
882 DCHECK(to_patch->Mask(TestBranchMask) == TBNZ); | 885 DCHECK(to_patch->Mask(TestBranchMask) == TBNZ); |
883 // This is JumpIfSmi(smi_reg, branch_imm). | 886 // This is JumpIfSmi(smi_reg, branch_imm). |
884 patcher.tbz(smi_reg, 0, branch_imm); | 887 patcher.tbz(smi_reg, 0, branch_imm); |
885 } | 888 } |
886 } | 889 } |
887 } // namespace internal | 890 } // namespace internal |
888 } // namespace v8 | 891 } // namespace v8 |
889 | 892 |
890 #endif // V8_TARGET_ARCH_ARM64 | 893 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |