Chromium Code Reviews| 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 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 583 | 583 |
| 584 Reduction JSTypedLowering::ReduceInt32Binop(Node* node, const Operator* intOp) { | 584 Reduction JSTypedLowering::ReduceInt32Binop(Node* node, const Operator* intOp) { |
| 585 if (flags() & kDisableIntegerBinaryOpReduction) return NoChange(); | 585 if (flags() & kDisableIntegerBinaryOpReduction) return NoChange(); |
| 586 | 586 |
| 587 JSBinopReduction r(this, node); | 587 JSBinopReduction r(this, node); |
| 588 r.ConvertInputsToNumber(); | 588 r.ConvertInputsToNumber(); |
| 589 r.ConvertInputsToUI32(kSigned, kSigned); | 589 r.ConvertInputsToUI32(kSigned, kSigned); |
| 590 return r.ChangeToPureOperator(intOp, Type::Integral32()); | 590 return r.ChangeToPureOperator(intOp, Type::Integral32()); |
| 591 } | 591 } |
| 592 | 592 |
| 593 Reduction JSTypedLowering::ReduceShiftLeft(Node* node) { | 593 static const Operator* SpeculativeVersionOf( |
|
Benedikt Meurer
2016/07/28 16:43:02
Please make this a member function or even inline
epertoso
2016/07/29 09:35:13
Done.
| |
| 594 SimplifiedOperatorBuilder* simplified, const Operator* shift_op, | |
| 595 BinaryOperationHints::Hint feedback) { | |
| 596 if (shift_op->opcode() == IrOpcode::kNumberShiftLeft) { | |
| 597 return simplified->SpeculativeNumberShiftLeft(feedback); | |
| 598 } else if (shift_op->opcode() == IrOpcode::kNumberShiftRightLogical) { | |
| 599 return simplified->SpeculativeNumberShiftRightLogical(feedback); | |
| 600 } else { | |
| 601 DCHECK(shift_op->opcode() == IrOpcode::kNumberShiftRight); | |
| 602 return simplified->SpeculativeNumberShiftRight(feedback); | |
| 603 } | |
| 604 } | |
| 605 | |
| 606 Reduction JSTypedLowering::ReduceUI32Shift(Node* node, | |
| 607 Signedness left_signedness, | |
| 608 const Operator* shift_op) { | |
| 594 if (flags() & kDisableIntegerBinaryOpReduction) return NoChange(); | 609 if (flags() & kDisableIntegerBinaryOpReduction) return NoChange(); |
| 595 | |
| 596 JSBinopReduction r(this, node); | 610 JSBinopReduction r(this, node); |
| 597 BinaryOperationHints::Hint feedback = r.GetNumberBinaryOperationFeedback(); | 611 BinaryOperationHints::Hint feedback = r.GetNumberBinaryOperationFeedback(); |
| 598 if (feedback != BinaryOperationHints::kAny) { | 612 if (feedback != BinaryOperationHints::kAny) { |
| 599 return r.ChangeToSpeculativeOperator( | 613 return r.ChangeToSpeculativeOperator( |
| 600 simplified()->SpeculativeNumberShiftLeft(feedback), Type::Signed32()); | 614 SpeculativeVersionOf(simplified(), shift_op, feedback), |
| 615 shift_op->opcode() == IrOpcode::kNumberShiftRightLogical | |
| 616 ? Type::Unsigned32() | |
| 617 : Type::Signed32()); | |
| 601 } | 618 } |
| 602 | 619 |
| 603 // If deoptimization is enabled we rely on type feedback. | 620 // If deoptimization is enabled we rely on type feedback. |
| 604 if (r.BothInputsAre(Type::PlainPrimitive()) || | 621 if (r.BothInputsAre(Type::PlainPrimitive()) || |
| 605 !(flags() & kDeoptimizationEnabled)) { | 622 !(flags() & kDeoptimizationEnabled)) { |
| 606 r.ConvertInputsToNumber(); | 623 r.ConvertInputsToNumber(); |
| 607 r.ConvertInputsToUI32(kSigned, kUnsigned); | 624 r.ConvertInputsToUI32(left_signedness, kUnsigned); |
| 608 return r.ChangeToPureOperator(simplified()->NumberShiftLeft(), | 625 return r.ChangeToPureOperator(shift_op); |
| 609 Type::Number()); | |
| 610 } | 626 } |
| 611 return NoChange(); | 627 return NoChange(); |
| 612 } | 628 } |
| 613 | 629 |
| 614 Reduction JSTypedLowering::ReduceUI32Shift(Node* node, | |
| 615 Signedness left_signedness, | |
| 616 const Operator* shift_op) { | |
| 617 if (flags() & kDisableIntegerBinaryOpReduction) return NoChange(); | |
| 618 | |
| 619 JSBinopReduction r(this, node); | |
| 620 r.ConvertInputsToNumber(); | |
| 621 r.ConvertInputsToUI32(left_signedness, kUnsigned); | |
| 622 return r.ChangeToPureOperator(shift_op); | |
| 623 } | |
| 624 | |
| 625 | 630 |
| 626 Reduction JSTypedLowering::ReduceJSComparison(Node* node) { | 631 Reduction JSTypedLowering::ReduceJSComparison(Node* node) { |
| 627 JSBinopReduction r(this, node); | 632 JSBinopReduction r(this, node); |
| 628 if (r.BothInputsAre(Type::String())) { | 633 if (r.BothInputsAre(Type::String())) { |
| 629 // If both inputs are definitely strings, perform a string comparison. | 634 // If both inputs are definitely strings, perform a string comparison. |
| 630 const Operator* stringOp; | 635 const Operator* stringOp; |
| 631 switch (node->opcode()) { | 636 switch (node->opcode()) { |
| 632 case IrOpcode::kJSLessThan: | 637 case IrOpcode::kJSLessThan: |
| 633 stringOp = simplified()->StringLessThan(); | 638 stringOp = simplified()->StringLessThan(); |
| 634 break; | 639 break; |
| (...skipping 1328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1963 case IrOpcode::kJSLessThanOrEqual: // fall through | 1968 case IrOpcode::kJSLessThanOrEqual: // fall through |
| 1964 case IrOpcode::kJSGreaterThanOrEqual: | 1969 case IrOpcode::kJSGreaterThanOrEqual: |
| 1965 return ReduceJSComparison(node); | 1970 return ReduceJSComparison(node); |
| 1966 case IrOpcode::kJSBitwiseOr: | 1971 case IrOpcode::kJSBitwiseOr: |
| 1967 return ReduceInt32Binop(node, simplified()->NumberBitwiseOr()); | 1972 return ReduceInt32Binop(node, simplified()->NumberBitwiseOr()); |
| 1968 case IrOpcode::kJSBitwiseXor: | 1973 case IrOpcode::kJSBitwiseXor: |
| 1969 return ReduceInt32Binop(node, simplified()->NumberBitwiseXor()); | 1974 return ReduceInt32Binop(node, simplified()->NumberBitwiseXor()); |
| 1970 case IrOpcode::kJSBitwiseAnd: | 1975 case IrOpcode::kJSBitwiseAnd: |
| 1971 return ReduceInt32Binop(node, simplified()->NumberBitwiseAnd()); | 1976 return ReduceInt32Binop(node, simplified()->NumberBitwiseAnd()); |
| 1972 case IrOpcode::kJSShiftLeft: | 1977 case IrOpcode::kJSShiftLeft: |
| 1973 return ReduceShiftLeft(node); | 1978 return ReduceUI32Shift(node, kSigned, simplified()->NumberShiftLeft()); |
| 1974 case IrOpcode::kJSShiftRight: | 1979 case IrOpcode::kJSShiftRight: |
| 1975 return ReduceUI32Shift(node, kSigned, simplified()->NumberShiftRight()); | 1980 return ReduceUI32Shift(node, kSigned, simplified()->NumberShiftRight()); |
| 1976 case IrOpcode::kJSShiftRightLogical: | 1981 case IrOpcode::kJSShiftRightLogical: |
| 1977 return ReduceUI32Shift(node, kUnsigned, | 1982 return ReduceUI32Shift(node, kUnsigned, |
| 1978 simplified()->NumberShiftRightLogical()); | 1983 simplified()->NumberShiftRightLogical()); |
| 1979 case IrOpcode::kJSAdd: | 1984 case IrOpcode::kJSAdd: |
| 1980 return ReduceJSAdd(node); | 1985 return ReduceJSAdd(node); |
| 1981 case IrOpcode::kJSSubtract: | 1986 case IrOpcode::kJSSubtract: |
| 1982 return ReduceJSSubtract(node); | 1987 return ReduceJSSubtract(node); |
| 1983 case IrOpcode::kJSMultiply: | 1988 case IrOpcode::kJSMultiply: |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2079 } | 2084 } |
| 2080 | 2085 |
| 2081 | 2086 |
| 2082 CompilationDependencies* JSTypedLowering::dependencies() const { | 2087 CompilationDependencies* JSTypedLowering::dependencies() const { |
| 2083 return dependencies_; | 2088 return dependencies_; |
| 2084 } | 2089 } |
| 2085 | 2090 |
| 2086 } // namespace compiler | 2091 } // namespace compiler |
| 2087 } // namespace internal | 2092 } // namespace internal |
| 2088 } // namespace v8 | 2093 } // namespace v8 |
| OLD | NEW |