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/code-factory.h" | 5 #include "src/code-factory.h" |
6 #include "src/compilation-dependencies.h" | 6 #include "src/compilation-dependencies.h" |
7 #include "src/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" |
8 #include "src/compiler/js-graph.h" | 8 #include "src/compiler/js-graph.h" |
9 #include "src/compiler/js-typed-lowering.h" | 9 #include "src/compiler/js-typed-lowering.h" |
10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 } | 397 } |
398 } | 398 } |
399 | 399 |
400 | 400 |
401 Reduction JSTypedLowering::ReduceJSAdd(Node* node) { | 401 Reduction JSTypedLowering::ReduceJSAdd(Node* node) { |
402 if (flags() & kDisableBinaryOpReduction) return NoChange(); | 402 if (flags() & kDisableBinaryOpReduction) return NoChange(); |
403 | 403 |
404 JSBinopReduction r(this, node); | 404 JSBinopReduction r(this, node); |
405 | 405 |
406 BinaryOperationHints::Hint feedback = r.GetUsableNumberFeedback(); | 406 BinaryOperationHints::Hint feedback = r.GetUsableNumberFeedback(); |
| 407 if (feedback == BinaryOperationHints::kNumberOrUndefined && |
| 408 r.BothInputsAre(Type::PlainPrimitive()) && |
| 409 r.NeitherInputCanBe(Type::StringOrReceiver())) { |
| 410 // JSAdd(x:-string, y:-string) => NumberAdd(ToNumber(x), ToNumber(y)) |
| 411 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); |
| 412 r.ConvertInputsToNumber(frame_state); |
| 413 return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number()); |
| 414 } |
407 if (feedback != BinaryOperationHints::kAny) { | 415 if (feedback != BinaryOperationHints::kAny) { |
408 // Lower to the optimistic number binop. | 416 // Lower to the optimistic number binop. |
409 return r.ChangeToSpeculativeOperator( | 417 return r.ChangeToSpeculativeOperator( |
410 simplified()->SpeculativeNumberAdd(feedback)); | 418 simplified()->SpeculativeNumberAdd(feedback)); |
411 } | 419 } |
412 if (r.BothInputsAre(Type::Number())) { | 420 if (r.BothInputsAre(Type::Number())) { |
413 // JSAdd(x:number, y:number) => NumberAdd(x, y) | 421 // JSAdd(x:number, y:number) => NumberAdd(x, y) |
414 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 422 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); |
415 r.ConvertInputsToNumber(frame_state); | 423 r.ConvertInputsToNumber(frame_state); |
416 return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number()); | 424 return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number()); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 return r.ChangeToPureOperator(simplified()->NumberModulus(), | 463 return r.ChangeToPureOperator(simplified()->NumberModulus(), |
456 Type::Number()); | 464 Type::Number()); |
457 } | 465 } |
458 return NoChange(); | 466 return NoChange(); |
459 } | 467 } |
460 | 468 |
461 Reduction JSTypedLowering::ReduceJSSubtract(Node* node) { | 469 Reduction JSTypedLowering::ReduceJSSubtract(Node* node) { |
462 if (flags() & kDisableBinaryOpReduction) return NoChange(); | 470 if (flags() & kDisableBinaryOpReduction) return NoChange(); |
463 JSBinopReduction r(this, node); | 471 JSBinopReduction r(this, node); |
464 BinaryOperationHints::Hint feedback = r.GetUsableNumberFeedback(); | 472 BinaryOperationHints::Hint feedback = r.GetUsableNumberFeedback(); |
| 473 if (feedback == BinaryOperationHints::kNumberOrUndefined && |
| 474 r.BothInputsAre(Type::PlainPrimitive())) { |
| 475 // JSSubtract(x:plain-primitive, y:plain-primitive) |
| 476 // => NumberSubtract(ToNumber(x), ToNumber(y)) |
| 477 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); |
| 478 r.ConvertInputsToNumber(frame_state); |
| 479 return r.ChangeToPureOperator(simplified()->NumberSubtract(), |
| 480 Type::Number()); |
| 481 } |
465 if (feedback != BinaryOperationHints::kAny) { | 482 if (feedback != BinaryOperationHints::kAny) { |
466 // Lower to the optimistic number binop. | 483 // Lower to the optimistic number binop. |
467 return r.ChangeToSpeculativeOperator( | 484 return r.ChangeToSpeculativeOperator( |
468 simplified()->SpeculativeNumberSubtract(feedback)); | 485 simplified()->SpeculativeNumberSubtract(feedback)); |
469 } | 486 } |
470 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 487 Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); |
471 r.ConvertInputsToNumber(frame_state); | 488 r.ConvertInputsToNumber(frame_state); |
472 return r.ChangeToPureOperator(simplified()->NumberSubtract(), Type::Number()); | 489 return r.ChangeToPureOperator(simplified()->NumberSubtract(), Type::Number()); |
473 } | 490 } |
474 | 491 |
(...skipping 1472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1947 } | 1964 } |
1948 | 1965 |
1949 | 1966 |
1950 CompilationDependencies* JSTypedLowering::dependencies() const { | 1967 CompilationDependencies* JSTypedLowering::dependencies() const { |
1951 return dependencies_; | 1968 return dependencies_; |
1952 } | 1969 } |
1953 | 1970 |
1954 } // namespace compiler | 1971 } // namespace compiler |
1955 } // namespace internal | 1972 } // namespace internal |
1956 } // namespace v8 | 1973 } // namespace v8 |
OLD | NEW |