| 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/bits.h" | 5 #include "src/base/bits.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 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 case kArchCallCodeObject: | 71 case kArchCallCodeObject: |
| 72 case kArchCallJSFunction: | 72 case kArchCallJSFunction: |
| 73 case kArchJmp: | 73 case kArchJmp: |
| 74 case kArchNop: | 74 case kArchNop: |
| 75 case kArchRet: | 75 case kArchRet: |
| 76 case kArchStackPointer: | 76 case kArchStackPointer: |
| 77 case kArchTruncateDoubleToI: | 77 case kArchTruncateDoubleToI: |
| 78 case kArmMul: | 78 case kArmMul: |
| 79 case kArmMla: | 79 case kArmMla: |
| 80 case kArmMls: | 80 case kArmMls: |
| 81 case kArmSmmul: |
| 82 case kArmSmmla: |
| 81 case kArmSdiv: | 83 case kArmSdiv: |
| 82 case kArmUdiv: | 84 case kArmUdiv: |
| 83 case kArmBfc: | 85 case kArmBfc: |
| 84 case kArmUbfx: | 86 case kArmUbfx: |
| 85 case kArmVcmpF64: | 87 case kArmVcmpF64: |
| 86 case kArmVaddF64: | 88 case kArmVaddF64: |
| 87 case kArmVsubF64: | 89 case kArmVsubF64: |
| 88 case kArmVmulF64: | 90 case kArmVmulF64: |
| 89 case kArmVmlaF64: | 91 case kArmVmlaF64: |
| 90 case kArmVmlsF64: | 92 case kArmVmlsF64: |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 Emit(kArmMla, g.DefineAsRegister(node), g.UseRegister(mleft.left().node()), | 564 Emit(kArmMla, g.DefineAsRegister(node), g.UseRegister(mleft.left().node()), |
| 563 g.UseRegister(mleft.right().node()), g.UseRegister(m.right().node())); | 565 g.UseRegister(mleft.right().node()), g.UseRegister(m.right().node())); |
| 564 return; | 566 return; |
| 565 } | 567 } |
| 566 if (m.right().IsInt32Mul() && CanCover(node, m.right().node())) { | 568 if (m.right().IsInt32Mul() && CanCover(node, m.right().node())) { |
| 567 Int32BinopMatcher mright(m.right().node()); | 569 Int32BinopMatcher mright(m.right().node()); |
| 568 Emit(kArmMla, g.DefineAsRegister(node), g.UseRegister(mright.left().node()), | 570 Emit(kArmMla, g.DefineAsRegister(node), g.UseRegister(mright.left().node()), |
| 569 g.UseRegister(mright.right().node()), g.UseRegister(m.left().node())); | 571 g.UseRegister(mright.right().node()), g.UseRegister(m.left().node())); |
| 570 return; | 572 return; |
| 571 } | 573 } |
| 574 if (m.left().IsInt32MulHigh() && CanCover(node, m.left().node())) { |
| 575 Int32BinopMatcher mleft(m.left().node()); |
| 576 Emit(kArmSmmla, g.DefineAsRegister(node), |
| 577 g.UseRegister(mleft.left().node()), |
| 578 g.UseRegister(mleft.right().node()), g.UseRegister(m.right().node())); |
| 579 return; |
| 580 } |
| 581 if (m.right().IsInt32MulHigh() && CanCover(node, m.right().node())) { |
| 582 Int32BinopMatcher mright(m.right().node()); |
| 583 Emit(kArmSmmla, g.DefineAsRegister(node), |
| 584 g.UseRegister(mright.left().node()), |
| 585 g.UseRegister(mright.right().node()), g.UseRegister(m.left().node())); |
| 586 return; |
| 587 } |
| 572 VisitBinop(this, node, kArmAdd, kArmAdd); | 588 VisitBinop(this, node, kArmAdd, kArmAdd); |
| 573 } | 589 } |
| 574 | 590 |
| 575 | 591 |
| 576 void InstructionSelector::VisitInt32Sub(Node* node) { | 592 void InstructionSelector::VisitInt32Sub(Node* node) { |
| 577 ArmOperandGenerator g(this); | 593 ArmOperandGenerator g(this); |
| 578 Int32BinopMatcher m(node); | 594 Int32BinopMatcher m(node); |
| 579 if (IsSupported(MLS) && m.right().IsInt32Mul() && | 595 if (IsSupported(MLS) && m.right().IsInt32Mul() && |
| 580 CanCover(node, m.right().node())) { | 596 CanCover(node, m.right().node())) { |
| 581 Int32BinopMatcher mright(m.right().node()); | 597 Int32BinopMatcher mright(m.right().node()); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 605 g.UseRegister(m.left().node()), | 621 g.UseRegister(m.left().node()), |
| 606 g.TempImmediate(WhichPowerOf2(value + 1))); | 622 g.TempImmediate(WhichPowerOf2(value + 1))); |
| 607 return; | 623 return; |
| 608 } | 624 } |
| 609 } | 625 } |
| 610 Emit(kArmMul, g.DefineAsRegister(node), g.UseRegister(m.left().node()), | 626 Emit(kArmMul, g.DefineAsRegister(node), g.UseRegister(m.left().node()), |
| 611 g.UseRegister(m.right().node())); | 627 g.UseRegister(m.right().node())); |
| 612 } | 628 } |
| 613 | 629 |
| 614 | 630 |
| 631 void InstructionSelector::VisitInt32MulHigh(Node* node) { |
| 632 ArmOperandGenerator g(this); |
| 633 Emit(kArmSmmul, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), |
| 634 g.UseRegister(node->InputAt(1))); |
| 635 } |
| 636 |
| 637 |
| 615 static void EmitDiv(InstructionSelector* selector, ArchOpcode div_opcode, | 638 static void EmitDiv(InstructionSelector* selector, ArchOpcode div_opcode, |
| 616 ArchOpcode f64i32_opcode, ArchOpcode i32f64_opcode, | 639 ArchOpcode f64i32_opcode, ArchOpcode i32f64_opcode, |
| 617 InstructionOperand* result_operand, | 640 InstructionOperand* result_operand, |
| 618 InstructionOperand* left_operand, | 641 InstructionOperand* left_operand, |
| 619 InstructionOperand* right_operand) { | 642 InstructionOperand* right_operand) { |
| 620 ArmOperandGenerator g(selector); | 643 ArmOperandGenerator g(selector); |
| 621 if (selector->IsSupported(SUDIV)) { | 644 if (selector->IsSupported(SUDIV)) { |
| 622 selector->Emit(div_opcode, result_operand, left_operand, right_operand); | 645 selector->Emit(div_opcode, result_operand, left_operand, right_operand); |
| 623 return; | 646 return; |
| 624 } | 647 } |
| (...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1129 | 1152 |
| 1130 | 1153 |
| 1131 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { | 1154 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { |
| 1132 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); | 1155 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); |
| 1133 VisitFloat64Compare(this, node, &cont); | 1156 VisitFloat64Compare(this, node, &cont); |
| 1134 } | 1157 } |
| 1135 | 1158 |
| 1136 } // namespace compiler | 1159 } // namespace compiler |
| 1137 } // namespace internal | 1160 } // namespace internal |
| 1138 } // namespace v8 | 1161 } // namespace v8 |
| OLD | NEW |