| 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 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
| 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 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 // Check that the object isn't a smi. | 150 // Check that the object isn't a smi. |
| 151 __ JumpIfSmi(receiver, slow); | 151 __ JumpIfSmi(receiver, slow); |
| 152 | 152 |
| 153 // Get the map of the receiver. | 153 // Get the map of the receiver. |
| 154 __ mov(map, FieldOperand(receiver, HeapObject::kMapOffset)); | 154 __ mov(map, FieldOperand(receiver, HeapObject::kMapOffset)); |
| 155 | 155 |
| 156 // Check bit field. | 156 // Check bit field. |
| 157 __ test_b(FieldOperand(map, Map::kBitFieldOffset), | 157 __ test_b(FieldOperand(map, Map::kBitFieldOffset), |
| 158 (1 << Map::kIsAccessCheckNeeded) | (1 << interceptor_bit)); | 158 (1 << Map::kIsAccessCheckNeeded) | (1 << interceptor_bit)); |
| 159 __ j(not_zero, slow); | 159 __ j(not_zero, slow); |
| 160 // Check that the object is some kind of JS object EXCEPT JS Value type. | 160 // Check that the object is some kind of JS object EXCEPT JS Value type. In |
| 161 // In the case that the object is a value-wrapper object, | 161 // the case that the object is a value-wrapper object, we enter the runtime |
| 162 // we enter the runtime system to make sure that indexing | 162 // system to make sure that indexing into string objects works as intended. |
| 163 // into string objects works as intended. | |
| 164 DCHECK(JS_OBJECT_TYPE > JS_VALUE_TYPE); | 163 DCHECK(JS_OBJECT_TYPE > JS_VALUE_TYPE); |
| 165 | 164 |
| 166 __ CmpInstanceType(map, JS_OBJECT_TYPE); | 165 __ CmpInstanceType(map, JS_OBJECT_TYPE); |
| 167 __ j(below, slow); | 166 __ j(below, slow); |
| 168 } | 167 } |
| 169 | 168 |
| 170 | 169 |
| 171 // Loads an indexed element from a fast case array. | 170 // Loads an indexed element from a fast case array. |
| 172 static void GenerateFastArrayLoad(MacroAssembler* masm, Register receiver, | 171 static void GenerateFastArrayLoad(MacroAssembler* masm, Register receiver, |
| 173 Register key, Register scratch, | 172 Register key, Register scratch, |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 __ mov(edi, FieldOperand(receiver, HeapObject::kMapOffset)); | 531 __ mov(edi, FieldOperand(receiver, HeapObject::kMapOffset)); |
| 533 // Check that the receiver does not require access checks and is not observed. | 532 // Check that the receiver does not require access checks and is not observed. |
| 534 // The generic stub does not perform map checks or handle observed objects. | 533 // The generic stub does not perform map checks or handle observed objects. |
| 535 __ test_b(FieldOperand(edi, Map::kBitFieldOffset), | 534 __ test_b(FieldOperand(edi, Map::kBitFieldOffset), |
| 536 1 << Map::kIsAccessCheckNeeded | 1 << Map::kIsObserved); | 535 1 << Map::kIsAccessCheckNeeded | 1 << Map::kIsObserved); |
| 537 __ j(not_zero, &slow); | 536 __ j(not_zero, &slow); |
| 538 // Check that the key is a smi. | 537 // Check that the key is a smi. |
| 539 __ JumpIfNotSmi(key, &maybe_name_key); | 538 __ JumpIfNotSmi(key, &maybe_name_key); |
| 540 __ CmpInstanceType(edi, JS_ARRAY_TYPE); | 539 __ CmpInstanceType(edi, JS_ARRAY_TYPE); |
| 541 __ j(equal, &array); | 540 __ j(equal, &array); |
| 542 // Check that the object is some kind of JSObject. | 541 // Check that the object is some kind of JS object EXCEPT JS Value type. In |
| 543 __ CmpInstanceType(edi, FIRST_JS_OBJECT_TYPE); | 542 // the case that the object is a value-wrapper object, we enter the runtime |
| 543 // system to make sure that indexing into string objects works as intended. |
| 544 STATIC_ASSERT(JS_VALUE_TYPE < JS_OBJECT_TYPE); |
| 545 __ CmpInstanceType(edi, JS_OBJECT_TYPE); |
| 544 __ j(below, &slow); | 546 __ j(below, &slow); |
| 545 | 547 |
| 546 // Object case: Check key against length in the elements array. | 548 // Object case: Check key against length in the elements array. |
| 547 // Key is a smi. | 549 // Key is a smi. |
| 548 // edi: receiver map | 550 // edi: receiver map |
| 549 __ mov(ebx, FieldOperand(receiver, JSObject::kElementsOffset)); | 551 __ mov(ebx, FieldOperand(receiver, JSObject::kElementsOffset)); |
| 550 // Check array bounds. Both the key and the length of FixedArray are smis. | 552 // Check array bounds. Both the key and the length of FixedArray are smis. |
| 551 __ cmp(key, FieldOperand(ebx, FixedArray::kLengthOffset)); | 553 __ cmp(key, FieldOperand(ebx, FixedArray::kLengthOffset)); |
| 552 __ j(below, &fast_object); | 554 __ j(below, &fast_object); |
| 553 | 555 |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 879 Condition cc = | 881 Condition cc = |
| 880 (check == ENABLE_INLINED_SMI_CHECK) | 882 (check == ENABLE_INLINED_SMI_CHECK) |
| 881 ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) | 883 ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) |
| 882 : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); | 884 : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); |
| 883 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 885 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); |
| 884 } | 886 } |
| 885 } // namespace internal | 887 } // namespace internal |
| 886 } // namespace v8 | 888 } // namespace v8 |
| 887 | 889 |
| 888 #endif // V8_TARGET_ARCH_IA32 | 890 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |