| 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 #ifndef V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ | 5 #ifndef V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ |
| 6 #define V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ | 6 #define V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ |
| 7 | 7 |
| 8 #include "src/compiler/instruction.h" | 8 #include "src/compiler/instruction.h" |
| 9 #include "src/compiler/instruction-selector.h" | 9 #include "src/compiler/instruction-selector.h" |
| 10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 reg.code(), GetVReg(node))); | 61 reg.code(), GetVReg(node))); |
| 62 } | 62 } |
| 63 | 63 |
| 64 InstructionOperand DefineAsConstant(Node* node) { | 64 InstructionOperand DefineAsConstant(Node* node) { |
| 65 selector()->MarkAsDefined(node); | 65 selector()->MarkAsDefined(node); |
| 66 int virtual_register = GetVReg(node); | 66 int virtual_register = GetVReg(node); |
| 67 sequence()->AddConstant(virtual_register, ToConstant(node)); | 67 sequence()->AddConstant(virtual_register, ToConstant(node)); |
| 68 return ConstantOperand(virtual_register); | 68 return ConstantOperand(virtual_register); |
| 69 } | 69 } |
| 70 | 70 |
| 71 InstructionOperand DefineAsLocation(Node* node, LinkageLocation location, | 71 InstructionOperand DefineAsLocation(Node* node, LinkageLocation location) { |
| 72 MachineRepresentation rep) { | 72 return Define(node, ToUnallocatedOperand(location, GetVReg(node))); |
| 73 return Define(node, ToUnallocatedOperand(location, rep, GetVReg(node))); | |
| 74 } | 73 } |
| 75 | 74 |
| 76 InstructionOperand DefineAsDualLocation(Node* node, | 75 InstructionOperand DefineAsDualLocation(Node* node, |
| 77 LinkageLocation primary_location, | 76 LinkageLocation primary_location, |
| 78 LinkageLocation secondary_location) { | 77 LinkageLocation secondary_location) { |
| 79 return Define(node, | 78 return Define(node, |
| 80 ToDualLocationUnallocatedOperand( | 79 ToDualLocationUnallocatedOperand( |
| 81 primary_location, secondary_location, GetVReg(node))); | 80 primary_location, secondary_location, GetVReg(node))); |
| 82 } | 81 } |
| 83 | 82 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 } else { | 136 } else { |
| 138 return ExplicitOperand(LocationOperand::STACK_SLOT, rep, | 137 return ExplicitOperand(LocationOperand::STACK_SLOT, rep, |
| 139 location.GetLocation()); | 138 location.GetLocation()); |
| 140 } | 139 } |
| 141 } | 140 } |
| 142 | 141 |
| 143 InstructionOperand UseImmediate(Node* node) { | 142 InstructionOperand UseImmediate(Node* node) { |
| 144 return sequence()->AddImmediate(ToConstant(node)); | 143 return sequence()->AddImmediate(ToConstant(node)); |
| 145 } | 144 } |
| 146 | 145 |
| 147 InstructionOperand UseLocation(Node* node, LinkageLocation location, | 146 InstructionOperand UseLocation(Node* node, LinkageLocation location) { |
| 148 MachineRepresentation rep) { | 147 return Use(node, ToUnallocatedOperand(location, GetVReg(node))); |
| 149 return Use(node, ToUnallocatedOperand(location, rep, GetVReg(node))); | |
| 150 } | 148 } |
| 151 | 149 |
| 152 // Used to force gap moves from the from_location to the to_location | 150 // Used to force gap moves from the from_location to the to_location |
| 153 // immediately before an instruction. | 151 // immediately before an instruction. |
| 154 InstructionOperand UsePointerLocation(LinkageLocation to_location, | 152 InstructionOperand UsePointerLocation(LinkageLocation to_location, |
| 155 LinkageLocation from_location) { | 153 LinkageLocation from_location) { |
| 156 MachineRepresentation rep = MachineType::PointerRepresentation(); | |
| 157 UnallocatedOperand casted_from_operand = | 154 UnallocatedOperand casted_from_operand = |
| 158 UnallocatedOperand::cast(TempLocation(from_location, rep)); | 155 UnallocatedOperand::cast(TempLocation(from_location)); |
| 159 selector_->Emit(kArchNop, casted_from_operand); | 156 selector_->Emit(kArchNop, casted_from_operand); |
| 160 return ToUnallocatedOperand(to_location, rep, | 157 return ToUnallocatedOperand(to_location, |
| 161 casted_from_operand.virtual_register()); | 158 casted_from_operand.virtual_register()); |
| 162 } | 159 } |
| 163 | 160 |
| 164 InstructionOperand TempRegister() { | 161 InstructionOperand TempRegister() { |
| 165 return UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER, | 162 return UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER, |
| 166 UnallocatedOperand::USED_AT_START, | 163 UnallocatedOperand::USED_AT_START, |
| 167 sequence()->NextVirtualRegister()); | 164 sequence()->NextVirtualRegister()); |
| 168 } | 165 } |
| 169 | 166 |
| 170 InstructionOperand TempDoubleRegister() { | 167 InstructionOperand TempDoubleRegister() { |
| 171 UnallocatedOperand op = UnallocatedOperand( | 168 UnallocatedOperand op = UnallocatedOperand( |
| 172 UnallocatedOperand::MUST_HAVE_REGISTER, | 169 UnallocatedOperand::MUST_HAVE_REGISTER, |
| 173 UnallocatedOperand::USED_AT_START, sequence()->NextVirtualRegister()); | 170 UnallocatedOperand::USED_AT_START, sequence()->NextVirtualRegister()); |
| 174 sequence()->MarkAsRepresentation(MachineRepresentation::kFloat64, | 171 sequence()->MarkAsRepresentation(MachineRepresentation::kFloat64, |
| 175 op.virtual_register()); | 172 op.virtual_register()); |
| 176 return op; | 173 return op; |
| 177 } | 174 } |
| 178 | 175 |
| 179 InstructionOperand TempRegister(Register reg) { | 176 InstructionOperand TempRegister(Register reg) { |
| 180 return UnallocatedOperand(UnallocatedOperand::FIXED_REGISTER, reg.code(), | 177 return UnallocatedOperand(UnallocatedOperand::FIXED_REGISTER, reg.code(), |
| 181 InstructionOperand::kInvalidVirtualRegister); | 178 InstructionOperand::kInvalidVirtualRegister); |
| 182 } | 179 } |
| 183 | 180 |
| 184 InstructionOperand TempImmediate(int32_t imm) { | 181 InstructionOperand TempImmediate(int32_t imm) { |
| 185 return sequence()->AddImmediate(Constant(imm)); | 182 return sequence()->AddImmediate(Constant(imm)); |
| 186 } | 183 } |
| 187 | 184 |
| 188 InstructionOperand TempLocation(LinkageLocation location, | 185 InstructionOperand TempLocation(LinkageLocation location) { |
| 189 MachineRepresentation rep) { | 186 return ToUnallocatedOperand(location, sequence()->NextVirtualRegister()); |
| 190 return ToUnallocatedOperand(location, rep, | |
| 191 sequence()->NextVirtualRegister()); | |
| 192 } | 187 } |
| 193 | 188 |
| 194 InstructionOperand Label(BasicBlock* block) { | 189 InstructionOperand Label(BasicBlock* block) { |
| 195 return sequence()->AddImmediate( | 190 return sequence()->AddImmediate( |
| 196 Constant(RpoNumber::FromInt(block->rpo_number()))); | 191 Constant(RpoNumber::FromInt(block->rpo_number()))); |
| 197 } | 192 } |
| 198 | 193 |
| 199 protected: | 194 protected: |
| 200 InstructionSelector* selector() const { return selector_; } | 195 InstructionSelector* selector() const { return selector_; } |
| 201 InstructionSequence* sequence() const { return selector()->sequence(); } | 196 InstructionSequence* sequence() const { return selector()->sequence(); } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 // We only support the primary location being a register and the secondary | 245 // We only support the primary location being a register and the secondary |
| 251 // one a slot. | 246 // one a slot. |
| 252 DCHECK(primary_location.IsRegister() && | 247 DCHECK(primary_location.IsRegister() && |
| 253 secondary_location.IsCalleeFrameSlot()); | 248 secondary_location.IsCalleeFrameSlot()); |
| 254 int reg_id = primary_location.AsRegister(); | 249 int reg_id = primary_location.AsRegister(); |
| 255 int slot_id = secondary_location.AsCalleeFrameSlot(); | 250 int slot_id = secondary_location.AsCalleeFrameSlot(); |
| 256 return UnallocatedOperand(reg_id, slot_id, virtual_register); | 251 return UnallocatedOperand(reg_id, slot_id, virtual_register); |
| 257 } | 252 } |
| 258 | 253 |
| 259 UnallocatedOperand ToUnallocatedOperand(LinkageLocation location, | 254 UnallocatedOperand ToUnallocatedOperand(LinkageLocation location, |
| 260 MachineRepresentation rep, | |
| 261 int virtual_register) { | 255 int virtual_register) { |
| 262 if (location.IsAnyRegister()) { | 256 if (location.IsAnyRegister()) { |
| 263 // any machine register. | 257 // any machine register. |
| 264 return UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER, | 258 return UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER, |
| 265 virtual_register); | 259 virtual_register); |
| 266 } | 260 } |
| 267 if (location.IsCallerFrameSlot()) { | 261 if (location.IsCallerFrameSlot()) { |
| 268 // a location on the caller frame. | 262 // a location on the caller frame. |
| 269 return UnallocatedOperand(UnallocatedOperand::FIXED_SLOT, | 263 return UnallocatedOperand(UnallocatedOperand::FIXED_SLOT, |
| 270 location.AsCallerFrameSlot(), virtual_register); | 264 location.AsCallerFrameSlot(), virtual_register); |
| 271 } | 265 } |
| 272 if (location.IsCalleeFrameSlot()) { | 266 if (location.IsCalleeFrameSlot()) { |
| 273 // a spill location on this (callee) frame. | 267 // a spill location on this (callee) frame. |
| 274 return UnallocatedOperand(UnallocatedOperand::FIXED_SLOT, | 268 return UnallocatedOperand(UnallocatedOperand::FIXED_SLOT, |
| 275 location.AsCalleeFrameSlot(), virtual_register); | 269 location.AsCalleeFrameSlot(), virtual_register); |
| 276 } | 270 } |
| 277 // a fixed register. | 271 // a fixed register. |
| 278 if (IsFloatingPoint(rep)) { | 272 if (IsFloatingPoint(location.GetType().representation())) { |
| 279 return UnallocatedOperand(UnallocatedOperand::FIXED_FP_REGISTER, | 273 return UnallocatedOperand(UnallocatedOperand::FIXED_FP_REGISTER, |
| 280 location.AsRegister(), virtual_register); | 274 location.AsRegister(), virtual_register); |
| 281 } | 275 } |
| 282 return UnallocatedOperand(UnallocatedOperand::FIXED_REGISTER, | 276 return UnallocatedOperand(UnallocatedOperand::FIXED_REGISTER, |
| 283 location.AsRegister(), virtual_register); | 277 location.AsRegister(), virtual_register); |
| 284 } | 278 } |
| 285 | 279 |
| 286 InstructionSelector* selector_; | 280 InstructionSelector* selector_; |
| 287 }; | 281 }; |
| 288 | 282 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 // or mode_ == kFlags_set. | 380 // or mode_ == kFlags_set. |
| 387 BasicBlock* true_block_; // Only valid if mode_ == kFlags_branch. | 381 BasicBlock* true_block_; // Only valid if mode_ == kFlags_branch. |
| 388 BasicBlock* false_block_; // Only valid if mode_ == kFlags_branch. | 382 BasicBlock* false_block_; // Only valid if mode_ == kFlags_branch. |
| 389 }; | 383 }; |
| 390 | 384 |
| 391 } // namespace compiler | 385 } // namespace compiler |
| 392 } // namespace internal | 386 } // namespace internal |
| 393 } // namespace v8 | 387 } // namespace v8 |
| 394 | 388 |
| 395 #endif // V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ | 389 #endif // V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ |
| OLD | NEW |