| 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" |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 MachineRepresentation::kWord32, | 535 MachineRepresentation::kWord32, |
| 536 graph()->NewNode(machine()->Int32Add(), | 536 graph()->NewNode(machine()->Int32Add(), |
| 537 graph()->NewNode(machine()->Word32Clz(), | 537 graph()->NewNode(machine()->Word32Clz(), |
| 538 GetReplacementLow(input)), | 538 GetReplacementLow(input)), |
| 539 graph()->NewNode(common()->Int32Constant(32))), | 539 graph()->NewNode(common()->Int32Constant(32))), |
| 540 graph()->NewNode(machine()->Word32Clz(), GetReplacementHigh(input))); | 540 graph()->NewNode(machine()->Word32Clz(), GetReplacementHigh(input))); |
| 541 ReplaceNode(node, low_node, graph()->NewNode(common()->Int32Constant(0))); | 541 ReplaceNode(node, low_node, graph()->NewNode(common()->Int32Constant(0))); |
| 542 break; | 542 break; |
| 543 } | 543 } |
| 544 // kExprI64Ctz: | 544 // kExprI64Ctz: |
| 545 case IrOpcode::kWord64Ctz: { |
| 546 DCHECK(node->InputCount() == 1); |
| 547 DCHECK(machine()->Word32Ctz().IsSupported()); |
| 548 Node* input = node->InputAt(0); |
| 549 Diamond d( |
| 550 graph(), common(), |
| 551 graph()->NewNode(machine()->Word32Equal(), GetReplacementLow(input), |
| 552 graph()->NewNode(common()->Int32Constant(0)))); |
| 553 Node* low_node = |
| 554 d.Phi(MachineRepresentation::kWord32, |
| 555 graph()->NewNode(machine()->Int32Add(), |
| 556 graph()->NewNode(machine()->Word32Ctz().op(), |
| 557 GetReplacementHigh(input)), |
| 558 graph()->NewNode(common()->Int32Constant(32))), |
| 559 graph()->NewNode(machine()->Word32Ctz().op(), |
| 560 GetReplacementLow(input))); |
| 561 ReplaceNode(node, low_node, graph()->NewNode(common()->Int32Constant(0))); |
| 562 break; |
| 563 } |
| 564 // kExprI64Popcnt: |
| 545 case IrOpcode::kWord64Popcnt: { | 565 case IrOpcode::kWord64Popcnt: { |
| 546 DCHECK(node->InputCount() == 1); | 566 DCHECK(node->InputCount() == 1); |
| 547 Node* input = node->InputAt(0); | 567 Node* input = node->InputAt(0); |
| 548 // We assume that a Word64Popcnt node only has been created if | 568 // We assume that a Word64Popcnt node only has been created if |
| 549 // Word32Popcnt is actually supported. | 569 // Word32Popcnt is actually supported. |
| 550 DCHECK(machine()->Word32Popcnt().IsSupported()); | 570 DCHECK(machine()->Word32Popcnt().IsSupported()); |
| 551 ReplaceNode(node, graph()->NewNode( | 571 ReplaceNode(node, graph()->NewNode( |
| 552 machine()->Int32Add(), | 572 machine()->Int32Add(), |
| 553 graph()->NewNode(machine()->Word32Popcnt().op(), | 573 graph()->NewNode(machine()->Word32Popcnt().op(), |
| 554 GetReplacementLow(input)), | 574 GetReplacementLow(input)), |
| 555 graph()->NewNode(machine()->Word32Popcnt().op(), | 575 graph()->NewNode(machine()->Word32Popcnt().op(), |
| 556 GetReplacementHigh(input))), | 576 GetReplacementHigh(input))), |
| 557 graph()->NewNode(common()->Int32Constant(0))); | 577 graph()->NewNode(common()->Int32Constant(0))); |
| 558 break; | 578 break; |
| 559 } | 579 } |
| 560 // kExprI64Popcnt: | |
| 561 | 580 |
| 562 default: { DefaultLowering(node); } | 581 default: { DefaultLowering(node); } |
| 563 } | 582 } |
| 564 } | 583 } |
| 565 | 584 |
| 566 void Int64Lowering::LowerComparison(Node* node, const Operator* high_word_op, | 585 void Int64Lowering::LowerComparison(Node* node, const Operator* high_word_op, |
| 567 const Operator* low_word_op) { | 586 const Operator* low_word_op) { |
| 568 DCHECK(node->InputCount() == 2); | 587 DCHECK(node->InputCount() == 2); |
| 569 Node* left = node->InputAt(0); | 588 Node* left = node->InputAt(0); |
| 570 Node* right = node->InputAt(1); | 589 Node* right = node->InputAt(1); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 620 } | 639 } |
| 621 | 640 |
| 622 Node* Int64Lowering::GetReplacementHigh(Node* node) { | 641 Node* Int64Lowering::GetReplacementHigh(Node* node) { |
| 623 Node* result = replacements_[node->id()].high; | 642 Node* result = replacements_[node->id()].high; |
| 624 DCHECK(result); | 643 DCHECK(result); |
| 625 return result; | 644 return result; |
| 626 } | 645 } |
| 627 } // namespace compiler | 646 } // namespace compiler |
| 628 } // namespace internal | 647 } // namespace internal |
| 629 } // namespace v8 | 648 } // namespace v8 |
| OLD | NEW |