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

Side by Side Diff: src/compiler/x64/code-generator-x64.cc

Issue 2023763010: [x64] Make xmm0 allocatable and use xmm15 as scratch register instead. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 6 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
« no previous file with comments | « no previous file | src/crankshaft/x64/lithium-codegen-x64.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/compiler/code-generator.h" 5 #include "src/compiler/code-generator.h"
6 6
7 #include "src/ast/scopes.h" 7 #include "src/ast/scopes.h"
8 #include "src/compiler/code-generator-impl.h" 8 #include "src/compiler/code-generator-impl.h"
9 #include "src/compiler/gap-resolver.h" 9 #include "src/compiler/gap-resolver.h"
10 #include "src/compiler/node-matchers.h" 10 #include "src/compiler/node-matchers.h"
11 #include "src/compiler/osr.h" 11 #include "src/compiler/osr.h"
12 #include "src/x64/assembler-x64.h" 12 #include "src/x64/assembler-x64.h"
13 #include "src/x64/macro-assembler-x64.h" 13 #include "src/x64/macro-assembler-x64.h"
14 14
15 namespace v8 { 15 namespace v8 {
16 namespace internal { 16 namespace internal {
17 namespace compiler { 17 namespace compiler {
18 18
19 #define __ masm()-> 19 #define __ masm()->
20 20
21
22 #define kScratchDoubleReg xmm0
23
24
25 // Adds X64 specific methods for decoding operands. 21 // Adds X64 specific methods for decoding operands.
26 class X64OperandConverter : public InstructionOperandConverter { 22 class X64OperandConverter : public InstructionOperandConverter {
27 public: 23 public:
28 X64OperandConverter(CodeGenerator* gen, Instruction* instr) 24 X64OperandConverter(CodeGenerator* gen, Instruction* instr)
29 : InstructionOperandConverter(gen, instr) {} 25 : InstructionOperandConverter(gen, instr) {}
30 26
31 Immediate InputImmediate(size_t index) { 27 Immediate InputImmediate(size_t index) {
32 return ToImmediate(instr_->InputAt(index)); 28 return ToImmediate(instr_->InputAt(index));
33 } 29 }
34 30
(...skipping 2185 matching lines...) Expand 10 before | Expand all | Expand 10 after
2220 Operand dst = g.ToOperand(destination); 2216 Operand dst = g.ToOperand(destination);
2221 __ Movsd(dst, src); 2217 __ Movsd(dst, src);
2222 } 2218 }
2223 } else if (source->IsFPStackSlot()) { 2219 } else if (source->IsFPStackSlot()) {
2224 DCHECK(destination->IsFPRegister() || destination->IsFPStackSlot()); 2220 DCHECK(destination->IsFPRegister() || destination->IsFPStackSlot());
2225 Operand src = g.ToOperand(source); 2221 Operand src = g.ToOperand(source);
2226 if (destination->IsFPRegister()) { 2222 if (destination->IsFPRegister()) {
2227 XMMRegister dst = g.ToDoubleRegister(destination); 2223 XMMRegister dst = g.ToDoubleRegister(destination);
2228 __ Movsd(dst, src); 2224 __ Movsd(dst, src);
2229 } else { 2225 } else {
2230 // We rely on having xmm0 available as a fixed scratch register.
2231 Operand dst = g.ToOperand(destination); 2226 Operand dst = g.ToOperand(destination);
2232 __ Movsd(xmm0, src); 2227 __ Movsd(kScratchDoubleReg, src);
2233 __ Movsd(dst, xmm0); 2228 __ Movsd(dst, kScratchDoubleReg);
2234 } 2229 }
2235 } else { 2230 } else {
2236 UNREACHABLE(); 2231 UNREACHABLE();
2237 } 2232 }
2238 } 2233 }
2239 2234
2240 2235
2241 void CodeGenerator::AssembleSwap(InstructionOperand* source, 2236 void CodeGenerator::AssembleSwap(InstructionOperand* source,
2242 InstructionOperand* destination) { 2237 InstructionOperand* destination) {
2243 X64OperandConverter g(this, nullptr); 2238 X64OperandConverter g(this, nullptr);
(...skipping 23 matching lines...) Expand all
2267 Operand dst = g.ToOperand(destination); 2262 Operand dst = g.ToOperand(destination);
2268 __ movq(tmp, dst); 2263 __ movq(tmp, dst);
2269 __ pushq(src); 2264 __ pushq(src);
2270 frame_access_state()->IncreaseSPDelta(1); 2265 frame_access_state()->IncreaseSPDelta(1);
2271 src = g.ToOperand(source); 2266 src = g.ToOperand(source);
2272 __ movq(src, tmp); 2267 __ movq(src, tmp);
2273 frame_access_state()->IncreaseSPDelta(-1); 2268 frame_access_state()->IncreaseSPDelta(-1);
2274 dst = g.ToOperand(destination); 2269 dst = g.ToOperand(destination);
2275 __ popq(dst); 2270 __ popq(dst);
2276 } else if (source->IsFPRegister() && destination->IsFPRegister()) { 2271 } else if (source->IsFPRegister() && destination->IsFPRegister()) {
2277 // XMM register-register swap. We rely on having xmm0 2272 // XMM register-register swap.
2278 // available as a fixed scratch register.
2279 XMMRegister src = g.ToDoubleRegister(source); 2273 XMMRegister src = g.ToDoubleRegister(source);
2280 XMMRegister dst = g.ToDoubleRegister(destination); 2274 XMMRegister dst = g.ToDoubleRegister(destination);
2281 __ Movapd(xmm0, src); 2275 __ Movapd(kScratchDoubleReg, src);
2282 __ Movapd(src, dst); 2276 __ Movapd(src, dst);
2283 __ Movapd(dst, xmm0); 2277 __ Movapd(dst, kScratchDoubleReg);
2284 } else if (source->IsFPRegister() && destination->IsFPStackSlot()) { 2278 } else if (source->IsFPRegister() && destination->IsFPStackSlot()) {
2285 // XMM register-memory swap. We rely on having xmm0 2279 // XMM register-memory swap.
2286 // available as a fixed scratch register.
2287 XMMRegister src = g.ToDoubleRegister(source); 2280 XMMRegister src = g.ToDoubleRegister(source);
2288 Operand dst = g.ToOperand(destination); 2281 Operand dst = g.ToOperand(destination);
2289 __ Movsd(xmm0, src); 2282 __ Movsd(kScratchDoubleReg, src);
2290 __ Movsd(src, dst); 2283 __ Movsd(src, dst);
2291 __ Movsd(dst, xmm0); 2284 __ Movsd(dst, kScratchDoubleReg);
2292 } else { 2285 } else {
2293 // No other combinations are possible. 2286 // No other combinations are possible.
2294 UNREACHABLE(); 2287 UNREACHABLE();
2295 } 2288 }
2296 } 2289 }
2297 2290
2298 2291
2299 void CodeGenerator::AssembleJumpTable(Label** targets, size_t target_count) { 2292 void CodeGenerator::AssembleJumpTable(Label** targets, size_t target_count) {
2300 for (size_t index = 0; index < target_count; ++index) { 2293 for (size_t index = 0; index < target_count; ++index) {
2301 __ dq(targets[index]); 2294 __ dq(targets[index]);
(...skipping 14 matching lines...) Expand all
2316 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; 2309 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
2317 __ Nop(padding_size); 2310 __ Nop(padding_size);
2318 } 2311 }
2319 } 2312 }
2320 2313
2321 #undef __ 2314 #undef __
2322 2315
2323 } // namespace compiler 2316 } // namespace compiler
2324 } // namespace internal 2317 } // namespace internal
2325 } // namespace v8 2318 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/crankshaft/x64/lithium-codegen-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698