| Index: vm/assembler_ia32.cc
|
| ===================================================================
|
| --- vm/assembler_ia32.cc (revision 8859)
|
| +++ vm/assembler_ia32.cc (working copy)
|
| @@ -1401,9 +1401,12 @@
|
| j(NOT_ZERO, &done, Assembler::kNearJump);
|
| // A store buffer update is required.
|
| pushal();
|
| - pushl(dest); // Push argument
|
| + movl(EBP, ESP);
|
| + ReserveAlignedFrameSpace(kWordSize);
|
| + movl(EAX, dest);
|
| + movl(Address(ESP, 0), EAX); // Push argument
|
| CallRuntime(kStoreBufferRuntimeEntry);
|
| - popl(value); // Pop argument
|
| + movl(ESP, EBP);
|
| popal();
|
| Bind(&done);
|
| }
|
| @@ -1503,6 +1506,16 @@
|
| }
|
|
|
|
|
| +void Assembler::ReserveAlignedFrameSpace(intptr_t frame_space) {
|
| + // Reserve space for arguments and align frame before entering
|
| + // the C++ world.
|
| + AddImmediate(ESP, Immediate(-frame_space));
|
| + if (OS::ActivationFrameAlignment() > 0) {
|
| + andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
|
| + }
|
| +}
|
| +
|
| +
|
| void Assembler::CallRuntime(const RuntimeEntry& entry) {
|
| entry.Call(this);
|
| }
|
|
|