Skip to content

Commit e54cbee

Browse files
committed
deps: V8: cherry-pick eadaef581c29
Original commit message: Fix usage of MulHighS64 on <= z13 mgrk is only available with MISC_INSTR_EXT2 installed. A runtime call needs to be made if it's unavailable. We also need to make sure caller saved registers are saved accordingly before making a call. Change-Id: If7ac06eef57cc3db059c2640b77c80de3b16fced Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4521297 Reviewed-by: Junliang Yan <[email protected]> Commit-Queue: Milad Farazmand <[email protected]> Cr-Commit-Position: refs/heads/main@{#87675} Fixes: nodejs#47064
1 parent 9cd70f4 commit e54cbee

File tree

2 files changed

+26
-21
lines changed

2 files changed

+26
-21
lines changed

deps/v8/src/codegen/s390/macro-assembler-s390.cc

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2906,8 +2906,23 @@ void MacroAssembler::MulS64(Register dst, const MemOperand& opnd) {
29062906
}
29072907

29082908
void MacroAssembler::MulHighS64(Register dst, Register src1, Register src2) {
2909-
mgrk(r0, src1, src2);
2910-
lgr(dst, r0);
2909+
if (CpuFeatures::IsSupported(MISC_INSTR_EXT2)) {
2910+
mgrk(r0, src1, src2);
2911+
lgr(dst, r0);
2912+
} else {
2913+
SaveFPRegsMode fp_mode = SaveFPRegsMode::kSave;
2914+
PushCallerSaved(fp_mode, ip);
2915+
Push(src1, src2);
2916+
Pop(r2, r3);
2917+
{
2918+
FrameScope scope(this, StackFrame::INTERNAL);
2919+
PrepareCallCFunction(2, 0, r0);
2920+
CallCFunction(ExternalReference::int64_mul_high_function(), 2, 0);
2921+
}
2922+
mov(r0, r2);
2923+
PopCallerSaved(fp_mode, ip);
2924+
mov(dst, r0);
2925+
}
29112926
}
29122927

29132928
void MacroAssembler::MulHighS64(Register dst, Register src1,

deps/v8/src/compiler/backend/s390/code-generator-s390.cc

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1699,15 +1699,18 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
16991699
case kS390_Mul64WithOverflow: {
17001700
Register dst = i.OutputRegister(), src1 = i.InputRegister(0),
17011701
src2 = i.InputRegister(1);
1702-
DCHECK(!AreAliased(dst, src1, src2));
1702+
CHECK(!AreAliased(dst, src1, src2));
17031703
if (CpuFeatures::IsSupported(MISC_INSTR_EXT2)) {
17041704
__ msgrkc(dst, src1, src2);
17051705
} else {
1706-
__ mgrk(r0, src1, src2); // r0 = high 64-bits, r1 = low 64-bits.
1707-
__ lgr(dst, r1);
1708-
__ ShiftRightS64(r1, r1, Operand(63));
1706+
// Mul high.
1707+
__ MulHighS64(r1, src1, src2);
1708+
// Mul low.
1709+
__ mov(dst, src1);
1710+
__ MulS64(dst, src2);
17091711
// Test whether {high} is a sign-extension of {result}.
1710-
__ CmpU64(r0, r1);
1712+
__ ShiftRightS64(r0, dst, Operand(63));
1713+
__ CmpU64(r1, r0);
17111714
}
17121715
break;
17131716
}
@@ -1725,20 +1728,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
17251728
ASSEMBLE_BIN_OP(RRRInstr(MulHighU64), nullInstr, nullInstr);
17261729
break;
17271730
case kS390_MulHighS64:
1728-
if (CpuFeatures::IsSupported(MISC_INSTR_EXT2)) {
1729-
ASSEMBLE_BIN_OP(RRRInstr(MulHighS64), nullInstr, nullInstr);
1730-
} else {
1731-
__ Push(r2, r3, i.InputRegister(0), i.InputRegister(1));
1732-
__ Pop(r2, r3);
1733-
{
1734-
FrameScope scope(masm(), StackFrame::INTERNAL);
1735-
__ PrepareCallCFunction(2, 0, kScratchReg);
1736-
__ CallCFunction(ExternalReference::int64_mul_high_function(), 2, 0);
1737-
}
1738-
__ mov(kScratchReg, r2);
1739-
__ Pop(r2, r3);
1740-
__ mov(i.OutputRegister(), kScratchReg);
1741-
}
1731+
ASSEMBLE_BIN_OP(RRRInstr(MulHighS64), nullInstr, nullInstr);
17421732
break;
17431733
case kS390_MulFloat:
17441734
ASSEMBLE_BIN_OP(DDInstr(meebr), DMTInstr(MulFloat32), nullInstr);

0 commit comments

Comments
 (0)