mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1112164 part 18 - PushRegsInMask: Do not spill SIMD register if there is no support. r=bbouvier
This commit is contained in:
parent
6067e57284
commit
91f884d4d5
@ -17,6 +17,7 @@ MacroAssembler::PushRegsInMask(RegisterSet set, FloatRegisterSet simdSet)
|
||||
{
|
||||
FloatRegisterSet doubleSet(FloatRegisterSet::Subtract(set.fpus(), simdSet));
|
||||
MOZ_ASSERT_IF(simdSet.empty(), doubleSet == set.fpus());
|
||||
doubleSet = doubleSet.reduceSetForPush();
|
||||
unsigned numSimd = simdSet.size();
|
||||
unsigned numDouble = doubleSet.size();
|
||||
int32_t diffF = doubleSet.getPushSizeInBytes() + numSimd * Simd128DataSize;
|
||||
@ -63,6 +64,7 @@ MacroAssembler::PopRegsInMaskIgnore(RegisterSet set, RegisterSet ignore, FloatRe
|
||||
{
|
||||
FloatRegisterSet doubleSet(FloatRegisterSet::Subtract(set.fpus(), simdSet));
|
||||
MOZ_ASSERT_IF(simdSet.empty(), doubleSet == set.fpus());
|
||||
doubleSet = doubleSet.reduceSetForPush();
|
||||
unsigned numSimd = simdSet.size();
|
||||
unsigned numDouble = doubleSet.size();
|
||||
int32_t diffG = set.gprs().size() * sizeof(intptr_t);
|
||||
|
@ -307,7 +307,11 @@ Assembler::TraceJumpRelocations(JSTracer *trc, JitCode *code, CompactBufferReade
|
||||
FloatRegisterSet
|
||||
FloatRegister::ReduceSetForPush(const FloatRegisterSet &s)
|
||||
{
|
||||
return s;
|
||||
if (JitSupportsSimd())
|
||||
return s;
|
||||
|
||||
// Ignore all SIMD register.
|
||||
return FloatRegisterSet(s.bits() & (Codes::AllPhysMask * Codes::SpreadScalar));
|
||||
}
|
||||
uint32_t
|
||||
FloatRegister::GetPushSizeInBytes(const FloatRegisterSet &s)
|
||||
|
@ -509,7 +509,25 @@ static void
|
||||
PushBailoutFrame(MacroAssembler &masm, Register spArg)
|
||||
{
|
||||
// Push registers such that we can access them from [base + code].
|
||||
masm.PushRegsInMask(AllRegs);
|
||||
if (JitSupportsSimd()) {
|
||||
masm.PushRegsInMask(AllRegs);
|
||||
} else {
|
||||
// When SIMD isn't supported, PushRegsInMask reduces the set of float
|
||||
// registers to be double-sized, while the RegisterDump expects each of
|
||||
// the float registers to have the maximal possible size
|
||||
// (Simd128DataSize). To work around this, we just spill the double
|
||||
// registers by hand here, using the register dump offset directly.
|
||||
RegisterSet set = AllRegs;
|
||||
for (GeneralRegisterBackwardIterator iter(set.gprs()); iter.more(); iter++)
|
||||
masm.Push(*iter);
|
||||
|
||||
masm.reserveStack(sizeof(RegisterDump::FPUArray));
|
||||
for (FloatRegisterBackwardIterator iter(set.fpus()); iter.more(); iter++) {
|
||||
FloatRegister reg = *iter;
|
||||
Address spillAddress(StackPointer, reg.getRegisterDumpOffsetInBytes());
|
||||
masm.storeDouble(reg, spillAddress);
|
||||
}
|
||||
}
|
||||
|
||||
// Get the stack pointer into a register, pre-alignment.
|
||||
masm.movq(rsp, spArg);
|
||||
|
@ -105,7 +105,11 @@ Assembler::TraceJumpRelocations(JSTracer *trc, JitCode *code, CompactBufferReade
|
||||
FloatRegisterSet
|
||||
FloatRegister::ReduceSetForPush(const FloatRegisterSet &s)
|
||||
{
|
||||
return s;
|
||||
if (JitSupportsSimd())
|
||||
return s;
|
||||
|
||||
// Ignore all SIMD register.
|
||||
return FloatRegisterSet(s.bits() & (Codes::AllPhysMask * Codes::SpreadScalar));
|
||||
}
|
||||
uint32_t
|
||||
FloatRegister::GetPushSizeInBytes(const FloatRegisterSet &s)
|
||||
|
@ -503,7 +503,25 @@ static void
|
||||
PushBailoutFrame(MacroAssembler &masm, uint32_t frameClass, Register spArg)
|
||||
{
|
||||
// Push registers such that we can access them from [base + code].
|
||||
masm.PushRegsInMask(AllRegs);
|
||||
if (JitSupportsSimd()) {
|
||||
masm.PushRegsInMask(AllRegs);
|
||||
} else {
|
||||
// When SIMD isn't supported, PushRegsInMask reduces the set of float
|
||||
// registers to be double-sized, while the RegisterDump expects each of
|
||||
// the float registers to have the maximal possible size
|
||||
// (Simd128DataSize). To work around this, we just spill the double
|
||||
// registers by hand here, using the register dump offset directly.
|
||||
RegisterSet set = AllRegs;
|
||||
for (GeneralRegisterBackwardIterator iter(set.gprs()); iter.more(); iter++)
|
||||
masm.Push(*iter);
|
||||
|
||||
masm.reserveStack(sizeof(RegisterDump::FPUArray));
|
||||
for (FloatRegisterBackwardIterator iter(set.fpus()); iter.more(); iter++) {
|
||||
FloatRegister reg = *iter;
|
||||
Address spillAddress(StackPointer, reg.getRegisterDumpOffsetInBytes());
|
||||
masm.storeDouble(reg, spillAddress);
|
||||
}
|
||||
}
|
||||
|
||||
// Push the bailout table number.
|
||||
masm.push(Imm32(frameClass));
|
||||
|
Loading…
Reference in New Issue
Block a user