OLD | NEW |
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/base/bits.h" | 6 #include "src/base/bits.h" |
7 #include "src/compiler/instruction-selector-impl.h" | 7 #include "src/compiler/instruction-selector-impl.h" |
8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
10 | 10 |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 static void VisitBinop(InstructionSelector* selector, Node* node, | 345 static void VisitBinop(InstructionSelector* selector, Node* node, |
346 InstructionCode opcode, FlagsContinuation* cont) { | 346 InstructionCode opcode, FlagsContinuation* cont) { |
347 VisitBinop(selector, node, opcode, false, kArchNop, cont); | 347 VisitBinop(selector, node, opcode, false, kArchNop, cont); |
348 } | 348 } |
349 | 349 |
350 static void VisitBinop(InstructionSelector* selector, Node* node, | 350 static void VisitBinop(InstructionSelector* selector, Node* node, |
351 InstructionCode opcode) { | 351 InstructionCode opcode) { |
352 VisitBinop(selector, node, opcode, false, kArchNop); | 352 VisitBinop(selector, node, opcode, false, kArchNop); |
353 } | 353 } |
354 | 354 |
| 355 void InstructionSelector::VisitStackSlot(Node* node) { |
| 356 StackSlotRepresentation rep = StackSlotRepresentationOf(node->op()); |
| 357 int alignment = rep.alignment(); |
| 358 int slot = frame_->AllocateSpillSlot(rep.size(), alignment); |
| 359 OperandGenerator g(this); |
| 360 |
| 361 Emit(kArchStackSlot, g.DefineAsRegister(node), |
| 362 sequence()->AddImmediate(Constant(slot)), |
| 363 sequence()->AddImmediate(Constant(alignment)), 0, nullptr); |
| 364 } |
| 365 |
355 void EmitLoad(InstructionSelector* selector, Node* node, InstructionCode opcode, | 366 void EmitLoad(InstructionSelector* selector, Node* node, InstructionCode opcode, |
356 Node* output = nullptr) { | 367 Node* output = nullptr) { |
357 Mips64OperandGenerator g(selector); | 368 Mips64OperandGenerator g(selector); |
358 Node* base = node->InputAt(0); | 369 Node* base = node->InputAt(0); |
359 Node* index = node->InputAt(1); | 370 Node* index = node->InputAt(1); |
360 | 371 |
361 if (g.CanBeImmediate(index, opcode)) { | 372 if (g.CanBeImmediate(index, opcode)) { |
362 selector->Emit(opcode | AddressingModeField::encode(kMode_MRI), | 373 selector->Emit(opcode | AddressingModeField::encode(kMode_MRI), |
363 g.DefineAsRegister(output == nullptr ? node : output), | 374 g.DefineAsRegister(output == nullptr ? node : output), |
364 g.UseRegister(base), g.UseImmediate(index)); | 375 g.UseRegister(base), g.UseImmediate(index)); |
(...skipping 2577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2942 } else { | 2953 } else { |
2943 DCHECK(kArchVariant == kMips64r2); | 2954 DCHECK(kArchVariant == kMips64r2); |
2944 return MachineOperatorBuilder::AlignmentRequirements:: | 2955 return MachineOperatorBuilder::AlignmentRequirements:: |
2945 NoUnalignedAccessSupport(); | 2956 NoUnalignedAccessSupport(); |
2946 } | 2957 } |
2947 } | 2958 } |
2948 | 2959 |
2949 } // namespace compiler | 2960 } // namespace compiler |
2950 } // namespace internal | 2961 } // namespace internal |
2951 } // namespace v8 | 2962 } // namespace v8 |
OLD | NEW |