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/arm64/frames-arm64.h" | 5 #include "src/arm64/frames-arm64.h" |
6 #include "src/codegen.h" | 6 #include "src/codegen.h" |
7 #include "src/deoptimizer.h" | 7 #include "src/deoptimizer.h" |
8 #include "src/full-codegen/full-codegen.h" | 8 #include "src/full-codegen/full-codegen.h" |
9 #include "src/register-configuration.h" | 9 #include "src/register-configuration.h" |
10 #include "src/safepoint-table.h" | 10 #include "src/safepoint-table.h" |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 | 89 |
90 void Deoptimizer::TableEntryGenerator::Generate() { | 90 void Deoptimizer::TableEntryGenerator::Generate() { |
91 GeneratePrologue(); | 91 GeneratePrologue(); |
92 | 92 |
93 // TODO(all): This code needs to be revisited. We probably only need to save | 93 // TODO(all): This code needs to be revisited. We probably only need to save |
94 // caller-saved registers here. Callee-saved registers can be stored directly | 94 // caller-saved registers here. Callee-saved registers can be stored directly |
95 // in the input frame. | 95 // in the input frame. |
96 | 96 |
97 // Save all allocatable floating point registers. | 97 // Save all allocatable floating point registers. |
98 CPURegList saved_fp_registers( | 98 CPURegList saved_fp_registers( |
99 CPURegister::kFPRegister, kDRegSizeInBits, | 99 CPURegister::kVRegister, kDRegSizeInBits, |
100 RegisterConfiguration::Crankshaft()->allocatable_double_codes_mask()); | 100 RegisterConfiguration::Crankshaft()->allocatable_double_codes_mask()); |
101 __ PushCPURegList(saved_fp_registers); | 101 __ PushCPURegList(saved_fp_registers); |
102 | 102 |
103 // We save all the registers expcept jssp, sp and lr. | 103 // We save all the registers expcept jssp, sp and lr. |
104 CPURegList saved_registers(CPURegister::kRegister, kXRegSizeInBits, 0, 27); | 104 CPURegList saved_registers(CPURegister::kRegister, kXRegSizeInBits, 0, 27); |
105 saved_registers.Combine(fp); | 105 saved_registers.Combine(fp); |
106 __ PushCPURegList(saved_registers); | 106 __ PushCPURegList(saved_registers); |
107 | 107 |
108 __ Mov(x3, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); | 108 __ Mov(x3, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); |
109 __ Str(fp, MemOperand(x3)); | 109 __ Str(fp, MemOperand(x3)); |
110 | 110 |
111 const int kSavedRegistersAreaSize = | 111 const int kSavedRegistersAreaSize = |
112 (saved_registers.Count() * kXRegSize) + | 112 (saved_registers.Count() * kXRegSize) + |
113 (saved_fp_registers.Count() * kDRegSize); | 113 (saved_fp_registers.Count() * kDRegSize); |
114 | 114 |
115 // Floating point registers are saved on the stack above core registers. | 115 // Floating point registers are saved on the stack above core registers. |
116 const int kFPRegistersOffset = saved_registers.Count() * kXRegSize; | 116 const int kVRegistersOffset = saved_registers.Count() * kXRegSize; |
117 | 117 |
118 // Get the bailout id from the stack. | 118 // Get the bailout id from the stack. |
119 Register bailout_id = x2; | 119 Register bailout_id = x2; |
120 __ Peek(bailout_id, kSavedRegistersAreaSize); | 120 __ Peek(bailout_id, kSavedRegistersAreaSize); |
121 | 121 |
122 Register code_object = x3; | 122 Register code_object = x3; |
123 Register fp_to_sp = x4; | 123 Register fp_to_sp = x4; |
124 // Get the address of the location in the code object. This is the return | 124 // Get the address of the location in the code object. This is the return |
125 // address for lazy deoptimization. | 125 // address for lazy deoptimization. |
126 __ Mov(code_object, lr); | 126 __ Mov(code_object, lr); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 __ Peek(x2, i * kPointerSize); | 161 __ Peek(x2, i * kPointerSize); |
162 CPURegister current_reg = copy_to_input.PopLowestIndex(); | 162 CPURegister current_reg = copy_to_input.PopLowestIndex(); |
163 int offset = (current_reg.code() * kPointerSize) + | 163 int offset = (current_reg.code() * kPointerSize) + |
164 FrameDescription::registers_offset(); | 164 FrameDescription::registers_offset(); |
165 __ Str(x2, MemOperand(x1, offset)); | 165 __ Str(x2, MemOperand(x1, offset)); |
166 } | 166 } |
167 | 167 |
168 // Copy FP registers to the input frame. | 168 // Copy FP registers to the input frame. |
169 CPURegList copy_fp_to_input = saved_fp_registers; | 169 CPURegList copy_fp_to_input = saved_fp_registers; |
170 for (int i = 0; i < saved_fp_registers.Count(); i++) { | 170 for (int i = 0; i < saved_fp_registers.Count(); i++) { |
171 int src_offset = kFPRegistersOffset + (i * kDoubleSize); | 171 int src_offset = kVRegistersOffset + (i * kDoubleSize); |
172 __ Peek(x2, src_offset); | 172 __ Peek(x2, src_offset); |
173 CPURegister reg = copy_fp_to_input.PopLowestIndex(); | 173 CPURegister reg = copy_fp_to_input.PopLowestIndex(); |
174 int dst_offset = FrameDescription::double_registers_offset() + | 174 int dst_offset = FrameDescription::double_registers_offset() + |
175 (reg.code() * kDoubleSize); | 175 (reg.code() * kDoubleSize); |
176 __ Str(x2, MemOperand(x1, dst_offset)); | 176 __ Str(x2, MemOperand(x1, dst_offset)); |
177 } | 177 } |
178 | 178 |
179 // Remove the bailout id and the saved registers from the stack. | 179 // Remove the bailout id and the saved registers from the stack. |
180 __ Drop(1 + (kSavedRegistersAreaSize / kXRegSize)); | 180 __ Drop(1 + (kSavedRegistersAreaSize / kXRegSize)); |
181 | 181 |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 void FrameDescription::SetCallerConstantPool(unsigned offset, intptr_t value) { | 339 void FrameDescription::SetCallerConstantPool(unsigned offset, intptr_t value) { |
340 // No embedded constant pool support. | 340 // No embedded constant pool support. |
341 UNREACHABLE(); | 341 UNREACHABLE(); |
342 } | 342 } |
343 | 343 |
344 | 344 |
345 #undef __ | 345 #undef __ |
346 | 346 |
347 } // namespace internal | 347 } // namespace internal |
348 } // namespace v8 | 348 } // namespace v8 |
OLD | NEW |