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

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

Issue 2662123004: [turbofan][x64] Fix instruction selection for Word32Equal. (Closed)
Patch Set: Address comment as per offline discussion. 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
« no previous file with comments | « no previous file | no next file » | 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 2053 matching lines...) Expand 10 before | Expand all | Expand 10 after
2064 cont->OverwriteAndNegateIfEqual(kOverflow); 2064 cont->OverwriteAndNegateIfEqual(kOverflow);
2065 return VisitBinop(selector, node, kX64Sub, cont); 2065 return VisitBinop(selector, node, kX64Sub, cont);
2066 default: 2066 default:
2067 break; 2067 break;
2068 } 2068 }
2069 } 2069 }
2070 } 2070 }
2071 break; 2071 break;
2072 case IrOpcode::kInt32Sub: 2072 case IrOpcode::kInt32Sub:
2073 return VisitWordCompare(selector, value, kX64Cmp32, cont); 2073 return VisitWordCompare(selector, value, kX64Cmp32, cont);
2074 case IrOpcode::kInt64Sub:
2075 return VisitWord64Compare(selector, value, cont);
2076 case IrOpcode::kWord32And: 2074 case IrOpcode::kWord32And:
2077 return VisitWordCompare(selector, value, kX64Test32, cont); 2075 return VisitWordCompare(selector, value, kX64Test32, cont);
2078 case IrOpcode::kWord64And:
2079 return VisitWordCompare(selector, value, kX64Test, cont);
2080 default: 2076 default:
2081 break; 2077 break;
2082 } 2078 }
2083 } 2079 }
2084 2080
2085 // Branch could not be combined with a compare, emit compare against 0. 2081 // Branch could not be combined with a compare, emit compare against 0.
2086 VisitCompareZero(selector, value, kX64Cmp32, cont); 2082 VisitCompareZero(selector, value, kX64Cmp32, cont);
2087 } 2083 }
2088 2084
2089 } // namespace 2085 } // namespace
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
2148 // Generate a sequence of conditional jumps. 2144 // Generate a sequence of conditional jumps.
2149 return EmitLookupSwitch(sw, value_operand); 2145 return EmitLookupSwitch(sw, value_operand);
2150 } 2146 }
2151 2147
2152 2148
2153 void InstructionSelector::VisitWord32Equal(Node* const node) { 2149 void InstructionSelector::VisitWord32Equal(Node* const node) {
2154 Node* user = node; 2150 Node* user = node;
2155 FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node); 2151 FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node);
2156 Int32BinopMatcher m(user); 2152 Int32BinopMatcher m(user);
2157 if (m.right().Is(0)) { 2153 if (m.right().Is(0)) {
2158 Node* value = m.left().node(); 2154 return VisitWordCompareZero(this, m.node(), m.left().node(), &cont);
2159
2160 // Try to combine with comparisons against 0 by simply inverting the branch.
2161 while (CanCover(user, value) && value->opcode() == IrOpcode::kWord32Equal) {
2162 Int32BinopMatcher m(value);
2163 if (m.right().Is(0)) {
2164 user = value;
2165 value = m.left().node();
2166 cont.Negate();
2167 } else {
2168 break;
2169 }
2170 }
2171
2172 // Try to combine the branch with a comparison.
2173 if (CanCover(user, value)) {
2174 switch (value->opcode()) {
2175 case IrOpcode::kInt32Sub:
2176 return VisitWordCompare(this, value, kX64Cmp32, &cont);
2177 case IrOpcode::kWord32And:
2178 return VisitWordCompare(this, value, kX64Test32, &cont);
2179 default:
2180 break;
2181 }
2182 }
2183 return VisitCompareZero(this, value, kX64Cmp32, &cont);
2184 } 2155 }
2185 VisitWordCompare(this, node, kX64Cmp32, &cont); 2156 VisitWordCompare(this, node, kX64Cmp32, &cont);
2186 } 2157 }
2187 2158
2188 2159
2189 void InstructionSelector::VisitInt32LessThan(Node* node) { 2160 void InstructionSelector::VisitInt32LessThan(Node* node) {
2190 FlagsContinuation cont = FlagsContinuation::ForSet(kSignedLessThan, node); 2161 FlagsContinuation cont = FlagsContinuation::ForSet(kSignedLessThan, node);
2191 VisitWordCompare(this, node, kX64Cmp32, &cont); 2162 VisitWordCompare(this, node, kX64Cmp32, &cont);
2192 } 2163 }
2193 2164
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
2481 // static 2452 // static
2482 MachineOperatorBuilder::AlignmentRequirements 2453 MachineOperatorBuilder::AlignmentRequirements
2483 InstructionSelector::AlignmentRequirements() { 2454 InstructionSelector::AlignmentRequirements() {
2484 return MachineOperatorBuilder::AlignmentRequirements:: 2455 return MachineOperatorBuilder::AlignmentRequirements::
2485 FullUnalignedAccessSupport(); 2456 FullUnalignedAccessSupport();
2486 } 2457 }
2487 2458
2488 } // namespace compiler 2459 } // namespace compiler
2489 } // namespace internal 2460 } // namespace internal
2490 } // namespace v8 2461 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698