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

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

Issue 677433002: Add floor, ceil, round (truncate) instructions for ia32, x64 (if SSE4.1) and (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address changes and fix compilation on mac. Created 6 years, 1 month 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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 case kArmVcmpF64: 93 case kArmVcmpF64:
94 case kArmVaddF64: 94 case kArmVaddF64:
95 case kArmVsubF64: 95 case kArmVsubF64:
96 case kArmVmulF64: 96 case kArmVmulF64:
97 case kArmVmlaF64: 97 case kArmVmlaF64:
98 case kArmVmlsF64: 98 case kArmVmlsF64:
99 case kArmVdivF64: 99 case kArmVdivF64:
100 case kArmVmodF64: 100 case kArmVmodF64:
101 case kArmVnegF64: 101 case kArmVnegF64:
102 case kArmVsqrtF64: 102 case kArmVsqrtF64:
103 case kArmVfloorF64:
104 case kArmVceilF64:
105 case kArmVroundTruncateF64:
106 case kArmVroundTiesAwayF64:
103 case kArmVcvtF32F64: 107 case kArmVcvtF32F64:
104 case kArmVcvtF64F32: 108 case kArmVcvtF64F32:
105 case kArmVcvtF64S32: 109 case kArmVcvtF64S32:
106 case kArmVcvtF64U32: 110 case kArmVcvtF64U32:
107 case kArmVcvtS32F64: 111 case kArmVcvtS32F64:
108 case kArmVcvtU32F64: 112 case kArmVcvtU32F64:
109 case kArmPush: 113 case kArmPush:
110 return false; 114 return false;
111 } 115 }
112 UNREACHABLE(); 116 UNREACHABLE();
113 return false; 117 return false;
114 } 118 }
115 }; 119 };
116 120
117 121
122 static void VisitRRFloat64(InstructionSelector* selector, ArchOpcode opcode,
123 Node* node) {
124 ArmOperandGenerator g(selector);
125 selector->Emit(opcode, g.DefineAsRegister(node),
126 g.UseRegister(node->InputAt(0)));
127 }
128
129
118 static void VisitRRRFloat64(InstructionSelector* selector, ArchOpcode opcode, 130 static void VisitRRRFloat64(InstructionSelector* selector, ArchOpcode opcode,
119 Node* node) { 131 Node* node) {
120 ArmOperandGenerator g(selector); 132 ArmOperandGenerator g(selector);
121 selector->Emit(opcode, g.DefineAsRegister(node), 133 selector->Emit(opcode, g.DefineAsRegister(node),
122 g.UseRegister(node->InputAt(0)), 134 g.UseRegister(node->InputAt(0)),
123 g.UseRegister(node->InputAt(1))); 135 g.UseRegister(node->InputAt(1)));
124 } 136 }
125 137
126 138
127 static bool TryMatchROR(InstructionSelector* selector, 139 static bool TryMatchROR(InstructionSelector* selector,
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 g.UseFixed(node->InputAt(1), d1))->MarkAsCall(); 831 g.UseFixed(node->InputAt(1), d1))->MarkAsCall();
820 } 832 }
821 833
822 834
823 void InstructionSelector::VisitFloat64Sqrt(Node* node) { 835 void InstructionSelector::VisitFloat64Sqrt(Node* node) {
824 ArmOperandGenerator g(this); 836 ArmOperandGenerator g(this);
825 Emit(kArmVsqrtF64, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); 837 Emit(kArmVsqrtF64, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)));
826 } 838 }
827 839
828 840
841 void InstructionSelector::VisitFloat64Floor(Node* node) {
842 DCHECK(CpuFeatures::IsSupported(ARMv8));
843 VisitRRFloat64(this, kArmVfloorF64, node);
844 }
845
846
847 void InstructionSelector::VisitFloat64Ceil(Node* node) {
848 DCHECK(CpuFeatures::IsSupported(ARMv8));
849 VisitRRFloat64(this, kArmVceilF64, node);
850 }
851
852
853 void InstructionSelector::VisitFloat64RoundTruncate(Node* node) {
854 DCHECK(CpuFeatures::IsSupported(ARMv8));
855 VisitRRFloat64(this, kArmVroundTruncateF64, node);
856 }
857
858
859 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) {
860 DCHECK(CpuFeatures::IsSupported(ARMv8));
861 VisitRRFloat64(this, kArmVroundTiesAwayF64, node);
862 }
863
864
829 void InstructionSelector::VisitCall(Node* node) { 865 void InstructionSelector::VisitCall(Node* node) {
830 ArmOperandGenerator g(this); 866 ArmOperandGenerator g(this);
831 CallDescriptor* descriptor = OpParameter<CallDescriptor*>(node); 867 CallDescriptor* descriptor = OpParameter<CallDescriptor*>(node);
832 868
833 FrameStateDescriptor* frame_state_descriptor = NULL; 869 FrameStateDescriptor* frame_state_descriptor = NULL;
834 if (descriptor->NeedsFrameState()) { 870 if (descriptor->NeedsFrameState()) {
835 frame_state_descriptor = 871 frame_state_descriptor =
836 GetFrameStateDescriptor(node->InputAt(descriptor->InputCount())); 872 GetFrameStateDescriptor(node->InputAt(descriptor->InputCount()));
837 } 873 }
838 874
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
1132 1168
1133 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { 1169 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) {
1134 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); 1170 FlagsContinuation cont(kUnorderedLessThanOrEqual, node);
1135 VisitFloat64Compare(this, node, &cont); 1171 VisitFloat64Compare(this, node, &cont);
1136 } 1172 }
1137 1173
1138 1174
1139 // static 1175 // static
1140 MachineOperatorBuilder::Flags 1176 MachineOperatorBuilder::Flags
1141 InstructionSelector::SupportedMachineOperatorFlags() { 1177 InstructionSelector::SupportedMachineOperatorFlags() {
1142 return MachineOperatorBuilder::kInt32DivIsSafe | 1178 MachineOperatorBuilder::Flags flags =
1143 MachineOperatorBuilder::kInt32ModIsSafe | 1179 MachineOperatorBuilder::kInt32DivIsSafe |
1144 MachineOperatorBuilder::kUint32DivIsSafe | 1180 MachineOperatorBuilder::kInt32ModIsSafe |
1145 MachineOperatorBuilder::kUint32ModIsSafe; 1181 MachineOperatorBuilder::kUint32DivIsSafe |
1182 MachineOperatorBuilder::kUint32ModIsSafe;
1183
1184 if (CpuFeatures::IsSupported(ARMv8)) {
1185 flags |= MachineOperatorBuilder::kFloat64Floor |
1186 MachineOperatorBuilder::kFloat64Ceil |
1187 MachineOperatorBuilder::kFloat64RoundTruncate |
1188 MachineOperatorBuilder::kFloat64RoundTiesAway;
1189 }
1190 return flags;
1146 } 1191 }
1147 1192
1148 } // namespace compiler 1193 } // namespace compiler
1149 } // namespace internal 1194 } // namespace internal
1150 } // namespace v8 1195 } // 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