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

Side by Side Diff: src/arm64/delayed-masm-arm64.cc

Issue 268673003: ARM64: Optimize generated code for gaps (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: use new includes norm Created 6 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 | Annotate | Revision Log
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "src/v8.h"
6
7 #if V8_TARGET_ARCH_ARM64
8
9 #include "src/arm64/delayed-masm-arm64.h"
10 #include "src/arm64/lithium-codegen-arm64.h"
11
12 namespace v8 {
13 namespace internal {
14
15 #define __ ACCESS_MASM(masm_)
16
17
18 void DelayedMasm::StackSlotMove(LOperand* src, LOperand* dst) {
19 ASSERT(src->IsStackSlot());
20 ASSERT(dst->IsStackSlot());
21 MemOperand src_operand = cgen_->ToMemOperand(src);
22 MemOperand dst_operand = cgen_->ToMemOperand(dst);
23 if (pending_ == kStackSlotMove) {
24 ASSERT(pending_pc_ == masm_->pc_offset());
25 UseScratchRegisterScope scope(masm_);
26 DoubleRegister temp1 = scope.AcquireD();
27 DoubleRegister temp2 = scope.AcquireD();
28 switch (MemOperand::AreConsistentForPair(pending_address_src_,
29 src_operand)) {
30 case MemOperand::kNotPair:
31 __ Ldr(temp1, pending_address_src_);
32 __ Ldr(temp2, src_operand);
33 break;
34 case MemOperand::kPairAB:
35 __ Ldp(temp1, temp2, pending_address_src_);
36 break;
37 case MemOperand::kPairBA:
38 __ Ldp(temp2, temp1, src_operand);
39 break;
40 }
41 switch (MemOperand::AreConsistentForPair(pending_address_dst_,
42 dst_operand)) {
43 case MemOperand::kNotPair:
44 __ Str(temp1, pending_address_dst_);
45 __ Str(temp2, dst_operand);
46 break;
47 case MemOperand::kPairAB:
48 __ Stp(temp1, temp2, pending_address_dst_);
49 break;
50 case MemOperand::kPairBA:
51 __ Stp(temp2, temp1, dst_operand);
52 break;
53 }
54 ResetPending();
55 return;
56 }
57
58 EmitPending();
59 pending_ = kStackSlotMove;
60 pending_address_src_ = src_operand;
61 pending_address_dst_ = dst_operand;
62 #ifdef DEBUG
63 pending_pc_ = masm_->pc_offset();
64 #endif
65 }
66
67
68 void DelayedMasm::StoreConstant(uint64_t value, const MemOperand& operand) {
69 if ((pending_ == kStoreConstant) && (value == pending_value_)) {
70 MemOperand::PairResult result =
71 MemOperand::AreConsistentForPair(pending_address_dst_, operand);
72 if (result != MemOperand::kNotPair) {
73 const MemOperand& dst =
74 (result == MemOperand::kPairAB) ?
75 pending_address_dst_ :
76 operand;
77 ASSERT(pending_pc_ == masm_->pc_offset());
78 if (pending_value_ == 0) {
79 __ Stp(xzr, xzr, dst);
80 } else {
81 SetSavedValue(pending_value_);
82 __ Stp(ScratchRegister(), ScratchRegister(), dst);
83 }
84 ResetPending();
85 return;
86 }
87 }
88
89 EmitPending();
90 pending_ = kStoreConstant;
91 pending_address_dst_ = operand;
92 pending_value_ = value;
93 #ifdef DEBUG
94 pending_pc_ = masm_->pc_offset();
95 #endif
96 }
97
98
99 void DelayedMasm::Load(const CPURegister& rd, const MemOperand& operand) {
100 if ((pending_ == kLoad) &&
101 pending_register_.IsSameSizeAndType(rd)) {
102 switch (MemOperand::AreConsistentForPair(pending_address_src_, operand)) {
103 case MemOperand::kNotPair:
104 break;
105 case MemOperand::kPairAB:
106 ASSERT(pending_pc_ == masm_->pc_offset());
107 __ Ldp(pending_register_, rd, pending_address_src_);
108 if (IsScratchRegister(pending_register_) || IsScratchRegister(rd)) {
109 ResetSavedValue();
110 }
111 ResetPending();
112 return;
113 case MemOperand::kPairBA:
114 ASSERT(pending_pc_ == masm_->pc_offset());
115 __ Ldp(rd, pending_register_, operand);
116 if (IsScratchRegister(pending_register_) || IsScratchRegister(rd)) {
117 ResetSavedValue();
118 }
119 ResetPending();
120 return;
121 }
122 }
123
124 EmitPending();
125 pending_ = kLoad;
126 pending_register_ = rd;
127 pending_address_src_ = operand;
128 #ifdef DEBUG
129 pending_pc_ = masm_->pc_offset();
130 #endif
131 }
132
133
134 void DelayedMasm::Store(const CPURegister& rd, const MemOperand& operand) {
135 if ((pending_ == kStore) &&
136 pending_register_.IsSameSizeAndType(rd)) {
137 switch (MemOperand::AreConsistentForPair(pending_address_dst_, operand)) {
138 case MemOperand::kNotPair:
139 break;
140 case MemOperand::kPairAB:
141 ASSERT(pending_pc_ == masm_->pc_offset());
142 __ Stp(pending_register_, rd, pending_address_dst_);
143 ResetPending();
144 return;
145 case MemOperand::kPairBA:
146 ASSERT(pending_pc_ == masm_->pc_offset());
147 __ Stp(rd, pending_register_, operand);
148 ResetPending();
149 return;
150 }
151 }
152
153 EmitPending();
154 pending_ = kStore;
155 pending_register_ = rd;
156 pending_address_dst_ = operand;
157 #ifdef DEBUG
158 pending_pc_ = masm_->pc_offset();
159 #endif
160 }
161
162
163 void DelayedMasm::EmitPending() {
164 ASSERT((pending_ == kNone) || (pending_pc_ == masm_->pc_offset()));
165 switch (pending_) {
166 case kNone:
167 return;
168 case kStoreConstant:
169 if (pending_value_ == 0) {
170 __ Str(xzr, pending_address_dst_);
171 } else {
172 SetSavedValue(pending_value_);
173 __ Str(ScratchRegister(), pending_address_dst_);
174 }
175 break;
176 case kLoad:
177 __ Ldr(pending_register_, pending_address_src_);
178 if (IsScratchRegister(pending_register_)) {
179 ResetSavedValue();
180 }
181 break;
182 case kStore:
183 __ Str(pending_register_, pending_address_dst_);
184 break;
185 case kStackSlotMove: {
186 UseScratchRegisterScope scope(masm_);
187 DoubleRegister temp = scope.AcquireD();
188 __ Ldr(temp, pending_address_src_);
189 __ Str(temp, pending_address_dst_);
190 break;
191 }
192 }
193 ResetPending();
194 }
195
196 } } // namespace v8::internal
197
198 #endif // V8_TARGET_ARCH_ARM64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698