Chromium Code Reviews| 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/machine-operator-reducer.h" | 5 #include "src/compiler/machine-operator-reducer.h" |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/base/division-by-constant.h" | 8 #include "src/base/division-by-constant.h" |
| 9 #include "src/base/ieee754.h" | 9 #include "src/base/ieee754.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 405 } | 405 } |
| 406 case IrOpcode::kFloat64Mul: { | 406 case IrOpcode::kFloat64Mul: { |
| 407 Float64BinopMatcher m(node); | 407 Float64BinopMatcher m(node); |
| 408 if (m.right().Is(-1)) { // x * -1.0 => -0.0 - x | 408 if (m.right().Is(-1)) { // x * -1.0 => -0.0 - x |
| 409 node->ReplaceInput(0, Float64Constant(-0.0)); | 409 node->ReplaceInput(0, Float64Constant(-0.0)); |
| 410 node->ReplaceInput(1, m.left().node()); | 410 node->ReplaceInput(1, m.left().node()); |
| 411 NodeProperties::ChangeOp(node, machine()->Float64Sub()); | 411 NodeProperties::ChangeOp(node, machine()->Float64Sub()); |
| 412 return Changed(node); | 412 return Changed(node); |
| 413 } | 413 } |
| 414 if (m.right().Is(1)) return Replace(m.left().node()); // x * 1.0 => x | 414 if (m.right().Is(1)) return Replace(m.left().node()); // x * 1.0 => x |
| 415 if (m.right().Is(2)) { // x * 2.0 => x + x | |
|
Benedikt Meurer
2016/09/15 17:20:52
This should come after the m.IsFoldable case below
| |
| 416 node->ReplaceInput(1, m.left().node()); | |
| 417 NodeProperties::ChangeOp(node, machine()->Float64Add()); | |
| 418 return Changed(node); | |
| 419 } | |
| 415 if (m.right().IsNaN()) { // x * NaN => NaN | 420 if (m.right().IsNaN()) { // x * NaN => NaN |
| 416 return Replace(m.right().node()); | 421 return Replace(m.right().node()); |
| 417 } | 422 } |
| 418 if (m.IsFoldable()) { // K * K => K | 423 if (m.IsFoldable()) { // K * K => K |
| 419 return ReplaceFloat64(m.left().Value() * m.right().Value()); | 424 return ReplaceFloat64(m.left().Value() * m.right().Value()); |
| 420 } | 425 } |
| 421 break; | 426 break; |
| 422 } | 427 } |
| 423 case IrOpcode::kFloat64Div: { | 428 case IrOpcode::kFloat64Div: { |
| 424 Float64BinopMatcher m(node); | 429 Float64BinopMatcher m(node); |
| 425 if (m.right().Is(1)) return Replace(m.left().node()); // x / 1.0 => x | 430 if (m.right().Is(1)) return Replace(m.left().node()); // x / 1.0 => x |
| 431 if (m.right().Is(-1)) { // x / -1.0 => -x | |
|
Benedikt Meurer
2016/09/15 17:20:52
Move this below the m.IsFoldable case.
| |
| 432 node->RemoveInput(1); | |
| 433 NodeProperties::ChangeOp(node, machine()->Float64Neg()); | |
| 434 return Changed(node); | |
| 435 } | |
| 426 if (m.right().IsNaN()) { // x / NaN => NaN | 436 if (m.right().IsNaN()) { // x / NaN => NaN |
| 427 return Replace(m.right().node()); | 437 return Replace(m.right().node()); |
| 428 } | 438 } |
| 429 if (m.left().IsNaN()) { // NaN / x => NaN | 439 if (m.left().IsNaN()) { // NaN / x => NaN |
| 430 return Replace(m.left().node()); | 440 return Replace(m.left().node()); |
| 431 } | 441 } |
| 432 if (m.IsFoldable()) { // K / K => K | 442 if (m.IsFoldable()) { // K / K => K |
| 433 return ReplaceFloat64(m.left().Value() / m.right().Value()); | 443 return ReplaceFloat64(m.left().Value() / m.right().Value()); |
| 434 } | 444 } |
| 445 if (m.right().HasValue()) { | |
| 446 Double k = Double(m.right().Value()); | |
|
Benedikt Meurer
2016/09/15 17:20:52
Can you add this as a IsPowerOfTwo methd to the Fl
martyn.capewell
2016/09/15 17:41:19
The idea is that all reciprocals of non-denormal p
Benedikt Meurer
2016/09/15 18:20:05
Aye, thanks. Please add a comment.
| |
| 447 if (!k.IsSpecial() && !k.IsDenormal() && | |
| 448 ((k.AsUint64() & Double::kSignificandMask) == 0)) { | |
| 449 // x / K => x * (1 / K) for power-of-two K | |
| 450 node->ReplaceInput(1, Float64Constant(1.0 / k.value())); | |
| 451 NodeProperties::ChangeOp(node, machine()->Float64Mul()); | |
| 452 return Changed(node); | |
| 453 } | |
| 454 } | |
| 435 break; | 455 break; |
| 436 } | 456 } |
| 437 case IrOpcode::kFloat64Mod: { | 457 case IrOpcode::kFloat64Mod: { |
| 438 Float64BinopMatcher m(node); | 458 Float64BinopMatcher m(node); |
| 439 if (m.right().Is(0)) { // x % 0 => NaN | 459 if (m.right().Is(0)) { // x % 0 => NaN |
| 440 return ReplaceFloat64(std::numeric_limits<double>::quiet_NaN()); | 460 return ReplaceFloat64(std::numeric_limits<double>::quiet_NaN()); |
| 441 } | 461 } |
| 442 if (m.right().IsNaN()) { // x % NaN => NaN | 462 if (m.right().IsNaN()) { // x % NaN => NaN |
| 443 return Replace(m.right().node()); | 463 return Replace(m.right().node()); |
| 444 } | 464 } |
| (...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1371 MachineOperatorBuilder* MachineOperatorReducer::machine() const { | 1391 MachineOperatorBuilder* MachineOperatorReducer::machine() const { |
| 1372 return jsgraph()->machine(); | 1392 return jsgraph()->machine(); |
| 1373 } | 1393 } |
| 1374 | 1394 |
| 1375 | 1395 |
| 1376 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } | 1396 Graph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } |
| 1377 | 1397 |
| 1378 } // namespace compiler | 1398 } // namespace compiler |
| 1379 } // namespace internal | 1399 } // namespace internal |
| 1380 } // namespace v8 | 1400 } // namespace v8 |
| OLD | NEW |