Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(658)

Side by Side Diff: src/arm64/deoptimizer-arm64.cc

Issue 2622643005: ARM64: Add NEON support (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698