| Index: src/compiler/machine-operator-reducer.cc
|
| diff --git a/src/compiler/machine-operator-reducer.cc b/src/compiler/machine-operator-reducer.cc
|
| index b566f489cb1114739f21823c0401ecc2fc84a1cc..f30c4f7aa6d6f3fee1252f555bea0213972db6f6 100644
|
| --- a/src/compiler/machine-operator-reducer.cc
|
| +++ b/src/compiler/machine-operator-reducer.cc
|
| @@ -43,6 +43,20 @@ Node* MachineOperatorReducer::Int64Constant(int64_t value) {
|
| return graph()->NewNode(common()->Int64Constant(value));
|
| }
|
|
|
| +Node* MachineOperatorReducer::Float64Mul(Node* lhs, Node* rhs) {
|
| + return graph()->NewNode(machine()->Float64Mul(), lhs, rhs);
|
| +}
|
| +
|
| +Node* MachineOperatorReducer::Float64PowHalf(Node* value) {
|
| + value =
|
| + graph()->NewNode(machine()->Float64Add(), Float64Constant(0.0), value);
|
| + return graph()->NewNode(
|
| + common()->Select(MachineRepresentation::kFloat64, BranchHint::kFalse),
|
| + graph()->NewNode(machine()->Float64LessThanOrEqual(), value,
|
| + Float64Constant(-V8_INFINITY)),
|
| + Float64Constant(V8_INFINITY),
|
| + graph()->NewNode(machine()->Float64Sqrt(), value));
|
| +}
|
|
|
| Node* MachineOperatorReducer::Word32And(Node* lhs, Node* rhs) {
|
| Node* const node = graph()->NewNode(machine()->Word32And(), lhs, rhs);
|
| @@ -377,6 +391,11 @@ Reduction MachineOperatorReducer::Reduce(Node* node) {
|
| if (m.HasValue()) return ReplaceFloat64(base::ieee754::atanh(m.Value()));
|
| break;
|
| }
|
| + case IrOpcode::kFloat64Cbrt: {
|
| + Float64Matcher m(node->InputAt(0));
|
| + if (m.HasValue()) return ReplaceFloat64(base::ieee754::cbrt(m.Value()));
|
| + break;
|
| + }
|
| case IrOpcode::kFloat64Cos: {
|
| Float64Matcher m(node->InputAt(0));
|
| if (m.HasValue()) return ReplaceFloat64(base::ieee754::cos(m.Value()));
|
| @@ -402,19 +421,40 @@ Reduction MachineOperatorReducer::Reduce(Node* node) {
|
| if (m.HasValue()) return ReplaceFloat64(base::ieee754::log1p(m.Value()));
|
| break;
|
| }
|
| - case IrOpcode::kFloat64Log2: {
|
| - Float64Matcher m(node->InputAt(0));
|
| - if (m.HasValue()) return ReplaceFloat64(base::ieee754::log2(m.Value()));
|
| - break;
|
| - }
|
| case IrOpcode::kFloat64Log10: {
|
| Float64Matcher m(node->InputAt(0));
|
| if (m.HasValue()) return ReplaceFloat64(base::ieee754::log10(m.Value()));
|
| break;
|
| }
|
| - case IrOpcode::kFloat64Cbrt: {
|
| + case IrOpcode::kFloat64Log2: {
|
| Float64Matcher m(node->InputAt(0));
|
| - if (m.HasValue()) return ReplaceFloat64(base::ieee754::cbrt(m.Value()));
|
| + if (m.HasValue()) return ReplaceFloat64(base::ieee754::log2(m.Value()));
|
| + break;
|
| + }
|
| + case IrOpcode::kFloat64Pow: {
|
| + Float64BinopMatcher m(node);
|
| + // TODO(bmeurer): Constant fold once we have a unified pow implementation.
|
| + if (m.right().Is(0.0)) { // x ** +-0.0 => 1.0
|
| + return ReplaceFloat64(1.0);
|
| + } else if (m.right().Is(-2.0)) { // x ** -2.0 => 1 / (x * x)
|
| + node->ReplaceInput(0, Float64Constant(1.0));
|
| + node->ReplaceInput(1, Float64Mul(m.left().node(), m.left().node()));
|
| + NodeProperties::ChangeOp(node, machine()->Float64Div());
|
| + return Changed(node);
|
| + } else if (m.right().Is(2.0)) { // x ** 2.0 => x * x
|
| + node->ReplaceInput(1, m.left().node());
|
| + NodeProperties::ChangeOp(node, machine()->Float64Mul());
|
| + return Changed(node);
|
| + } else if (m.right().Is(-0.5)) {
|
| + // x ** 0.5 => 1 / (if x <= -Infinity then Infinity else sqrt(0.0 + x))
|
| + node->ReplaceInput(0, Float64Constant(1.0));
|
| + node->ReplaceInput(1, Float64PowHalf(m.left().node()));
|
| + NodeProperties::ChangeOp(node, machine()->Float64Div());
|
| + return Changed(node);
|
| + } else if (m.right().Is(0.5)) {
|
| + // x ** 0.5 => if x <= -Infinity then Infinity else sqrt(0.0 + x)
|
| + return Replace(Float64PowHalf(m.left().node()));
|
| + }
|
| break;
|
| }
|
| case IrOpcode::kFloat64Sin: {
|
| @@ -505,7 +545,6 @@ Reduction MachineOperatorReducer::Reduce(Node* node) {
|
| return NoChange();
|
| }
|
|
|
| -
|
| Reduction MachineOperatorReducer::ReduceInt32Add(Node* node) {
|
| DCHECK_EQ(IrOpcode::kInt32Add, node->opcode());
|
| Int32BinopMatcher m(node);
|
|
|