Chromium Code Reviews| Index: src/compiler/simplified-lowering.cc |
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
| index 7a0f32493239279bb25136f23e1fbd7c76a1c4b3..6892879f7cc0c6154fbb561c00e5822f44379bbc 100644 |
| --- a/src/compiler/simplified-lowering.cc |
| +++ b/src/compiler/simplified-lowering.cc |
| @@ -355,6 +355,41 @@ class RepresentationSelector { |
| } |
| } |
| + void VisitIsSmi(Node* node) { |
| + ProcessInput(node, 0, kMachAnyTagged); |
| + if (lower()) { |
| + Node* is_tagged = jsgraph_->graph()->NewNode( |
| + jsgraph_->machine()->WordAnd(), node->InputAt(0), |
| + jsgraph_->Int32Constant(static_cast<int>(kSmiTagMask))); |
| + Node* is_smi = jsgraph_->graph()->NewNode( |
|
Michael Starzinger
2014/10/15 13:03:17
For posterity: There might be a more optimal lower
sigurds
2014/10/15 14:59:58
Acknowledged.
|
| + jsgraph_->machine()->WordEqual(), is_tagged, |
| + jsgraph_->Int32Constant(kSmiTag)); |
| + DeferReplacement(node, is_smi); |
| + } |
| + SetOutput(node, kRepBit | kTypeBool); |
| + } |
| + |
| + void VisitIsNonNegativeSmi(Node* node) { |
| + ProcessInput(node, 0, kMachAnyTagged); |
| + if (lower()) { |
| + Node* is_tagged = jsgraph_->graph()->NewNode( |
| + jsgraph_->machine()->WordAnd(), node->InputAt(0), |
| + jsgraph_->Int32Constant(static_cast<int>(kSmiTagMask))); |
| + Node* is_smi = jsgraph_->graph()->NewNode( |
| + jsgraph_->machine()->WordEqual(), is_tagged, |
| + jsgraph_->Int32Constant(kSmiTag)); |
| + Node* is_non_neg = jsgraph_->graph()->NewNode( |
| + jsgraph_->machine()->Is32() |
|
Michael Starzinger
2014/10/15 13:03:17
nit: There already should be IntLessThanOrEqual()
sigurds
2014/10/15 14:59:58
Done.
|
| + ? jsgraph_->machine()->Int32LessThanOrEqual() |
| + : jsgraph_->machine()->Int64LessThanOrEqual(), |
| + jsgraph_->Int32Constant(0), node->InputAt(0)); |
| + Node* is_non_neg_smi = jsgraph_->graph()->NewNode( |
| + jsgraph_->machine()->Word32And(), is_smi, is_non_neg); |
| + DeferReplacement(node, is_non_neg_smi); |
| + } |
| + SetOutput(node, kRepBit | kTypeBool); |
| + } |
| + |
| const Operator* Int32Op(Node* node) { |
| return changer_->Int32OperatorFor(node->opcode()); |
| } |
| @@ -833,6 +868,10 @@ class RepresentationSelector { |
| } |
| SetOutput(node, kMachAnyTagged); |
| break; |
| + case IrOpcode::kIsSmi: |
| + return VisitIsSmi(node); |
|
Michael Starzinger
2014/10/15 13:03:17
Please move this into the section for simplified o
sigurds
2014/10/15 14:59:58
Done. Did not create DoIsSmi/DoIsNonNegativeSmi.
|
| + case IrOpcode::kIsNonNegativeSmi: |
| + return VisitIsNonNegativeSmi(node); |
| default: |
| VisitInputs(node); |
| break; |