Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: src/compiler/arm/instruction-selector-arm.cc

Issue 654833002: [turbofan] Optimize division/modulus by constant. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/compiler/arm/instruction-codes-arm.h ('k') | src/compiler/arm64/code-generator-arm64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/compiler/arm/instruction-codes-arm.h ('k') | src/compiler/arm64/code-generator-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698