[vm, compiler] XMM0 is not just a scratch register on IA32.

In particular, it can be live across write-barrier calls.

TEST=ci
Change-Id: I9383cc775315d76d0dc0052fa8f91daa233cb413
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/248681
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
This commit is contained in:
Ryan Macnak
2022-06-15 20:16:58 +00:00
committed by Commit Bot
parent 5daf8f21ed
commit 1a2dd17712
@@ -2462,10 +2462,6 @@ static const intptr_t kNumberOfVolatileCpuRegisters = 3;
static const Register volatile_cpu_registers[kNumberOfVolatileCpuRegisters] = {
EAX, ECX, EDX};
// XMM0 is used only as a scratch register in the optimized code. No need to
// save it.
static const intptr_t kNumberOfVolatileXmmRegisters = kNumberOfXmmRegisters - 1;
void Assembler::CallRuntime(const RuntimeEntry& entry,
intptr_t argument_count) {
ASSERT(!entry.is_leaf());
@@ -2491,12 +2487,12 @@ LeafRuntimeScope::LeafRuntimeScope(Assembler* assembler,
__ pushl(volatile_cpu_registers[i]);
}
// Preserve all XMM registers except XMM0
__ subl(ESP, Immediate((kNumberOfXmmRegisters - 1) * kFpuRegisterSize));
// Preserve all XMM registers.
__ subl(ESP, Immediate(kNumberOfXmmRegisters * kFpuRegisterSize));
// Store XMM registers with the lowest register number at the lowest
// address.
intptr_t offset = 0;
for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
__ movups(Address(ESP, offset), xmm_reg);
offset += kFpuRegisterSize;
@@ -2526,13 +2522,13 @@ LeafRuntimeScope::~LeafRuntimeScope() {
// We need to restore it before restoring registers.
const intptr_t kPushedRegistersSize =
kNumberOfVolatileCpuRegisters * target::kWordSize +
kNumberOfVolatileXmmRegisters * kFpuRegisterSize;
kNumberOfXmmRegisters * kFpuRegisterSize;
__ leal(ESP, Address(EBP, -kPushedRegistersSize));
// Restore all XMM registers except XMM0
// Restore all XMM registers.
// XMM registers have the lowest register number at the lowest address.
intptr_t offset = 0;
for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
__ movups(xmm_reg, Address(ESP, offset));
offset += kFpuRegisterSize;