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 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 case kRepFloat32: | 701 case kRepFloat32: |
702 opcode = kCheckedLoadFloat32; | 702 opcode = kCheckedLoadFloat32; |
703 break; | 703 break; |
704 case kRepFloat64: | 704 case kRepFloat64: |
705 opcode = kCheckedLoadFloat64; | 705 opcode = kCheckedLoadFloat64; |
706 break; | 706 break; |
707 default: | 707 default: |
708 UNREACHABLE(); | 708 UNREACHABLE(); |
709 return; | 709 return; |
710 } | 710 } |
711 InstructionOperand* offset_operand = g.UseRegister(offset); | 711 InstructionOperand* offset_operand = g.CanBeImmediate(offset, opcode) |
| 712 ? g.UseImmediate(offset) |
| 713 : g.UseRegister(offset); |
| 714 |
| 715 InstructionOperand* length_operand = |
| 716 (!g.CanBeImmediate(offset, opcode)) ? g.CanBeImmediate(length, opcode) |
| 717 ? g.UseImmediate(length) |
| 718 : g.UseRegister(length) |
| 719 : g.UseRegister(length); |
| 720 |
712 Emit(opcode | AddressingModeField::encode(kMode_MRI), | 721 Emit(opcode | AddressingModeField::encode(kMode_MRI), |
713 g.DefineAsRegister(node), offset_operand, g.UseRegister(length), | 722 g.DefineAsRegister(node), offset_operand, length_operand, |
714 g.UseRegister(buffer)); | 723 g.UseRegister(buffer)); |
715 } | 724 } |
716 | 725 |
717 | 726 |
718 void InstructionSelector::VisitCheckedStore(Node* node) { | 727 void InstructionSelector::VisitCheckedStore(Node* node) { |
719 MachineType rep = RepresentationOf(OpParameter<MachineType>(node)); | 728 MachineType rep = RepresentationOf(OpParameter<MachineType>(node)); |
720 Mips64OperandGenerator g(this); | 729 Mips64OperandGenerator g(this); |
721 Node* const buffer = node->InputAt(0); | 730 Node* const buffer = node->InputAt(0); |
722 Node* const offset = node->InputAt(1); | 731 Node* const offset = node->InputAt(1); |
723 Node* const length = node->InputAt(2); | 732 Node* const length = node->InputAt(2); |
(...skipping 12 matching lines...) Expand all Loading... |
736 case kRepFloat32: | 745 case kRepFloat32: |
737 opcode = kCheckedStoreFloat32; | 746 opcode = kCheckedStoreFloat32; |
738 break; | 747 break; |
739 case kRepFloat64: | 748 case kRepFloat64: |
740 opcode = kCheckedStoreFloat64; | 749 opcode = kCheckedStoreFloat64; |
741 break; | 750 break; |
742 default: | 751 default: |
743 UNREACHABLE(); | 752 UNREACHABLE(); |
744 return; | 753 return; |
745 } | 754 } |
746 InstructionOperand* offset_operand = g.UseRegister(offset); | 755 InstructionOperand* offset_operand = g.CanBeImmediate(offset, opcode) |
| 756 ? g.UseImmediate(offset) |
| 757 : g.UseRegister(offset); |
| 758 |
| 759 InstructionOperand* length_operand = |
| 760 (!g.CanBeImmediate(offset, opcode)) ? g.CanBeImmediate(length, opcode) |
| 761 ? g.UseImmediate(length) |
| 762 : g.UseRegister(length) |
| 763 : g.UseRegister(length); |
| 764 |
747 Emit(opcode | AddressingModeField::encode(kMode_MRI), nullptr, offset_operand, | 765 Emit(opcode | AddressingModeField::encode(kMode_MRI), nullptr, offset_operand, |
748 g.UseRegister(length), g.UseRegister(value), g.UseRegister(buffer)); | 766 length_operand, g.UseRegister(value), g.UseRegister(buffer)); |
749 } | 767 } |
750 | 768 |
751 | 769 |
752 namespace { | 770 namespace { |
753 | 771 |
754 // Shared routine for multiple compare operations. | 772 // Shared routine for multiple compare operations. |
755 static void VisitCompare(InstructionSelector* selector, InstructionCode opcode, | 773 static void VisitCompare(InstructionSelector* selector, InstructionCode opcode, |
756 InstructionOperand* left, InstructionOperand* right, | 774 InstructionOperand* left, InstructionOperand* right, |
757 FlagsContinuation* cont) { | 775 FlagsContinuation* cont) { |
758 Mips64OperandGenerator g(selector); | 776 Mips64OperandGenerator g(selector); |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1050 | 1068 |
1051 // static | 1069 // static |
1052 MachineOperatorBuilder::Flags | 1070 MachineOperatorBuilder::Flags |
1053 InstructionSelector::SupportedMachineOperatorFlags() { | 1071 InstructionSelector::SupportedMachineOperatorFlags() { |
1054 return MachineOperatorBuilder::kNoFlags; | 1072 return MachineOperatorBuilder::kNoFlags; |
1055 } | 1073 } |
1056 | 1074 |
1057 } // namespace compiler | 1075 } // namespace compiler |
1058 } // namespace internal | 1076 } // namespace internal |
1059 } // namespace v8 | 1077 } // namespace v8 |
OLD | NEW |