| 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 <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "src/base/adapters.h" | 7 #include "src/base/adapters.h" |
| 8 #include "src/compiler/instruction-selector-impl.h" | 8 #include "src/compiler/instruction-selector-impl.h" |
| 9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
| 10 #include "src/compiler/node-properties.h" | 10 #include "src/compiler/node-properties.h" |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 inputs[(*input_count)++] = UseRegister(index); | 129 inputs[(*input_count)++] = UseRegister(index); |
| 130 } | 130 } |
| 131 } | 131 } |
| 132 } | 132 } |
| 133 return mode; | 133 return mode; |
| 134 } | 134 } |
| 135 | 135 |
| 136 AddressingMode GetEffectiveAddressMemoryOperand(Node* operand, | 136 AddressingMode GetEffectiveAddressMemoryOperand(Node* operand, |
| 137 InstructionOperand inputs[], | 137 InstructionOperand inputs[], |
| 138 size_t* input_count) { | 138 size_t* input_count) { |
| 139 if (selector()->CanAddressRelativeToRootsRegister()) { |
| 140 LoadMatcher<ExternalReferenceMatcher> m(operand); |
| 141 if (m.index().HasValue() && m.object().HasValue()) { |
| 142 Address const kRootsRegisterValue = |
| 143 kRootRegisterBias + |
| 144 reinterpret_cast<Address>( |
| 145 selector()->isolate()->heap()->roots_array_start()); |
| 146 ptrdiff_t const delta = |
| 147 m.index().Value() + |
| 148 (m.object().Value().address() - kRootsRegisterValue); |
| 149 if (is_int32(delta)) { |
| 150 inputs[(*input_count)++] = TempImmediate(static_cast<int32_t>(delta)); |
| 151 return kMode_Root; |
| 152 } |
| 153 } |
| 154 } |
| 139 BaseWithIndexAndDisplacement64Matcher m(operand, AddressOption::kAllowAll); | 155 BaseWithIndexAndDisplacement64Matcher m(operand, AddressOption::kAllowAll); |
| 140 DCHECK(m.matches()); | 156 DCHECK(m.matches()); |
| 141 if ((m.displacement() == nullptr || CanBeImmediate(m.displacement()))) { | 157 if ((m.displacement() == nullptr || CanBeImmediate(m.displacement()))) { |
| 142 return GenerateMemoryOperandInputs( | 158 return GenerateMemoryOperandInputs( |
| 143 m.index(), m.scale(), m.base(), m.displacement(), | 159 m.index(), m.scale(), m.base(), m.displacement(), |
| 144 m.displacement_mode(), inputs, input_count); | 160 m.displacement_mode(), inputs, input_count); |
| 145 } else { | 161 } else { |
| 146 inputs[(*input_count)++] = UseRegister(operand->InputAt(0)); | 162 inputs[(*input_count)++] = UseRegister(operand->InputAt(0)); |
| 147 inputs[(*input_count)++] = UseRegister(operand->InputAt(1)); | 163 inputs[(*input_count)++] = UseRegister(operand->InputAt(1)); |
| 148 return kMode_MR1; | 164 return kMode_MR1; |
| 149 } | 165 } |
| 150 } | 166 } |
| 151 | 167 |
| 152 bool CanBeBetterLeftOperand(Node* node) const { | 168 bool CanBeBetterLeftOperand(Node* node) const { |
| 153 return !selector()->IsLive(node); | 169 return !selector()->IsLive(node); |
| 154 } | 170 } |
| 155 }; | 171 }; |
| 156 | 172 |
| 157 namespace { | 173 namespace { |
| 174 |
| 158 ArchOpcode GetLoadOpcode(LoadRepresentation load_rep) { | 175 ArchOpcode GetLoadOpcode(LoadRepresentation load_rep) { |
| 159 ArchOpcode opcode = kArchNop; | 176 ArchOpcode opcode = kArchNop; |
| 160 switch (load_rep.representation()) { | 177 switch (load_rep.representation()) { |
| 161 case MachineRepresentation::kFloat32: | 178 case MachineRepresentation::kFloat32: |
| 162 opcode = kX64Movss; | 179 opcode = kX64Movss; |
| 163 break; | 180 break; |
| 164 case MachineRepresentation::kFloat64: | 181 case MachineRepresentation::kFloat64: |
| 165 opcode = kX64Movsd; | 182 opcode = kX64Movsd; |
| 166 break; | 183 break; |
| 167 case MachineRepresentation::kBit: // Fall through. | 184 case MachineRepresentation::kBit: // Fall through. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 180 case MachineRepresentation::kWord64: | 197 case MachineRepresentation::kWord64: |
| 181 opcode = kX64Movq; | 198 opcode = kX64Movq; |
| 182 break; | 199 break; |
| 183 case MachineRepresentation::kSimd128: // Fall through. | 200 case MachineRepresentation::kSimd128: // Fall through. |
| 184 case MachineRepresentation::kNone: | 201 case MachineRepresentation::kNone: |
| 185 UNREACHABLE(); | 202 UNREACHABLE(); |
| 186 break; | 203 break; |
| 187 } | 204 } |
| 188 return opcode; | 205 return opcode; |
| 189 } | 206 } |
| 207 |
| 190 } // namespace | 208 } // namespace |
| 191 | 209 |
| 192 void InstructionSelector::VisitLoad(Node* node) { | 210 void InstructionSelector::VisitLoad(Node* node) { |
| 193 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); | 211 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); |
| 194 X64OperandGenerator g(this); | 212 X64OperandGenerator g(this); |
| 195 | 213 |
| 196 ArchOpcode opcode = GetLoadOpcode(load_rep); | 214 ArchOpcode opcode = GetLoadOpcode(load_rep); |
| 197 InstructionOperand outputs[1]; | 215 InstructionOperand outputs[1]; |
| 198 outputs[0] = g.DefineAsRegister(node); | 216 outputs[0] = g.DefineAsRegister(node); |
| 199 InstructionOperand inputs[3]; | 217 InstructionOperand inputs[3]; |
| (...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 716 case kMode_None: | 734 case kMode_None: |
| 717 case kMode_MRI: | 735 case kMode_MRI: |
| 718 case kMode_MR1I: | 736 case kMode_MR1I: |
| 719 case kMode_MR2I: | 737 case kMode_MR2I: |
| 720 case kMode_MR4I: | 738 case kMode_MR4I: |
| 721 case kMode_MR8I: | 739 case kMode_MR8I: |
| 722 case kMode_M1I: | 740 case kMode_M1I: |
| 723 case kMode_M2I: | 741 case kMode_M2I: |
| 724 case kMode_M4I: | 742 case kMode_M4I: |
| 725 case kMode_M8I: | 743 case kMode_M8I: |
| 744 case kMode_Root: |
| 726 UNREACHABLE(); | 745 UNREACHABLE(); |
| 727 } | 746 } |
| 728 inputs[input_count++] = ImmediateOperand(ImmediateOperand::INLINE, 4); | 747 inputs[input_count++] = ImmediateOperand(ImmediateOperand::INLINE, 4); |
| 729 } else { | 748 } else { |
| 730 int32_t displacement = g.GetImmediateIntegerValue(mleft.displacement()); | 749 int32_t displacement = g.GetImmediateIntegerValue(mleft.displacement()); |
| 731 inputs[input_count - 1] = | 750 inputs[input_count - 1] = |
| 732 ImmediateOperand(ImmediateOperand::INLINE, displacement + 4); | 751 ImmediateOperand(ImmediateOperand::INLINE, displacement + 4); |
| 733 } | 752 } |
| 734 InstructionOperand outputs[] = {g.DefineAsRegister(node)}; | 753 InstructionOperand outputs[] = {g.DefineAsRegister(node)}; |
| 735 InstructionCode code = opcode | AddressingModeField::encode(mode); | 754 InstructionCode code = opcode | AddressingModeField::encode(mode); |
| (...skipping 1555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2291 // static | 2310 // static |
| 2292 MachineOperatorBuilder::AlignmentRequirements | 2311 MachineOperatorBuilder::AlignmentRequirements |
| 2293 InstructionSelector::AlignmentRequirements() { | 2312 InstructionSelector::AlignmentRequirements() { |
| 2294 return MachineOperatorBuilder::AlignmentRequirements:: | 2313 return MachineOperatorBuilder::AlignmentRequirements:: |
| 2295 FullUnalignedAccessSupport(); | 2314 FullUnalignedAccessSupport(); |
| 2296 } | 2315 } |
| 2297 | 2316 |
| 2298 } // namespace compiler | 2317 } // namespace compiler |
| 2299 } // namespace internal | 2318 } // namespace internal |
| 2300 } // namespace v8 | 2319 } // namespace v8 |
| OLD | NEW |