diff options
Diffstat (limited to 'deps/v8/src/compiler/s390/instruction-selector-s390.cc')
-rw-r--r-- | deps/v8/src/compiler/s390/instruction-selector-s390.cc | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/deps/v8/src/compiler/s390/instruction-selector-s390.cc b/deps/v8/src/compiler/s390/instruction-selector-s390.cc index 228ec3c0d5..f4e8ea13d2 100644 --- a/deps/v8/src/compiler/s390/instruction-selector-s390.cc +++ b/deps/v8/src/compiler/s390/instruction-selector-s390.cc @@ -702,6 +702,15 @@ void VisitBinOp(InstructionSelector* selector, Node* node, } // namespace +void InstructionSelector::VisitStackSlot(Node* node) { + StackSlotRepresentation rep = StackSlotRepresentationOf(node->op()); + int slot = frame_->AllocateSpillSlot(rep.size()); + OperandGenerator g(this); + + Emit(kArchStackSlot, g.DefineAsRegister(node), + sequence()->AddImmediate(Constant(slot)), 0, nullptr); +} + void InstructionSelector::VisitLoad(Node* node) { S390OperandGenerator g(this); ArchOpcode opcode = SelectLoadOpcode(node); @@ -2050,11 +2059,18 @@ void VisitWordCompareZero(InstructionSelector* selector, Node* user, return VisitWord32BinOp(selector, node, kS390_Sub32, SubOperandMode, cont); case IrOpcode::kInt32MulWithOverflow: - cont->OverwriteAndNegateIfEqual(kNotEqual); - return VisitWord32BinOp( - selector, node, kS390_Mul32WithOverflow, - OperandMode::kInt32Imm | OperandMode::kAllowDistinctOps, - cont); + if (CpuFeatures::IsSupported(MISC_INSTR_EXT2)) { + cont->OverwriteAndNegateIfEqual(kOverflow); + return VisitWord32BinOp( + selector, node, kS390_Mul32, + OperandMode::kAllowRRR | OperandMode::kAllowRM, cont); + } else { + cont->OverwriteAndNegateIfEqual(kNotEqual); + return VisitWord32BinOp( + selector, node, kS390_Mul32WithOverflow, + OperandMode::kInt32Imm | OperandMode::kAllowDistinctOps, + cont); + } case IrOpcode::kInt32AbsWithOverflow: cont->OverwriteAndNegateIfEqual(kOverflow); return VisitWord32UnaryOp(selector, node, kS390_Abs32, |