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/compiler/simplified-lowering.h" | 5 #include "src/compiler/simplified-lowering.h" |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/compiler/common-operator.h" | 9 #include "src/compiler/common-operator.h" |
10 #include "src/compiler/graph-inl.h" | 10 #include "src/compiler/graph-inl.h" |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 ProcessInput(node, iter.index(), values > 0 ? use : 0); | 281 ProcessInput(node, iter.index(), values > 0 ? use : 0); |
282 } | 282 } |
283 } | 283 } |
284 // Phis adapt to whatever output representation their uses demand, | 284 // Phis adapt to whatever output representation their uses demand, |
285 // pushing representation changes to their inputs. | 285 // pushing representation changes to their inputs. |
286 MachineTypeUnion use_rep = GetUseInfo(node) & kRepMask; | 286 MachineTypeUnion use_rep = GetUseInfo(node) & kRepMask; |
287 MachineTypeUnion use_type = GetUseInfo(node) & kTypeMask; | 287 MachineTypeUnion use_type = GetUseInfo(node) & kTypeMask; |
288 MachineTypeUnion rep = 0; | 288 MachineTypeUnion rep = 0; |
289 if (use_rep & kRepTagged) { | 289 if (use_rep & kRepTagged) { |
290 rep = kRepTagged; // Tagged overrides everything. | 290 rep = kRepTagged; // Tagged overrides everything. |
| 291 } else if (use_rep & kRepFloat32) { |
| 292 rep = kRepFloat32; |
291 } else if (use_rep & kRepFloat64) { | 293 } else if (use_rep & kRepFloat64) { |
292 rep = kRepFloat64; | 294 rep = kRepFloat64; |
293 } else if (use_rep & kRepWord64) { | 295 } else if (use_rep & kRepWord64) { |
294 rep = kRepWord64; | 296 rep = kRepWord64; |
295 } else if (use_rep & kRepWord32) { | 297 } else if (use_rep & kRepWord32) { |
296 rep = kRepWord32; | 298 rep = kRepWord32; |
297 } else if (use_rep & kRepBit) { | 299 } else if (use_rep & kRepBit) { |
298 rep = kRepBit; | 300 rep = kRepBit; |
299 } else { | 301 } else { |
300 // There was no representation associated with any of the uses. | 302 // There was no representation associated with any of the uses. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 } | 344 } |
343 | 345 |
344 const Operator* Uint32Op(Node* node) { | 346 const Operator* Uint32Op(Node* node) { |
345 return changer_->Uint32OperatorFor(node->opcode()); | 347 return changer_->Uint32OperatorFor(node->opcode()); |
346 } | 348 } |
347 | 349 |
348 const Operator* Float64Op(Node* node) { | 350 const Operator* Float64Op(Node* node) { |
349 return changer_->Float64OperatorFor(node->opcode()); | 351 return changer_->Float64OperatorFor(node->opcode()); |
350 } | 352 } |
351 | 353 |
352 static MachineType AssumeImplicitFloat32Change(MachineType type) { | |
353 // TODO(titzer): Assume loads of float32 change representation to float64. | |
354 // Fix this with full support for float32 representations. | |
355 if (type & kRepFloat32) { | |
356 return static_cast<MachineType>((type & ~kRepFloat32) | kRepFloat64); | |
357 } | |
358 return type; | |
359 } | |
360 | |
361 // Dispatching routine for visiting the node {node} with the usage {use}. | 354 // Dispatching routine for visiting the node {node} with the usage {use}. |
362 // Depending on the operator, propagate new usage info to the inputs. | 355 // Depending on the operator, propagate new usage info to the inputs. |
363 void VisitNode(Node* node, MachineTypeUnion use, | 356 void VisitNode(Node* node, MachineTypeUnion use, |
364 SimplifiedLowering* lowering) { | 357 SimplifiedLowering* lowering) { |
365 switch (node->opcode()) { | 358 switch (node->opcode()) { |
366 //------------------------------------------------------------------ | 359 //------------------------------------------------------------------ |
367 // Common operators. | 360 // Common operators. |
368 //------------------------------------------------------------------ | 361 //------------------------------------------------------------------ |
369 case IrOpcode::kStart: | 362 case IrOpcode::kStart: |
370 case IrOpcode::kDead: | 363 case IrOpcode::kDead: |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 } | 565 } |
573 case IrOpcode::kStringAdd: { | 566 case IrOpcode::kStringAdd: { |
574 VisitBinop(node, kMachAnyTagged, kMachAnyTagged); | 567 VisitBinop(node, kMachAnyTagged, kMachAnyTagged); |
575 if (lower()) lowering->DoStringAdd(node); | 568 if (lower()) lowering->DoStringAdd(node); |
576 break; | 569 break; |
577 } | 570 } |
578 case IrOpcode::kLoadField: { | 571 case IrOpcode::kLoadField: { |
579 FieldAccess access = FieldAccessOf(node->op()); | 572 FieldAccess access = FieldAccessOf(node->op()); |
580 ProcessInput(node, 0, changer_->TypeForBasePointer(access)); | 573 ProcessInput(node, 0, changer_->TypeForBasePointer(access)); |
581 ProcessRemainingInputs(node, 1); | 574 ProcessRemainingInputs(node, 1); |
582 SetOutput(node, AssumeImplicitFloat32Change(access.machine_type)); | 575 SetOutput(node, access.machine_type); |
583 if (lower()) lowering->DoLoadField(node); | 576 if (lower()) lowering->DoLoadField(node); |
584 break; | 577 break; |
585 } | 578 } |
586 case IrOpcode::kStoreField: { | 579 case IrOpcode::kStoreField: { |
587 FieldAccess access = FieldAccessOf(node->op()); | 580 FieldAccess access = FieldAccessOf(node->op()); |
588 ProcessInput(node, 0, changer_->TypeForBasePointer(access)); | 581 ProcessInput(node, 0, changer_->TypeForBasePointer(access)); |
589 ProcessInput(node, 1, AssumeImplicitFloat32Change(access.machine_type)); | 582 ProcessInput(node, 1, access.machine_type); |
590 ProcessRemainingInputs(node, 2); | 583 ProcessRemainingInputs(node, 2); |
591 SetOutput(node, 0); | 584 SetOutput(node, 0); |
592 if (lower()) lowering->DoStoreField(node); | 585 if (lower()) lowering->DoStoreField(node); |
593 break; | 586 break; |
594 } | 587 } |
595 case IrOpcode::kLoadElement: { | 588 case IrOpcode::kLoadElement: { |
596 ElementAccess access = ElementAccessOf(node->op()); | 589 ElementAccess access = ElementAccessOf(node->op()); |
597 ProcessInput(node, 0, changer_->TypeForBasePointer(access)); | 590 ProcessInput(node, 0, changer_->TypeForBasePointer(access)); |
598 ProcessInput(node, 1, kMachInt32); // element index | 591 ProcessInput(node, 1, kMachInt32); // element index |
599 ProcessInput(node, 2, kMachInt32); // length | 592 ProcessInput(node, 2, kMachInt32); // length |
600 ProcessRemainingInputs(node, 3); | 593 ProcessRemainingInputs(node, 3); |
601 SetOutput(node, AssumeImplicitFloat32Change(access.machine_type)); | 594 SetOutput(node, access.machine_type); |
602 if (lower()) lowering->DoLoadElement(node); | 595 if (lower()) lowering->DoLoadElement(node); |
603 break; | 596 break; |
604 } | 597 } |
605 case IrOpcode::kStoreElement: { | 598 case IrOpcode::kStoreElement: { |
606 ElementAccess access = ElementAccessOf(node->op()); | 599 ElementAccess access = ElementAccessOf(node->op()); |
607 ProcessInput(node, 0, changer_->TypeForBasePointer(access)); | 600 ProcessInput(node, 0, changer_->TypeForBasePointer(access)); |
608 ProcessInput(node, 1, kMachInt32); // element index | 601 ProcessInput(node, 1, kMachInt32); // element index |
609 ProcessInput(node, 2, kMachInt32); // length | 602 ProcessInput(node, 2, kMachInt32); // length |
610 ProcessInput(node, 3, AssumeImplicitFloat32Change(access.machine_type)); | 603 ProcessInput(node, 3, access.machine_type); |
611 ProcessRemainingInputs(node, 4); | 604 ProcessRemainingInputs(node, 4); |
612 SetOutput(node, 0); | 605 SetOutput(node, 0); |
613 if (lower()) lowering->DoStoreElement(node); | 606 if (lower()) lowering->DoStoreElement(node); |
614 break; | 607 break; |
615 } | 608 } |
616 | 609 |
617 //------------------------------------------------------------------ | 610 //------------------------------------------------------------------ |
618 // Machine-level operators. | 611 // Machine-level operators. |
619 //------------------------------------------------------------------ | 612 //------------------------------------------------------------------ |
620 case IrOpcode::kLoad: { | 613 case IrOpcode::kLoad: { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 return VisitBinop(node, kRepWord64, kRepWord64); | 686 return VisitBinop(node, kRepWord64, kRepWord64); |
694 case IrOpcode::kWord64Equal: | 687 case IrOpcode::kWord64Equal: |
695 return VisitBinop(node, kRepWord64, kRepBit); | 688 return VisitBinop(node, kRepWord64, kRepBit); |
696 | 689 |
697 case IrOpcode::kChangeInt32ToInt64: | 690 case IrOpcode::kChangeInt32ToInt64: |
698 return VisitUnop(node, kTypeInt32 | kRepWord32, | 691 return VisitUnop(node, kTypeInt32 | kRepWord32, |
699 kTypeInt32 | kRepWord64); | 692 kTypeInt32 | kRepWord64); |
700 case IrOpcode::kChangeUint32ToUint64: | 693 case IrOpcode::kChangeUint32ToUint64: |
701 return VisitUnop(node, kTypeUint32 | kRepWord32, | 694 return VisitUnop(node, kTypeUint32 | kRepWord32, |
702 kTypeUint32 | kRepWord64); | 695 kTypeUint32 | kRepWord64); |
| 696 case IrOpcode::kTruncateFloat64ToFloat32: |
| 697 return VisitUnop(node, kTypeNumber | kRepFloat64, |
| 698 kTypeNumber | kRepFloat32); |
703 case IrOpcode::kTruncateInt64ToInt32: | 699 case IrOpcode::kTruncateInt64ToInt32: |
704 // TODO(titzer): Is kTypeInt32 correct here? | 700 // TODO(titzer): Is kTypeInt32 correct here? |
705 return VisitUnop(node, kTypeInt32 | kRepWord64, | 701 return VisitUnop(node, kTypeInt32 | kRepWord64, |
706 kTypeInt32 | kRepWord32); | 702 kTypeInt32 | kRepWord32); |
707 | 703 |
| 704 case IrOpcode::kChangeFloat32ToFloat64: |
| 705 return VisitUnop(node, kTypeNumber | kRepFloat32, |
| 706 kTypeNumber | kRepFloat64); |
708 case IrOpcode::kChangeInt32ToFloat64: | 707 case IrOpcode::kChangeInt32ToFloat64: |
709 return VisitUnop(node, kTypeInt32 | kRepWord32, | 708 return VisitUnop(node, kTypeInt32 | kRepWord32, |
710 kTypeInt32 | kRepFloat64); | 709 kTypeInt32 | kRepFloat64); |
711 case IrOpcode::kChangeUint32ToFloat64: | 710 case IrOpcode::kChangeUint32ToFloat64: |
712 return VisitUnop(node, kTypeUint32 | kRepWord32, | 711 return VisitUnop(node, kTypeUint32 | kRepWord32, |
713 kTypeUint32 | kRepFloat64); | 712 kTypeUint32 | kRepFloat64); |
714 case IrOpcode::kChangeFloat64ToInt32: | 713 case IrOpcode::kChangeFloat64ToInt32: |
715 return VisitUnop(node, kTypeInt32 | kRepFloat64, | 714 return VisitUnop(node, kTypeInt32 | kRepFloat64, |
716 kTypeInt32 | kRepWord32); | 715 kTypeInt32 | kRepWord32); |
717 case IrOpcode::kChangeFloat64ToUint32: | 716 case IrOpcode::kChangeFloat64ToUint32: |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
936 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { | 935 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { |
937 node->set_op(machine()->IntLessThanOrEqual()); | 936 node->set_op(machine()->IntLessThanOrEqual()); |
938 node->ReplaceInput(0, StringComparison(node, true)); | 937 node->ReplaceInput(0, StringComparison(node, true)); |
939 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); | 938 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); |
940 } | 939 } |
941 | 940 |
942 | 941 |
943 } // namespace compiler | 942 } // namespace compiler |
944 } // namespace internal | 943 } // namespace internal |
945 } // namespace v8 | 944 } // namespace v8 |
OLD | NEW |