| 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 #include "src/arm64/lithium-codegen-arm64.h" | 7 #include "src/arm64/lithium-codegen-arm64.h" |
| 8 #include "src/arm64/lithium-gap-resolver-arm64.h" | 8 #include "src/arm64/lithium-gap-resolver-arm64.h" |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 3377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3388 __ B(ne, &done); | 3388 __ B(ne, &done); |
| 3389 | 3389 |
| 3390 // Get the prototype from the initial map. | 3390 // Get the prototype from the initial map. |
| 3391 __ Ldr(result, FieldMemOperand(result, Map::kPrototypeOffset)); | 3391 __ Ldr(result, FieldMemOperand(result, Map::kPrototypeOffset)); |
| 3392 | 3392 |
| 3393 // All done. | 3393 // All done. |
| 3394 __ Bind(&done); | 3394 __ Bind(&done); |
| 3395 } | 3395 } |
| 3396 | 3396 |
| 3397 | 3397 |
| 3398 void LCodeGen::DoLoadGlobalCell(LLoadGlobalCell* instr) { | |
| 3399 Register result = ToRegister(instr->result()); | |
| 3400 __ Mov(result, Operand(Handle<Object>(instr->hydrogen()->cell().handle()))); | |
| 3401 __ Ldr(result, FieldMemOperand(result, Cell::kValueOffset)); | |
| 3402 if (instr->hydrogen()->RequiresHoleCheck()) { | |
| 3403 DeoptimizeIfRoot(result, Heap::kTheHoleValueRootIndex, instr, | |
| 3404 Deoptimizer::kHole); | |
| 3405 } | |
| 3406 } | |
| 3407 | |
| 3408 | |
| 3409 template <class T> | 3398 template <class T> |
| 3410 void LCodeGen::EmitVectorLoadICRegisters(T* instr) { | 3399 void LCodeGen::EmitVectorLoadICRegisters(T* instr) { |
| 3411 DCHECK(FLAG_vector_ics); | 3400 DCHECK(FLAG_vector_ics); |
| 3412 Register vector_register = ToRegister(instr->temp_vector()); | 3401 Register vector_register = ToRegister(instr->temp_vector()); |
| 3413 Register slot_register = VectorLoadICDescriptor::SlotRegister(); | 3402 Register slot_register = VectorLoadICDescriptor::SlotRegister(); |
| 3414 DCHECK(vector_register.is(VectorLoadICDescriptor::VectorRegister())); | 3403 DCHECK(vector_register.is(VectorLoadICDescriptor::VectorRegister())); |
| 3415 DCHECK(slot_register.is(x0)); | 3404 DCHECK(slot_register.is(x0)); |
| 3416 | 3405 |
| 3417 AllowDeferredHandleDereference vector_structure_check; | 3406 AllowDeferredHandleDereference vector_structure_check; |
| 3418 Handle<TypeFeedbackVector> vector = instr->hydrogen()->feedback_vector(); | 3407 Handle<TypeFeedbackVector> vector = instr->hydrogen()->feedback_vector(); |
| (...skipping 1756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5175 scratch, | 5164 scratch, |
| 5176 GetLinkRegisterState(), | 5165 GetLinkRegisterState(), |
| 5177 kSaveFPRegs, | 5166 kSaveFPRegs, |
| 5178 EMIT_REMEMBERED_SET, | 5167 EMIT_REMEMBERED_SET, |
| 5179 check_needed); | 5168 check_needed); |
| 5180 } | 5169 } |
| 5181 __ Bind(&skip_assignment); | 5170 __ Bind(&skip_assignment); |
| 5182 } | 5171 } |
| 5183 | 5172 |
| 5184 | 5173 |
| 5185 void LCodeGen::DoStoreGlobalCell(LStoreGlobalCell* instr) { | |
| 5186 Register value = ToRegister(instr->value()); | |
| 5187 Register cell = ToRegister(instr->temp1()); | |
| 5188 | |
| 5189 // Load the cell. | |
| 5190 __ Mov(cell, Operand(instr->hydrogen()->cell().handle())); | |
| 5191 | |
| 5192 // If the cell we are storing to contains the hole it could have | |
| 5193 // been deleted from the property dictionary. In that case, we need | |
| 5194 // to update the property details in the property dictionary to mark | |
| 5195 // it as no longer deleted. We deoptimize in that case. | |
| 5196 if (instr->hydrogen()->RequiresHoleCheck()) { | |
| 5197 Register payload = ToRegister(instr->temp2()); | |
| 5198 __ Ldr(payload, FieldMemOperand(cell, Cell::kValueOffset)); | |
| 5199 DeoptimizeIfRoot(payload, Heap::kTheHoleValueRootIndex, instr, | |
| 5200 Deoptimizer::kHole); | |
| 5201 } | |
| 5202 | |
| 5203 // Store the value. | |
| 5204 __ Str(value, FieldMemOperand(cell, Cell::kValueOffset)); | |
| 5205 // Cells are always rescanned, so no write barrier here. | |
| 5206 } | |
| 5207 | |
| 5208 | |
| 5209 void LCodeGen::DoStoreKeyedExternal(LStoreKeyedExternal* instr) { | 5174 void LCodeGen::DoStoreKeyedExternal(LStoreKeyedExternal* instr) { |
| 5210 Register ext_ptr = ToRegister(instr->elements()); | 5175 Register ext_ptr = ToRegister(instr->elements()); |
| 5211 Register key = no_reg; | 5176 Register key = no_reg; |
| 5212 Register scratch; | 5177 Register scratch; |
| 5213 ElementsKind elements_kind = instr->elements_kind(); | 5178 ElementsKind elements_kind = instr->elements_kind(); |
| 5214 | 5179 |
| 5215 bool key_is_smi = instr->hydrogen()->key()->representation().IsSmi(); | 5180 bool key_is_smi = instr->hydrogen()->key()->representation().IsSmi(); |
| 5216 bool key_is_constant = instr->key()->IsConstantOperand(); | 5181 bool key_is_constant = instr->key()->IsConstantOperand(); |
| 5217 int constant_key = 0; | 5182 int constant_key = 0; |
| 5218 if (key_is_constant) { | 5183 if (key_is_constant) { |
| (...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6097 Handle<ScopeInfo> scope_info = instr->scope_info(); | 6062 Handle<ScopeInfo> scope_info = instr->scope_info(); |
| 6098 __ Push(scope_info); | 6063 __ Push(scope_info); |
| 6099 __ Push(ToRegister(instr->function())); | 6064 __ Push(ToRegister(instr->function())); |
| 6100 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6065 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 6101 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6066 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 6102 } | 6067 } |
| 6103 | 6068 |
| 6104 | 6069 |
| 6105 | 6070 |
| 6106 } } // namespace v8::internal | 6071 } } // namespace v8::internal |
| OLD | NEW |