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

Side by Side Diff: src/compiler/x64/instruction-selector-x64.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/x64/code-generator-x64.cc ('k') | test/cctest/compiler/test-branch-combine.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 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after
1020 1020
1021 1021
1022 // Shared routine for comparison with zero. 1022 // Shared routine for comparison with zero.
1023 static void VisitCompareZero(InstructionSelector* selector, Node* node, 1023 static void VisitCompareZero(InstructionSelector* selector, Node* node,
1024 InstructionCode opcode, FlagsContinuation* cont) { 1024 InstructionCode opcode, FlagsContinuation* cont) {
1025 X64OperandGenerator g(selector); 1025 X64OperandGenerator g(selector);
1026 VisitCompare(selector, opcode, g.Use(node), g.TempImmediate(0), cont); 1026 VisitCompare(selector, opcode, g.Use(node), g.TempImmediate(0), cont);
1027 } 1027 }
1028 1028
1029 1029
1030 // Shared routine for multiple float64 compare operations. 1030 // Shared routine for multiple float64 compare operations (inputs commuted).
1031 static void VisitFloat64Compare(InstructionSelector* selector, Node* node, 1031 static void VisitFloat64Compare(InstructionSelector* selector, Node* node,
1032 FlagsContinuation* cont) { 1032 FlagsContinuation* cont) {
1033 VisitCompare(selector, kSSEFloat64Cmp, node->InputAt(0), node->InputAt(1), 1033 Node* const left = node->InputAt(0);
1034 cont, node->op()->HasProperty(Operator::kCommutative)); 1034 Node* const right = node->InputAt(1);
1035 VisitCompare(selector, kSSEFloat64Cmp, right, left, cont, false);
1035 } 1036 }
1036 1037
1037 1038
1038 void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch, 1039 void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch,
1039 BasicBlock* fbranch) { 1040 BasicBlock* fbranch) {
1040 X64OperandGenerator g(this); 1041 X64OperandGenerator g(this);
1041 Node* user = branch; 1042 Node* user = branch;
1042 Node* value = branch->InputAt(0); 1043 Node* value = branch->InputAt(0);
1043 1044
1044 FlagsContinuation cont(kNotEqual, tbranch, fbranch); 1045 FlagsContinuation cont(kNotEqual, tbranch, fbranch);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 case IrOpcode::kInt64LessThanOrEqual: 1096 case IrOpcode::kInt64LessThanOrEqual:
1096 cont.OverwriteAndNegateIfEqual(kSignedLessThanOrEqual); 1097 cont.OverwriteAndNegateIfEqual(kSignedLessThanOrEqual);
1097 return VisitWordCompare(this, value, kX64Cmp, &cont); 1098 return VisitWordCompare(this, value, kX64Cmp, &cont);
1098 case IrOpcode::kUint64LessThan: 1099 case IrOpcode::kUint64LessThan:
1099 cont.OverwriteAndNegateIfEqual(kUnsignedLessThan); 1100 cont.OverwriteAndNegateIfEqual(kUnsignedLessThan);
1100 return VisitWordCompare(this, value, kX64Cmp, &cont); 1101 return VisitWordCompare(this, value, kX64Cmp, &cont);
1101 case IrOpcode::kFloat64Equal: 1102 case IrOpcode::kFloat64Equal:
1102 cont.OverwriteAndNegateIfEqual(kUnorderedEqual); 1103 cont.OverwriteAndNegateIfEqual(kUnorderedEqual);
1103 return VisitFloat64Compare(this, value, &cont); 1104 return VisitFloat64Compare(this, value, &cont);
1104 case IrOpcode::kFloat64LessThan: 1105 case IrOpcode::kFloat64LessThan:
1105 cont.OverwriteAndNegateIfEqual(kUnorderedLessThan); 1106 cont.OverwriteAndNegateIfEqual(kUnsignedGreaterThan);
1106 return VisitFloat64Compare(this, value, &cont); 1107 return VisitFloat64Compare(this, value, &cont);
1107 case IrOpcode::kFloat64LessThanOrEqual: 1108 case IrOpcode::kFloat64LessThanOrEqual:
1108 cont.OverwriteAndNegateIfEqual(kUnorderedLessThanOrEqual); 1109 cont.OverwriteAndNegateIfEqual(kUnsignedGreaterThanOrEqual);
1109 return VisitFloat64Compare(this, value, &cont); 1110 return VisitFloat64Compare(this, value, &cont);
1110 case IrOpcode::kProjection: 1111 case IrOpcode::kProjection:
1111 // Check if this is the overflow output projection of an 1112 // Check if this is the overflow output projection of an
1112 // <Operation>WithOverflow node. 1113 // <Operation>WithOverflow node.
1113 if (OpParameter<size_t>(value) == 1u) { 1114 if (OpParameter<size_t>(value) == 1u) {
1114 // We cannot combine the <Operation>WithOverflow with this branch 1115 // We cannot combine the <Operation>WithOverflow with this branch
1115 // unless the 0th projection (the use of the actual value of the 1116 // unless the 0th projection (the use of the actual value of the
1116 // <Operation> is either NULL, which means there's no use of the 1117 // <Operation> is either NULL, which means there's no use of the
1117 // actual value, or was already defined, which means it is scheduled 1118 // actual value, or was already defined, which means it is scheduled
1118 // *AFTER* this branch). 1119 // *AFTER* this branch).
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1284 } 1285 }
1285 1286
1286 1287
1287 void InstructionSelector::VisitFloat64Equal(Node* node) { 1288 void InstructionSelector::VisitFloat64Equal(Node* node) {
1288 FlagsContinuation cont(kUnorderedEqual, node); 1289 FlagsContinuation cont(kUnorderedEqual, node);
1289 VisitFloat64Compare(this, node, &cont); 1290 VisitFloat64Compare(this, node, &cont);
1290 } 1291 }
1291 1292
1292 1293
1293 void InstructionSelector::VisitFloat64LessThan(Node* node) { 1294 void InstructionSelector::VisitFloat64LessThan(Node* node) {
1294 FlagsContinuation cont(kUnorderedLessThan, node); 1295 FlagsContinuation cont(kUnsignedGreaterThan, node);
1295 VisitFloat64Compare(this, node, &cont); 1296 VisitFloat64Compare(this, node, &cont);
1296 } 1297 }
1297 1298
1298 1299
1299 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { 1300 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) {
1300 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); 1301 FlagsContinuation cont(kUnsignedGreaterThanOrEqual, node);
1301 VisitFloat64Compare(this, node, &cont); 1302 VisitFloat64Compare(this, node, &cont);
1302 } 1303 }
1303 1304
1304 1305
1305 // static 1306 // static
1306 MachineOperatorBuilder::Flags 1307 MachineOperatorBuilder::Flags
1307 InstructionSelector::SupportedMachineOperatorFlags() { 1308 InstructionSelector::SupportedMachineOperatorFlags() {
1308 if (CpuFeatures::IsSupported(SSE4_1)) { 1309 if (CpuFeatures::IsSupported(SSE4_1)) {
1309 return MachineOperatorBuilder::kFloat64Floor | 1310 return MachineOperatorBuilder::kFloat64Floor |
1310 MachineOperatorBuilder::kFloat64Ceil | 1311 MachineOperatorBuilder::kFloat64Ceil |
1311 MachineOperatorBuilder::kFloat64RoundTruncate | 1312 MachineOperatorBuilder::kFloat64RoundTruncate |
1312 MachineOperatorBuilder::kWord32ShiftIsSafe; 1313 MachineOperatorBuilder::kWord32ShiftIsSafe;
1313 } 1314 }
1314 return MachineOperatorBuilder::kNoFlags; 1315 return MachineOperatorBuilder::kNoFlags;
1315 } 1316 }
1316 1317
1317 } // namespace compiler 1318 } // namespace compiler
1318 } // namespace internal 1319 } // namespace internal
1319 } // namespace v8 1320 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/x64/code-generator-x64.cc ('k') | test/cctest/compiler/test-branch-combine.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698