mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1138141 - x64: Add some padding after pushing an odd number of float32 registers. r=bbouvier
This commit is contained in:
parent
80219bece3
commit
09fb377e19
@ -56,6 +56,9 @@ MacroAssembler::PushRegsInMask(RegisterSet set, FloatRegisterSet simdSet)
|
|||||||
storeUnalignedInt32x4(*iter, Address(StackPointer, diffF));
|
storeUnalignedInt32x4(*iter, Address(StackPointer, diffF));
|
||||||
}
|
}
|
||||||
MOZ_ASSERT(numSimd == 0);
|
MOZ_ASSERT(numSimd == 0);
|
||||||
|
// x64 padding to keep the stack aligned on uintptr_t. Keep in sync with
|
||||||
|
// GetPushBytesInSize.
|
||||||
|
diffF -= diffF % sizeof(uintptr_t);
|
||||||
MOZ_ASSERT(diffF == 0);
|
MOZ_ASSERT(diffF == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,6 +104,9 @@ MacroAssembler::PopRegsInMaskIgnore(RegisterSet set, RegisterSet ignore, FloatRe
|
|||||||
}
|
}
|
||||||
freeStack(reservedF);
|
freeStack(reservedF);
|
||||||
MOZ_ASSERT(numDouble == 0);
|
MOZ_ASSERT(numDouble == 0);
|
||||||
|
// x64 padding to keep the stack aligned on uintptr_t. Keep in sync with
|
||||||
|
// GetPushBytesInSize.
|
||||||
|
diffF -= diffF % sizeof(uintptr_t);
|
||||||
MOZ_ASSERT(diffF == 0);
|
MOZ_ASSERT(diffF == 0);
|
||||||
|
|
||||||
// On x86, use pop to pop the integer registers, if we're not going to
|
// On x86, use pop to pop the integer registers, if we're not going to
|
||||||
|
@ -334,9 +334,16 @@ FloatRegister::GetPushSizeInBytes(const FloatRegisterSet &s)
|
|||||||
SetType set32b = singleSet & ~set64b & ~set128b;
|
SetType set32b = singleSet & ~set64b & ~set128b;
|
||||||
|
|
||||||
static_assert(Codes::AllPhysMask <= 0xffff, "We can safely use CountPopulation32");
|
static_assert(Codes::AllPhysMask <= 0xffff, "We can safely use CountPopulation32");
|
||||||
|
uint32_t count32b = mozilla::CountPopulation32(set32b);
|
||||||
|
|
||||||
|
// If we have an odd number of 32 bits values, then we increase the size to
|
||||||
|
// keep the stack aligned on 8 bytes. Note: Keep in sync with
|
||||||
|
// PushRegsInMask, and PopRegsInMaskIgnore.
|
||||||
|
count32b += count32b & 1;
|
||||||
|
|
||||||
return mozilla::CountPopulation32(set128b) * (4 * sizeof(int32_t))
|
return mozilla::CountPopulation32(set128b) * (4 * sizeof(int32_t))
|
||||||
+ mozilla::CountPopulation32(set64b) * sizeof(double)
|
+ mozilla::CountPopulation32(set64b) * sizeof(double)
|
||||||
+ mozilla::CountPopulation32(set32b) * sizeof(float);
|
+ count32b * sizeof(float);
|
||||||
}
|
}
|
||||||
uint32_t
|
uint32_t
|
||||||
FloatRegister::getRegisterDumpOffsetInBytes()
|
FloatRegister::getRegisterDumpOffsetInBytes()
|
||||||
|
Loading…
Reference in New Issue
Block a user