| Index: src/x87/code-stubs-x87.h
|
| diff --git a/src/x87/code-stubs-x87.h b/src/x87/code-stubs-x87.h
|
| index 49462bc5c4622a29b5552345ba4ed301517aab3c..18ae09c4de6a0382f72da838ba379a250006ea2c 100644
|
| --- a/src/x87/code-stubs-x87.h
|
| +++ b/src/x87/code-stubs-x87.h
|
| @@ -120,7 +120,8 @@ class RecordWriteStub: public PlatformCodeStub {
|
| Register object,
|
| Register value,
|
| Register address,
|
| - RememberedSetAction remembered_set_action)
|
| + RememberedSetAction remembered_set_action,
|
| + SaveFPRegsMode fp_mode)
|
| : PlatformCodeStub(isolate),
|
| regs_(object, // An input reg.
|
| address, // An input reg.
|
| @@ -128,7 +129,8 @@ class RecordWriteStub: public PlatformCodeStub {
|
| minor_key_ = ObjectBits::encode(object.code()) |
|
| ValueBits::encode(value.code()) |
|
| AddressBits::encode(address.code()) |
|
| - RememberedSetActionBits::encode(remembered_set_action);
|
| + RememberedSetActionBits::encode(remembered_set_action) |
|
| + SaveFPRegsModeBits::encode(fp_mode);
|
| }
|
|
|
| RecordWriteStub(uint32_t key, Isolate* isolate)
|
| @@ -271,12 +273,23 @@ class RecordWriteStub: public PlatformCodeStub {
|
| // saved registers that were not already preserved. The caller saved
|
| // registers are eax, ecx and edx. The three scratch registers (incl. ecx)
|
| // will be restored by other means so we don't bother pushing them here.
|
| - void SaveCallerSaveRegisters(MacroAssembler* masm) {
|
| + void SaveCallerSaveRegisters(MacroAssembler* masm, SaveFPRegsMode mode) {
|
| if (!scratch0_.is(eax) && !scratch1_.is(eax)) masm->push(eax);
|
| if (!scratch0_.is(edx) && !scratch1_.is(edx)) masm->push(edx);
|
| + if (mode == kSaveFPRegs) {
|
| + // Save FPU state in m108byte.
|
| + masm->sub(esp, Immediate(108));
|
| + masm->fnsave(Operand(esp, 0));
|
| + }
|
| }
|
|
|
| - inline void RestoreCallerSaveRegisters(MacroAssembler*masm) {
|
| + inline void RestoreCallerSaveRegisters(MacroAssembler*masm,
|
| + SaveFPRegsMode mode) {
|
| + if (mode == kSaveFPRegs) {
|
| + // Restore FPU state in m108byte.
|
| + masm->frstor(Operand(esp, 0));
|
| + masm->add(esp, Immediate(108));
|
| + }
|
| if (!scratch0_.is(edx) && !scratch1_.is(edx)) masm->pop(edx);
|
| if (!scratch0_.is(eax) && !scratch1_.is(eax)) masm->pop(eax);
|
| }
|
| @@ -348,10 +361,15 @@ class RecordWriteStub: public PlatformCodeStub {
|
| return RememberedSetActionBits::decode(minor_key_);
|
| }
|
|
|
| + SaveFPRegsMode save_fp_regs_mode() const {
|
| + return SaveFPRegsModeBits::decode(minor_key_);
|
| + }
|
| +
|
| class ObjectBits: public BitField<int, 0, 3> {};
|
| class ValueBits: public BitField<int, 3, 3> {};
|
| class AddressBits: public BitField<int, 6, 3> {};
|
| class RememberedSetActionBits: public BitField<RememberedSetAction, 9, 1> {};
|
| + class SaveFPRegsModeBits: public BitField<SaveFPRegsMode, 10, 1> {};
|
|
|
| RegisterAllocation regs_;
|
|
|
|
|