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/compiler/instruction-selector-impl.h" | 5 #include "src/compiler/instruction-selector-impl.h" |
6 #include "src/compiler/node-matchers.h" | 6 #include "src/compiler/node-matchers.h" |
7 | 7 |
8 namespace v8 { | 8 namespace v8 { |
9 namespace internal { | 9 namespace internal { |
10 namespace compiler { | 10 namespace compiler { |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 case kRepFloat32: | 223 case kRepFloat32: |
224 opcode = kCheckedLoadFloat32; | 224 opcode = kCheckedLoadFloat32; |
225 break; | 225 break; |
226 case kRepFloat64: | 226 case kRepFloat64: |
227 opcode = kCheckedLoadFloat64; | 227 opcode = kCheckedLoadFloat64; |
228 break; | 228 break; |
229 default: | 229 default: |
230 UNREACHABLE(); | 230 UNREACHABLE(); |
231 return; | 231 return; |
232 } | 232 } |
233 if (offset->opcode() == IrOpcode::kInt32Add && CanCover(node, offset)) { | |
234 Int32Matcher mlength(length); | |
235 Int32BinopMatcher moffset(offset); | |
236 if (mlength.HasValue() && moffset.right().HasValue() && | |
237 mlength.Value() > moffset.right().Value()) { | |
238 InstructionOperand* offset_operand = g.UseRegister(moffset.left().node()); | |
239 InstructionOperand* length_operand = | |
240 g.TempImmediate(mlength.Value() - moffset.right().Value()); | |
241 Emit(opcode | AddressingModeField::encode(kMode_MR1I), | |
242 g.DefineAsRegister(node), offset_operand, length_operand, | |
243 g.UseRegister(buffer), offset_operand, | |
244 g.UseImmediate(moffset.right().node())); | |
245 return; | |
246 } | |
247 } | |
248 InstructionOperand* offset_operand = g.UseRegister(offset); | 233 InstructionOperand* offset_operand = g.UseRegister(offset); |
249 InstructionOperand* length_operand = | 234 InstructionOperand* length_operand = |
250 g.CanBeImmediate(length) ? g.UseImmediate(length) : g.UseRegister(length); | 235 g.CanBeImmediate(length) ? g.UseImmediate(length) : g.UseRegister(length); |
251 Emit(opcode | AddressingModeField::encode(kMode_MR1), | 236 Emit(opcode | AddressingModeField::encode(kMode_MR1), |
252 g.DefineAsRegister(node), offset_operand, length_operand, | 237 g.DefineAsRegister(node), offset_operand, length_operand, |
253 g.UseRegister(buffer), offset_operand); | 238 g.UseRegister(buffer), offset_operand); |
254 } | 239 } |
255 | 240 |
256 | 241 |
257 void InstructionSelector::VisitCheckedStore(Node* node) { | 242 void InstructionSelector::VisitCheckedStore(Node* node) { |
(...skipping 19 matching lines...) Expand all Loading... |
277 break; | 262 break; |
278 case kRepFloat64: | 263 case kRepFloat64: |
279 opcode = kCheckedStoreFloat64; | 264 opcode = kCheckedStoreFloat64; |
280 break; | 265 break; |
281 default: | 266 default: |
282 UNREACHABLE(); | 267 UNREACHABLE(); |
283 return; | 268 return; |
284 } | 269 } |
285 InstructionOperand* value_operand = | 270 InstructionOperand* value_operand = |
286 g.CanBeImmediate(value) ? g.UseImmediate(value) : g.UseRegister(value); | 271 g.CanBeImmediate(value) ? g.UseImmediate(value) : g.UseRegister(value); |
287 if (offset->opcode() == IrOpcode::kInt32Add && CanCover(node, offset)) { | |
288 Int32Matcher mlength(length); | |
289 Int32BinopMatcher moffset(offset); | |
290 if (mlength.HasValue() && moffset.right().HasValue() && | |
291 mlength.Value() > moffset.right().Value()) { | |
292 InstructionOperand* offset_operand = g.UseRegister(moffset.left().node()); | |
293 InstructionOperand* length_operand = | |
294 g.TempImmediate(mlength.Value() - moffset.right().Value()); | |
295 Emit(opcode | AddressingModeField::encode(kMode_MR1I), nullptr, | |
296 offset_operand, length_operand, value_operand, g.UseRegister(buffer), | |
297 offset_operand, g.UseImmediate(moffset.right().node())); | |
298 return; | |
299 } | |
300 } | |
301 InstructionOperand* offset_operand = g.UseRegister(offset); | 272 InstructionOperand* offset_operand = g.UseRegister(offset); |
302 InstructionOperand* length_operand = | 273 InstructionOperand* length_operand = |
303 g.CanBeImmediate(length) ? g.UseImmediate(length) : g.UseRegister(length); | 274 g.CanBeImmediate(length) ? g.UseImmediate(length) : g.UseRegister(length); |
304 Emit(opcode | AddressingModeField::encode(kMode_MR1), nullptr, offset_operand, | 275 Emit(opcode | AddressingModeField::encode(kMode_MR1), nullptr, offset_operand, |
305 length_operand, value_operand, g.UseRegister(buffer), offset_operand); | 276 length_operand, value_operand, g.UseRegister(buffer), offset_operand); |
306 } | 277 } |
307 | 278 |
308 | 279 |
309 // Shared routine for multiple binary operations. | 280 // Shared routine for multiple binary operations. |
310 static void VisitBinop(InstructionSelector* selector, Node* node, | 281 static void VisitBinop(InstructionSelector* selector, Node* node, |
(...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1314 MachineOperatorBuilder::kFloat64Ceil | | 1285 MachineOperatorBuilder::kFloat64Ceil | |
1315 MachineOperatorBuilder::kFloat64RoundTruncate | | 1286 MachineOperatorBuilder::kFloat64RoundTruncate | |
1316 MachineOperatorBuilder::kWord32ShiftIsSafe; | 1287 MachineOperatorBuilder::kWord32ShiftIsSafe; |
1317 } | 1288 } |
1318 return MachineOperatorBuilder::kNoFlags; | 1289 return MachineOperatorBuilder::kNoFlags; |
1319 } | 1290 } |
1320 | 1291 |
1321 } // namespace compiler | 1292 } // namespace compiler |
1322 } // namespace internal | 1293 } // namespace internal |
1323 } // namespace v8 | 1294 } // namespace v8 |
OLD | NEW |