| Index: src/compiler/js-intrinsic-lowering.cc
|
| diff --git a/src/compiler/js-intrinsic-lowering.cc b/src/compiler/js-intrinsic-lowering.cc
|
| index ca5cb932b4bd7606521b32ae63c7c8076779d74f..1ae45ea775c6b62db50fb5f673298ca5db285b01 100644
|
| --- a/src/compiler/js-intrinsic-lowering.cc
|
| +++ b/src/compiler/js-intrinsic-lowering.cc
|
| @@ -39,6 +39,8 @@
|
| return ReduceConstructDouble(node);
|
| case Runtime::kInlineCreateIterResultObject:
|
| return ReduceCreateIterResultObject(node);
|
| + case Runtime::kInlineDateField:
|
| + return ReduceDateField(node);
|
| case Runtime::kInlineDeoptimizeNow:
|
| return ReduceDeoptimizeNow(node);
|
| case Runtime::kInlineDoubleHi:
|
| @@ -101,6 +103,8 @@
|
| return ReduceToPrimitive(node);
|
| case Runtime::kInlineToString:
|
| return ReduceToString(node);
|
| + case Runtime::kInlineThrowNotDateError:
|
| + return ReduceThrowNotDateError(node);
|
| case Runtime::kInlineCall:
|
| return ReduceCall(node);
|
| case Runtime::kInlineTailCall:
|
| @@ -134,6 +138,24 @@
|
| high);
|
| ReplaceWithValue(node, value);
|
| return Replace(value);
|
| +}
|
| +
|
| +
|
| +Reduction JSIntrinsicLowering::ReduceDateField(Node* node) {
|
| + Node* const value = NodeProperties::GetValueInput(node, 0);
|
| + Node* const index = NodeProperties::GetValueInput(node, 1);
|
| + Node* const effect = NodeProperties::GetEffectInput(node);
|
| + Node* const control = NodeProperties::GetControlInput(node);
|
| + NumberMatcher mindex(index);
|
| + if (mindex.Is(JSDate::kDateValue)) {
|
| + return Change(
|
| + node,
|
| + simplified()->LoadField(AccessBuilder::ForJSDateField(
|
| + static_cast<JSDate::FieldIndex>(static_cast<int>(mindex.Value())))),
|
| + value, effect, control);
|
| + }
|
| + // TODO(turbofan): Optimize more patterns.
|
| + return NoChange();
|
| }
|
|
|
|
|
| @@ -502,6 +524,24 @@
|
|
|
| Reduction JSIntrinsicLowering::ReduceSubString(Node* node) {
|
| return Change(node, CodeFactory::SubString(isolate()), 3);
|
| +}
|
| +
|
| +
|
| +Reduction JSIntrinsicLowering::ReduceThrowNotDateError(Node* node) {
|
| + if (mode() != kDeoptimizationEnabled) return NoChange();
|
| + Node* const frame_state = NodeProperties::GetFrameStateInput(node, 1);
|
| + Node* const effect = NodeProperties::GetEffectInput(node);
|
| + Node* const control = NodeProperties::GetControlInput(node);
|
| +
|
| + // TODO(bmeurer): Move MergeControlToEnd() to the AdvancedReducer.
|
| + Node* deoptimize =
|
| + graph()->NewNode(common()->Deoptimize(DeoptimizeKind::kEager),
|
| + frame_state, effect, control);
|
| + NodeProperties::MergeControlToEnd(graph(), common(), deoptimize);
|
| +
|
| + node->TrimInputCount(0);
|
| + NodeProperties::ChangeOp(node, common()->Dead());
|
| + return Changed(node);
|
| }
|
|
|
|
|
|
|