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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 inputs[(*input_count)++] = UseRegister(operand->InputAt(1)); | 148 inputs[(*input_count)++] = UseRegister(operand->InputAt(1)); |
149 return kMode_MR1; | 149 return kMode_MR1; |
150 } | 150 } |
151 } | 151 } |
152 | 152 |
153 bool CanBeBetterLeftOperand(Node* node) const { | 153 bool CanBeBetterLeftOperand(Node* node) const { |
154 return !selector()->IsLive(node); | 154 return !selector()->IsLive(node); |
155 } | 155 } |
156 }; | 156 }; |
157 | 157 |
158 | 158 namespace { |
159 void InstructionSelector::VisitLoad(Node* node) { | 159 ArchOpcode GetLoadOpcode(LoadRepresentation load_rep) { |
160 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); | |
161 X64OperandGenerator g(this); | |
162 | |
163 ArchOpcode opcode = kArchNop; | 160 ArchOpcode opcode = kArchNop; |
164 switch (load_rep.representation()) { | 161 switch (load_rep.representation()) { |
165 case MachineRepresentation::kFloat32: | 162 case MachineRepresentation::kFloat32: |
166 opcode = kX64Movss; | 163 opcode = kX64Movss; |
167 break; | 164 break; |
168 case MachineRepresentation::kFloat64: | 165 case MachineRepresentation::kFloat64: |
169 opcode = kX64Movsd; | 166 opcode = kX64Movsd; |
170 break; | 167 break; |
171 case MachineRepresentation::kBit: // Fall through. | 168 case MachineRepresentation::kBit: // Fall through. |
172 case MachineRepresentation::kWord8: | 169 case MachineRepresentation::kWord8: |
173 opcode = load_rep.IsSigned() ? kX64Movsxbl : kX64Movzxbl; | 170 opcode = load_rep.IsSigned() ? kX64Movsxbl : kX64Movzxbl; |
174 break; | 171 break; |
175 case MachineRepresentation::kWord16: | 172 case MachineRepresentation::kWord16: |
176 opcode = load_rep.IsSigned() ? kX64Movsxwl : kX64Movzxwl; | 173 opcode = load_rep.IsSigned() ? kX64Movsxwl : kX64Movzxwl; |
177 break; | 174 break; |
178 case MachineRepresentation::kWord32: | 175 case MachineRepresentation::kWord32: |
179 opcode = kX64Movl; | 176 opcode = kX64Movl; |
180 break; | 177 break; |
181 case MachineRepresentation::kTaggedSigned: // Fall through. | 178 case MachineRepresentation::kTaggedSigned: // Fall through. |
182 case MachineRepresentation::kTaggedPointer: // Fall through. | 179 case MachineRepresentation::kTaggedPointer: // Fall through. |
183 case MachineRepresentation::kTagged: // Fall through. | 180 case MachineRepresentation::kTagged: // Fall through. |
184 case MachineRepresentation::kWord64: | 181 case MachineRepresentation::kWord64: |
185 opcode = kX64Movq; | 182 opcode = kX64Movq; |
186 break; | 183 break; |
187 case MachineRepresentation::kSimd128: // Fall through. | 184 case MachineRepresentation::kSimd128: // Fall through. |
188 case MachineRepresentation::kNone: | 185 case MachineRepresentation::kNone: |
189 UNREACHABLE(); | 186 UNREACHABLE(); |
190 return; | 187 break; |
191 } | 188 } |
| 189 return opcode; |
| 190 } |
| 191 } // namespace |
192 | 192 |
| 193 void InstructionSelector::VisitLoad(Node* node) { |
| 194 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); |
| 195 X64OperandGenerator g(this); |
| 196 |
| 197 ArchOpcode opcode = GetLoadOpcode(load_rep); |
193 InstructionOperand outputs[1]; | 198 InstructionOperand outputs[1]; |
194 outputs[0] = g.DefineAsRegister(node); | 199 outputs[0] = g.DefineAsRegister(node); |
195 InstructionOperand inputs[3]; | 200 InstructionOperand inputs[3]; |
196 size_t input_count = 0; | 201 size_t input_count = 0; |
197 AddressingMode mode = | 202 AddressingMode mode = |
198 g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count); | 203 g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count); |
199 InstructionCode code = opcode | AddressingModeField::encode(mode); | 204 InstructionCode code = opcode | AddressingModeField::encode(mode); |
200 Emit(code, 1, outputs, input_count, inputs); | 205 Emit(code, 1, outputs, input_count, inputs); |
201 } | 206 } |
202 | 207 |
| 208 void InstructionSelector::VisitProtectedLoad(Node* node) { |
| 209 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); |
| 210 X64OperandGenerator g(this); |
| 211 |
| 212 ArchOpcode opcode = GetLoadOpcode(load_rep); |
| 213 InstructionOperand outputs[1]; |
| 214 outputs[0] = g.DefineAsRegister(node); |
| 215 InstructionOperand inputs[4]; |
| 216 size_t input_count = 0; |
| 217 AddressingMode mode = |
| 218 g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count); |
| 219 // Add the context parameter as an input. |
| 220 inputs[input_count++] = g.UseUniqueRegister(node->InputAt(2)); |
| 221 // Add the source position as an input |
| 222 inputs[input_count++] = g.UseImmediate(node->InputAt(3)); |
| 223 InstructionCode code = opcode | AddressingModeField::encode(mode); |
| 224 Emit(code, 1, outputs, input_count, inputs); |
| 225 } |
203 | 226 |
204 void InstructionSelector::VisitStore(Node* node) { | 227 void InstructionSelector::VisitStore(Node* node) { |
205 X64OperandGenerator g(this); | 228 X64OperandGenerator g(this); |
206 Node* base = node->InputAt(0); | 229 Node* base = node->InputAt(0); |
207 Node* index = node->InputAt(1); | 230 Node* index = node->InputAt(1); |
208 Node* value = node->InputAt(2); | 231 Node* value = node->InputAt(2); |
209 | 232 |
210 StoreRepresentation store_rep = StoreRepresentationOf(node->op()); | 233 StoreRepresentation store_rep = StoreRepresentationOf(node->op()); |
211 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind(); | 234 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind(); |
212 MachineRepresentation rep = store_rep.representation(); | 235 MachineRepresentation rep = store_rep.representation(); |
(...skipping 2037 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2250 // static | 2273 // static |
2251 MachineOperatorBuilder::AlignmentRequirements | 2274 MachineOperatorBuilder::AlignmentRequirements |
2252 InstructionSelector::AlignmentRequirements() { | 2275 InstructionSelector::AlignmentRequirements() { |
2253 return MachineOperatorBuilder::AlignmentRequirements:: | 2276 return MachineOperatorBuilder::AlignmentRequirements:: |
2254 FullUnalignedAccessSupport(); | 2277 FullUnalignedAccessSupport(); |
2255 } | 2278 } |
2256 | 2279 |
2257 } // namespace compiler | 2280 } // namespace compiler |
2258 } // namespace internal | 2281 } // namespace internal |
2259 } // namespace v8 | 2282 } // namespace v8 |
OLD | NEW |