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 |