| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 6098 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6109 Label check_inlined_codesize; | 6109 Label check_inlined_codesize; |
| 6110 masm_->bind(&check_inlined_codesize); | 6110 masm_->bind(&check_inlined_codesize); |
| 6111 #endif | 6111 #endif |
| 6112 __ mov(scratch2, Operand(Factory::null_value())); | 6112 __ mov(scratch2, Operand(Factory::null_value())); |
| 6113 __ cmp(scratch1, scratch2); | 6113 __ cmp(scratch1, scratch2); |
| 6114 deferred->Branch(ne); | 6114 deferred->Branch(ne); |
| 6115 | 6115 |
| 6116 // Get the elements array from the receiver and check that it | 6116 // Get the elements array from the receiver and check that it |
| 6117 // is not a dictionary. | 6117 // is not a dictionary. |
| 6118 __ ldr(scratch1, FieldMemOperand(receiver, JSObject::kElementsOffset)); | 6118 __ ldr(scratch1, FieldMemOperand(receiver, JSObject::kElementsOffset)); |
| 6119 __ ldr(scratch2, FieldMemOperand(scratch1, JSObject::kMapOffset)); | 6119 if (FLAG_debug_code) { |
| 6120 __ LoadRoot(ip, Heap::kFixedArrayMapRootIndex); | 6120 __ ldr(scratch2, FieldMemOperand(scratch1, JSObject::kMapOffset)); |
| 6121 __ cmp(scratch2, ip); | 6121 __ LoadRoot(ip, Heap::kFixedArrayMapRootIndex); |
| 6122 deferred->Branch(ne); | 6122 __ cmp(scratch2, ip); |
| 6123 __ Assert(eq, "JSObject with fast elements map has slow elements"); |
| 6124 } |
| 6123 | 6125 |
| 6124 // Check that key is within bounds. Use unsigned comparison to handle | 6126 // Check that key is within bounds. Use unsigned comparison to handle |
| 6125 // negative keys. | 6127 // negative keys. |
| 6126 __ ldr(scratch2, FieldMemOperand(scratch1, FixedArray::kLengthOffset)); | 6128 __ ldr(scratch2, FieldMemOperand(scratch1, FixedArray::kLengthOffset)); |
| 6127 __ cmp(scratch2, key); | 6129 __ cmp(scratch2, key); |
| 6128 deferred->Branch(ls); // Unsigned less equal. | 6130 deferred->Branch(ls); // Unsigned less equal. |
| 6129 | 6131 |
| 6130 // Load and check that the result is not the hole (key is a smi). | 6132 // Load and check that the result is not the hole (key is a smi). |
| 6131 __ LoadRoot(scratch2, Heap::kTheHoleValueRootIndex); | 6133 __ LoadRoot(scratch2, Heap::kTheHoleValueRootIndex); |
| 6132 __ add(scratch1, | 6134 __ add(scratch1, |
| 6133 scratch1, | 6135 scratch1, |
| 6134 Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 6136 Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
| 6135 __ ldr(scratch1, | 6137 __ ldr(scratch1, |
| 6136 MemOperand(scratch1, key, LSL, | 6138 MemOperand(scratch1, key, LSL, |
| 6137 kPointerSizeLog2 - (kSmiTagSize + kSmiShiftSize))); | 6139 kPointerSizeLog2 - (kSmiTagSize + kSmiShiftSize))); |
| 6138 __ cmp(scratch1, scratch2); | 6140 __ cmp(scratch1, scratch2); |
| 6139 deferred->Branch(eq); | 6141 deferred->Branch(eq); |
| 6140 | 6142 |
| 6141 __ mov(r0, scratch1); | 6143 __ mov(r0, scratch1); |
| 6142 // Make sure that the expected number of instructions are generated. | 6144 // Make sure that the expected number of instructions are generated. |
| 6143 ASSERT_EQ(kInlinedKeyedLoadInstructionsAfterPatch, | 6145 ASSERT_EQ(GetInlinedKeyedLoadInstructionsAfterPatch(), |
| 6144 masm_->InstructionsGeneratedSince(&check_inlined_codesize)); | 6146 masm_->InstructionsGeneratedSince(&check_inlined_codesize)); |
| 6145 } | 6147 } |
| 6146 | 6148 |
| 6147 deferred->BindExit(); | 6149 deferred->BindExit(); |
| 6148 } | 6150 } |
| 6149 } | 6151 } |
| 6150 | 6152 |
| 6151 | 6153 |
| 6152 void CodeGenerator::EmitKeyedStore(StaticType* key_type) { | 6154 void CodeGenerator::EmitKeyedStore(StaticType* key_type) { |
| 6153 // Generate inlined version of the keyed store if the code is in a loop | 6155 // Generate inlined version of the keyed store if the code is in a loop |
| (...skipping 4542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10696 __ bind(&string_add_runtime); | 10698 __ bind(&string_add_runtime); |
| 10697 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); | 10699 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); |
| 10698 } | 10700 } |
| 10699 | 10701 |
| 10700 | 10702 |
| 10701 #undef __ | 10703 #undef __ |
| 10702 | 10704 |
| 10703 } } // namespace v8::internal | 10705 } } // namespace v8::internal |
| 10704 | 10706 |
| 10705 #endif // V8_TARGET_ARCH_ARM | 10707 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |