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

Side by Side Diff: src/compiler/ppc/instruction-selector-ppc.cc

Issue 1431923003: PPC: [turbofan] Avoid unnecessary write barriers and improve code generation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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 | « src/compiler/ppc/instruction-codes-ppc.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/base/adapters.h" 5 #include "src/base/adapters.h"
6 #include "src/compiler/instruction-selector-impl.h" 6 #include "src/compiler/instruction-selector-impl.h"
7 #include "src/compiler/node-matchers.h" 7 #include "src/compiler/node-matchers.h"
8 #include "src/compiler/node-properties.h" 8 #include "src/compiler/node-properties.h"
9 #include "src/ppc/frames-ppc.h" 9 #include "src/ppc/frames-ppc.h"
10 10
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 } 198 }
199 199
200 200
201 void InstructionSelector::VisitStore(Node* node) { 201 void InstructionSelector::VisitStore(Node* node) {
202 PPCOperandGenerator g(this); 202 PPCOperandGenerator g(this);
203 Node* base = node->InputAt(0); 203 Node* base = node->InputAt(0);
204 Node* offset = node->InputAt(1); 204 Node* offset = node->InputAt(1);
205 Node* value = node->InputAt(2); 205 Node* value = node->InputAt(2);
206 206
207 StoreRepresentation store_rep = OpParameter<StoreRepresentation>(node); 207 StoreRepresentation store_rep = OpParameter<StoreRepresentation>(node);
208 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind();
208 MachineType rep = RepresentationOf(store_rep.machine_type()); 209 MachineType rep = RepresentationOf(store_rep.machine_type());
209 if (store_rep.write_barrier_kind() == kFullWriteBarrier) { 210
210 DCHECK(rep == kRepTagged); 211 // TODO(ppc): I guess this could be done in a better way.
211 // TODO(dcarney): refactor RecordWrite function to take temp registers 212 if (write_barrier_kind != kNoWriteBarrier) {
212 // and pass them here instead of using fixed regs 213 DCHECK_EQ(kRepTagged, rep);
213 // TODO(dcarney): handle immediate indices. 214 InstructionOperand inputs[3];
214 InstructionOperand temps[] = {g.TempRegister(r8), g.TempRegister(r9)}; 215 size_t input_count = 0;
215 Emit(kPPC_StoreWriteBarrier, g.NoOutput(), g.UseFixed(base, r7), 216 inputs[input_count++] = g.UseUniqueRegister(base);
216 g.UseFixed(offset, r8), g.UseFixed(value, r9), arraysize(temps), 217 inputs[input_count++] = g.UseUniqueRegister(offset);
217 temps); 218 inputs[input_count++] = (write_barrier_kind == kMapWriteBarrier)
218 return; 219 ? g.UseRegister(value)
219 } 220 : g.UseUniqueRegister(value);
220 DCHECK_EQ(kNoWriteBarrier, store_rep.write_barrier_kind()); 221 RecordWriteMode record_write_mode = RecordWriteMode::kValueIsAny;
221 ArchOpcode opcode; 222 switch (write_barrier_kind) {
222 ImmediateMode mode = kInt16Imm; 223 case kNoWriteBarrier:
223 switch (rep) { 224 UNREACHABLE();
224 case kRepFloat32: 225 break;
225 opcode = kPPC_StoreFloat32; 226 case kMapWriteBarrier:
226 break; 227 record_write_mode = RecordWriteMode::kValueIsMap;
227 case kRepFloat64: 228 break;
228 opcode = kPPC_StoreDouble; 229 case kPointerWriteBarrier:
229 break; 230 record_write_mode = RecordWriteMode::kValueIsPointer;
230 case kRepBit: // Fall through. 231 break;
231 case kRepWord8: 232 case kFullWriteBarrier:
232 opcode = kPPC_StoreWord8; 233 record_write_mode = RecordWriteMode::kValueIsAny;
233 break; 234 break;
234 case kRepWord16: 235 }
235 opcode = kPPC_StoreWord16; 236 InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()};
236 break; 237 size_t const temp_count = arraysize(temps);
238 InstructionCode code = kArchStoreWithWriteBarrier;
239 code |= MiscField::encode(static_cast<int>(record_write_mode));
240 Emit(code, 0, nullptr, input_count, inputs, temp_count, temps);
241 } else {
242 ArchOpcode opcode;
243 ImmediateMode mode = kInt16Imm;
244 switch (rep) {
245 case kRepFloat32:
246 opcode = kPPC_StoreFloat32;
247 break;
248 case kRepFloat64:
249 opcode = kPPC_StoreDouble;
250 break;
251 case kRepBit: // Fall through.
252 case kRepWord8:
253 opcode = kPPC_StoreWord8;
254 break;
255 case kRepWord16:
256 opcode = kPPC_StoreWord16;
257 break;
237 #if !V8_TARGET_ARCH_PPC64 258 #if !V8_TARGET_ARCH_PPC64
238 case kRepTagged: // Fall through. 259 case kRepTagged: // Fall through.
239 #endif 260 #endif
240 case kRepWord32: 261 case kRepWord32:
241 opcode = kPPC_StoreWord32; 262 opcode = kPPC_StoreWord32;
242 break; 263 break;
243 #if V8_TARGET_ARCH_PPC64 264 #if V8_TARGET_ARCH_PPC64
244 case kRepTagged: // Fall through. 265 case kRepTagged: // Fall through.
245 case kRepWord64: 266 case kRepWord64:
246 opcode = kPPC_StoreWord64; 267 opcode = kPPC_StoreWord64;
247 mode = kInt16Imm_4ByteAligned; 268 mode = kInt16Imm_4ByteAligned;
248 break; 269 break;
249 #endif 270 #endif
250 default: 271 default:
251 UNREACHABLE(); 272 UNREACHABLE();
252 return; 273 return;
253 } 274 }
254 if (g.CanBeImmediate(offset, mode)) { 275 if (g.CanBeImmediate(offset, mode)) {
255 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), 276 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
256 g.UseRegister(base), g.UseImmediate(offset), g.UseRegister(value)); 277 g.UseRegister(base), g.UseImmediate(offset), g.UseRegister(value));
257 } else if (g.CanBeImmediate(base, mode)) { 278 } else if (g.CanBeImmediate(base, mode)) {
258 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), 279 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
259 g.UseRegister(offset), g.UseImmediate(base), g.UseRegister(value)); 280 g.UseRegister(offset), g.UseImmediate(base), g.UseRegister(value));
260 } else { 281 } else {
261 Emit(opcode | AddressingModeField::encode(kMode_MRR), g.NoOutput(), 282 Emit(opcode | AddressingModeField::encode(kMode_MRR), g.NoOutput(),
262 g.UseRegister(base), g.UseRegister(offset), g.UseRegister(value)); 283 g.UseRegister(base), g.UseRegister(offset), g.UseRegister(value));
284 }
263 } 285 }
264 } 286 }
265 287
266 288
267 void InstructionSelector::VisitCheckedLoad(Node* node) { 289 void InstructionSelector::VisitCheckedLoad(Node* node) {
268 MachineType rep = RepresentationOf(OpParameter<MachineType>(node)); 290 MachineType rep = RepresentationOf(OpParameter<MachineType>(node));
269 MachineType typ = TypeOf(OpParameter<MachineType>(node)); 291 MachineType typ = TypeOf(OpParameter<MachineType>(node));
270 PPCOperandGenerator g(this); 292 PPCOperandGenerator g(this);
271 Node* const base = node->InputAt(0); 293 Node* const base = node->InputAt(0);
272 Node* const offset = node->InputAt(1); 294 Node* const offset = node->InputAt(1);
(...skipping 1316 matching lines...) Expand 10 before | Expand all | Expand 10 after
1589 return MachineOperatorBuilder::kFloat64RoundDown | 1611 return MachineOperatorBuilder::kFloat64RoundDown |
1590 MachineOperatorBuilder::kFloat64RoundTruncate | 1612 MachineOperatorBuilder::kFloat64RoundTruncate |
1591 MachineOperatorBuilder::kFloat64RoundTiesAway | 1613 MachineOperatorBuilder::kFloat64RoundTiesAway |
1592 MachineOperatorBuilder::kWord32Popcnt; 1614 MachineOperatorBuilder::kWord32Popcnt;
1593 // We omit kWord32ShiftIsSafe as s[rl]w use 0x3f as a mask rather than 0x1f. 1615 // We omit kWord32ShiftIsSafe as s[rl]w use 0x3f as a mask rather than 0x1f.
1594 } 1616 }
1595 1617
1596 } // namespace compiler 1618 } // namespace compiler
1597 } // namespace internal 1619 } // namespace internal
1598 } // namespace v8 1620 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/ppc/instruction-codes-ppc.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698