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

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

Issue 2220313002: S390: Decouple Add/Sub/Neg to 32/64 Bit Op (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix Neg32 to use lcr Created 4 years, 4 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
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 856 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 g.DefineAsRegister(node), g.UseRegister(base), 867 g.DefineAsRegister(node), g.UseRegister(base),
868 g.UseRegister(offset)); 868 g.UseRegister(offset));
869 return; 869 return;
870 } 870 }
871 } 871 }
872 Emit(kS390_LoadReverse32RR, g.DefineAsRegister(node), 872 Emit(kS390_LoadReverse32RR, g.DefineAsRegister(node),
873 g.UseRegister(node->InputAt(0))); 873 g.UseRegister(node->InputAt(0)));
874 } 874 }
875 875
876 void InstructionSelector::VisitInt32Add(Node* node) { 876 void InstructionSelector::VisitInt32Add(Node* node) {
877 VisitBinop<Int32BinopMatcher>(this, node, kS390_Add, kInt16Imm); 877 VisitBinop<Int32BinopMatcher>(this, node, kS390_Add32, kInt16Imm);
878 } 878 }
879 879
880 #if V8_TARGET_ARCH_S390X 880 #if V8_TARGET_ARCH_S390X
881 void InstructionSelector::VisitInt64Add(Node* node) { 881 void InstructionSelector::VisitInt64Add(Node* node) {
882 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add, kInt16Imm); 882 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add64, kInt16Imm);
883 } 883 }
884 #endif 884 #endif
885 885
886 void InstructionSelector::VisitInt32Sub(Node* node) { 886 void InstructionSelector::VisitInt32Sub(Node* node) {
887 S390OperandGenerator g(this); 887 S390OperandGenerator g(this);
888 Int32BinopMatcher m(node); 888 Int32BinopMatcher m(node);
889 if (m.left().Is(0)) { 889 if (m.left().Is(0)) {
890 Emit(kS390_Neg, g.DefineAsRegister(node), g.UseRegister(m.right().node())); 890 Emit(kS390_Neg32, g.DefineAsRegister(node),
891 g.UseRegister(m.right().node()));
891 } else { 892 } else {
892 VisitBinop<Int32BinopMatcher>(this, node, kS390_Sub, kInt16Imm_Negate); 893 VisitBinop<Int32BinopMatcher>(this, node, kS390_Sub32, kInt16Imm_Negate);
893 } 894 }
894 } 895 }
895 896
896 #if V8_TARGET_ARCH_S390X 897 #if V8_TARGET_ARCH_S390X
897 void InstructionSelector::VisitInt64Sub(Node* node) { 898 void InstructionSelector::VisitInt64Sub(Node* node) {
898 S390OperandGenerator g(this); 899 S390OperandGenerator g(this);
899 Int64BinopMatcher m(node); 900 Int64BinopMatcher m(node);
900 if (m.left().Is(0)) { 901 if (m.left().Is(0)) {
901 Emit(kS390_Neg, g.DefineAsRegister(node), g.UseRegister(m.right().node())); 902 Emit(kS390_Neg64, g.DefineAsRegister(node),
903 g.UseRegister(m.right().node()));
902 } else { 904 } else {
903 VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub, kInt16Imm_Negate); 905 VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub64, kInt16Imm_Negate);
904 } 906 }
905 } 907 }
906 #endif 908 #endif
907 909
908 namespace { 910 namespace {
909 911
910 void VisitCompare(InstructionSelector* selector, InstructionCode opcode, 912 void VisitCompare(InstructionSelector* selector, InstructionCode opcode,
911 InstructionOperand left, InstructionOperand right, 913 InstructionOperand left, InstructionOperand right,
912 FlagsContinuation* cont); 914 FlagsContinuation* cont);
913 void EmitInt32MulWithOverflow(InstructionSelector* selector, Node* node, 915 void EmitInt32MulWithOverflow(InstructionSelector* selector, Node* node,
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
1277 UNREACHABLE(); 1279 UNREACHABLE();
1278 } 1280 }
1279 1281
1280 void InstructionSelector::VisitFloat32Neg(Node* node) { UNREACHABLE(); } 1282 void InstructionSelector::VisitFloat32Neg(Node* node) { UNREACHABLE(); }
1281 1283
1282 void InstructionSelector::VisitFloat64Neg(Node* node) { UNREACHABLE(); } 1284 void InstructionSelector::VisitFloat64Neg(Node* node) { UNREACHABLE(); }
1283 1285
1284 void InstructionSelector::VisitInt32AddWithOverflow(Node* node) { 1286 void InstructionSelector::VisitInt32AddWithOverflow(Node* node) {
1285 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { 1287 if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
1286 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf); 1288 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
1287 return VisitBinop<Int32BinopMatcher>(this, node, kS390_AddWithOverflow32, 1289 return VisitBinop<Int32BinopMatcher>(this, node, kS390_Add32, kInt16Imm,
1288 kInt16Imm, &cont); 1290 &cont);
1289 } 1291 }
1290 FlagsContinuation cont; 1292 FlagsContinuation cont;
1291 VisitBinop<Int32BinopMatcher>(this, node, kS390_AddWithOverflow32, kInt16Imm, 1293 VisitBinop<Int32BinopMatcher>(this, node, kS390_Add32, kInt16Imm, &cont);
1292 &cont);
1293 } 1294 }
1294 1295
1295 void InstructionSelector::VisitInt32SubWithOverflow(Node* node) { 1296 void InstructionSelector::VisitInt32SubWithOverflow(Node* node) {
1296 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { 1297 if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
1297 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf); 1298 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
1298 return VisitBinop<Int32BinopMatcher>(this, node, kS390_SubWithOverflow32, 1299 return VisitBinop<Int32BinopMatcher>(this, node, kS390_Sub32,
1299 kInt16Imm_Negate, &cont); 1300 kInt16Imm_Negate, &cont);
1300 } 1301 }
1301 FlagsContinuation cont; 1302 FlagsContinuation cont;
1302 VisitBinop<Int32BinopMatcher>(this, node, kS390_SubWithOverflow32, 1303 VisitBinop<Int32BinopMatcher>(this, node, kS390_Sub32, kInt16Imm_Negate,
1303 kInt16Imm_Negate, &cont); 1304 &cont);
1304 } 1305 }
1305 1306
1306 #if V8_TARGET_ARCH_S390X 1307 #if V8_TARGET_ARCH_S390X
1307 void InstructionSelector::VisitInt64AddWithOverflow(Node* node) { 1308 void InstructionSelector::VisitInt64AddWithOverflow(Node* node) {
1308 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { 1309 if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
1309 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf); 1310 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
1310 return VisitBinop<Int64BinopMatcher>(this, node, kS390_Add, kInt16Imm, 1311 return VisitBinop<Int64BinopMatcher>(this, node, kS390_Add64, kInt16Imm,
1311 &cont); 1312 &cont);
1312 } 1313 }
1313 FlagsContinuation cont; 1314 FlagsContinuation cont;
1314 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add, kInt16Imm, &cont); 1315 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add64, kInt16Imm, &cont);
1315 } 1316 }
1316 1317
1317 void InstructionSelector::VisitInt64SubWithOverflow(Node* node) { 1318 void InstructionSelector::VisitInt64SubWithOverflow(Node* node) {
1318 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { 1319 if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
1319 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf); 1320 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
1320 return VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub, 1321 return VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub64,
1321 kInt16Imm_Negate, &cont); 1322 kInt16Imm_Negate, &cont);
1322 } 1323 }
1323 FlagsContinuation cont; 1324 FlagsContinuation cont;
1324 VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub, kInt16Imm_Negate, &cont); 1325 VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub64, kInt16Imm_Negate,
1326 &cont);
1325 } 1327 }
1326 #endif 1328 #endif
1327 1329
1328 static bool CompareLogical(FlagsContinuation* cont) { 1330 static bool CompareLogical(FlagsContinuation* cont) {
1329 switch (cont->condition()) { 1331 switch (cont->condition()) {
1330 case kUnsignedLessThan: 1332 case kUnsignedLessThan:
1331 case kUnsignedGreaterThanOrEqual: 1333 case kUnsignedGreaterThanOrEqual:
1332 case kUnsignedLessThanOrEqual: 1334 case kUnsignedLessThanOrEqual:
1333 case kUnsignedGreaterThan: 1335 case kUnsignedGreaterThan:
1334 return true; 1336 return true;
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1490 // <Operation> is either nullptr, which means there's no use of the 1492 // <Operation> is either nullptr, which means there's no use of the
1491 // actual value, or was already defined, which means it is scheduled 1493 // actual value, or was already defined, which means it is scheduled
1492 // *AFTER* this branch). 1494 // *AFTER* this branch).
1493 Node* const node = value->InputAt(0); 1495 Node* const node = value->InputAt(0);
1494 Node* const result = NodeProperties::FindProjection(node, 0); 1496 Node* const result = NodeProperties::FindProjection(node, 0);
1495 if (result == nullptr || selector->IsDefined(result)) { 1497 if (result == nullptr || selector->IsDefined(result)) {
1496 switch (node->opcode()) { 1498 switch (node->opcode()) {
1497 case IrOpcode::kInt32AddWithOverflow: 1499 case IrOpcode::kInt32AddWithOverflow:
1498 cont->OverwriteAndNegateIfEqual(kOverflow); 1500 cont->OverwriteAndNegateIfEqual(kOverflow);
1499 return VisitBinop<Int32BinopMatcher>( 1501 return VisitBinop<Int32BinopMatcher>(
1500 selector, node, kS390_AddWithOverflow32, kInt16Imm, cont); 1502 selector, node, kS390_Add32, kInt16Imm, cont);
1501 case IrOpcode::kInt32SubWithOverflow: 1503 case IrOpcode::kInt32SubWithOverflow:
1502 cont->OverwriteAndNegateIfEqual(kOverflow); 1504 cont->OverwriteAndNegateIfEqual(kOverflow);
1503 return VisitBinop<Int32BinopMatcher>(selector, node, 1505 return VisitBinop<Int32BinopMatcher>(
1504 kS390_SubWithOverflow32, 1506 selector, node, kS390_Sub32, kInt16Imm_Negate, cont);
1505 kInt16Imm_Negate, cont);
1506 case IrOpcode::kInt32MulWithOverflow: 1507 case IrOpcode::kInt32MulWithOverflow:
1507 cont->OverwriteAndNegateIfEqual(kNotEqual); 1508 cont->OverwriteAndNegateIfEqual(kNotEqual);
1508 return EmitInt32MulWithOverflow(selector, node, cont); 1509 return EmitInt32MulWithOverflow(selector, node, cont);
1509 #if V8_TARGET_ARCH_S390X 1510 #if V8_TARGET_ARCH_S390X
1510 case IrOpcode::kInt64AddWithOverflow: 1511 case IrOpcode::kInt64AddWithOverflow:
1511 cont->OverwriteAndNegateIfEqual(kOverflow); 1512 cont->OverwriteAndNegateIfEqual(kOverflow);
1512 return VisitBinop<Int64BinopMatcher>(selector, node, kS390_Add, 1513 return VisitBinop<Int64BinopMatcher>(
1513 kInt16Imm, cont); 1514 selector, node, kS390_Add64, kInt16Imm, cont);
1514 case IrOpcode::kInt64SubWithOverflow: 1515 case IrOpcode::kInt64SubWithOverflow:
1515 cont->OverwriteAndNegateIfEqual(kOverflow); 1516 cont->OverwriteAndNegateIfEqual(kOverflow);
1516 return VisitBinop<Int64BinopMatcher>(selector, node, kS390_Sub, 1517 return VisitBinop<Int64BinopMatcher>(
1517 kInt16Imm_Negate, cont); 1518 selector, node, kS390_Sub64, kInt16Imm_Negate, cont);
1518 #endif 1519 #endif
1519 default: 1520 default:
1520 break; 1521 break;
1521 } 1522 }
1522 } 1523 }
1523 } 1524 }
1524 break; 1525 break;
1525 case IrOpcode::kInt32Sub: 1526 case IrOpcode::kInt32Sub:
1526 return VisitWord32Compare(selector, value, cont); 1527 return VisitWord32Compare(selector, value, cont);
1527 case IrOpcode::kWord32And: 1528 case IrOpcode::kWord32And:
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1603 size_t table_time_cost = 3; 1604 size_t table_time_cost = 3;
1604 size_t lookup_space_cost = 3 + 2 * sw.case_count; 1605 size_t lookup_space_cost = 3 + 2 * sw.case_count;
1605 size_t lookup_time_cost = sw.case_count; 1606 size_t lookup_time_cost = sw.case_count;
1606 if (sw.case_count > 0 && 1607 if (sw.case_count > 0 &&
1607 table_space_cost + 3 * table_time_cost <= 1608 table_space_cost + 3 * table_time_cost <=
1608 lookup_space_cost + 3 * lookup_time_cost && 1609 lookup_space_cost + 3 * lookup_time_cost &&
1609 sw.min_value > std::numeric_limits<int32_t>::min()) { 1610 sw.min_value > std::numeric_limits<int32_t>::min()) {
1610 InstructionOperand index_operand = value_operand; 1611 InstructionOperand index_operand = value_operand;
1611 if (sw.min_value) { 1612 if (sw.min_value) {
1612 index_operand = g.TempRegister(); 1613 index_operand = g.TempRegister();
1613 Emit(kS390_Sub, index_operand, value_operand, 1614 Emit(kS390_Sub32, index_operand, value_operand,
1614 g.TempImmediate(sw.min_value)); 1615 g.TempImmediate(sw.min_value));
1615 } 1616 }
1616 // Generate a table lookup. 1617 // Generate a table lookup.
1617 return EmitTableSwitch(sw, index_operand); 1618 return EmitTableSwitch(sw, index_operand);
1618 } 1619 }
1619 1620
1620 // Generate a sequence of conditional jumps. 1621 // Generate a sequence of conditional jumps.
1621 return EmitLookupSwitch(sw, value_operand); 1622 return EmitLookupSwitch(sw, value_operand);
1622 } 1623 }
1623 1624
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
1885 // static 1886 // static
1886 MachineOperatorBuilder::AlignmentRequirements 1887 MachineOperatorBuilder::AlignmentRequirements
1887 InstructionSelector::AlignmentRequirements() { 1888 InstructionSelector::AlignmentRequirements() {
1888 return MachineOperatorBuilder::AlignmentRequirements:: 1889 return MachineOperatorBuilder::AlignmentRequirements::
1889 FullUnalignedAccessSupport(); 1890 FullUnalignedAccessSupport();
1890 } 1891 }
1891 1892
1892 } // namespace compiler 1893 } // namespace compiler
1893 } // namespace internal 1894 } // namespace internal
1894 } // namespace v8 1895 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/s390/instruction-scheduler-s390.cc ('k') | src/full-codegen/s390/full-codegen-s390.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698