Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Unified Diff: src/compiler/common-operator-reducer.cc

Issue 1066393002: [turbofan] Add new Float32Abs and Float64Abs operators. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix comment. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/common-operator-reducer.h ('k') | src/compiler/ia32/code-generator-ia32.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/common-operator-reducer.cc
diff --git a/src/compiler/common-operator-reducer.cc b/src/compiler/common-operator-reducer.cc
index c66cce0538794f8019fba27966bc3181b088113d..8001961d37215c8b57ddaac7ea0ebbc5e6a38d7a 100644
--- a/src/compiler/common-operator-reducer.cc
+++ b/src/compiler/common-operator-reducer.cc
@@ -55,21 +55,39 @@ Reduction CommonOperatorReducer::ReducePhi(Node* node) {
if (matcher.Matched()) {
if (matcher.IfTrue() == merge->InputAt(1)) std::swap(vtrue, vfalse);
Node* cond = matcher.Branch()->InputAt(0);
- if (cond->opcode() == IrOpcode::kFloat64LessThan) {
- if (cond->InputAt(0) == vtrue && cond->InputAt(1) == vfalse &&
+ if (cond->opcode() == IrOpcode::kFloat32LessThan) {
+ Float32BinopMatcher mcond(cond);
+ if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) &&
+ vfalse->opcode() == IrOpcode::kFloat32Sub &&
+ machine()->HasFloat32Abs()) {
+ Float32BinopMatcher mvfalse(vfalse);
+ if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) {
+ return Change(node, machine()->Float32Abs(), vtrue);
+ }
+ }
+ if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) &&
+ machine()->HasFloat32Min()) {
+ return Change(node, machine()->Float32Min(), vtrue, vfalse);
+ } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) &&
+ machine()->HasFloat32Max()) {
+ return Change(node, machine()->Float32Max(), vtrue, vfalse);
+ }
+ } else if (cond->opcode() == IrOpcode::kFloat64LessThan) {
+ Float64BinopMatcher mcond(cond);
+ if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) &&
+ vfalse->opcode() == IrOpcode::kFloat64Sub &&
+ machine()->HasFloat64Abs()) {
+ Float64BinopMatcher mvfalse(vfalse);
+ if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) {
+ return Change(node, machine()->Float64Abs(), vtrue);
+ }
+ }
+ if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) &&
machine()->HasFloat64Min()) {
- node->set_op(machine()->Float64Min());
- node->ReplaceInput(0, vtrue);
- node->ReplaceInput(1, vfalse);
- node->TrimInputCount(2);
- return Changed(node);
- } else if (cond->InputAt(0) == vfalse && cond->InputAt(1) == vtrue &&
+ return Change(node, machine()->Float64Min(), vtrue, vfalse);
+ } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) &&
machine()->HasFloat64Max()) {
- node->set_op(machine()->Float64Max());
- node->ReplaceInput(0, vtrue);
- node->ReplaceInput(1, vfalse);
- node->TrimInputCount(2);
- return Changed(node);
+ return Change(node, machine()->Float64Max(), vtrue, vfalse);
}
}
}
@@ -91,27 +109,64 @@ Reduction CommonOperatorReducer::ReduceSelect(Node* node) {
Node* vtrue = NodeProperties::GetValueInput(node, 1);
Node* vfalse = NodeProperties::GetValueInput(node, 2);
if (vtrue == vfalse) return Replace(vtrue);
- if (cond->opcode() == IrOpcode::kFloat64LessThan) {
- if (cond->InputAt(0) == vtrue && cond->InputAt(1) == vfalse &&
+ if (cond->opcode() == IrOpcode::kFloat32LessThan) {
+ Float32BinopMatcher mcond(cond);
+ if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) &&
+ vfalse->opcode() == IrOpcode::kFloat32Sub &&
+ machine()->HasFloat32Abs()) {
+ Float32BinopMatcher mvfalse(vfalse);
+ if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) {
+ return Change(node, machine()->Float32Abs(), vtrue);
+ }
+ }
+ if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) &&
+ machine()->HasFloat32Min()) {
+ return Change(node, machine()->Float32Min(), vtrue, vfalse);
+ } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) &&
+ machine()->HasFloat32Max()) {
+ return Change(node, machine()->Float32Max(), vtrue, vfalse);
+ }
+ } else if (cond->opcode() == IrOpcode::kFloat64LessThan) {
+ Float64BinopMatcher mcond(cond);
+ if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) &&
+ vfalse->opcode() == IrOpcode::kFloat64Sub &&
+ machine()->HasFloat64Abs()) {
+ Float64BinopMatcher mvfalse(vfalse);
+ if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) {
+ return Change(node, machine()->Float64Abs(), vtrue);
+ }
+ }
+ if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) &&
machine()->HasFloat64Min()) {
- node->set_op(machine()->Float64Min());
- node->ReplaceInput(0, vtrue);
- node->ReplaceInput(1, vfalse);
- node->TrimInputCount(2);
- return Changed(node);
- } else if (cond->InputAt(0) == vfalse && cond->InputAt(1) == vtrue &&
+ return Change(node, machine()->Float64Min(), vtrue, vfalse);
+ } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) &&
machine()->HasFloat64Max()) {
- node->set_op(machine()->Float64Max());
- node->ReplaceInput(0, vtrue);
- node->ReplaceInput(1, vfalse);
- node->TrimInputCount(2);
- return Changed(node);
+ return Change(node, machine()->Float64Max(), vtrue, vfalse);
}
}
return NoChange();
}
+Reduction CommonOperatorReducer::Change(Node* node, Operator const* op,
+ Node* a) {
+ node->set_op(op);
+ node->ReplaceInput(0, a);
+ node->TrimInputCount(1);
+ return Changed(node);
+}
+
+
+Reduction CommonOperatorReducer::Change(Node* node, Operator const* op, Node* a,
+ Node* b) {
+ node->set_op(op);
+ node->ReplaceInput(0, a);
+ node->ReplaceInput(1, b);
+ node->TrimInputCount(2);
+ return Changed(node);
+}
+
+
CommonOperatorBuilder* CommonOperatorReducer::common() const {
return jsgraph()->common();
}
« no previous file with comments | « src/compiler/common-operator-reducer.h ('k') | src/compiler/ia32/code-generator-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698