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/compiler/int64-lowering.h" | 5 #include "src/compiler/int64-lowering.h" |
| 6 #include "src/compiler/common-operator.h" | 6 #include "src/compiler/common-operator.h" |
| 7 #include "src/compiler/diamond.h" | 7 #include "src/compiler/diamond.h" |
| 8 #include "src/compiler/graph.h" | 8 #include "src/compiler/graph.h" |
| 9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
| 10 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
| 11 #include "src/compiler/node-matchers.h" | |
| 11 #include "src/compiler/node-properties.h" | 12 #include "src/compiler/node-properties.h" |
| 12 | 13 |
| 13 #include "src/compiler/node.h" | 14 #include "src/compiler/node.h" |
| 14 #include "src/wasm/wasm-module.h" | 15 #include "src/wasm/wasm-module.h" |
| 15 #include "src/zone.h" | 16 #include "src/zone.h" |
| 16 | 17 |
| 17 namespace v8 { | 18 namespace v8 { |
| 18 namespace internal { | 19 namespace internal { |
| 19 namespace compiler { | 20 namespace compiler { |
| 20 | 21 |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 543 graph()->NewNode(common()->Int32Constant(4)), store, | 544 graph()->NewNode(common()->Int32Constant(4)), store, |
| 544 graph()->start()); | 545 graph()->start()); |
| 545 | 546 |
| 546 Node* low_node = | 547 Node* low_node = |
| 547 graph()->NewNode(machine()->Load(MachineType::Int32()), stack_slot, | 548 graph()->NewNode(machine()->Load(MachineType::Int32()), stack_slot, |
| 548 graph()->NewNode(common()->Int32Constant(0)), store, | 549 graph()->NewNode(common()->Int32Constant(0)), store, |
| 549 graph()->start()); | 550 graph()->start()); |
| 550 ReplaceNode(node, low_node, high_node); | 551 ReplaceNode(node, low_node, high_node); |
| 551 break; | 552 break; |
| 552 } | 553 } |
| 554 case IrOpcode::kWord64Ror: { | |
|
titzer
2016/03/30 14:56:35
The names in here are a bit confusing. Fixed have
ahaas
2016/03/31 14:17:12
Done.
| |
| 555 DCHECK(node->InputCount() == 2); | |
| 556 Node* input = node->InputAt(0); | |
| 557 Node* shift = HasReplacementLow(node->InputAt(1)) | |
| 558 ? GetReplacementLow(node->InputAt(1)) | |
| 559 : node->InputAt(1); | |
| 560 Int32Matcher m(shift); | |
| 561 if (m.HasValue()) { | |
| 562 int32_t shift_value = m.Value() & 0x3f; | |
| 563 | |
| 564 Node* fixed_low; | |
| 565 Node* fixed_high; | |
| 566 if (shift_value < 32) { | |
| 567 fixed_low = GetReplacementLow(input); | |
| 568 fixed_high = GetReplacementHigh(input); | |
| 569 } else { | |
| 570 fixed_low = GetReplacementHigh(input); | |
| 571 fixed_high = GetReplacementLow(input); | |
| 572 } | |
| 573 | |
| 574 int32_t fixed_shift_value = shift_value & 0x1f; | |
| 575 Node* fixed_shift = | |
| 576 graph()->NewNode(common()->Int32Constant(fixed_shift_value)); | |
| 577 Node* inv_shift = | |
| 578 graph()->NewNode(common()->Int32Constant(32 - fixed_shift_value)); | |
| 579 if (fixed_shift_value == 0) { | |
|
titzer
2016/03/30 14:56:35
Can you move this case up and save the creation of
ahaas
2016/03/31 14:17:12
Done.
| |
| 580 ReplaceNode(node, fixed_low, fixed_high); | |
| 581 } else { | |
| 582 Node* low_node = graph()->NewNode( | |
| 583 machine()->Word32Or(), | |
| 584 graph()->NewNode(machine()->Word32Shr(), fixed_low, fixed_shift), | |
| 585 graph()->NewNode(machine()->Word32Shl(), fixed_high, inv_shift)); | |
| 586 Node* high_node = graph()->NewNode( | |
| 587 machine()->Word32Or(), | |
| 588 graph()->NewNode(machine()->Word32Shr(), fixed_high, fixed_shift), | |
| 589 graph()->NewNode(machine()->Word32Shl(), fixed_low, inv_shift)); | |
| 590 ReplaceNode(node, low_node, high_node); | |
| 591 } | |
| 592 } else { | |
| 593 Diamond lt32(graph(), common(), | |
| 594 graph()->NewNode( | |
| 595 machine()->Int32LessThan(), | |
| 596 graph()->NewNode( | |
| 597 machine()->Word32And(), shift, | |
| 598 graph()->NewNode(common()->Int32Constant(0x3f))), | |
| 599 graph()->NewNode(common()->Int32Constant(32)))); | |
| 600 | |
| 601 Node* fixed_low = | |
|
titzer
2016/03/30 14:56:35
This is probably going to generate some bad code.
ahaas
2016/03/31 14:17:13
I did a complete rework of the lowering. Word64Ror
| |
| 602 lt32.Phi(MachineRepresentation::kWord32, GetReplacementLow(input), | |
| 603 GetReplacementHigh(input)); | |
| 604 Node* fixed_high = | |
| 605 lt32.Phi(MachineRepresentation::kWord32, GetReplacementHigh(input), | |
| 606 GetReplacementLow(input)); | |
| 607 | |
| 608 Node* fixed_shift = | |
| 609 graph()->NewNode(machine()->Word32And(), shift, | |
| 610 graph()->NewNode(common()->Int32Constant(0x1f))); | |
| 611 Node* inv_shift = graph()->NewNode( | |
| 612 machine()->Int32Sub(), | |
| 613 graph()->NewNode(common()->Int32Constant(32)), fixed_shift); | |
| 614 | |
| 615 Diamond z( | |
| 616 graph(), common(), | |
| 617 graph()->NewNode(machine()->Word32Equal(), fixed_shift, | |
| 618 graph()->NewNode(common()->Int32Constant(0)))); | |
| 619 | |
| 620 Node* low_node = | |
| 621 z.Phi(MachineRepresentation::kWord32, fixed_low, | |
| 622 graph()->NewNode(machine()->Word32Or(), | |
| 623 graph()->NewNode(machine()->Word32Shr(), | |
| 624 fixed_low, fixed_shift), | |
| 625 graph()->NewNode(machine()->Word32Shl(), | |
| 626 fixed_high, inv_shift))); | |
| 627 | |
| 628 Node* high_node = | |
| 629 z.Phi(MachineRepresentation::kWord32, fixed_high, | |
| 630 graph()->NewNode(machine()->Word32Or(), | |
| 631 graph()->NewNode(machine()->Word32Shr(), | |
| 632 fixed_high, fixed_shift), | |
| 633 graph()->NewNode(machine()->Word32Shl(), | |
| 634 fixed_low, inv_shift))); | |
| 635 | |
| 636 ReplaceNode(node, low_node, high_node); | |
| 637 } | |
| 638 break; | |
| 639 } | |
| 553 // kExprI64Clz: | 640 // kExprI64Clz: |
| 554 case IrOpcode::kWord64Clz: { | 641 case IrOpcode::kWord64Clz: { |
| 555 DCHECK(node->InputCount() == 1); | 642 DCHECK(node->InputCount() == 1); |
| 556 Node* input = node->InputAt(0); | 643 Node* input = node->InputAt(0); |
| 557 Diamond d( | 644 Diamond d( |
| 558 graph(), common(), | 645 graph(), common(), |
| 559 graph()->NewNode(machine()->Word32Equal(), GetReplacementHigh(input), | 646 graph()->NewNode(machine()->Word32Equal(), GetReplacementHigh(input), |
| 560 graph()->NewNode(common()->Int32Constant(0)))); | 647 graph()->NewNode(common()->Int32Constant(0)))); |
| 561 | 648 |
| 562 Node* low_node = d.Phi( | 649 Node* low_node = d.Phi( |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 617 high_node->ReplaceInput(i, GetReplacementHigh(node->InputAt(i))); | 704 high_node->ReplaceInput(i, GetReplacementHigh(node->InputAt(i))); |
| 618 } | 705 } |
| 619 } else { | 706 } else { |
| 620 DefaultLowering(node); | 707 DefaultLowering(node); |
| 621 } | 708 } |
| 622 break; | 709 break; |
| 623 } | 710 } |
| 624 | 711 |
| 625 default: { DefaultLowering(node); } | 712 default: { DefaultLowering(node); } |
| 626 } | 713 } |
| 627 } | 714 } // NOLINT(readability/fn_size) |
| 628 | 715 |
| 629 void Int64Lowering::LowerComparison(Node* node, const Operator* high_word_op, | 716 void Int64Lowering::LowerComparison(Node* node, const Operator* high_word_op, |
| 630 const Operator* low_word_op) { | 717 const Operator* low_word_op) { |
| 631 DCHECK(node->InputCount() == 2); | 718 DCHECK(node->InputCount() == 2); |
| 632 Node* left = node->InputAt(0); | 719 Node* left = node->InputAt(0); |
| 633 Node* right = node->InputAt(1); | 720 Node* right = node->InputAt(1); |
| 634 Node* replacement = graph()->NewNode( | 721 Node* replacement = graph()->NewNode( |
| 635 machine()->Word32Or(), | 722 machine()->Word32Or(), |
| 636 graph()->NewNode(high_word_op, GetReplacementHigh(left), | 723 graph()->NewNode(high_word_op, GetReplacementHigh(left), |
| 637 GetReplacementHigh(right)), | 724 GetReplacementHigh(right)), |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 709 common()->Phi(MachineRepresentation::kWord32, value_count), | 796 common()->Phi(MachineRepresentation::kWord32, value_count), |
| 710 value_count + 1, inputs_low, false), | 797 value_count + 1, inputs_low, false), |
| 711 graph()->NewNode( | 798 graph()->NewNode( |
| 712 common()->Phi(MachineRepresentation::kWord32, value_count), | 799 common()->Phi(MachineRepresentation::kWord32, value_count), |
| 713 value_count + 1, inputs_high, false)); | 800 value_count + 1, inputs_high, false)); |
| 714 } | 801 } |
| 715 } | 802 } |
| 716 } // namespace compiler | 803 } // namespace compiler |
| 717 } // namespace internal | 804 } // namespace internal |
| 718 } // namespace v8 | 805 } // namespace v8 |
| OLD | NEW |