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/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/graph.h" | 10 #include "src/compiler/graph.h" |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && | 172 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && |
173 vfalse->opcode() == IrOpcode::kFloat32Sub) { | 173 vfalse->opcode() == IrOpcode::kFloat32Sub) { |
174 Float32BinopMatcher mvfalse(vfalse); | 174 Float32BinopMatcher mvfalse(vfalse); |
175 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { | 175 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { |
176 // We might now be able to further reduce the {merge} node. | 176 // We might now be able to further reduce the {merge} node. |
177 Revisit(merge); | 177 Revisit(merge); |
178 return Change(node, machine()->Float32Abs(), vtrue); | 178 return Change(node, machine()->Float32Abs(), vtrue); |
179 } | 179 } |
180 } | 180 } |
181 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && | 181 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && |
182 machine()->HasFloat32Min()) { | 182 machine()->Float32Min().IsSupported()) { |
183 // We might now be able to further reduce the {merge} node. | 183 // We might now be able to further reduce the {merge} node. |
184 Revisit(merge); | 184 Revisit(merge); |
185 return Change(node, machine()->Float32Min(), vtrue, vfalse); | 185 return Change(node, machine()->Float32Min().op(), vtrue, vfalse); |
186 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && | 186 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && |
187 machine()->HasFloat32Max()) { | 187 machine()->Float32Max().IsSupported()) { |
188 // We might now be able to further reduce the {merge} node. | 188 // We might now be able to further reduce the {merge} node. |
189 Revisit(merge); | 189 Revisit(merge); |
190 return Change(node, machine()->Float32Max(), vtrue, vfalse); | 190 return Change(node, machine()->Float32Max().op(), vtrue, vfalse); |
191 } | 191 } |
192 } else if (cond->opcode() == IrOpcode::kFloat64LessThan) { | 192 } else if (cond->opcode() == IrOpcode::kFloat64LessThan) { |
193 Float64BinopMatcher mcond(cond); | 193 Float64BinopMatcher mcond(cond); |
194 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && | 194 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && |
195 vfalse->opcode() == IrOpcode::kFloat64Sub) { | 195 vfalse->opcode() == IrOpcode::kFloat64Sub) { |
196 Float64BinopMatcher mvfalse(vfalse); | 196 Float64BinopMatcher mvfalse(vfalse); |
197 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { | 197 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { |
198 // We might now be able to further reduce the {merge} node. | 198 // We might now be able to further reduce the {merge} node. |
199 Revisit(merge); | 199 Revisit(merge); |
200 return Change(node, machine()->Float64Abs(), vtrue); | 200 return Change(node, machine()->Float64Abs(), vtrue); |
201 } | 201 } |
202 } | 202 } |
203 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && | 203 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && |
204 machine()->HasFloat64Min()) { | 204 machine()->Float64Min().IsSupported()) { |
205 // We might now be able to further reduce the {merge} node. | 205 // We might now be able to further reduce the {merge} node. |
206 Revisit(merge); | 206 Revisit(merge); |
207 return Change(node, machine()->Float64Min(), vtrue, vfalse); | 207 return Change(node, machine()->Float64Min().op(), vtrue, vfalse); |
208 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && | 208 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && |
209 machine()->HasFloat64Max()) { | 209 machine()->Float64Max().IsSupported()) { |
210 // We might now be able to further reduce the {merge} node. | 210 // We might now be able to further reduce the {merge} node. |
211 Revisit(merge); | 211 Revisit(merge); |
212 return Change(node, machine()->Float64Max(), vtrue, vfalse); | 212 return Change(node, machine()->Float64Max().op(), vtrue, vfalse); |
213 } | 213 } |
214 } | 214 } |
215 } | 215 } |
216 } | 216 } |
217 Node* const value = node->InputAt(0); | 217 Node* const value = node->InputAt(0); |
218 DCHECK_NE(node, value); | 218 DCHECK_NE(node, value); |
219 for (int i = 1; i < input_count; ++i) { | 219 for (int i = 1; i < input_count; ++i) { |
220 Node* const input = node->InputAt(i); | 220 Node* const input = node->InputAt(i); |
221 if (input == node) { | 221 if (input == node) { |
222 // Ignore redundant inputs. | 222 // Ignore redundant inputs. |
(...skipping 26 matching lines...) Expand all Loading... |
249 case IrOpcode::kFloat32LessThan: { | 249 case IrOpcode::kFloat32LessThan: { |
250 Float32BinopMatcher mcond(cond); | 250 Float32BinopMatcher mcond(cond); |
251 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && | 251 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && |
252 vfalse->opcode() == IrOpcode::kFloat32Sub) { | 252 vfalse->opcode() == IrOpcode::kFloat32Sub) { |
253 Float32BinopMatcher mvfalse(vfalse); | 253 Float32BinopMatcher mvfalse(vfalse); |
254 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { | 254 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { |
255 return Change(node, machine()->Float32Abs(), vtrue); | 255 return Change(node, machine()->Float32Abs(), vtrue); |
256 } | 256 } |
257 } | 257 } |
258 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && | 258 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && |
259 machine()->HasFloat32Min()) { | 259 machine()->Float32Min().IsSupported()) { |
260 return Change(node, machine()->Float32Min(), vtrue, vfalse); | 260 return Change(node, machine()->Float32Min().op(), vtrue, vfalse); |
261 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && | 261 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && |
262 machine()->HasFloat32Max()) { | 262 machine()->Float32Max().IsSupported()) { |
263 return Change(node, machine()->Float32Max(), vtrue, vfalse); | 263 return Change(node, machine()->Float32Max().op(), vtrue, vfalse); |
264 } | 264 } |
265 break; | 265 break; |
266 } | 266 } |
267 case IrOpcode::kFloat64LessThan: { | 267 case IrOpcode::kFloat64LessThan: { |
268 Float64BinopMatcher mcond(cond); | 268 Float64BinopMatcher mcond(cond); |
269 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && | 269 if (mcond.left().Is(0.0) && mcond.right().Equals(vtrue) && |
270 vfalse->opcode() == IrOpcode::kFloat64Sub) { | 270 vfalse->opcode() == IrOpcode::kFloat64Sub) { |
271 Float64BinopMatcher mvfalse(vfalse); | 271 Float64BinopMatcher mvfalse(vfalse); |
272 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { | 272 if (mvfalse.left().IsZero() && mvfalse.right().Equals(vtrue)) { |
273 return Change(node, machine()->Float64Abs(), vtrue); | 273 return Change(node, machine()->Float64Abs(), vtrue); |
274 } | 274 } |
275 } | 275 } |
276 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && | 276 if (mcond.left().Equals(vtrue) && mcond.right().Equals(vfalse) && |
277 machine()->HasFloat64Min()) { | 277 machine()->Float64Min().IsSupported()) { |
278 return Change(node, machine()->Float64Min(), vtrue, vfalse); | 278 return Change(node, machine()->Float64Min().op(), vtrue, vfalse); |
279 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && | 279 } else if (mcond.left().Equals(vfalse) && mcond.right().Equals(vtrue) && |
280 machine()->HasFloat64Max()) { | 280 machine()->Float64Max().IsSupported()) { |
281 return Change(node, machine()->Float64Max(), vtrue, vfalse); | 281 return Change(node, machine()->Float64Max().op(), vtrue, vfalse); |
282 } | 282 } |
283 break; | 283 break; |
284 } | 284 } |
285 default: | 285 default: |
286 break; | 286 break; |
287 } | 287 } |
288 return NoChange(); | 288 return NoChange(); |
289 } | 289 } |
290 | 290 |
291 | 291 |
(...skipping 11 matching lines...) Expand all Loading... |
303 node->set_op(op); | 303 node->set_op(op); |
304 node->ReplaceInput(0, a); | 304 node->ReplaceInput(0, a); |
305 node->ReplaceInput(1, b); | 305 node->ReplaceInput(1, b); |
306 node->TrimInputCount(2); | 306 node->TrimInputCount(2); |
307 return Changed(node); | 307 return Changed(node); |
308 } | 308 } |
309 | 309 |
310 } // namespace compiler | 310 } // namespace compiler |
311 } // namespace internal | 311 } // namespace internal |
312 } // namespace v8 | 312 } // namespace v8 |
OLD | NEW |