diff options
Diffstat (limited to 'deps/v8/src/ia32/virtual-frame-ia32.cc')
-rw-r--r-- | deps/v8/src/ia32/virtual-frame-ia32.cc | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/deps/v8/src/ia32/virtual-frame-ia32.cc b/deps/v8/src/ia32/virtual-frame-ia32.cc index 104d18750..9267507c7 100644 --- a/deps/v8/src/ia32/virtual-frame-ia32.cc +++ b/deps/v8/src/ia32/virtual-frame-ia32.cc @@ -899,31 +899,45 @@ Result VirtualFrame::CallKeyedLoadIC(RelocInfo::Mode mode) { Result VirtualFrame::CallStoreIC() { // Name, value, and receiver are on top of the frame. The IC - // expects name in ecx, value in eax, and receiver on the stack. It - // does not drop the receiver. + // expects name in ecx, value in eax, and receiver in edx. Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); Result name = Pop(); Result value = Pop(); - PrepareForCall(1, 0); // One stack arg, not callee-dropped. + Result receiver = Pop(); + PrepareForCall(0, 0); - if (value.is_register() && value.reg().is(ecx)) { - if (name.is_register() && name.reg().is(eax)) { + // Optimized for case in which name is a constant value. + if (name.is_register() && (name.reg().is(edx) || name.reg().is(eax))) { + if (!is_used(ecx)) { + name.ToRegister(ecx); + } else if (!is_used(ebx)) { + name.ToRegister(ebx); + } else { + ASSERT(!is_used(edi)); // Only three results are live, so edi is free. + name.ToRegister(edi); + } + } + // Now name is not in edx or eax, so we can fix them, then move name to ecx. + if (value.is_register() && value.reg().is(edx)) { + if (receiver.is_register() && receiver.reg().is(eax)) { // Wrong registers. - __ xchg(eax, ecx); + __ xchg(eax, edx); } else { - // Register eax is free for value, which frees ecx for name. + // Register eax is free for value, which frees edx for receiver. value.ToRegister(eax); - name.ToRegister(ecx); + receiver.ToRegister(edx); } } else { - // Register ecx is free for name, which guarantees eax is free for + // Register edx is free for receiver, which guarantees eax is free for // value. - name.ToRegister(ecx); + receiver.ToRegister(edx); value.ToRegister(eax); } - + // Receiver and value are in the right place, so ecx is free for name. + name.ToRegister(ecx); name.Unuse(); value.Unuse(); + receiver.Unuse(); return RawCallCodeObject(ic, RelocInfo::CODE_TARGET); } |