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/base/bits.h" | 6 #include "src/base/bits.h" |
7 #include "src/compiler/instruction-selector-impl.h" | 7 #include "src/compiler/instruction-selector-impl.h" |
8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
10 | 10 |
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
662 | 662 |
663 | 663 |
664 void InstructionSelector::VisitFloat64Mod(Node* node) { | 664 void InstructionSelector::VisitFloat64Mod(Node* node) { |
665 Mips64OperandGenerator g(this); | 665 Mips64OperandGenerator g(this); |
666 Emit(kMips64ModD, g.DefineAsFixed(node, f0), | 666 Emit(kMips64ModD, g.DefineAsFixed(node, f0), |
667 g.UseFixed(node->InputAt(0), f12), | 667 g.UseFixed(node->InputAt(0), f12), |
668 g.UseFixed(node->InputAt(1), f14))->MarkAsCall(); | 668 g.UseFixed(node->InputAt(1), f14))->MarkAsCall(); |
669 } | 669 } |
670 | 670 |
671 | 671 |
672 void InstructionSelector::VisitFloat32Max(Node* node) { UNREACHABLE(); } | 672 void InstructionSelector::VisitFloat32Max(Node* node) { |
| 673 Mips64OperandGenerator g(this); |
| 674 if (kArchVariant == kMips64r6) { |
| 675 Emit(kMips64Float32Max, g.DefineAsRegister(node), |
| 676 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); |
| 677 |
| 678 } else { |
| 679 // Reverse operands, and use same reg. for result and right operand. |
| 680 Emit(kMips64Float32Max, g.DefineSameAsFirst(node), |
| 681 g.UseRegister(node->InputAt(1)), g.UseRegister(node->InputAt(0))); |
| 682 } |
| 683 } |
673 | 684 |
674 | 685 |
675 void InstructionSelector::VisitFloat64Max(Node* node) { UNREACHABLE(); } | 686 void InstructionSelector::VisitFloat64Max(Node* node) { |
| 687 Mips64OperandGenerator g(this); |
| 688 if (kArchVariant == kMips64r6) { |
| 689 Emit(kMips64Float64Max, g.DefineAsRegister(node), |
| 690 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); |
| 691 |
| 692 } else { |
| 693 // Reverse operands, and use same reg. for result and right operand. |
| 694 Emit(kMips64Float64Max, g.DefineSameAsFirst(node), |
| 695 g.UseRegister(node->InputAt(1)), g.UseRegister(node->InputAt(0))); |
| 696 } |
| 697 } |
676 | 698 |
677 | 699 |
678 void InstructionSelector::VisitFloat32Min(Node* node) { UNREACHABLE(); } | 700 void InstructionSelector::VisitFloat32Min(Node* node) { |
| 701 Mips64OperandGenerator g(this); |
| 702 if (kArchVariant == kMips64r6) { |
| 703 Emit(kMips64Float32Min, g.DefineAsRegister(node), |
| 704 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); |
| 705 |
| 706 } else { |
| 707 // Reverse operands, and use same reg. for result and right operand. |
| 708 Emit(kMips64Float32Min, g.DefineSameAsFirst(node), |
| 709 g.UseRegister(node->InputAt(1)), g.UseRegister(node->InputAt(0))); |
| 710 } |
| 711 } |
679 | 712 |
680 | 713 |
681 void InstructionSelector::VisitFloat64Min(Node* node) { UNREACHABLE(); } | 714 void InstructionSelector::VisitFloat64Min(Node* node) { |
| 715 Mips64OperandGenerator g(this); |
| 716 if (kArchVariant == kMips64r6) { |
| 717 Emit(kMips64Float64Min, g.DefineAsRegister(node), |
| 718 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); |
| 719 |
| 720 } else { |
| 721 // Reverse operands, and use same reg. for result and right operand. |
| 722 Emit(kMips64Float64Min, g.DefineSameAsFirst(node), |
| 723 g.UseRegister(node->InputAt(1)), g.UseRegister(node->InputAt(0))); |
| 724 } |
| 725 } |
682 | 726 |
683 | 727 |
684 void InstructionSelector::VisitFloat32Abs(Node* node) { | 728 void InstructionSelector::VisitFloat32Abs(Node* node) { |
685 VisitRR(this, kMips64AbsS, node); | 729 VisitRR(this, kMips64AbsS, node); |
686 } | 730 } |
687 | 731 |
688 | 732 |
689 void InstructionSelector::VisitFloat64Abs(Node* node) { | 733 void InstructionSelector::VisitFloat64Abs(Node* node) { |
690 VisitRR(this, kMips64AbsD, node); | 734 VisitRR(this, kMips64AbsD, node); |
691 } | 735 } |
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1284 Node* left = node->InputAt(0); | 1328 Node* left = node->InputAt(0); |
1285 Node* right = node->InputAt(1); | 1329 Node* right = node->InputAt(1); |
1286 Emit(kMips64Float64InsertHighWord32, g.DefineSameAsFirst(node), | 1330 Emit(kMips64Float64InsertHighWord32, g.DefineSameAsFirst(node), |
1287 g.UseRegister(left), g.UseRegister(right)); | 1331 g.UseRegister(left), g.UseRegister(right)); |
1288 } | 1332 } |
1289 | 1333 |
1290 | 1334 |
1291 // static | 1335 // static |
1292 MachineOperatorBuilder::Flags | 1336 MachineOperatorBuilder::Flags |
1293 InstructionSelector::SupportedMachineOperatorFlags() { | 1337 InstructionSelector::SupportedMachineOperatorFlags() { |
1294 return MachineOperatorBuilder::kFloat64RoundDown | | 1338 return MachineOperatorBuilder::kFloat64Min | |
| 1339 MachineOperatorBuilder::kFloat64Max | |
| 1340 MachineOperatorBuilder::kFloat32Min | |
| 1341 MachineOperatorBuilder::kFloat32Max | |
| 1342 MachineOperatorBuilder::kFloat64RoundDown | |
1295 MachineOperatorBuilder::kFloat64RoundTruncate; | 1343 MachineOperatorBuilder::kFloat64RoundTruncate; |
1296 } | 1344 } |
1297 | 1345 |
1298 } // namespace compiler | 1346 } // namespace compiler |
1299 } // namespace internal | 1347 } // namespace internal |
1300 } // namespace v8 | 1348 } // namespace v8 |
OLD | NEW |