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 |