| 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 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 CanCover(node, m.right().node()), kLogical64Imm); | 535 CanCover(node, m.right().node()), kLogical64Imm); |
| 536 } | 536 } |
| 537 | 537 |
| 538 | 538 |
| 539 void InstructionSelector::VisitWord32Shl(Node* node) { | 539 void InstructionSelector::VisitWord32Shl(Node* node) { |
| 540 VisitRRO(this, kArm64Lsl32, node, kShift32Imm); | 540 VisitRRO(this, kArm64Lsl32, node, kShift32Imm); |
| 541 } | 541 } |
| 542 | 542 |
| 543 | 543 |
| 544 void InstructionSelector::VisitWord64Shl(Node* node) { | 544 void InstructionSelector::VisitWord64Shl(Node* node) { |
| 545 Arm64OperandGenerator g(this); |
| 546 Int64BinopMatcher m(node); |
| 547 if ((m.left().IsChangeInt32ToInt64() || m.left().IsChangeUint32ToUint64()) && |
| 548 m.right().IsInRange(32, 63)) { |
| 549 // There's no need to sign/zero-extend to 64-bit if we shift out the upper |
| 550 // 32 bits anyway. |
| 551 Emit(kArm64Lsl, g.DefineAsRegister(node), |
| 552 g.UseRegister(m.left().node()->InputAt(0)), |
| 553 g.UseImmediate(m.right().node())); |
| 554 return; |
| 555 } |
| 545 VisitRRO(this, kArm64Lsl, node, kShift64Imm); | 556 VisitRRO(this, kArm64Lsl, node, kShift64Imm); |
| 546 } | 557 } |
| 547 | 558 |
| 548 | 559 |
| 549 void InstructionSelector::VisitWord32Shr(Node* node) { | 560 void InstructionSelector::VisitWord32Shr(Node* node) { |
| 550 Arm64OperandGenerator g(this); | 561 Arm64OperandGenerator g(this); |
| 551 Int32BinopMatcher m(node); | 562 Int32BinopMatcher m(node); |
| 552 if (m.left().IsWord32And() && m.right().IsInRange(0, 31)) { | 563 if (m.left().IsWord32And() && m.right().IsInRange(0, 31)) { |
| 553 int32_t lsb = m.right().Value(); | 564 int32_t lsb = m.right().Value(); |
| 554 Int32BinopMatcher mleft(m.left().node()); | 565 Int32BinopMatcher mleft(m.left().node()); |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 877 | 888 |
| 878 void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) { | 889 void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) { |
| 879 Arm64OperandGenerator g(this); | 890 Arm64OperandGenerator g(this); |
| 880 Emit(kArm64Float64ToFloat32, g.DefineAsRegister(node), | 891 Emit(kArm64Float64ToFloat32, g.DefineAsRegister(node), |
| 881 g.UseRegister(node->InputAt(0))); | 892 g.UseRegister(node->InputAt(0))); |
| 882 } | 893 } |
| 883 | 894 |
| 884 | 895 |
| 885 void InstructionSelector::VisitTruncateInt64ToInt32(Node* node) { | 896 void InstructionSelector::VisitTruncateInt64ToInt32(Node* node) { |
| 886 Arm64OperandGenerator g(this); | 897 Arm64OperandGenerator g(this); |
| 898 Node* value = node->InputAt(0); |
| 899 if (CanCover(node, value)) { |
| 900 Int64BinopMatcher m(value); |
| 901 if ((m.IsWord64Sar() && m.right().HasValue() && |
| 902 (m.right().Value() == 32)) || |
| 903 (m.IsWord64Shr() && m.right().IsInRange(32, 63))) { |
| 904 Emit(kArm64Lsr, g.DefineAsRegister(node), g.UseRegister(m.left().node()), |
| 905 g.UseImmediate(m.right().node())); |
| 906 return; |
| 907 } |
| 908 } |
| 909 |
| 887 Emit(kArm64Mov32, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); | 910 Emit(kArm64Mov32, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); |
| 888 } | 911 } |
| 889 | 912 |
| 890 | 913 |
| 891 void InstructionSelector::VisitFloat64Add(Node* node) { | 914 void InstructionSelector::VisitFloat64Add(Node* node) { |
| 892 VisitRRRFloat64(this, kArm64Float64Add, node); | 915 VisitRRRFloat64(this, kArm64Float64Add, node); |
| 893 } | 916 } |
| 894 | 917 |
| 895 | 918 |
| 896 void InstructionSelector::VisitFloat64Sub(Node* node) { | 919 void InstructionSelector::VisitFloat64Sub(Node* node) { |
| (...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1386 MachineOperatorBuilder::Flags | 1409 MachineOperatorBuilder::Flags |
| 1387 InstructionSelector::SupportedMachineOperatorFlags() { | 1410 InstructionSelector::SupportedMachineOperatorFlags() { |
| 1388 return MachineOperatorBuilder::kFloat64Floor | | 1411 return MachineOperatorBuilder::kFloat64Floor | |
| 1389 MachineOperatorBuilder::kFloat64Ceil | | 1412 MachineOperatorBuilder::kFloat64Ceil | |
| 1390 MachineOperatorBuilder::kFloat64RoundTruncate | | 1413 MachineOperatorBuilder::kFloat64RoundTruncate | |
| 1391 MachineOperatorBuilder::kFloat64RoundTiesAway; | 1414 MachineOperatorBuilder::kFloat64RoundTiesAway; |
| 1392 } | 1415 } |
| 1393 } // namespace compiler | 1416 } // namespace compiler |
| 1394 } // namespace internal | 1417 } // namespace internal |
| 1395 } // namespace v8 | 1418 } // namespace v8 |
| OLD | NEW |