Chromium Code Reviews| 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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 160 CPURegList copy_to_input = saved_registers; | 160 CPURegList copy_to_input = saved_registers; |
| 161 for (int i = 0; i < saved_registers.Count(); i++) { | 161 for (int i = 0; i < saved_registers.Count(); i++) { |
| 162 __ Peek(x2, i * kPointerSize); | 162 __ Peek(x2, i * kPointerSize); |
| 163 CPURegister current_reg = copy_to_input.PopLowestIndex(); | 163 CPURegister current_reg = copy_to_input.PopLowestIndex(); |
| 164 int offset = (current_reg.code() * kPointerSize) + | 164 int offset = (current_reg.code() * kPointerSize) + |
| 165 FrameDescription::registers_offset(); | 165 FrameDescription::registers_offset(); |
| 166 __ Str(x2, MemOperand(x1, offset)); | 166 __ Str(x2, MemOperand(x1, offset)); |
| 167 } | 167 } |
| 168 | 168 |
| 169 // Copy FP registers to the input frame. | 169 // Copy FP registers to the input frame. |
| 170 CPURegList copy_fp_to_input = saved_fp_registers; | |
| 170 for (int i = 0; i < saved_fp_registers.Count(); i++) { | 171 for (int i = 0; i < saved_fp_registers.Count(); i++) { |
| 171 int dst_offset = FrameDescription::double_registers_offset() + | |
| 172 (i * kDoubleSize); | |
| 173 int src_offset = kFPRegistersOffset + (i * kDoubleSize); | 172 int src_offset = kFPRegistersOffset + (i * kDoubleSize); |
| 174 __ Peek(x2, src_offset); | 173 __ Peek(x2, src_offset); |
| 174 CPURegister reg = copy_fp_to_input.PopLowestIndex(); | |
| 175 int dst_offset = FrameDescription::double_registers_offset() + | |
| 176 (reg.code() * kDoubleSize); | |
|
Jakob Kummerow
2016/03/09 11:07:25
The change here is s/i/reg.code()/. We must not us
| |
| 175 __ Str(x2, MemOperand(x1, dst_offset)); | 177 __ Str(x2, MemOperand(x1, dst_offset)); |
| 176 } | 178 } |
| 177 | 179 |
| 178 // Remove the bailout id and the saved registers from the stack. | 180 // Remove the bailout id and the saved registers from the stack. |
| 179 __ Drop(1 + (kSavedRegistersAreaSize / kXRegSize)); | 181 __ Drop(1 + (kSavedRegistersAreaSize / kXRegSize)); |
| 180 | 182 |
| 181 // Compute a pointer to the unwinding limit in register x2; that is | 183 // Compute a pointer to the unwinding limit in register x2; that is |
| 182 // the first stack slot not part of the input frame. | 184 // the first stack slot not part of the input frame. |
| 183 Register unwind_limit = x2; | 185 Register unwind_limit = x2; |
| 184 __ Ldr(unwind_limit, MemOperand(x1, FrameDescription::frame_size_offset())); | 186 __ Ldr(unwind_limit, MemOperand(x1, FrameDescription::frame_size_offset())); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 233 | 235 |
| 234 __ Add(x0, x0, kPointerSize); | 236 __ Add(x0, x0, kPointerSize); |
| 235 __ Bind(&outer_loop_header); | 237 __ Bind(&outer_loop_header); |
| 236 __ Cmp(x0, x1); | 238 __ Cmp(x0, x1); |
| 237 __ B(lt, &outer_push_loop); | 239 __ B(lt, &outer_push_loop); |
| 238 | 240 |
| 239 __ Ldr(x1, MemOperand(x4, Deoptimizer::input_offset())); | 241 __ Ldr(x1, MemOperand(x4, Deoptimizer::input_offset())); |
| 240 DCHECK(!saved_fp_registers.IncludesAliasOf(crankshaft_fp_scratch) && | 242 DCHECK(!saved_fp_registers.IncludesAliasOf(crankshaft_fp_scratch) && |
| 241 !saved_fp_registers.IncludesAliasOf(fp_zero) && | 243 !saved_fp_registers.IncludesAliasOf(fp_zero) && |
| 242 !saved_fp_registers.IncludesAliasOf(fp_scratch)); | 244 !saved_fp_registers.IncludesAliasOf(fp_scratch)); |
| 243 int src_offset = FrameDescription::double_registers_offset(); | |
| 244 while (!saved_fp_registers.IsEmpty()) { | 245 while (!saved_fp_registers.IsEmpty()) { |
| 245 const CPURegister reg = saved_fp_registers.PopLowestIndex(); | 246 const CPURegister reg = saved_fp_registers.PopLowestIndex(); |
| 247 int src_offset = FrameDescription::double_registers_offset() + | |
| 248 (reg.code() * kDoubleSize); | |
| 246 __ Ldr(reg, MemOperand(x1, src_offset)); | 249 __ Ldr(reg, MemOperand(x1, src_offset)); |
| 247 src_offset += kDoubleSize; | |
| 248 } | 250 } |
| 249 | 251 |
| 250 // Push state from the last output frame. | 252 // Push state from the last output frame. |
| 251 __ Ldr(x6, MemOperand(current_frame, FrameDescription::state_offset())); | 253 __ Ldr(x6, MemOperand(current_frame, FrameDescription::state_offset())); |
| 252 __ Push(x6); | 254 __ Push(x6); |
| 253 | 255 |
| 254 // TODO(all): ARM copies a lot (if not all) of the last output frame onto the | 256 // TODO(all): ARM copies a lot (if not all) of the last output frame onto the |
| 255 // stack, then pops it all into registers. Here, we try to load it directly | 257 // stack, then pops it all into registers. Here, we try to load it directly |
| 256 // into the relevant registers. Is this correct? If so, we should improve the | 258 // into the relevant registers. Is this correct? If so, we should improve the |
| 257 // ARM code. | 259 // ARM code. |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 335 void FrameDescription::SetCallerConstantPool(unsigned offset, intptr_t value) { | 337 void FrameDescription::SetCallerConstantPool(unsigned offset, intptr_t value) { |
| 336 // No embedded constant pool support. | 338 // No embedded constant pool support. |
| 337 UNREACHABLE(); | 339 UNREACHABLE(); |
| 338 } | 340 } |
| 339 | 341 |
| 340 | 342 |
| 341 #undef __ | 343 #undef __ |
| 342 | 344 |
| 343 } // namespace internal | 345 } // namespace internal |
| 344 } // namespace v8 | 346 } // namespace v8 |
| OLD | NEW |