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

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

Issue 1584663007: [turbofan] Implement rounding of floats on x64 and ia32 without sse4.1. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: reduced generated code. Created 4 years, 11 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
« no previous file with comments | « src/compiler/x64/code-generator-x64.cc ('k') | src/ia32/assembler-ia32.h » ('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 <algorithm> 5 #include <algorithm>
6 6
7 #include "src/base/adapters.h" 7 #include "src/base/adapters.h"
8 #include "src/compiler/instruction-selector-impl.h" 8 #include "src/compiler/instruction-selector-impl.h"
9 #include "src/compiler/node-matchers.h" 9 #include "src/compiler/node-matchers.h"
10 #include "src/compiler/node-properties.h" 10 #include "src/compiler/node-properties.h"
(...skipping 1208 matching lines...) Expand 10 before | Expand all | Expand 10 after
1219 VisitFloatUnop(this, node, node->InputAt(0), kAVXFloat64Abs, kSSEFloat64Abs); 1219 VisitFloatUnop(this, node, node->InputAt(0), kAVXFloat64Abs, kSSEFloat64Abs);
1220 } 1220 }
1221 1221
1222 1222
1223 void InstructionSelector::VisitFloat64Sqrt(Node* node) { 1223 void InstructionSelector::VisitFloat64Sqrt(Node* node) {
1224 VisitRO(this, node, kSSEFloat64Sqrt); 1224 VisitRO(this, node, kSSEFloat64Sqrt);
1225 } 1225 }
1226 1226
1227 1227
1228 void InstructionSelector::VisitFloat32RoundDown(Node* node) { 1228 void InstructionSelector::VisitFloat32RoundDown(Node* node) {
1229 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundDown)); 1229 X64OperandGenerator g(this);
1230 Emit(kSSEFloat32Round | MiscField::encode(kRoundDown),
1231 g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)));
1230 } 1232 }
1231 1233
1232 1234
1233 void InstructionSelector::VisitFloat64RoundDown(Node* node) { 1235 void InstructionSelector::VisitFloat64RoundDown(Node* node) {
1234 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundDown)); 1236 X64OperandGenerator g(this);
1237 Emit(kSSEFloat64Round | MiscField::encode(kRoundDown),
1238 g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)));
1235 } 1239 }
1236 1240
1237 1241
1238 void InstructionSelector::VisitFloat32RoundUp(Node* node) { 1242 void InstructionSelector::VisitFloat32RoundUp(Node* node) {
1239 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundUp)); 1243 X64OperandGenerator g(this);
1244 Emit(kSSEFloat32Round | MiscField::encode(kRoundUp),
1245 g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)));
1240 } 1246 }
1241 1247
1242 1248
1243 void InstructionSelector::VisitFloat64RoundUp(Node* node) { 1249 void InstructionSelector::VisitFloat64RoundUp(Node* node) {
1244 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundUp)); 1250 X64OperandGenerator g(this);
1251 Emit(kSSEFloat64Round | MiscField::encode(kRoundUp),
1252 g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)));
1245 } 1253 }
1246 1254
1247 1255
1248 void InstructionSelector::VisitFloat32RoundTruncate(Node* node) { 1256 void InstructionSelector::VisitFloat32RoundTruncate(Node* node) {
1249 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundToZero)); 1257 X64OperandGenerator g(this);
1258 Emit(kSSEFloat32Round | MiscField::encode(kRoundToZero),
1259 g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)));
1250 } 1260 }
1251 1261
1252 1262
1253 void InstructionSelector::VisitFloat64RoundTruncate(Node* node) { 1263 void InstructionSelector::VisitFloat64RoundTruncate(Node* node) {
1254 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToZero)); 1264 X64OperandGenerator g(this);
1265 Emit(kSSEFloat64Round | MiscField::encode(kRoundToZero),
1266 g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)));
1255 } 1267 }
1256 1268
1257 1269
1258 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) { 1270 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) {
1259 UNREACHABLE(); 1271 UNREACHABLE();
1260 } 1272 }
1261 1273
1262 1274
1263 void InstructionSelector::VisitFloat32RoundTiesEven(Node* node) { 1275 void InstructionSelector::VisitFloat32RoundTiesEven(Node* node) {
1264 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundToNearest)); 1276 X64OperandGenerator g(this);
1277 Emit(kSSEFloat32Round | MiscField::encode(kRoundToNearest),
1278 g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)));
1265 } 1279 }
1266 1280
1267 1281
1268 void InstructionSelector::VisitFloat64RoundTiesEven(Node* node) { 1282 void InstructionSelector::VisitFloat64RoundTiesEven(Node* node) {
1269 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToNearest)); 1283 X64OperandGenerator g(this);
1284 Emit(kSSEFloat64Round | MiscField::encode(kRoundToNearest),
1285 g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)));
1270 } 1286 }
1271 1287
1272 1288
1273 void InstructionSelector::EmitPrepareArguments( 1289 void InstructionSelector::EmitPrepareArguments(
1274 ZoneVector<PushParameter>* arguments, const CallDescriptor* descriptor, 1290 ZoneVector<PushParameter>* arguments, const CallDescriptor* descriptor,
1275 Node* node) { 1291 Node* node) {
1276 X64OperandGenerator g(this); 1292 X64OperandGenerator g(this);
1277 1293
1278 // Prepare for C function call. 1294 // Prepare for C function call.
1279 if (descriptor->IsCFunctionCall()) { 1295 if (descriptor->IsCFunctionCall()) {
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after
1792 1808
1793 // static 1809 // static
1794 MachineOperatorBuilder::Flags 1810 MachineOperatorBuilder::Flags
1795 InstructionSelector::SupportedMachineOperatorFlags() { 1811 InstructionSelector::SupportedMachineOperatorFlags() {
1796 MachineOperatorBuilder::Flags flags = 1812 MachineOperatorBuilder::Flags flags =
1797 MachineOperatorBuilder::kFloat32Max | 1813 MachineOperatorBuilder::kFloat32Max |
1798 MachineOperatorBuilder::kFloat32Min | 1814 MachineOperatorBuilder::kFloat32Min |
1799 MachineOperatorBuilder::kFloat64Max | 1815 MachineOperatorBuilder::kFloat64Max |
1800 MachineOperatorBuilder::kFloat64Min | 1816 MachineOperatorBuilder::kFloat64Min |
1801 MachineOperatorBuilder::kWord32ShiftIsSafe | 1817 MachineOperatorBuilder::kWord32ShiftIsSafe |
1802 MachineOperatorBuilder::kWord32Ctz | MachineOperatorBuilder::kWord64Ctz; 1818 MachineOperatorBuilder::kWord32Ctz | MachineOperatorBuilder::kWord64Ctz |
1819 MachineOperatorBuilder::kFloat32RoundDown |
1820 MachineOperatorBuilder::kFloat32RoundUp |
1821 MachineOperatorBuilder::kFloat32RoundTruncate |
1822 MachineOperatorBuilder::kFloat32RoundTiesEven |
1823 MachineOperatorBuilder::kFloat64RoundDown |
1824 MachineOperatorBuilder::kFloat64RoundUp |
1825 MachineOperatorBuilder::kFloat64RoundTruncate |
1826 MachineOperatorBuilder::kFloat64RoundTiesEven;
1803 if (CpuFeatures::IsSupported(POPCNT)) { 1827 if (CpuFeatures::IsSupported(POPCNT)) {
1804 flags |= MachineOperatorBuilder::kWord32Popcnt | 1828 flags |= MachineOperatorBuilder::kWord32Popcnt |
1805 MachineOperatorBuilder::kWord64Popcnt; 1829 MachineOperatorBuilder::kWord64Popcnt;
1806 } 1830 }
1807 if (CpuFeatures::IsSupported(SSE4_1)) {
1808 flags |= MachineOperatorBuilder::kFloat32RoundDown |
1809 MachineOperatorBuilder::kFloat64RoundDown |
1810 MachineOperatorBuilder::kFloat32RoundUp |
1811 MachineOperatorBuilder::kFloat64RoundUp |
1812 MachineOperatorBuilder::kFloat32RoundTruncate |
1813 MachineOperatorBuilder::kFloat64RoundTruncate |
1814 MachineOperatorBuilder::kFloat32RoundTiesEven |
1815 MachineOperatorBuilder::kFloat64RoundTiesEven;
1816 }
1817 return flags; 1831 return flags;
1818 } 1832 }
1819 1833
1820 } // namespace compiler 1834 } // namespace compiler
1821 } // namespace internal 1835 } // namespace internal
1822 } // namespace v8 1836 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/x64/code-generator-x64.cc ('k') | src/ia32/assembler-ia32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698