| Index: src/compiler/simplified-lowering.cc
|
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc
|
| index a277388df2ce7c1dcf7e5f19ed4b1426f65fe2f3..297d18131024f80d6392dd683fb99a9842487148 100644
|
| --- a/src/compiler/simplified-lowering.cc
|
| +++ b/src/compiler/simplified-lowering.cc
|
| @@ -1870,18 +1870,6 @@ class RepresentationSelector {
|
| if (lower()) NodeProperties::ChangeOp(node, Uint32Op(node));
|
| return;
|
| }
|
| - case IrOpcode::kNumberCeil: {
|
| - VisitUnop(node, UseInfo::TruncatingFloat64(),
|
| - MachineRepresentation::kFloat64);
|
| - if (lower()) DeferReplacement(node, lowering->Float64Ceil(node));
|
| - return;
|
| - }
|
| - case IrOpcode::kNumberFloor: {
|
| - VisitUnop(node, UseInfo::TruncatingFloat64(),
|
| - MachineRepresentation::kFloat64);
|
| - if (lower()) DeferReplacement(node, lowering->Float64Floor(node));
|
| - return;
|
| - }
|
| case IrOpcode::kNumberFround: {
|
| VisitUnop(node, UseInfo::TruncatingFloat64(),
|
| MachineRepresentation::kFloat32);
|
| @@ -1953,10 +1941,12 @@ class RepresentationSelector {
|
| case IrOpcode::kNumberAsinh:
|
| case IrOpcode::kNumberAtan:
|
| case IrOpcode::kNumberAtanh:
|
| + case IrOpcode::kNumberCeil:
|
| case IrOpcode::kNumberCos:
|
| case IrOpcode::kNumberCosh:
|
| case IrOpcode::kNumberExp:
|
| case IrOpcode::kNumberExpm1:
|
| + case IrOpcode::kNumberFloor:
|
| case IrOpcode::kNumberLog:
|
| case IrOpcode::kNumberLog1p:
|
| case IrOpcode::kNumberLog2:
|
| @@ -1965,7 +1955,8 @@ class RepresentationSelector {
|
| case IrOpcode::kNumberSin:
|
| case IrOpcode::kNumberSinh:
|
| case IrOpcode::kNumberTan:
|
| - case IrOpcode::kNumberTanh: {
|
| + case IrOpcode::kNumberTanh:
|
| + case IrOpcode::kNumberTrunc: {
|
| VisitUnop(node, UseInfo::TruncatingFloat64(),
|
| MachineRepresentation::kFloat64);
|
| if (lower()) NodeProperties::ChangeOp(node, Float64Op(node));
|
| @@ -1995,12 +1986,6 @@ class RepresentationSelector {
|
| if (lower()) NodeProperties::ChangeOp(node, Float64Op(node));
|
| return;
|
| }
|
| - case IrOpcode::kNumberTrunc: {
|
| - VisitUnop(node, UseInfo::TruncatingFloat64(),
|
| - MachineRepresentation::kFloat64);
|
| - if (lower()) DeferReplacement(node, lowering->Float64Trunc(node));
|
| - return;
|
| - }
|
| case IrOpcode::kNumberToInt32: {
|
| // Just change representation if necessary.
|
| VisitUnop(node, UseInfo::TruncatingWord32(),
|
| @@ -2927,262 +2912,14 @@ void SimplifiedLowering::DoStoreBuffer(Node* node) {
|
| NodeProperties::ChangeOp(node, machine()->CheckedStore(rep));
|
| }
|
|
|
| -Node* SimplifiedLowering::Float64Ceil(Node* const node) {
|
| - Node* const one = jsgraph()->Float64Constant(1.0);
|
| - Node* const zero = jsgraph()->Float64Constant(0.0);
|
| - Node* const minus_zero = jsgraph()->Float64Constant(-0.0);
|
| - Node* const two_52 = jsgraph()->Float64Constant(4503599627370496.0E0);
|
| - Node* const minus_two_52 = jsgraph()->Float64Constant(-4503599627370496.0E0);
|
| - Node* const input = node->InputAt(0);
|
| -
|
| - // Use fast hardware instruction if available.
|
| - if (machine()->Float64RoundUp().IsSupported()) {
|
| - return graph()->NewNode(machine()->Float64RoundUp().op(), input);
|
| - }
|
| -
|
| - // General case for ceil.
|
| - //
|
| - // if 0.0 < input then
|
| - // if 2^52 <= input then
|
| - // input
|
| - // else
|
| - // let temp1 = (2^52 + input) - 2^52 in
|
| - // if temp1 < input then
|
| - // temp1 + 1
|
| - // else
|
| - // temp1
|
| - // else
|
| - // if input == 0 then
|
| - // input
|
| - // else
|
| - // if input <= -2^52 then
|
| - // input
|
| - // else
|
| - // let temp1 = -0 - input in
|
| - // let temp2 = (2^52 + temp1) - 2^52 in
|
| - // let temp3 = (if temp1 < temp2 then temp2 - 1 else temp2) in
|
| - // -0 - temp3
|
| - //
|
| - // Note: We do not use the Diamond helper class here, because it really hurts
|
| - // readability with nested diamonds.
|
| -
|
| - Node* check0 = graph()->NewNode(machine()->Float64LessThan(), zero, input);
|
| - Node* branch0 = graph()->NewNode(common()->Branch(BranchHint::kTrue), check0,
|
| - graph()->start());
|
| -
|
| - Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0);
|
| - Node* vtrue0;
|
| - {
|
| - Node* check1 =
|
| - graph()->NewNode(machine()->Float64LessThanOrEqual(), two_52, input);
|
| - Node* branch1 = graph()->NewNode(common()->Branch(), check1, if_true0);
|
| -
|
| - Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1);
|
| - Node* vtrue1 = input;
|
| -
|
| - Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1);
|
| - Node* vfalse1;
|
| - {
|
| - Node* temp1 = graph()->NewNode(
|
| - machine()->Float64Sub(),
|
| - graph()->NewNode(machine()->Float64Add(), two_52, input), two_52);
|
| - vfalse1 = graph()->NewNode(
|
| - common()->Select(MachineRepresentation::kFloat64),
|
| - graph()->NewNode(machine()->Float64LessThan(), temp1, input),
|
| - graph()->NewNode(machine()->Float64Add(), temp1, one), temp1);
|
| - }
|
| -
|
| - if_true0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1);
|
| - vtrue0 = graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue1, vfalse1, if_true0);
|
| - }
|
| -
|
| - Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0);
|
| - Node* vfalse0;
|
| - {
|
| - Node* check1 = graph()->NewNode(machine()->Float64Equal(), input, zero);
|
| - Node* branch1 = graph()->NewNode(common()->Branch(BranchHint::kFalse),
|
| - check1, if_false0);
|
| -
|
| - Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1);
|
| - Node* vtrue1 = input;
|
| -
|
| - Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1);
|
| - Node* vfalse1;
|
| - {
|
| - Node* check2 = graph()->NewNode(machine()->Float64LessThanOrEqual(),
|
| - input, minus_two_52);
|
| - Node* branch2 = graph()->NewNode(common()->Branch(BranchHint::kFalse),
|
| - check2, if_false1);
|
| -
|
| - Node* if_true2 = graph()->NewNode(common()->IfTrue(), branch2);
|
| - Node* vtrue2 = input;
|
| -
|
| - Node* if_false2 = graph()->NewNode(common()->IfFalse(), branch2);
|
| - Node* vfalse2;
|
| - {
|
| - Node* temp1 =
|
| - graph()->NewNode(machine()->Float64Sub(), minus_zero, input);
|
| - Node* temp2 = graph()->NewNode(
|
| - machine()->Float64Sub(),
|
| - graph()->NewNode(machine()->Float64Add(), two_52, temp1), two_52);
|
| - Node* temp3 = graph()->NewNode(
|
| - common()->Select(MachineRepresentation::kFloat64),
|
| - graph()->NewNode(machine()->Float64LessThan(), temp1, temp2),
|
| - graph()->NewNode(machine()->Float64Sub(), temp2, one), temp2);
|
| - vfalse2 = graph()->NewNode(machine()->Float64Sub(), minus_zero, temp3);
|
| - }
|
| -
|
| - if_false1 = graph()->NewNode(common()->Merge(2), if_true2, if_false2);
|
| - vfalse1 =
|
| - graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue2, vfalse2, if_false1);
|
| - }
|
| -
|
| - if_false0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1);
|
| - vfalse0 =
|
| - graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue1, vfalse1, if_false0);
|
| - }
|
| -
|
| - Node* merge0 = graph()->NewNode(common()->Merge(2), if_true0, if_false0);
|
| - return graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue0, vfalse0, merge0);
|
| -}
|
| -
|
| -Node* SimplifiedLowering::Float64Floor(Node* const node) {
|
| - Node* const one = jsgraph()->Float64Constant(1.0);
|
| - Node* const zero = jsgraph()->Float64Constant(0.0);
|
| - Node* const minus_one = jsgraph()->Float64Constant(-1.0);
|
| - Node* const minus_zero = jsgraph()->Float64Constant(-0.0);
|
| - Node* const two_52 = jsgraph()->Float64Constant(4503599627370496.0E0);
|
| - Node* const minus_two_52 = jsgraph()->Float64Constant(-4503599627370496.0E0);
|
| - Node* const input = node->InputAt(0);
|
| -
|
| - // Use fast hardware instruction if available.
|
| - if (machine()->Float64RoundDown().IsSupported()) {
|
| - return graph()->NewNode(machine()->Float64RoundDown().op(), input);
|
| - }
|
| -
|
| - // General case for floor.
|
| - //
|
| - // if 0.0 < input then
|
| - // if 2^52 <= input then
|
| - // input
|
| - // else
|
| - // let temp1 = (2^52 + input) - 2^52 in
|
| - // if input < temp1 then
|
| - // temp1 - 1
|
| - // else
|
| - // temp1
|
| - // else
|
| - // if input == 0 then
|
| - // input
|
| - // else
|
| - // if input <= -2^52 then
|
| - // input
|
| - // else
|
| - // let temp1 = -0 - input in
|
| - // let temp2 = (2^52 + temp1) - 2^52 in
|
| - // if temp2 < temp1 then
|
| - // -1 - temp2
|
| - // else
|
| - // -0 - temp2
|
| - //
|
| - // Note: We do not use the Diamond helper class here, because it really hurts
|
| - // readability with nested diamonds.
|
| -
|
| - Node* check0 = graph()->NewNode(machine()->Float64LessThan(), zero, input);
|
| - Node* branch0 = graph()->NewNode(common()->Branch(BranchHint::kTrue), check0,
|
| - graph()->start());
|
| -
|
| - Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0);
|
| - Node* vtrue0;
|
| - {
|
| - Node* check1 =
|
| - graph()->NewNode(machine()->Float64LessThanOrEqual(), two_52, input);
|
| - Node* branch1 = graph()->NewNode(common()->Branch(), check1, if_true0);
|
| -
|
| - Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1);
|
| - Node* vtrue1 = input;
|
| -
|
| - Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1);
|
| - Node* vfalse1;
|
| - {
|
| - Node* temp1 = graph()->NewNode(
|
| - machine()->Float64Sub(),
|
| - graph()->NewNode(machine()->Float64Add(), two_52, input), two_52);
|
| - vfalse1 = graph()->NewNode(
|
| - common()->Select(MachineRepresentation::kFloat64),
|
| - graph()->NewNode(machine()->Float64LessThan(), input, temp1),
|
| - graph()->NewNode(machine()->Float64Sub(), temp1, one), temp1);
|
| - }
|
| -
|
| - if_true0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1);
|
| - vtrue0 = graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue1, vfalse1, if_true0);
|
| - }
|
| -
|
| - Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0);
|
| - Node* vfalse0;
|
| - {
|
| - Node* check1 = graph()->NewNode(machine()->Float64Equal(), input, zero);
|
| - Node* branch1 = graph()->NewNode(common()->Branch(BranchHint::kFalse),
|
| - check1, if_false0);
|
| -
|
| - Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1);
|
| - Node* vtrue1 = input;
|
| -
|
| - Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1);
|
| - Node* vfalse1;
|
| - {
|
| - Node* check2 = graph()->NewNode(machine()->Float64LessThanOrEqual(),
|
| - input, minus_two_52);
|
| - Node* branch2 = graph()->NewNode(common()->Branch(BranchHint::kFalse),
|
| - check2, if_false1);
|
| -
|
| - Node* if_true2 = graph()->NewNode(common()->IfTrue(), branch2);
|
| - Node* vtrue2 = input;
|
| -
|
| - Node* if_false2 = graph()->NewNode(common()->IfFalse(), branch2);
|
| - Node* vfalse2;
|
| - {
|
| - Node* temp1 =
|
| - graph()->NewNode(machine()->Float64Sub(), minus_zero, input);
|
| - Node* temp2 = graph()->NewNode(
|
| - machine()->Float64Sub(),
|
| - graph()->NewNode(machine()->Float64Add(), two_52, temp1), two_52);
|
| - vfalse2 = graph()->NewNode(
|
| - common()->Select(MachineRepresentation::kFloat64),
|
| - graph()->NewNode(machine()->Float64LessThan(), temp2, temp1),
|
| - graph()->NewNode(machine()->Float64Sub(), minus_one, temp2),
|
| - graph()->NewNode(machine()->Float64Sub(), minus_zero, temp2));
|
| - }
|
| -
|
| - if_false1 = graph()->NewNode(common()->Merge(2), if_true2, if_false2);
|
| - vfalse1 =
|
| - graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue2, vfalse2, if_false1);
|
| - }
|
| -
|
| - if_false0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1);
|
| - vfalse0 =
|
| - graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue1, vfalse1, if_false0);
|
| - }
|
| -
|
| - Node* merge0 = graph()->NewNode(common()->Merge(2), if_true0, if_false0);
|
| - return graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue0, vfalse0, merge0);
|
| -}
|
| -
|
| Node* SimplifiedLowering::Float64Round(Node* const node) {
|
| Node* const one = jsgraph()->Float64Constant(1.0);
|
| Node* const one_half = jsgraph()->Float64Constant(0.5);
|
| Node* const input = node->InputAt(0);
|
|
|
| // Round up towards Infinity, and adjust if the difference exceeds 0.5.
|
| - Node* result = Float64Ceil(node);
|
| + Node* result = graph()->NewNode(machine()->Float64RoundUp().placeholder(),
|
| + node->InputAt(0));
|
| return graph()->NewNode(
|
| common()->Select(MachineRepresentation::kFloat64),
|
| graph()->NewNode(
|
| @@ -3207,129 +2944,6 @@ Node* SimplifiedLowering::Float64Sign(Node* const node) {
|
| zero));
|
| }
|
|
|
| -Node* SimplifiedLowering::Float64Trunc(Node* const node) {
|
| - Node* const one = jsgraph()->Float64Constant(1.0);
|
| - Node* const zero = jsgraph()->Float64Constant(0.0);
|
| - Node* const minus_zero = jsgraph()->Float64Constant(-0.0);
|
| - Node* const two_52 = jsgraph()->Float64Constant(4503599627370496.0E0);
|
| - Node* const minus_two_52 = jsgraph()->Float64Constant(-4503599627370496.0E0);
|
| - Node* const input = node->InputAt(0);
|
| -
|
| - // Use fast hardware instruction if available.
|
| - if (machine()->Float64RoundTruncate().IsSupported()) {
|
| - return graph()->NewNode(machine()->Float64RoundTruncate().op(), input);
|
| - }
|
| -
|
| - // General case for trunc.
|
| - //
|
| - // if 0.0 < input then
|
| - // if 2^52 <= input then
|
| - // input
|
| - // else
|
| - // let temp1 = (2^52 + input) - 2^52 in
|
| - // if input < temp1 then
|
| - // temp1 - 1
|
| - // else
|
| - // temp1
|
| - // else
|
| - // if input == 0 then
|
| - // input
|
| - // else
|
| - // if input <= -2^52 then
|
| - // input
|
| - // else
|
| - // let temp1 = -0 - input in
|
| - // let temp2 = (2^52 + temp1) - 2^52 in
|
| - // let temp3 = (if temp1 < temp2 then temp2 - 1 else temp2) in
|
| - // -0 - temp3
|
| - //
|
| - // Note: We do not use the Diamond helper class here, because it really hurts
|
| - // readability with nested diamonds.
|
| -
|
| - Node* check0 = graph()->NewNode(machine()->Float64LessThan(), zero, input);
|
| - Node* branch0 = graph()->NewNode(common()->Branch(BranchHint::kTrue), check0,
|
| - graph()->start());
|
| -
|
| - Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0);
|
| - Node* vtrue0;
|
| - {
|
| - Node* check1 =
|
| - graph()->NewNode(machine()->Float64LessThanOrEqual(), two_52, input);
|
| - Node* branch1 = graph()->NewNode(common()->Branch(), check1, if_true0);
|
| -
|
| - Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1);
|
| - Node* vtrue1 = input;
|
| -
|
| - Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1);
|
| - Node* vfalse1;
|
| - {
|
| - Node* temp1 = graph()->NewNode(
|
| - machine()->Float64Sub(),
|
| - graph()->NewNode(machine()->Float64Add(), two_52, input), two_52);
|
| - vfalse1 = graph()->NewNode(
|
| - common()->Select(MachineRepresentation::kFloat64),
|
| - graph()->NewNode(machine()->Float64LessThan(), input, temp1),
|
| - graph()->NewNode(machine()->Float64Sub(), temp1, one), temp1);
|
| - }
|
| -
|
| - if_true0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1);
|
| - vtrue0 = graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue1, vfalse1, if_true0);
|
| - }
|
| -
|
| - Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0);
|
| - Node* vfalse0;
|
| - {
|
| - Node* check1 = graph()->NewNode(machine()->Float64Equal(), input, zero);
|
| - Node* branch1 = graph()->NewNode(common()->Branch(BranchHint::kFalse),
|
| - check1, if_false0);
|
| -
|
| - Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1);
|
| - Node* vtrue1 = input;
|
| -
|
| - Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1);
|
| - Node* vfalse1;
|
| - {
|
| - Node* check2 = graph()->NewNode(machine()->Float64LessThanOrEqual(),
|
| - input, minus_two_52);
|
| - Node* branch2 = graph()->NewNode(common()->Branch(BranchHint::kFalse),
|
| - check2, if_false1);
|
| -
|
| - Node* if_true2 = graph()->NewNode(common()->IfTrue(), branch2);
|
| - Node* vtrue2 = input;
|
| -
|
| - Node* if_false2 = graph()->NewNode(common()->IfFalse(), branch2);
|
| - Node* vfalse2;
|
| - {
|
| - Node* temp1 =
|
| - graph()->NewNode(machine()->Float64Sub(), minus_zero, input);
|
| - Node* temp2 = graph()->NewNode(
|
| - machine()->Float64Sub(),
|
| - graph()->NewNode(machine()->Float64Add(), two_52, temp1), two_52);
|
| - Node* temp3 = graph()->NewNode(
|
| - common()->Select(MachineRepresentation::kFloat64),
|
| - graph()->NewNode(machine()->Float64LessThan(), temp1, temp2),
|
| - graph()->NewNode(machine()->Float64Sub(), temp2, one), temp2);
|
| - vfalse2 = graph()->NewNode(machine()->Float64Sub(), minus_zero, temp3);
|
| - }
|
| -
|
| - if_false1 = graph()->NewNode(common()->Merge(2), if_true2, if_false2);
|
| - vfalse1 =
|
| - graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue2, vfalse2, if_false1);
|
| - }
|
| -
|
| - if_false0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1);
|
| - vfalse0 =
|
| - graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue1, vfalse1, if_false0);
|
| - }
|
| -
|
| - Node* merge0 = graph()->NewNode(common()->Merge(2), if_true0, if_false0);
|
| - return graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
|
| - vtrue0, vfalse0, merge0);
|
| -}
|
| -
|
| Node* SimplifiedLowering::Int32Abs(Node* const node) {
|
| Node* const input = node->InputAt(0);
|
|
|
|
|