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

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

Issue 2700813002: [V8] Implement SIMD Boolean vector types to allow mask registers. (Closed)
Patch Set: Rebase. Created 3 years, 10 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
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/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 #include "src/compiler/node-properties.h" 7 #include "src/compiler/node-properties.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 // Shift operations only observe the bottom 5 or 6 bits of the value. 116 // Shift operations only observe the bottom 5 or 6 bits of the value.
117 // All possible shifts can be encoded by discarding bits which have no 117 // All possible shifts can be encoded by discarding bits which have no
118 // effect. 118 // effect.
119 return true; 119 return true;
120 } 120 }
121 return false; 121 return false;
122 } 122 }
123 123
124 bool CanBeLoadStoreShiftImmediate(Node* node, MachineRepresentation rep) { 124 bool CanBeLoadStoreShiftImmediate(Node* node, MachineRepresentation rep) {
125 // TODO(arm64): Load and Store on 128 bit Q registers is not supported yet. 125 // TODO(arm64): Load and Store on 128 bit Q registers is not supported yet.
126 DCHECK_NE(MachineRepresentation::kSimd128, rep); 126 DCHECK_GT(MachineRepresentation::kSimd128, rep);
127 return IsIntegerConstant(node) && 127 return IsIntegerConstant(node) &&
128 (GetIntegerConstantValue(node) == ElementSizeLog2Of(rep)); 128 (GetIntegerConstantValue(node) == ElementSizeLog2Of(rep));
129 } 129 }
130 130
131 private: 131 private:
132 bool IsLoadStoreImmediate(int64_t value, LSDataSize size) { 132 bool IsLoadStoreImmediate(int64_t value, LSDataSize size) {
133 return Assembler::IsImmLSScaled(value, size) || 133 return Assembler::IsImmLSScaled(value, size) ||
134 Assembler::IsImmLSUnscaled(value); 134 Assembler::IsImmLSUnscaled(value);
135 } 135 }
136 }; 136 };
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 immediate_mode = kLoadStoreImm32; 586 immediate_mode = kLoadStoreImm32;
587 break; 587 break;
588 case MachineRepresentation::kTaggedSigned: // Fall through. 588 case MachineRepresentation::kTaggedSigned: // Fall through.
589 case MachineRepresentation::kTaggedPointer: // Fall through. 589 case MachineRepresentation::kTaggedPointer: // Fall through.
590 case MachineRepresentation::kTagged: // Fall through. 590 case MachineRepresentation::kTagged: // Fall through.
591 case MachineRepresentation::kWord64: 591 case MachineRepresentation::kWord64:
592 opcode = kArm64Ldr; 592 opcode = kArm64Ldr;
593 immediate_mode = kLoadStoreImm64; 593 immediate_mode = kLoadStoreImm64;
594 break; 594 break;
595 case MachineRepresentation::kSimd128: // Fall through. 595 case MachineRepresentation::kSimd128: // Fall through.
596 case MachineRepresentation::kSimd1x4: // Fall through.
597 case MachineRepresentation::kSimd1x8: // Fall through.
598 case MachineRepresentation::kSimd1x16: // Fall through.
596 case MachineRepresentation::kNone: 599 case MachineRepresentation::kNone:
597 UNREACHABLE(); 600 UNREACHABLE();
598 return; 601 return;
599 } 602 }
600 EmitLoad(this, node, opcode, immediate_mode, rep); 603 EmitLoad(this, node, opcode, immediate_mode, rep);
601 } 604 }
602 605
603 void InstructionSelector::VisitProtectedLoad(Node* node) { 606 void InstructionSelector::VisitProtectedLoad(Node* node) {
604 // TODO(eholk) 607 // TODO(eholk)
605 UNIMPLEMENTED(); 608 UNIMPLEMENTED();
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 immediate_mode = kLoadStoreImm32; 685 immediate_mode = kLoadStoreImm32;
683 break; 686 break;
684 case MachineRepresentation::kTaggedSigned: // Fall through. 687 case MachineRepresentation::kTaggedSigned: // Fall through.
685 case MachineRepresentation::kTaggedPointer: // Fall through. 688 case MachineRepresentation::kTaggedPointer: // Fall through.
686 case MachineRepresentation::kTagged: // Fall through. 689 case MachineRepresentation::kTagged: // Fall through.
687 case MachineRepresentation::kWord64: 690 case MachineRepresentation::kWord64:
688 opcode = kArm64Str; 691 opcode = kArm64Str;
689 immediate_mode = kLoadStoreImm64; 692 immediate_mode = kLoadStoreImm64;
690 break; 693 break;
691 case MachineRepresentation::kSimd128: // Fall through. 694 case MachineRepresentation::kSimd128: // Fall through.
695 case MachineRepresentation::kSimd1x4: // Fall through.
696 case MachineRepresentation::kSimd1x8: // Fall through.
697 case MachineRepresentation::kSimd1x16: // Fall through.
692 case MachineRepresentation::kNone: 698 case MachineRepresentation::kNone:
693 UNREACHABLE(); 699 UNREACHABLE();
694 return; 700 return;
695 } 701 }
696 702
697 inputs[0] = g.UseRegisterOrImmediateZero(value); 703 inputs[0] = g.UseRegisterOrImmediateZero(value);
698 inputs[1] = g.UseRegister(base); 704 inputs[1] = g.UseRegister(base);
699 705
700 if (g.CanBeImmediate(index, immediate_mode)) { 706 if (g.CanBeImmediate(index, immediate_mode)) {
701 input_count = 3; 707 input_count = 3;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
750 opcode = kCheckedLoadFloat32; 756 opcode = kCheckedLoadFloat32;
751 break; 757 break;
752 case MachineRepresentation::kFloat64: 758 case MachineRepresentation::kFloat64:
753 opcode = kCheckedLoadFloat64; 759 opcode = kCheckedLoadFloat64;
754 break; 760 break;
755 case MachineRepresentation::kBit: // Fall through. 761 case MachineRepresentation::kBit: // Fall through.
756 case MachineRepresentation::kTaggedSigned: // Fall through. 762 case MachineRepresentation::kTaggedSigned: // Fall through.
757 case MachineRepresentation::kTaggedPointer: // Fall through. 763 case MachineRepresentation::kTaggedPointer: // Fall through.
758 case MachineRepresentation::kTagged: // Fall through. 764 case MachineRepresentation::kTagged: // Fall through.
759 case MachineRepresentation::kSimd128: // Fall through. 765 case MachineRepresentation::kSimd128: // Fall through.
766 case MachineRepresentation::kSimd1x4: // Fall through.
767 case MachineRepresentation::kSimd1x8: // Fall through.
768 case MachineRepresentation::kSimd1x16: // Fall through.
760 case MachineRepresentation::kNone: 769 case MachineRepresentation::kNone:
761 UNREACHABLE(); 770 UNREACHABLE();
762 return; 771 return;
763 } 772 }
764 // If the length is a constant power of two, allow the code generator to 773 // If the length is a constant power of two, allow the code generator to
765 // pick a more efficient bounds check sequence by passing the length as an 774 // pick a more efficient bounds check sequence by passing the length as an
766 // immediate. 775 // immediate.
767 if (length->opcode() == IrOpcode::kInt32Constant) { 776 if (length->opcode() == IrOpcode::kInt32Constant) {
768 Int32Matcher m(length); 777 Int32Matcher m(length);
769 if (m.IsPowerOf2()) { 778 if (m.IsPowerOf2()) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 opcode = kCheckedStoreFloat32; 811 opcode = kCheckedStoreFloat32;
803 break; 812 break;
804 case MachineRepresentation::kFloat64: 813 case MachineRepresentation::kFloat64:
805 opcode = kCheckedStoreFloat64; 814 opcode = kCheckedStoreFloat64;
806 break; 815 break;
807 case MachineRepresentation::kBit: // Fall through. 816 case MachineRepresentation::kBit: // Fall through.
808 case MachineRepresentation::kTaggedSigned: // Fall through. 817 case MachineRepresentation::kTaggedSigned: // Fall through.
809 case MachineRepresentation::kTaggedPointer: // Fall through. 818 case MachineRepresentation::kTaggedPointer: // Fall through.
810 case MachineRepresentation::kTagged: // Fall through. 819 case MachineRepresentation::kTagged: // Fall through.
811 case MachineRepresentation::kSimd128: // Fall through. 820 case MachineRepresentation::kSimd128: // Fall through.
821 case MachineRepresentation::kSimd1x4: // Fall through.
822 case MachineRepresentation::kSimd1x8: // Fall through.
823 case MachineRepresentation::kSimd1x16: // Fall through.
812 case MachineRepresentation::kNone: 824 case MachineRepresentation::kNone:
813 UNREACHABLE(); 825 UNREACHABLE();
814 return; 826 return;
815 } 827 }
816 // If the length is a constant power of two, allow the code generator to 828 // If the length is a constant power of two, allow the code generator to
817 // pick a more efficient bounds check sequence by passing the length as an 829 // pick a more efficient bounds check sequence by passing the length as an
818 // immediate. 830 // immediate.
819 if (length->opcode() == IrOpcode::kInt32Constant) { 831 if (length->opcode() == IrOpcode::kInt32Constant) {
820 Int32Matcher m(length); 832 Int32Matcher m(length);
821 if (m.IsPowerOf2()) { 833 if (m.IsPowerOf2()) {
(...skipping 1889 matching lines...) Expand 10 before | Expand all | Expand 10 after
2711 // static 2723 // static
2712 MachineOperatorBuilder::AlignmentRequirements 2724 MachineOperatorBuilder::AlignmentRequirements
2713 InstructionSelector::AlignmentRequirements() { 2725 InstructionSelector::AlignmentRequirements() {
2714 return MachineOperatorBuilder::AlignmentRequirements:: 2726 return MachineOperatorBuilder::AlignmentRequirements::
2715 FullUnalignedAccessSupport(); 2727 FullUnalignedAccessSupport();
2716 } 2728 }
2717 2729
2718 } // namespace compiler 2730 } // namespace compiler
2719 } // namespace internal 2731 } // namespace internal
2720 } // namespace v8 2732 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/arm/instruction-selector-arm.cc ('k') | src/compiler/ia32/instruction-selector-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698