Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Side by Side Diff: src/compiler/s390/instruction-selector-s390.cc

Issue 2153913002: S390: [turbofan] Introduce integer multiplication with overflow. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/s390/instruction-scheduler-s390.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/base/adapters.h" 5 #include "src/base/adapters.h"
6 #include "src/compiler/instruction-selector-impl.h" 6 #include "src/compiler/instruction-selector-impl.h"
7 #include "src/compiler/node-matchers.h" 7 #include "src/compiler/node-matchers.h"
8 #include "src/compiler/node-properties.h" 8 #include "src/compiler/node-properties.h"
9 #include "src/s390/frames-s390.h" 9 #include "src/s390/frames-s390.h"
10 10
(...skipping 901 matching lines...) Expand 10 before | Expand all | Expand 10 after
912 S390OperandGenerator g(this); 912 S390OperandGenerator g(this);
913 Int64BinopMatcher m(node); 913 Int64BinopMatcher m(node);
914 if (m.left().Is(0)) { 914 if (m.left().Is(0)) {
915 Emit(kS390_Neg, g.DefineAsRegister(node), g.UseRegister(m.right().node())); 915 Emit(kS390_Neg, g.DefineAsRegister(node), g.UseRegister(m.right().node()));
916 } else { 916 } else {
917 VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub, kInt16Imm_Negate); 917 VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub, kInt16Imm_Negate);
918 } 918 }
919 } 919 }
920 #endif 920 #endif
921 921
922 namespace {
923
924 void VisitCompare(InstructionSelector* selector, InstructionCode opcode,
925 InstructionOperand left, InstructionOperand right,
926 FlagsContinuation* cont);
927 void EmitInt32MulWithOverflow(InstructionSelector* selector, Node* node,
928 FlagsContinuation* cont) {
929 S390OperandGenerator g(selector);
930 Int32BinopMatcher m(node);
931 InstructionOperand result_operand = g.DefineAsRegister(node);
932 InstructionOperand high32_operand = g.TempRegister();
933 InstructionOperand temp_operand = g.TempRegister();
934 {
935 InstructionOperand outputs[] = {result_operand, high32_operand};
936 InstructionOperand inputs[] = {g.UseRegister(m.left().node()),
937 g.UseRegister(m.right().node())};
938 selector->Emit(kS390_Mul32WithHigh32, 2, outputs, 2, inputs);
939 }
940 {
941 InstructionOperand shift_31 = g.UseImmediate(31);
942 InstructionOperand outputs[] = {temp_operand};
943 InstructionOperand inputs[] = {result_operand, shift_31};
944 selector->Emit(kS390_ShiftRightArith32, 1, outputs, 2, inputs);
945 }
946
947 VisitCompare(selector, kS390_Cmp32, high32_operand, temp_operand, cont);
948 }
949
950 } // namespace
951
922 void InstructionSelector::VisitInt32Mul(Node* node) { 952 void InstructionSelector::VisitInt32Mul(Node* node) {
923 VisitRRR(this, kS390_Mul32, node); 953 VisitRRR(this, kS390_Mul32, node);
924 } 954 }
925 955
926 #if V8_TARGET_ARCH_S390X 956 #if V8_TARGET_ARCH_S390X
927 void InstructionSelector::VisitInt64Mul(Node* node) { 957 void InstructionSelector::VisitInt64Mul(Node* node) {
928 VisitRRR(this, kS390_Mul64, node); 958 VisitRRR(this, kS390_Mul64, node);
929 } 959 }
930 #endif 960 #endif
931 961
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after
1480 switch (node->opcode()) { 1510 switch (node->opcode()) {
1481 case IrOpcode::kInt32AddWithOverflow: 1511 case IrOpcode::kInt32AddWithOverflow:
1482 cont->OverwriteAndNegateIfEqual(kOverflow); 1512 cont->OverwriteAndNegateIfEqual(kOverflow);
1483 return VisitBinop<Int32BinopMatcher>( 1513 return VisitBinop<Int32BinopMatcher>(
1484 selector, node, kS390_AddWithOverflow32, kInt16Imm, cont); 1514 selector, node, kS390_AddWithOverflow32, kInt16Imm, cont);
1485 case IrOpcode::kInt32SubWithOverflow: 1515 case IrOpcode::kInt32SubWithOverflow:
1486 cont->OverwriteAndNegateIfEqual(kOverflow); 1516 cont->OverwriteAndNegateIfEqual(kOverflow);
1487 return VisitBinop<Int32BinopMatcher>(selector, node, 1517 return VisitBinop<Int32BinopMatcher>(selector, node,
1488 kS390_SubWithOverflow32, 1518 kS390_SubWithOverflow32,
1489 kInt16Imm_Negate, cont); 1519 kInt16Imm_Negate, cont);
1520 case IrOpcode::kInt32MulWithOverflow:
1521 cont->OverwriteAndNegateIfEqual(kNotEqual);
1522 return EmitInt32MulWithOverflow(selector, node, cont);
1490 #if V8_TARGET_ARCH_S390X 1523 #if V8_TARGET_ARCH_S390X
1491 case IrOpcode::kInt64AddWithOverflow: 1524 case IrOpcode::kInt64AddWithOverflow:
1492 cont->OverwriteAndNegateIfEqual(kOverflow); 1525 cont->OverwriteAndNegateIfEqual(kOverflow);
1493 return VisitBinop<Int64BinopMatcher>(selector, node, kS390_Add, 1526 return VisitBinop<Int64BinopMatcher>(selector, node, kS390_Add,
1494 kInt16Imm, cont); 1527 kInt16Imm, cont);
1495 case IrOpcode::kInt64SubWithOverflow: 1528 case IrOpcode::kInt64SubWithOverflow:
1496 cont->OverwriteAndNegateIfEqual(kOverflow); 1529 cont->OverwriteAndNegateIfEqual(kOverflow);
1497 return VisitBinop<Int64BinopMatcher>(selector, node, kS390_Sub, 1530 return VisitBinop<Int64BinopMatcher>(selector, node, kS390_Sub,
1498 kInt16Imm_Negate, cont); 1531 kInt16Imm_Negate, cont);
1499 #endif 1532 #endif
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
1659 VisitWord64Compare(this, node, &cont); 1692 VisitWord64Compare(this, node, &cont);
1660 } 1693 }
1661 1694
1662 void InstructionSelector::VisitUint64LessThanOrEqual(Node* node) { 1695 void InstructionSelector::VisitUint64LessThanOrEqual(Node* node) {
1663 FlagsContinuation cont = 1696 FlagsContinuation cont =
1664 FlagsContinuation::ForSet(kUnsignedLessThanOrEqual, node); 1697 FlagsContinuation::ForSet(kUnsignedLessThanOrEqual, node);
1665 VisitWord64Compare(this, node, &cont); 1698 VisitWord64Compare(this, node, &cont);
1666 } 1699 }
1667 #endif 1700 #endif
1668 1701
1702 void InstructionSelector::VisitInt32MulWithOverflow(Node* node) {
1703 if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
1704 FlagsContinuation cont = FlagsContinuation::ForSet(kNotEqual, ovf);
1705 return EmitInt32MulWithOverflow(this, node, &cont);
1706 }
1707 FlagsContinuation cont;
1708 EmitInt32MulWithOverflow(this, node, &cont);
1709 }
1710
1669 void InstructionSelector::VisitFloat32Equal(Node* node) { 1711 void InstructionSelector::VisitFloat32Equal(Node* node) {
1670 FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node); 1712 FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node);
1671 VisitFloat32Compare(this, node, &cont); 1713 VisitFloat32Compare(this, node, &cont);
1672 } 1714 }
1673 1715
1674 void InstructionSelector::VisitFloat32LessThan(Node* node) { 1716 void InstructionSelector::VisitFloat32LessThan(Node* node) {
1675 FlagsContinuation cont = FlagsContinuation::ForSet(kUnsignedLessThan, node); 1717 FlagsContinuation cont = FlagsContinuation::ForSet(kUnsignedLessThan, node);
1676 VisitFloat32Compare(this, node, &cont); 1718 VisitFloat32Compare(this, node, &cont);
1677 } 1719 }
1678 1720
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1855 // static 1897 // static
1856 MachineOperatorBuilder::AlignmentRequirements 1898 MachineOperatorBuilder::AlignmentRequirements
1857 InstructionSelector::AlignmentRequirements() { 1899 InstructionSelector::AlignmentRequirements() {
1858 return MachineOperatorBuilder::AlignmentRequirements:: 1900 return MachineOperatorBuilder::AlignmentRequirements::
1859 FullUnalignedAccessSupport(); 1901 FullUnalignedAccessSupport();
1860 } 1902 }
1861 1903
1862 } // namespace compiler 1904 } // namespace compiler
1863 } // namespace internal 1905 } // namespace internal
1864 } // namespace v8 1906 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/s390/instruction-scheduler-s390.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698