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/base/adapters.h" | 5 #include "src/base/adapters.h" |
6 #include "src/base/bits.h" | 6 #include "src/base/bits.h" |
7 #include "src/compiler/instruction-selector-impl.h" | 7 #include "src/compiler/instruction-selector-impl.h" |
8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
10 | 10 |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 m.right().Is(-1)) { | 352 m.right().Is(-1)) { |
353 Int32BinopMatcher mleft(m.left().node()); | 353 Int32BinopMatcher mleft(m.left().node()); |
354 if (!mleft.right().HasValue()) { | 354 if (!mleft.right().HasValue()) { |
355 Mips64OperandGenerator g(this); | 355 Mips64OperandGenerator g(this); |
356 Emit(kMips64Nor, g.DefineAsRegister(node), | 356 Emit(kMips64Nor, g.DefineAsRegister(node), |
357 g.UseRegister(mleft.left().node()), | 357 g.UseRegister(mleft.left().node()), |
358 g.UseRegister(mleft.right().node())); | 358 g.UseRegister(mleft.right().node())); |
359 return; | 359 return; |
360 } | 360 } |
361 } | 361 } |
| 362 if (m.right().Is(-1)) { |
| 363 // Use Nor for bit negation and eliminate constant loading for xori. |
| 364 Mips64OperandGenerator g(this); |
| 365 Emit(kMips64Nor, g.DefineAsRegister(node), g.UseRegister(m.left().node()), |
| 366 g.TempImmediate(0)); |
| 367 return; |
| 368 } |
362 VisitBinop(this, node, kMips64Xor); | 369 VisitBinop(this, node, kMips64Xor); |
363 } | 370 } |
364 | 371 |
365 | 372 |
366 void InstructionSelector::VisitWord64Xor(Node* node) { | 373 void InstructionSelector::VisitWord64Xor(Node* node) { |
367 Int64BinopMatcher m(node); | 374 Int64BinopMatcher m(node); |
368 if (m.left().IsWord64Or() && CanCover(node, m.left().node()) && | 375 if (m.left().IsWord64Or() && CanCover(node, m.left().node()) && |
369 m.right().Is(-1)) { | 376 m.right().Is(-1)) { |
370 Int64BinopMatcher mleft(m.left().node()); | 377 Int64BinopMatcher mleft(m.left().node()); |
371 if (!mleft.right().HasValue()) { | 378 if (!mleft.right().HasValue()) { |
372 Mips64OperandGenerator g(this); | 379 Mips64OperandGenerator g(this); |
373 Emit(kMips64Nor, g.DefineAsRegister(node), | 380 Emit(kMips64Nor, g.DefineAsRegister(node), |
374 g.UseRegister(mleft.left().node()), | 381 g.UseRegister(mleft.left().node()), |
375 g.UseRegister(mleft.right().node())); | 382 g.UseRegister(mleft.right().node())); |
376 return; | 383 return; |
377 } | 384 } |
378 } | 385 } |
| 386 if (m.right().Is(-1)) { |
| 387 // Use Nor for bit negation and eliminate constant loading for xori. |
| 388 Mips64OperandGenerator g(this); |
| 389 Emit(kMips64Nor, g.DefineAsRegister(node), g.UseRegister(m.left().node()), |
| 390 g.TempImmediate(0)); |
| 391 return; |
| 392 } |
379 VisitBinop(this, node, kMips64Xor); | 393 VisitBinop(this, node, kMips64Xor); |
380 } | 394 } |
381 | 395 |
382 | 396 |
383 void InstructionSelector::VisitWord32Shl(Node* node) { | 397 void InstructionSelector::VisitWord32Shl(Node* node) { |
384 VisitRRO(this, kMips64Shl, node); | 398 VisitRRO(this, kMips64Shl, node); |
385 } | 399 } |
386 | 400 |
387 | 401 |
388 void InstructionSelector::VisitWord32Shr(Node* node) { | 402 void InstructionSelector::VisitWord32Shr(Node* node) { |
(...skipping 1232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1621 MachineOperatorBuilder::kFloat32RoundUp | | 1635 MachineOperatorBuilder::kFloat32RoundUp | |
1622 MachineOperatorBuilder::kFloat64RoundTruncate | | 1636 MachineOperatorBuilder::kFloat64RoundTruncate | |
1623 MachineOperatorBuilder::kFloat32RoundTruncate | | 1637 MachineOperatorBuilder::kFloat32RoundTruncate | |
1624 MachineOperatorBuilder::kFloat64RoundTiesEven | | 1638 MachineOperatorBuilder::kFloat64RoundTiesEven | |
1625 MachineOperatorBuilder::kFloat32RoundTiesEven; | 1639 MachineOperatorBuilder::kFloat32RoundTiesEven; |
1626 } | 1640 } |
1627 | 1641 |
1628 } // namespace compiler | 1642 } // namespace compiler |
1629 } // namespace internal | 1643 } // namespace internal |
1630 } // namespace v8 | 1644 } // namespace v8 |
OLD | NEW |