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/compiler/instruction-selector-impl.h" | 6 #include "src/compiler/instruction-selector-impl.h" |
7 #include "src/compiler/node-matchers.h" | 7 #include "src/compiler/node-matchers.h" |
8 #include "src/compiler/node-properties.h" | 8 #include "src/compiler/node-properties.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 case MachineRepresentation::kBit: // Fall through. | 388 case MachineRepresentation::kBit: // Fall through. |
389 case MachineRepresentation::kTaggedSigned: // Fall through. | 389 case MachineRepresentation::kTaggedSigned: // Fall through. |
390 case MachineRepresentation::kTaggedPointer: // Fall through. | 390 case MachineRepresentation::kTaggedPointer: // Fall through. |
391 case MachineRepresentation::kTagged: // Fall through. | 391 case MachineRepresentation::kTagged: // Fall through. |
392 case MachineRepresentation::kWord64: // Fall through. | 392 case MachineRepresentation::kWord64: // Fall through. |
393 case MachineRepresentation::kSimd128: // Fall through. | 393 case MachineRepresentation::kSimd128: // Fall through. |
394 case MachineRepresentation::kNone: | 394 case MachineRepresentation::kNone: |
395 UNREACHABLE(); | 395 UNREACHABLE(); |
396 return; | 396 return; |
397 } | 397 } |
| 398 if (offset->opcode() == IrOpcode::kInt32Add && CanCover(node, offset)) { |
| 399 Int32BinopMatcher moffset(offset); |
| 400 InstructionOperand buffer_operand = g.CanBeImmediate(buffer) |
| 401 ? g.UseImmediate(buffer) |
| 402 : g.UseRegister(buffer); |
| 403 Int32Matcher mlength(length); |
| 404 if (mlength.HasValue() && moffset.right().HasValue() && |
| 405 moffset.right().Value() >= 0 && |
| 406 mlength.Value() >= moffset.right().Value()) { |
| 407 Emit(opcode, g.DefineAsRegister(node), |
| 408 g.UseImmediate(moffset.right().node()), g.UseImmediate(length), |
| 409 g.UseRegister(moffset.left().node()), buffer_operand); |
| 410 return; |
| 411 } |
| 412 IntMatcher<int32_t, IrOpcode::kRelocatableInt32Constant> mmlength(length); |
| 413 if (mmlength.HasValue() && moffset.right().HasValue() && |
| 414 moffset.right().Value() >= 0 && |
| 415 mmlength.Value() >= moffset.right().Value()) { |
| 416 Emit(opcode, g.DefineAsRegister(node), |
| 417 g.UseImmediate(moffset.right().node()), g.UseImmediate(length), |
| 418 g.UseRegister(moffset.left().node()), buffer_operand); |
| 419 return; |
| 420 } |
| 421 } |
398 InstructionOperand offset_operand = g.UseRegister(offset); | 422 InstructionOperand offset_operand = g.UseRegister(offset); |
399 InstructionOperand length_operand = | 423 InstructionOperand length_operand = |
400 g.CanBeImmediate(length) ? g.UseImmediate(length) : g.UseRegister(length); | 424 g.CanBeImmediate(length) ? g.UseImmediate(length) : g.UseRegister(length); |
401 if (g.CanBeImmediate(buffer)) { | 425 if (g.CanBeImmediate(buffer)) { |
402 Emit(opcode | AddressingModeField::encode(kMode_MRI), | 426 Emit(opcode | AddressingModeField::encode(kMode_MRI), |
403 g.DefineAsRegister(node), offset_operand, length_operand, | 427 g.DefineAsRegister(node), offset_operand, length_operand, |
404 offset_operand, g.UseImmediate(buffer)); | 428 offset_operand, g.UseImmediate(buffer)); |
405 } else { | 429 } else { |
406 Emit(opcode | AddressingModeField::encode(kMode_MR1), | 430 Emit(opcode | AddressingModeField::encode(kMode_MR1), |
407 g.DefineAsRegister(node), offset_operand, length_operand, | 431 g.DefineAsRegister(node), offset_operand, length_operand, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 case MachineRepresentation::kNone: | 467 case MachineRepresentation::kNone: |
444 UNREACHABLE(); | 468 UNREACHABLE(); |
445 return; | 469 return; |
446 } | 470 } |
447 InstructionOperand value_operand = | 471 InstructionOperand value_operand = |
448 g.CanBeImmediate(value) ? g.UseImmediate(value) | 472 g.CanBeImmediate(value) ? g.UseImmediate(value) |
449 : ((rep == MachineRepresentation::kWord8 || | 473 : ((rep == MachineRepresentation::kWord8 || |
450 rep == MachineRepresentation::kBit) | 474 rep == MachineRepresentation::kBit) |
451 ? g.UseByteRegister(value) | 475 ? g.UseByteRegister(value) |
452 : g.UseRegister(value)); | 476 : g.UseRegister(value)); |
| 477 if (offset->opcode() == IrOpcode::kInt32Add && CanCover(node, offset)) { |
| 478 Int32BinopMatcher moffset(offset); |
| 479 InstructionOperand buffer_operand = g.CanBeImmediate(buffer) |
| 480 ? g.UseImmediate(buffer) |
| 481 : g.UseRegister(buffer); |
| 482 Int32Matcher mlength(length); |
| 483 if (mlength.HasValue() && moffset.right().HasValue() && |
| 484 moffset.right().Value() >= 0 && |
| 485 mlength.Value() >= moffset.right().Value()) { |
| 486 Emit(opcode, g.NoOutput(), g.UseImmediate(moffset.right().node()), |
| 487 g.UseImmediate(length), value_operand, |
| 488 g.UseRegister(moffset.left().node()), buffer_operand); |
| 489 return; |
| 490 } |
| 491 IntMatcher<int32_t, IrOpcode::kRelocatableInt32Constant> mmlength(length); |
| 492 if (mmlength.HasValue() && moffset.right().HasValue() && |
| 493 moffset.right().Value() >= 0 && |
| 494 mmlength.Value() >= moffset.right().Value()) { |
| 495 Emit(opcode, g.NoOutput(), g.UseImmediate(moffset.right().node()), |
| 496 g.UseImmediate(length), value_operand, |
| 497 g.UseRegister(moffset.left().node()), buffer_operand); |
| 498 return; |
| 499 } |
| 500 } |
453 InstructionOperand offset_operand = g.UseRegister(offset); | 501 InstructionOperand offset_operand = g.UseRegister(offset); |
454 InstructionOperand length_operand = | 502 InstructionOperand length_operand = |
455 g.CanBeImmediate(length) ? g.UseImmediate(length) : g.UseRegister(length); | 503 g.CanBeImmediate(length) ? g.UseImmediate(length) : g.UseRegister(length); |
456 if (g.CanBeImmediate(buffer)) { | 504 if (g.CanBeImmediate(buffer)) { |
457 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), | 505 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), |
458 offset_operand, length_operand, value_operand, offset_operand, | 506 offset_operand, length_operand, value_operand, offset_operand, |
459 g.UseImmediate(buffer)); | 507 g.UseImmediate(buffer)); |
460 } else { | 508 } else { |
461 Emit(opcode | AddressingModeField::encode(kMode_MR1), g.NoOutput(), | 509 Emit(opcode | AddressingModeField::encode(kMode_MR1), g.NoOutput(), |
462 offset_operand, length_operand, value_operand, g.UseRegister(buffer), | 510 offset_operand, length_operand, value_operand, g.UseRegister(buffer), |
(...skipping 1334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1797 // static | 1845 // static |
1798 MachineOperatorBuilder::AlignmentRequirements | 1846 MachineOperatorBuilder::AlignmentRequirements |
1799 InstructionSelector::AlignmentRequirements() { | 1847 InstructionSelector::AlignmentRequirements() { |
1800 return MachineOperatorBuilder::AlignmentRequirements:: | 1848 return MachineOperatorBuilder::AlignmentRequirements:: |
1801 FullUnalignedAccessSupport(); | 1849 FullUnalignedAccessSupport(); |
1802 } | 1850 } |
1803 | 1851 |
1804 } // namespace compiler | 1852 } // namespace compiler |
1805 } // namespace internal | 1853 } // namespace internal |
1806 } // namespace v8 | 1854 } // namespace v8 |
OLD | NEW |