| OLD | NEW |
| 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 #include "src/compiler/node-properties.h" | 7 #include "src/compiler/node-properties.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 2335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2346 g.UseImmediate(m.left().node()), cont); | 2346 g.UseImmediate(m.left().node()), cont); |
| 2347 } else { | 2347 } else { |
| 2348 VisitCompare(selector, kArm64Float64Cmp, g.UseRegister(m.left().node()), | 2348 VisitCompare(selector, kArm64Float64Cmp, g.UseRegister(m.left().node()), |
| 2349 g.UseRegister(m.right().node()), cont); | 2349 g.UseRegister(m.right().node()), cont); |
| 2350 } | 2350 } |
| 2351 } | 2351 } |
| 2352 | 2352 |
| 2353 void VisitWordCompareZero(InstructionSelector* selector, Node* user, | 2353 void VisitWordCompareZero(InstructionSelector* selector, Node* user, |
| 2354 Node* value, FlagsContinuation* cont) { | 2354 Node* value, FlagsContinuation* cont) { |
| 2355 Arm64OperandGenerator g(selector); | 2355 Arm64OperandGenerator g(selector); |
| 2356 while (selector->CanCover(user, value)) { | 2356 // Try to combine with comparisons against 0 by simply inverting the branch. |
| 2357 while (value->opcode() == IrOpcode::kWord32Equal && |
| 2358 selector->CanCover(user, value)) { |
| 2359 Int32BinopMatcher m(value); |
| 2360 if (!m.right().Is(0)) break; |
| 2361 |
| 2362 user = value; |
| 2363 value = m.left().node(); |
| 2364 cont->Negate(); |
| 2365 } |
| 2366 |
| 2367 if (selector->CanCover(user, value)) { |
| 2357 switch (value->opcode()) { | 2368 switch (value->opcode()) { |
| 2358 case IrOpcode::kWord32Equal: { | 2369 case IrOpcode::kWord32Equal: |
| 2359 // Combine with comparisons against 0 by simply inverting the | |
| 2360 // continuation. | |
| 2361 Int32BinopMatcher m(value); | |
| 2362 if (m.right().Is(0)) { | |
| 2363 user = value; | |
| 2364 value = m.left().node(); | |
| 2365 cont->Negate(); | |
| 2366 continue; | |
| 2367 } | |
| 2368 cont->OverwriteAndNegateIfEqual(kEqual); | 2370 cont->OverwriteAndNegateIfEqual(kEqual); |
| 2369 return VisitWord32Compare(selector, value, cont); | 2371 return VisitWord32Compare(selector, value, cont); |
| 2370 } | |
| 2371 case IrOpcode::kInt32LessThan: | 2372 case IrOpcode::kInt32LessThan: |
| 2372 cont->OverwriteAndNegateIfEqual(kSignedLessThan); | 2373 cont->OverwriteAndNegateIfEqual(kSignedLessThan); |
| 2373 return VisitWord32Compare(selector, value, cont); | 2374 return VisitWord32Compare(selector, value, cont); |
| 2374 case IrOpcode::kInt32LessThanOrEqual: | 2375 case IrOpcode::kInt32LessThanOrEqual: |
| 2375 cont->OverwriteAndNegateIfEqual(kSignedLessThanOrEqual); | 2376 cont->OverwriteAndNegateIfEqual(kSignedLessThanOrEqual); |
| 2376 return VisitWord32Compare(selector, value, cont); | 2377 return VisitWord32Compare(selector, value, cont); |
| 2377 case IrOpcode::kUint32LessThan: | 2378 case IrOpcode::kUint32LessThan: |
| 2378 cont->OverwriteAndNegateIfEqual(kUnsignedLessThan); | 2379 cont->OverwriteAndNegateIfEqual(kUnsignedLessThan); |
| 2379 return VisitWord32Compare(selector, value, cont); | 2380 return VisitWord32Compare(selector, value, cont); |
| 2380 case IrOpcode::kUint32LessThanOrEqual: | 2381 case IrOpcode::kUint32LessThanOrEqual: |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2498 case IrOpcode::kWord64And: | 2499 case IrOpcode::kWord64And: |
| 2499 if (TryEmitTestAndBranch<Uint64BinopMatcher, kArm64TestAndBranch>( | 2500 if (TryEmitTestAndBranch<Uint64BinopMatcher, kArm64TestAndBranch>( |
| 2500 selector, value, cont)) { | 2501 selector, value, cont)) { |
| 2501 return; | 2502 return; |
| 2502 } | 2503 } |
| 2503 return VisitWordCompare(selector, value, kArm64Tst, cont, true, | 2504 return VisitWordCompare(selector, value, kArm64Tst, cont, true, |
| 2504 kLogical64Imm); | 2505 kLogical64Imm); |
| 2505 default: | 2506 default: |
| 2506 break; | 2507 break; |
| 2507 } | 2508 } |
| 2508 break; | |
| 2509 } | 2509 } |
| 2510 | 2510 |
| 2511 // Branch could not be combined with a compare, compare against 0 and branch. | 2511 // Branch could not be combined with a compare, compare against 0 and branch. |
| 2512 if (cont->IsBranch()) { | 2512 if (cont->IsBranch()) { |
| 2513 selector->Emit(cont->Encode(kArm64CompareAndBranch32), g.NoOutput(), | 2513 selector->Emit(cont->Encode(kArm64CompareAndBranch32), g.NoOutput(), |
| 2514 g.UseRegister(value), g.Label(cont->true_block()), | 2514 g.UseRegister(value), g.Label(cont->true_block()), |
| 2515 g.Label(cont->false_block())); | 2515 g.Label(cont->false_block())); |
| 2516 } else { | 2516 } else { |
| 2517 DCHECK(cont->IsDeoptimize()); | 2517 DCHECK(cont->IsDeoptimize()); |
| 2518 selector->EmitDeoptimize(cont->Encode(kArm64Tst32), g.NoOutput(), | 2518 selector->EmitDeoptimize(cont->Encode(kArm64Tst32), g.NoOutput(), |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2905 // static | 2905 // static |
| 2906 MachineOperatorBuilder::AlignmentRequirements | 2906 MachineOperatorBuilder::AlignmentRequirements |
| 2907 InstructionSelector::AlignmentRequirements() { | 2907 InstructionSelector::AlignmentRequirements() { |
| 2908 return MachineOperatorBuilder::AlignmentRequirements:: | 2908 return MachineOperatorBuilder::AlignmentRequirements:: |
| 2909 FullUnalignedAccessSupport(); | 2909 FullUnalignedAccessSupport(); |
| 2910 } | 2910 } |
| 2911 | 2911 |
| 2912 } // namespace compiler | 2912 } // namespace compiler |
| 2913 } // namespace internal | 2913 } // namespace internal |
| 2914 } // namespace v8 | 2914 } // namespace v8 |
| OLD | NEW |