summaryrefslogtreecommitdiff
path: root/deps/v8/src/ia32/virtual-frame-ia32.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/ia32/virtual-frame-ia32.cc')
-rw-r--r--deps/v8/src/ia32/virtual-frame-ia32.cc36
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);
}