Bug 1112164 part 18 - PushRegsInMask: Do not spill SIMD register if there is no support. r=bbouvier

This commit is contained in:
Nicolas B. Pierron 2015-02-26 12:18:30 +01:00
parent 6067e57284
commit 91f884d4d5
5 changed files with 50 additions and 4 deletions

View File

@ -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);

View File

@ -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)

View File

@ -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);

View File

@ -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)

View File

@ -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));