Revision: 10232
Author: [email protected]
Date: Sun Dec 11 22:38:29 2011
Log: MIPS: Reland 10216 - Optimize the equality check case of
ICCompare stubs.
Port r10219 (56686b).
Original commit message:
Now with arm and x64 support. Additionally, added default unreachable case
to switch statement in CompareIC::TargetState to make win and mac compilers
happy.
Reviewer guide:
This is an exact copy of 10216 except:
src/arm/*
src/x64/*
src/ic.cc (added default case to swith in CompareIC::TargetState)
BUG=
TEST=
Review URL: http://codereview.chromium.org/8896022
http://code.google.com/p/v8/source/detail?r=10232
Modified:
/branches/bleeding_edge/src/mips/code-stubs-mips.cc
/branches/bleeding_edge/src/mips/ic-mips.cc
=======================================
--- /branches/bleeding_edge/src/mips/code-stubs-mips.cc Thu Dec 1 06:40:13
2011
+++ /branches/bleeding_edge/src/mips/code-stubs-mips.cc Sun Dec 11 22:38:29
2011
@@ -6869,26 +6869,39 @@
}
-void ICCompareStub::GenerateMiss(MacroAssembler* masm) {
- __ Push(a1, a0);
- __ push(ra);
-
- // Call the runtime system in a fresh internal frame.
- ExternalReference miss =
ExternalReference(IC_Utility(IC::kCompareIC_Miss),
- masm->isolate());
- {
+void ICCompareStub::GenerateKnownObjects(MacroAssembler* masm) {
+ Label miss;
+ __ And(a2, a1, a0);
+ __ JumpIfSmi(a2, &miss);
+ __ lw(a2, FieldMemOperand(a0, HeapObject::kMapOffset));
+ __ lw(a3, FieldMemOperand(a1, HeapObject::kMapOffset));
+ __ Branch(&miss, ne, a2, Operand(known_map_));
+ __ Branch(&miss, ne, a3, Operand(known_map_));
+
+ __ Ret(USE_DELAY_SLOT);
+ __ subu(v0, a0, a1);
+
+ __ bind(&miss);
+ GenerateMiss(masm);
+}
+
+void ICCompareStub::GenerateMiss(MacroAssembler* masm) {
+ {
+ // Call the runtime system in a fresh internal frame.
+ ExternalReference miss =
+ ExternalReference(IC_Utility(IC::kCompareIC_Miss),
masm->isolate());
FrameScope scope(masm, StackFrame::INTERNAL);
+ __ Push(a1, a0);
+ __ push(ra);
__ Push(a1, a0);
__ li(t0, Operand(Smi::FromInt(op_)));
__ push(t0);
__ CallExternalReference(miss, 3);
- }
- // Compute the entry point of the rewritten stub.
- __ Addu(a2, v0, Operand(Code::kHeaderSize - kHeapObjectTag));
- // Restore registers.
- __ pop(ra);
- __ pop(a0);
- __ pop(a1);
+ // Compute the entry point of the rewritten stub.
+ __ Addu(a2, v0, Operand(Code::kHeaderSize - kHeapObjectTag));
+ // Restore registers.
+ __ Pop(a1, a0, ra);
+ }
__ Jump(a2);
}
=======================================
--- /branches/bleeding_edge/src/mips/ic-mips.cc Thu Nov 10 00:07:39 2011
+++ /branches/bleeding_edge/src/mips/ic-mips.cc Sun Dec 11 22:38:29 2011
@@ -1587,6 +1587,9 @@
rewritten = stub.GetCode();
} else {
ICCompareStub stub(op_, state);
+ if (state == KNOWN_OBJECTS) {
+ stub.set_known_map(Handle<Map>(Handle<JSObject>::cast(x)->map()));
+ }
rewritten = stub.GetCode();
}
set_target(*rewritten);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev