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

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

Issue 850653002: [turbofan] Improve code generation for unordered comparisons. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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/arm64/code-generator-arm64.cc ('k') | src/compiler/ia32/code-generator-ia32.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/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 7
8 namespace v8 { 8 namespace v8 {
9 namespace internal { 9 namespace internal {
10 namespace compiler { 10 namespace compiler {
(...skipping 1277 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 kArithmeticImm); 1288 kArithmeticImm);
1289 case IrOpcode::kInt64LessThanOrEqual: 1289 case IrOpcode::kInt64LessThanOrEqual:
1290 cont.OverwriteAndNegateIfEqual(kSignedLessThanOrEqual); 1290 cont.OverwriteAndNegateIfEqual(kSignedLessThanOrEqual);
1291 return VisitWordCompare(this, value, kArm64Cmp, &cont, false, 1291 return VisitWordCompare(this, value, kArm64Cmp, &cont, false,
1292 kArithmeticImm); 1292 kArithmeticImm);
1293 case IrOpcode::kUint64LessThan: 1293 case IrOpcode::kUint64LessThan:
1294 cont.OverwriteAndNegateIfEqual(kUnsignedLessThan); 1294 cont.OverwriteAndNegateIfEqual(kUnsignedLessThan);
1295 return VisitWordCompare(this, value, kArm64Cmp, &cont, false, 1295 return VisitWordCompare(this, value, kArm64Cmp, &cont, false,
1296 kArithmeticImm); 1296 kArithmeticImm);
1297 case IrOpcode::kFloat64Equal: 1297 case IrOpcode::kFloat64Equal:
1298 cont.OverwriteAndNegateIfEqual(kUnorderedEqual); 1298 cont.OverwriteAndNegateIfEqual(kEqual);
1299 return VisitFloat64Compare(this, value, &cont); 1299 return VisitFloat64Compare(this, value, &cont);
1300 case IrOpcode::kFloat64LessThan: 1300 case IrOpcode::kFloat64LessThan:
1301 cont.OverwriteAndNegateIfEqual(kUnorderedLessThan); 1301 cont.OverwriteAndNegateIfEqual(kUnsignedLessThan);
1302 return VisitFloat64Compare(this, value, &cont); 1302 return VisitFloat64Compare(this, value, &cont);
1303 case IrOpcode::kFloat64LessThanOrEqual: 1303 case IrOpcode::kFloat64LessThanOrEqual:
1304 cont.OverwriteAndNegateIfEqual(kUnorderedLessThanOrEqual); 1304 cont.OverwriteAndNegateIfEqual(kUnsignedLessThanOrEqual);
1305 return VisitFloat64Compare(this, value, &cont); 1305 return VisitFloat64Compare(this, value, &cont);
1306 case IrOpcode::kProjection: 1306 case IrOpcode::kProjection:
1307 // Check if this is the overflow output projection of an 1307 // Check if this is the overflow output projection of an
1308 // <Operation>WithOverflow node. 1308 // <Operation>WithOverflow node.
1309 if (OpParameter<size_t>(value) == 1u) { 1309 if (OpParameter<size_t>(value) == 1u) {
1310 // We cannot combine the <Operation>WithOverflow with this branch 1310 // We cannot combine the <Operation>WithOverflow with this branch
1311 // unless the 0th projection (the use of the actual value of the 1311 // unless the 0th projection (the use of the actual value of the
1312 // <Operation> is either NULL, which means there's no use of the 1312 // <Operation> is either NULL, which means there's no use of the
1313 // actual value, or was already defined, which means it is scheduled 1313 // actual value, or was already defined, which means it is scheduled
1314 // *AFTER* this branch). 1314 // *AFTER* this branch).
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1490 } 1490 }
1491 1491
1492 1492
1493 void InstructionSelector::VisitUint64LessThan(Node* node) { 1493 void InstructionSelector::VisitUint64LessThan(Node* node) {
1494 FlagsContinuation cont(kUnsignedLessThan, node); 1494 FlagsContinuation cont(kUnsignedLessThan, node);
1495 VisitWordCompare(this, node, kArm64Cmp, &cont, false, kArithmeticImm); 1495 VisitWordCompare(this, node, kArm64Cmp, &cont, false, kArithmeticImm);
1496 } 1496 }
1497 1497
1498 1498
1499 void InstructionSelector::VisitFloat64Equal(Node* node) { 1499 void InstructionSelector::VisitFloat64Equal(Node* node) {
1500 FlagsContinuation cont(kUnorderedEqual, node); 1500 FlagsContinuation cont(kEqual, node);
1501 VisitFloat64Compare(this, node, &cont); 1501 VisitFloat64Compare(this, node, &cont);
1502 } 1502 }
1503 1503
1504 1504
1505 void InstructionSelector::VisitFloat64LessThan(Node* node) { 1505 void InstructionSelector::VisitFloat64LessThan(Node* node) {
1506 FlagsContinuation cont(kUnorderedLessThan, node); 1506 FlagsContinuation cont(kUnsignedLessThan, node);
1507 VisitFloat64Compare(this, node, &cont); 1507 VisitFloat64Compare(this, node, &cont);
1508 } 1508 }
1509 1509
1510 1510
1511 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { 1511 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) {
1512 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); 1512 FlagsContinuation cont(kUnsignedLessThanOrEqual, node);
1513 VisitFloat64Compare(this, node, &cont); 1513 VisitFloat64Compare(this, node, &cont);
1514 } 1514 }
1515 1515
1516 1516
1517 // static 1517 // static
1518 MachineOperatorBuilder::Flags 1518 MachineOperatorBuilder::Flags
1519 InstructionSelector::SupportedMachineOperatorFlags() { 1519 InstructionSelector::SupportedMachineOperatorFlags() {
1520 return MachineOperatorBuilder::kFloat64Floor | 1520 return MachineOperatorBuilder::kFloat64Floor |
1521 MachineOperatorBuilder::kFloat64Ceil | 1521 MachineOperatorBuilder::kFloat64Ceil |
1522 MachineOperatorBuilder::kFloat64RoundTruncate | 1522 MachineOperatorBuilder::kFloat64RoundTruncate |
1523 MachineOperatorBuilder::kFloat64RoundTiesAway | 1523 MachineOperatorBuilder::kFloat64RoundTiesAway |
1524 MachineOperatorBuilder::kWord32ShiftIsSafe | 1524 MachineOperatorBuilder::kWord32ShiftIsSafe |
1525 MachineOperatorBuilder::kInt32DivIsSafe | 1525 MachineOperatorBuilder::kInt32DivIsSafe |
1526 MachineOperatorBuilder::kUint32DivIsSafe; 1526 MachineOperatorBuilder::kUint32DivIsSafe;
1527 } 1527 }
1528
1528 } // namespace compiler 1529 } // namespace compiler
1529 } // namespace internal 1530 } // namespace internal
1530 } // namespace v8 1531 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/arm64/code-generator-arm64.cc ('k') | src/compiler/ia32/code-generator-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698