OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/js-intrinsic-lowering.h" | 5 #include "src/compiler/js-intrinsic-lowering.h" |
6 | 6 |
7 #include <stack> | 7 #include <stack> |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/compiler/access-builder.h" | 10 #include "src/compiler/access-builder.h" |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 } | 345 } |
346 | 346 |
347 | 347 |
348 Reduction JSIntrinsicLowering::ReduceSubString(Node* node) { | 348 Reduction JSIntrinsicLowering::ReduceSubString(Node* node) { |
349 return Change(node, CodeFactory::SubString(isolate()), 3); | 349 return Change(node, CodeFactory::SubString(isolate()), 3); |
350 } | 350 } |
351 | 351 |
352 | 352 |
353 Reduction JSIntrinsicLowering::ReduceToInteger(Node* node) { | 353 Reduction JSIntrinsicLowering::ReduceToInteger(Node* node) { |
354 Node* value = NodeProperties::GetValueInput(node, 0); | 354 Node* value = NodeProperties::GetValueInput(node, 0); |
355 Node* context = NodeProperties::GetContextInput(node); | |
356 Node* frame_state = NodeProperties::GetFrameStateInput(node, 0); | |
357 Node* effect = NodeProperties::GetEffectInput(node); | |
358 Node* control = NodeProperties::GetControlInput(node); | |
359 | 355 |
360 // ToInteger is a no-op on integer values and -0. | 356 // ToInteger is a no-op on integer values and -0. |
361 Type* value_type = NodeProperties::GetType(value); | 357 Type* value_type = NodeProperties::GetType(value); |
362 if (value_type->Is(type_cache().kIntegerOrMinusZero)) { | 358 if (value_type->Is(type_cache().kIntegerOrMinusZero)) { |
363 ReplaceWithValue(node, value); | 359 ReplaceWithValue(node, value); |
364 return Replace(value); | 360 return Replace(value); |
365 } | 361 } |
366 | 362 |
367 Node* check = graph()->NewNode(simplified()->ObjectIsSmi(), value); | 363 return Change(node, CodeFactory::ToInteger(isolate()), 0); |
368 Node* branch = | |
369 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); | |
370 | |
371 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | |
372 Node* etrue = effect; | |
373 Node* vtrue = | |
374 graph()->NewNode(common()->Guard(type_cache_.kSmi), value, if_true); | |
375 | |
376 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | |
377 Node* efalse = effect; | |
378 Node* vfalse; | |
379 { | |
380 vfalse = efalse = | |
381 graph()->NewNode(javascript()->CallRuntime(Runtime::kToInteger), value, | |
382 context, frame_state, efalse, if_false); | |
383 // TODO(jarin) Intersect the type with integers? | |
384 NodeProperties::SetType(vfalse, NodeProperties::GetType(node)); | |
385 | |
386 if_false = graph()->NewNode(common()->IfSuccess(), vfalse); | |
387 } | |
388 | |
389 control = graph()->NewNode(common()->Merge(2), if_true, if_false); | |
390 effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control); | |
391 value = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), | |
392 vtrue, vfalse, control); | |
393 | |
394 // TODO(bmeurer, mstarzinger): Rewire IfException inputs to {vfalse}. | |
395 ReplaceWithValue(node, value, effect, control); | |
396 return Changed(value); | |
397 } | 364 } |
398 | 365 |
399 | 366 |
400 Reduction JSIntrinsicLowering::ReduceToName(Node* node) { | 367 Reduction JSIntrinsicLowering::ReduceToName(Node* node) { |
401 NodeProperties::ChangeOp(node, javascript()->ToName()); | 368 NodeProperties::ChangeOp(node, javascript()->ToName()); |
402 return Changed(node); | 369 return Changed(node); |
403 } | 370 } |
404 | 371 |
405 | 372 |
406 Reduction JSIntrinsicLowering::ReduceToNumber(Node* node) { | 373 Reduction JSIntrinsicLowering::ReduceToNumber(Node* node) { |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
574 } | 541 } |
575 | 542 |
576 | 543 |
577 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { | 544 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { |
578 return jsgraph()->simplified(); | 545 return jsgraph()->simplified(); |
579 } | 546 } |
580 | 547 |
581 } // namespace compiler | 548 } // namespace compiler |
582 } // namespace internal | 549 } // namespace internal |
583 } // namespace v8 | 550 } // namespace v8 |
OLD | NEW |