Commit 1fd74664 authored by Milad Fa's avatar Milad Fa Committed by V8 LUCI CQ

PPC/s390: [codegen] Save the full 128bit FP register for Push/PopCallerSaved

Note that `kFixedFrameSizeFromFp` is hard coded to include space
for Simd registers however it is only used when Wasm is
enabled so adding V8_ENABLE_WEBASSEMBLY guards under MultiPushF64AndV128
and MultiPushF64OrV128 will be safe, more detail are
in the comment section of this CL: https://crrev.com/c/2656857

Port b0eb59fb

Original Commit Message:

    Note that Arm32 is already saving the full register in
    https://source.chromium.org/chromium/chromium/src/+/main:v8/src/codegen/arm/macro-assembler-arm.cc;l=2250;drc=ec4fd32cf7f945923fa6bb332c061ecbdaaaa405

R=solanes@chromium.org, joransiu@ca.ibm.com, junyan@redhat.com, midawson@redhat.com
BUG=
LOG=N

Change-Id: Ica4230f31b207e5933ed5c891b091a2f32782284
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2969823Reviewed-by: 's avatarSantiago Aboy Solanes <solanes@chromium.org>
Reviewed-by: 's avatarJunliang Yan <junyan@redhat.com>
Commit-Queue: Milad Fa <mfarazma@redhat.com>
Cr-Commit-Position: refs/heads/master@{#75227}
parent 8db8b6c2
......@@ -36,6 +36,22 @@
namespace v8 {
namespace internal {
namespace {
// Simd and Floating Pointer registers are not shared. For WebAssembly we save
// both registers, If we are not running Wasm, we can get away with only saving
// FP registers.
#if V8_ENABLE_WEBASSEMBLY
constexpr int kStackSavedSavedFPSizeInBytes =
(kNumCallerSavedDoubles * kSimd128Size) +
(kNumCallerSavedDoubles * kDoubleSize);
#else
constexpr int kStackSavedSavedFPSizeInBytes =
kNumCallerSavedDoubles * kDoubleSize;
#endif // V8_ENABLE_WEBASSEMBLY
} // namespace
int TurboAssembler::RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode,
Register exclusion1,
Register exclusion2,
......@@ -56,7 +72,7 @@ int TurboAssembler::RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode,
bytes += NumRegs(list) * kSystemPointerSize;
if (fp_mode == SaveFPRegsMode::kSave) {
bytes += kNumCallerSavedDoubles * kDoubleSize;
bytes += kStackSavedSavedFPSizeInBytes;
}
return bytes;
......@@ -81,8 +97,8 @@ int TurboAssembler::PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1,
bytes += NumRegs(list) * kSystemPointerSize;
if (fp_mode == SaveFPRegsMode::kSave) {
MultiPushDoubles(kCallerSavedDoubles);
bytes += kNumCallerSavedDoubles * kDoubleSize;
MultiPushF64AndV128(kCallerSavedDoubles, kCallerSavedDoubles);
bytes += kStackSavedSavedFPSizeInBytes;
}
return bytes;
......@@ -92,8 +108,8 @@ int TurboAssembler::PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1,
Register exclusion2, Register exclusion3) {
int bytes = 0;
if (fp_mode == SaveFPRegsMode::kSave) {
MultiPopDoubles(kCallerSavedDoubles);
bytes += kNumCallerSavedDoubles * kDoubleSize;
MultiPopF64AndV128(kCallerSavedDoubles, kCallerSavedDoubles);
bytes += kStackSavedSavedFPSizeInBytes;
}
RegList exclusions = 0;
......@@ -472,9 +488,10 @@ void TurboAssembler::MultiPopV128(RegList dregs, Register location) {
void TurboAssembler::MultiPushF64AndV128(RegList dregs, RegList simd_regs,
Register location) {
MultiPushDoubles(dregs);
#if V8_ENABLE_WEBASSEMBLY
bool generating_bultins =
isolate() && isolate()->IsGeneratingEmbeddedBuiltins();
MultiPushDoubles(dregs);
if (generating_bultins) {
// V8 uses the same set of fp param registers as Simd param registers.
// As these registers are two different sets on ppc we must make
......@@ -501,10 +518,12 @@ void TurboAssembler::MultiPushF64AndV128(RegList dregs, RegList simd_regs,
Operand(-static_cast<int8_t>(NumRegs(simd_regs)) * kSimd128Size));
}
}
#endif
}
void TurboAssembler::MultiPopF64AndV128(RegList dregs, RegList simd_regs,
Register location) {
#if V8_ENABLE_WEBASSEMBLY
bool generating_bultins =
isolate() && isolate()->IsGeneratingEmbeddedBuiltins();
if (generating_bultins) {
......@@ -527,6 +546,7 @@ void TurboAssembler::MultiPopF64AndV128(RegList dregs, RegList simd_regs,
Operand(static_cast<int8_t>(NumRegs(simd_regs)) * kSimd128Size));
}
}
#endif
MultiPopDoubles(dregs);
}
......
......@@ -37,6 +37,21 @@
namespace v8 {
namespace internal {
namespace {
// For WebAssembly we care about the full floating point (Simd) registers. If we
// are not running Wasm, we can get away with saving half of those (F64)
// registers.
#if V8_ENABLE_WEBASSEMBLY
constexpr int kStackSavedSavedFPSizeInBytes =
kNumCallerSavedDoubles * kSimd128Size;
#else
constexpr int kStackSavedSavedFPSizeInBytes =
kNumCallerSavedDoubles * kDoubleSize;
#endif // V8_ENABLE_WEBASSEMBLY
} // namespace
void TurboAssembler::DoubleMax(DoubleRegister result_reg,
DoubleRegister left_reg,
DoubleRegister right_reg) {
......@@ -283,7 +298,7 @@ int TurboAssembler::RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode,
bytes += NumRegs(list) * kSystemPointerSize;
if (fp_mode == SaveFPRegsMode::kSave) {
bytes += NumRegs(kCallerSavedDoubles) * kDoubleSize;
bytes += kStackSavedSavedFPSizeInBytes;
}
return bytes;
......@@ -308,8 +323,8 @@ int TurboAssembler::PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1,
bytes += NumRegs(list) * kSystemPointerSize;
if (fp_mode == SaveFPRegsMode::kSave) {
MultiPushDoubles(kCallerSavedDoubles);
bytes += NumRegs(kCallerSavedDoubles) * kDoubleSize;
MultiPushF64OrV128(kCallerSavedDoubles);
bytes += kStackSavedSavedFPSizeInBytes;
}
return bytes;
......@@ -319,8 +334,8 @@ int TurboAssembler::PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1,
Register exclusion2, Register exclusion3) {
int bytes = 0;
if (fp_mode == SaveFPRegsMode::kSave) {
MultiPopDoubles(kCallerSavedDoubles);
bytes += NumRegs(kCallerSavedDoubles) * kDoubleSize;
MultiPopF64OrV128(kCallerSavedDoubles);
bytes += kStackSavedSavedFPSizeInBytes;
}
RegList exclusions = 0;
......@@ -702,6 +717,7 @@ void TurboAssembler::MultiPopV128(RegList dregs, Register location) {
}
void TurboAssembler::MultiPushF64OrV128(RegList dregs, Register location) {
#if V8_ENABLE_WEBASSEMBLY
bool generating_bultins =
isolate() && isolate()->IsGeneratingEmbeddedBuiltins();
if (generating_bultins) {
......@@ -728,9 +744,13 @@ void TurboAssembler::MultiPushF64OrV128(RegList dregs, Register location) {
lay(sp, MemOperand(sp, -(NumRegs(dregs) * kDoubleSize)));
}
}
#else
MultiPushDoubles(dregs);
#endif
}
void TurboAssembler::MultiPopF64OrV128(RegList dregs, Register location) {
#if V8_ENABLE_WEBASSEMBLY
bool generating_bultins =
isolate() && isolate()->IsGeneratingEmbeddedBuiltins();
if (generating_bultins) {
......@@ -753,6 +773,9 @@ void TurboAssembler::MultiPopF64OrV128(RegList dregs, Register location) {
MultiPopDoubles(dregs);
}
}
#else
MultiPopDoubles(dregs);
#endif
}
void TurboAssembler::LoadRoot(Register destination, RootIndex index,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment