| Index: src/compiler/s390/instruction-selector-s390.cc
|
| diff --git a/src/compiler/s390/instruction-selector-s390.cc b/src/compiler/s390/instruction-selector-s390.cc
|
| index 4b70e41ffdab884eb5ee8aae7fe74652c4cc9a54..802c499ee595d76441832223bc55961e8849248f 100644
|
| --- a/src/compiler/s390/instruction-selector-s390.cc
|
| +++ b/src/compiler/s390/instruction-selector-s390.cc
|
| @@ -389,6 +389,11 @@ bool ProduceWord32Result(Node* node) {
|
| switch (load_rep.representation()) {
|
| case MachineRepresentation::kWord32:
|
| return true;
|
| + case MachineRepresentation::kWord8:
|
| + if (load_rep.IsSigned())
|
| + return false;
|
| + else
|
| + return true;
|
| default:
|
| return false;
|
| }
|
| @@ -515,6 +520,8 @@ void VisitBinOp(InstructionSelector* selector, Node* node,
|
| V(Word32, Unary, [](ArchOpcode opcode) { \
|
| return opcode == kS390_LoadWordS32 || opcode == kS390_LoadWordU32; \
|
| }) \
|
| + V(Word64, Unary, \
|
| + [](ArchOpcode opcode) { return opcode == kS390_LoadWord64; }) \
|
| V(Float32, Unary, \
|
| [](ArchOpcode opcode) { return opcode == kS390_LoadFloat32; }) \
|
| V(Float64, Unary, \
|
| @@ -529,8 +536,6 @@ void VisitBinOp(InstructionSelector* selector, Node* node,
|
| #if V8_TARGET_ARCH_S390X
|
| #define VISIT_OP_LIST(V) \
|
| VISIT_OP_LIST_32(V) \
|
| - V(Word64, Unary, \
|
| - [](ArchOpcode opcode) { return opcode == kS390_LoadWord64; }) \
|
| V(Word64, Bin, [](ArchOpcode opcode) { return opcode == kS390_LoadWord64; })
|
| #else
|
| #define VISIT_OP_LIST VISIT_OP_LIST_32
|
| @@ -1242,6 +1247,14 @@ void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); }
|
| void InstructionSelector::VisitWord64ReverseBits(Node* node) { UNREACHABLE(); }
|
| #endif
|
|
|
| +void InstructionSelector::VisitInt32AbsWithOverflow(Node* node) {
|
| + VisitWord32UnaryOp(this, node, kS390_Abs32, OperandMode::kNone);
|
| +}
|
| +
|
| +void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) {
|
| + VisitWord64UnaryOp(this, node, kS390_Abs64, OperandMode::kNone);
|
| +}
|
| +
|
| void InstructionSelector::VisitWord64ReverseBytes(Node* node) {
|
| S390OperandGenerator g(this);
|
| Emit(kS390_LoadReverse64RR, g.DefineAsRegister(node),
|
| @@ -2037,7 +2050,15 @@ void VisitWordCompareZero(InstructionSelector* selector, Node* user,
|
| selector, node, kS390_Mul32WithOverflow,
|
| OperandMode::kInt32Imm | OperandMode::kAllowDistinctOps,
|
| cont);
|
| + case IrOpcode::kInt32AbsWithOverflow:
|
| + cont->OverwriteAndNegateIfEqual(kOverflow);
|
| + return VisitWord32UnaryOp(selector, node, kS390_Abs32,
|
| + OperandMode::kNone, cont);
|
| #if V8_TARGET_ARCH_S390X
|
| + case IrOpcode::kInt64AbsWithOverflow:
|
| + cont->OverwriteAndNegateIfEqual(kOverflow);
|
| + return VisitWord64UnaryOp(selector, node, kS390_Abs64,
|
| + OperandMode::kNone, cont);
|
| case IrOpcode::kInt64AddWithOverflow:
|
| cont->OverwriteAndNegateIfEqual(kOverflow);
|
| return VisitWord64BinOp(selector, node, kS390_Add64,
|
| @@ -2450,6 +2471,8 @@ InstructionSelector::SupportedMachineOperatorFlags() {
|
| MachineOperatorBuilder::kWord32Popcnt |
|
| MachineOperatorBuilder::kWord32ReverseBytes |
|
| MachineOperatorBuilder::kWord64ReverseBytes |
|
| + MachineOperatorBuilder::kInt32AbsWithOverflow |
|
| + MachineOperatorBuilder::kInt64AbsWithOverflow |
|
| MachineOperatorBuilder::kWord64Popcnt;
|
| }
|
|
|
|
|