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/crankshaft/arm64/lithium-codegen-arm64.h" | 5 #include "src/crankshaft/arm64/lithium-codegen-arm64.h" |
6 | 6 |
7 #include "src/arm64/frames-arm64.h" | 7 #include "src/arm64/frames-arm64.h" |
8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 environment->HasTaggedValueAt(env_offset + i), | 270 environment->HasTaggedValueAt(env_offset + i), |
271 environment->HasUint32ValueAt(env_offset + i), | 271 environment->HasUint32ValueAt(env_offset + i), |
272 object_index_pointer, | 272 object_index_pointer, |
273 dematerialized_index_pointer); | 273 dematerialized_index_pointer); |
274 } | 274 } |
275 return; | 275 return; |
276 } | 276 } |
277 | 277 |
278 if (op->IsStackSlot()) { | 278 if (op->IsStackSlot()) { |
279 int index = op->index(); | 279 int index = op->index(); |
280 if (index >= 0) { | |
281 index += StandardFrameConstants::kFixedFrameSize / kPointerSize; | |
282 } | |
283 if (is_tagged) { | 280 if (is_tagged) { |
284 translation->StoreStackSlot(index); | 281 translation->StoreStackSlot(index); |
285 } else if (is_uint32) { | 282 } else if (is_uint32) { |
286 translation->StoreUint32StackSlot(index); | 283 translation->StoreUint32StackSlot(index); |
287 } else { | 284 } else { |
288 translation->StoreInt32StackSlot(index); | 285 translation->StoreInt32StackSlot(index); |
289 } | 286 } |
290 } else if (op->IsDoubleStackSlot()) { | 287 } else if (op->IsDoubleStackSlot()) { |
291 int index = op->index(); | 288 int index = op->index(); |
292 if (index >= 0) { | |
293 index += StandardFrameConstants::kFixedFrameSize / kPointerSize; | |
294 } | |
295 translation->StoreDoubleStackSlot(index); | 289 translation->StoreDoubleStackSlot(index); |
296 } else if (op->IsRegister()) { | 290 } else if (op->IsRegister()) { |
297 Register reg = ToRegister(op); | 291 Register reg = ToRegister(op); |
298 if (is_tagged) { | 292 if (is_tagged) { |
299 translation->StoreRegister(reg); | 293 translation->StoreRegister(reg); |
300 } else if (is_uint32) { | 294 } else if (is_uint32) { |
301 translation->StoreUint32Register(reg); | 295 translation->StoreUint32Register(reg); |
302 } else { | 296 } else { |
303 translation->StoreInt32Register(reg); | 297 translation->StoreInt32Register(reg); |
304 } | 298 } |
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 if (!is_aborted()) status_ = DONE; | 851 if (!is_aborted()) status_ = DONE; |
858 return !is_aborted(); | 852 return !is_aborted(); |
859 } | 853 } |
860 | 854 |
861 | 855 |
862 bool LCodeGen::GenerateSafepointTable() { | 856 bool LCodeGen::GenerateSafepointTable() { |
863 DCHECK(is_done()); | 857 DCHECK(is_done()); |
864 // We do not know how much data will be emitted for the safepoint table, so | 858 // We do not know how much data will be emitted for the safepoint table, so |
865 // force emission of the veneer pool. | 859 // force emission of the veneer pool. |
866 masm()->CheckVeneerPool(true, true); | 860 masm()->CheckVeneerPool(true, true); |
867 safepoints_.Emit(masm(), GetStackSlotCount()); | 861 safepoints_.Emit(masm(), GetTotalFrameSlotCount()); |
868 return !is_aborted(); | 862 return !is_aborted(); |
869 } | 863 } |
870 | 864 |
871 | 865 |
872 void LCodeGen::FinishCode(Handle<Code> code) { | 866 void LCodeGen::FinishCode(Handle<Code> code) { |
873 DCHECK(is_done()); | 867 DCHECK(is_done()); |
874 code->set_stack_slots(GetStackSlotCount()); | 868 code->set_stack_slots(GetTotalFrameSlotCount()); |
875 code->set_safepoint_table_offset(safepoints_.GetCodeOffset()); | 869 code->set_safepoint_table_offset(safepoints_.GetCodeOffset()); |
876 PopulateDeoptimizationData(code); | 870 PopulateDeoptimizationData(code); |
877 } | 871 } |
878 | 872 |
879 | 873 |
880 void LCodeGen::DeoptimizeBranch( | 874 void LCodeGen::DeoptimizeBranch( |
881 LInstruction* instr, Deoptimizer::DeoptReason deopt_reason, | 875 LInstruction* instr, Deoptimizer::DeoptReason deopt_reason, |
882 BranchType branch_type, Register reg, int bit, | 876 BranchType branch_type, Register reg, int bit, |
883 Deoptimizer::BailoutType* override_bailout_type) { | 877 Deoptimizer::BailoutType* override_bailout_type) { |
884 LEnvironment* environment = instr->environment(); | 878 LEnvironment* environment = instr->environment(); |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1148 return -(index + 1) * kPointerSize; | 1142 return -(index + 1) * kPointerSize; |
1149 } | 1143 } |
1150 | 1144 |
1151 | 1145 |
1152 MemOperand LCodeGen::ToMemOperand(LOperand* op, StackMode stack_mode) const { | 1146 MemOperand LCodeGen::ToMemOperand(LOperand* op, StackMode stack_mode) const { |
1153 DCHECK(op != NULL); | 1147 DCHECK(op != NULL); |
1154 DCHECK(!op->IsRegister()); | 1148 DCHECK(!op->IsRegister()); |
1155 DCHECK(!op->IsDoubleRegister()); | 1149 DCHECK(!op->IsDoubleRegister()); |
1156 DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); | 1150 DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); |
1157 if (NeedsEagerFrame()) { | 1151 if (NeedsEagerFrame()) { |
1158 int fp_offset = StackSlotOffset(op->index()); | 1152 int fp_offset = FrameSlotToFPOffset(op->index()); |
1159 // Loads and stores have a bigger reach in positive offset than negative. | 1153 // Loads and stores have a bigger reach in positive offset than negative. |
1160 // We try to access using jssp (positive offset) first, then fall back to | 1154 // We try to access using jssp (positive offset) first, then fall back to |
1161 // fp (negative offset) if that fails. | 1155 // fp (negative offset) if that fails. |
1162 // | 1156 // |
1163 // We can reference a stack slot from jssp only if we know how much we've | 1157 // We can reference a stack slot from jssp only if we know how much we've |
1164 // put on the stack. We don't know this in the following cases: | 1158 // put on the stack. We don't know this in the following cases: |
1165 // - stack_mode != kCanUseStackPointer: this is the case when deferred | 1159 // - stack_mode != kCanUseStackPointer: this is the case when deferred |
1166 // code has saved the registers. | 1160 // code has saved the registers. |
1167 // - saves_caller_doubles(): some double registers have been pushed, jssp | 1161 // - saves_caller_doubles(): some double registers have been pushed, jssp |
1168 // references the end of the double registers and not the end of the stack | 1162 // references the end of the double registers and not the end of the stack |
1169 // slots. | 1163 // slots. |
1170 // In both of the cases above, we _could_ add the tracking information | 1164 // In both of the cases above, we _could_ add the tracking information |
1171 // required so that we can use jssp here, but in practice it isn't worth it. | 1165 // required so that we can use jssp here, but in practice it isn't worth it. |
1172 if ((stack_mode == kCanUseStackPointer) && | 1166 if ((stack_mode == kCanUseStackPointer) && |
1173 !info()->saves_caller_doubles()) { | 1167 !info()->saves_caller_doubles()) { |
1174 int jssp_offset_to_fp = | 1168 int jssp_offset_to_fp = |
1175 StandardFrameConstants::kFixedFrameSizeFromFp + | 1169 (pushed_arguments_ + GetTotalFrameSlotCount()) * kPointerSize - |
1176 (pushed_arguments_ + GetStackSlotCount()) * kPointerSize; | 1170 StandardFrameConstants::kFixedFrameSizeAboveFp; |
1177 int jssp_offset = fp_offset + jssp_offset_to_fp; | 1171 int jssp_offset = fp_offset + jssp_offset_to_fp; |
1178 if (masm()->IsImmLSScaled(jssp_offset, LSDoubleWord)) { | 1172 if (masm()->IsImmLSScaled(jssp_offset, LSDoubleWord)) { |
1179 return MemOperand(masm()->StackPointer(), jssp_offset); | 1173 return MemOperand(masm()->StackPointer(), jssp_offset); |
1180 } | 1174 } |
1181 } | 1175 } |
1182 return MemOperand(fp, fp_offset); | 1176 return MemOperand(fp, fp_offset); |
1183 } else { | 1177 } else { |
1184 // Retrieve parameter without eager stack-frame relative to the | 1178 // Retrieve parameter without eager stack-frame relative to the |
1185 // stack-pointer. | 1179 // stack-pointer. |
1186 return MemOperand(masm()->StackPointer(), | 1180 return MemOperand(masm()->StackPointer(), |
(...skipping 4553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5740 Handle<ScopeInfo> scope_info = instr->scope_info(); | 5734 Handle<ScopeInfo> scope_info = instr->scope_info(); |
5741 __ Push(scope_info); | 5735 __ Push(scope_info); |
5742 __ Push(ToRegister(instr->function())); | 5736 __ Push(ToRegister(instr->function())); |
5743 CallRuntime(Runtime::kPushBlockContext, instr); | 5737 CallRuntime(Runtime::kPushBlockContext, instr); |
5744 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5738 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5745 } | 5739 } |
5746 | 5740 |
5747 | 5741 |
5748 } // namespace internal | 5742 } // namespace internal |
5749 } // namespace v8 | 5743 } // namespace v8 |
OLD | NEW |