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

Side by Side 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/common-operator-reducer.h" 5 #include "src/compiler/common-operator-reducer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "src/compiler/common-operator.h" 9 #include "src/compiler/common-operator.h"
10 #include "src/compiler/js-graph.h" 10 #include "src/compiler/js-graph.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 DCHECK_EQ(IrOpcode::kPhi, node->opcode()); 48 DCHECK_EQ(IrOpcode::kPhi, node->opcode());
49 int const input_count = node->InputCount(); 49 int const input_count = node->InputCount();
50 if (input_count == 3) { 50 if (input_count == 3) {
51 Node* vtrue = NodeProperties::GetValueInput(node, 0); 51 Node* vtrue = NodeProperties::GetValueInput(node, 0);
52 Node* vfalse = NodeProperties::GetValueInput(node, 1); 52 Node* vfalse = NodeProperties::GetValueInput(node, 1);
53 Node* merge = NodeProperties::GetControlInput(node); 53 Node* merge = NodeProperties::GetControlInput(node);
54 DiamondMatcher matcher(merge); 54 DiamondMatcher matcher(merge);
55 if (matcher.Matched()) { 55 if (matcher.Matched()) {
56 if (matcher.IfTrue() == merge->InputAt(1)) std::swap(vtrue, vfalse); 56 if (matcher.IfTrue() == merge->InputAt(1)) std::swap(vtrue, vfalse);
57 Node* cond = matcher.Branch()->InputAt(0); 57 Node* cond = matcher.Branch()->InputAt(0);
58 if (cond->opcode() == IrOpcode::kFloat64LessThan) { 58 if (cond->opcode() == IrOpcode::kFloat32LessThan) {
59 if (cond->InputAt(0) == vtrue && cond->InputAt(1) == vfalse && 59 Float32BinopMatcher mcond(cond);
60 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) &&
61 vfalse->opcode() == IrOpcode::kFloat32Sub &&
62 machine()->HasFloat32Abs()) {
63 Float32BinopMatcher mvfalse(vfalse);
64 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) {
65 return Change(node, machine()->Float32Abs(), vtrue);
66 }
67 }
68 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) &&
69 machine()->HasFloat32Min()) {
70 return Change(node, machine()->Float32Min(), vtrue, vfalse);
71 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) &&
72 machine()->HasFloat32Max()) {
73 return Change(node, machine()->Float32Max(), vtrue, vfalse);
74 }
75 } else if (cond->opcode() == IrOpcode::kFloat64LessThan) {
76 Float64BinopMatcher mcond(cond);
77 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) &&
78 vfalse->opcode() == IrOpcode::kFloat64Sub &&
79 machine()->HasFloat64Abs()) {
80 Float64BinopMatcher mvfalse(vfalse);
81 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) {
82 return Change(node, machine()->Float64Abs(), vtrue);
83 }
84 }
85 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) &&
60 machine()->HasFloat64Min()) { 86 machine()->HasFloat64Min()) {
61 node->set_op(machine()->Float64Min()); 87 return Change(node, machine()->Float64Min(), vtrue, vfalse);
62 node->ReplaceInput(0, vtrue); 88 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) &&
63 node->ReplaceInput(1, vfalse);
64 node->TrimInputCount(2);
65 return Changed(node);
66 } else if (cond->InputAt(0) == vfalse && cond->InputAt(1) == vtrue &&
67 machine()->HasFloat64Max()) { 89 machine()->HasFloat64Max()) {
68 node->set_op(machine()->Float64Max()); 90 return Change(node, machine()->Float64Max(), vtrue, vfalse);
69 node->ReplaceInput(0, vtrue);
70 node->ReplaceInput(1, vfalse);
71 node->TrimInputCount(2);
72 return Changed(node);
73 } 91 }
74 } 92 }
75 } 93 }
76 } 94 }
77 if (input_count > 1) { 95 if (input_count > 1) {
78 Node* const replacement = node->InputAt(0); 96 Node* const replacement = node->InputAt(0);
79 for (int i = 1; i < input_count - 1; ++i) { 97 for (int i = 1; i < input_count - 1; ++i) {
80 if (node->InputAt(i) != replacement) return NoChange(); 98 if (node->InputAt(i) != replacement) return NoChange();
81 } 99 }
82 return Replace(replacement); 100 return Replace(replacement);
83 } 101 }
84 return NoChange(); 102 return NoChange();
85 } 103 }
86 104
87 105
88 Reduction CommonOperatorReducer::ReduceSelect(Node* node) { 106 Reduction CommonOperatorReducer::ReduceSelect(Node* node) {
89 DCHECK_EQ(IrOpcode::kSelect, node->opcode()); 107 DCHECK_EQ(IrOpcode::kSelect, node->opcode());
90 Node* cond = NodeProperties::GetValueInput(node, 0); 108 Node* cond = NodeProperties::GetValueInput(node, 0);
91 Node* vtrue = NodeProperties::GetValueInput(node, 1); 109 Node* vtrue = NodeProperties::GetValueInput(node, 1);
92 Node* vfalse = NodeProperties::GetValueInput(node, 2); 110 Node* vfalse = NodeProperties::GetValueInput(node, 2);
93 if (vtrue == vfalse) return Replace(vtrue); 111 if (vtrue == vfalse) return Replace(vtrue);
94 if (cond->opcode() == IrOpcode::kFloat64LessThan) { 112 if (cond->opcode() == IrOpcode::kFloat32LessThan) {
95 if (cond->InputAt(0) == vtrue && cond->InputAt(1) == vfalse && 113 Float32BinopMatcher mcond(cond);
114 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) &&
115 vfalse->opcode() == IrOpcode::kFloat32Sub &&
116 machine()->HasFloat32Abs()) {
117 Float32BinopMatcher mvfalse(vfalse);
118 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) {
119 return Change(node, machine()->Float32Abs(), vtrue);
120 }
121 }
122 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) &&
123 machine()->HasFloat32Min()) {
124 return Change(node, machine()->Float32Min(), vtrue, vfalse);
125 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) &&
126 machine()->HasFloat32Max()) {
127 return Change(node, machine()->Float32Max(), vtrue, vfalse);
128 }
129 } else if (cond->opcode() == IrOpcode::kFloat64LessThan) {
130 Float64BinopMatcher mcond(cond);
131 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) &&
132 vfalse->opcode() == IrOpcode::kFloat64Sub &&
133 machine()->HasFloat64Abs()) {
134 Float64BinopMatcher mvfalse(vfalse);
135 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) {
136 return Change(node, machine()->Float64Abs(), vtrue);
137 }
138 }
139 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) &&
96 machine()->HasFloat64Min()) { 140 machine()->HasFloat64Min()) {
97 node->set_op(machine()->Float64Min()); 141 return Change(node, machine()->Float64Min(), vtrue, vfalse);
98 node->ReplaceInput(0, vtrue); 142 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) &&
99 node->ReplaceInput(1, vfalse);
100 node->TrimInputCount(2);
101 return Changed(node);
102 } else if (cond->InputAt(0) == vfalse && cond->InputAt(1) == vtrue &&
103 machine()->HasFloat64Max()) { 143 machine()->HasFloat64Max()) {
104 node->set_op(machine()->Float64Max()); 144 return Change(node, machine()->Float64Max(), vtrue, vfalse);
105 node->ReplaceInput(0, vtrue);
106 node->ReplaceInput(1, vfalse);
107 node->TrimInputCount(2);
108 return Changed(node);
109 } 145 }
110 } 146 }
111 return NoChange(); 147 return NoChange();
112 } 148 }
113 149
114 150
151 Reduction CommonOperatorReducer::Change(Node* node, Operator const* op,
152 Node* a) {
153 node->set_op(op);
154 node->ReplaceInput(0, a);
155 node->TrimInputCount(1);
156 return Changed(node);
157 }
158
159
160 Reduction CommonOperatorReducer::Change(Node* node, Operator const* op, Node* a,
161 Node* b) {
162 node->set_op(op);
163 node->ReplaceInput(0, a);
164 node->ReplaceInput(1, b);
165 node->TrimInputCount(2);
166 return Changed(node);
167 }
168
169
115 CommonOperatorBuilder* CommonOperatorReducer::common() const { 170 CommonOperatorBuilder* CommonOperatorReducer::common() const {
116 return jsgraph()->common(); 171 return jsgraph()->common();
117 } 172 }
118 173
119 174
120 Graph* CommonOperatorReducer::graph() const { return jsgraph()->graph(); } 175 Graph* CommonOperatorReducer::graph() const { return jsgraph()->graph(); }
121 176
122 177
123 MachineOperatorBuilder* CommonOperatorReducer::machine() const { 178 MachineOperatorBuilder* CommonOperatorReducer::machine() const {
124 return jsgraph()->machine(); 179 return jsgraph()->machine();
125 } 180 }
126 181
127 } // namespace compiler 182 } // namespace compiler
128 } // namespace internal 183 } // namespace internal
129 } // namespace v8 184 } // namespace v8
OLDNEW
« 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