Revision: 4584
Author: [email protected]
Date: Tue May 4 23:40:14 2010
Log: Pass key in register for keyed load IC
The calling convention for keyed load IC is changed to have the key passed
both in a register (r0) and on the stack.
Next steps will be first to remove the key from the stack and then pass the
receiver in a register (r1).
Review URL: http://codereview.chromium.org/1937003
http://code.google.com/p/v8/source/detail?r=4584
Modified:
/branches/bleeding_edge/src/arm/codegen-arm.cc
/branches/bleeding_edge/src/arm/debug-arm.cc
/branches/bleeding_edge/src/arm/full-codegen-arm.cc
/branches/bleeding_edge/src/arm/ic-arm.cc
/branches/bleeding_edge/src/arm/stub-cache-arm.cc
/branches/bleeding_edge/src/arm/virtual-frame-arm.cc
=======================================
--- /branches/bleeding_edge/src/arm/codegen-arm.cc Tue May 4 07:49:50 2010
+++ /branches/bleeding_edge/src/arm/codegen-arm.cc Tue May 4 23:40:14 2010
@@ -5391,7 +5391,8 @@
// The rest of the instructions in the deferred code must be together.
{ Assembler::BlockConstPoolScope block_const_pool(masm_);
- // Call keyed load IC. It has all arguments on the stack.
+ // Call keyed load IC. It has all arguments on the stack and the key
in r0.
+ __ ldr(r0, MemOperand(sp, 0));
Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
__ Call(ic, RelocInfo::CODE_TARGET);
// The call must be followed by a nop instruction to indicate that the
@@ -5514,7 +5515,6 @@
void CodeGenerator::EmitKeyedLoad() {
if (loop_nesting() == 0) {
- VirtualFrame::SpilledScope spilled(frame_);
Comment cmnt(masm_, "[ Load from keyed property");
frame_->CallKeyedLoadIC();
} else {
=======================================
--- /branches/bleeding_edge/src/arm/debug-arm.cc Tue Apr 27 12:24:36 2010
+++ /branches/bleeding_edge/src/arm/debug-arm.cc Tue May 4 23:40:14 2010
@@ -161,9 +161,10 @@
void Debug::GenerateKeyedLoadICDebugBreak(MacroAssembler* masm) {
// ---------- S t a t e --------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
- Generate_DebugBreakCallHelper(masm, 0);
+ Generate_DebugBreakCallHelper(masm, r0.bit());
}
=======================================
--- /branches/bleeding_edge/src/arm/full-codegen-arm.cc Tue Apr 27 12:24:36
2010
+++ /branches/bleeding_edge/src/arm/full-codegen-arm.cc Tue May 4 23:40:14
2010
@@ -728,7 +728,7 @@
ASSERT_NOT_NULL(object_slot);
// Load the object.
- Move(r2, object_slot);
+ Move(r1, object_slot);
// Assert that the key is a smi.
Literal* key_literal = property->key()->AsLiteral();
@@ -736,12 +736,12 @@
ASSERT(key_literal->handle()->IsSmi());
// Load the key.
- __ mov(r1, Operand(key_literal->handle()));
+ __ mov(r0, Operand(key_literal->handle()));
// Push both as arguments to ic.
- __ Push(r2, r1);
-
- // Do a keyed property load.
+ __ Push(r1, r0);
+
+ // Call keyed load IC. It has all arguments on the stack and the key
in r0.
Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
__ Call(ic, RelocInfo::CODE_TARGET);
@@ -1005,6 +1005,8 @@
void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
SetSourcePosition(prop->position());
+ // Call keyed load IC. It has all arguments on the stack and the key in
r0.
+ __ ldr(r0, MemOperand(sp, 0));
Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
__ Call(ic, RelocInfo::CODE_TARGET);
}
@@ -1247,6 +1249,9 @@
VisitForValue(prop->key(), kStack);
// Record source code position for IC call.
SetSourcePosition(prop->position());
+ // Call keyed load IC. It has all arguments on the stack and the key
in
+ // r0.
+ __ ldr(r0, MemOperand(sp, 0));
Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
__ Call(ic, RelocInfo::CODE_TARGET);
// Load receiver object into r1.
=======================================
--- /branches/bleeding_edge/src/arm/ic-arm.cc Tue May 4 02:32:07 2010
+++ /branches/bleeding_edge/src/arm/ic-arm.cc Tue May 4 23:40:14 2010
@@ -682,12 +682,13 @@
void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) {
// ---------- S t a t e --------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
- __ ldm(ia, sp, r2.bit() | r3.bit());
- __ Push(r3, r2);
+ __ ldr(r1, MemOperand(sp, kPointerSize));
+ __ Push(r1, r0);
ExternalReference ref = ExternalReference(IC_Utility(kKeyedLoadIC_Miss));
__ TailCallExternalReference(ref, 2, 1);
@@ -697,12 +698,13 @@
void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
// ---------- S t a t e --------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
- __ ldm(ia, sp, r2.bit() | r3.bit());
- __ Push(r3, r2);
+ __ ldr(r1, MemOperand(sp, kPointerSize));
+ __ Push(r1, r0);
__ TailCallRuntime(Runtime::kGetProperty, 2, 1);
}
@@ -711,13 +713,14 @@
void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
// ---------- S t a t e --------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
Label slow, fast, check_pixel_array, check_number_dictionary;
- // Get the key and receiver object from the stack.
- __ ldm(ia, sp, r0.bit() | r1.bit());
+ // Get the object from the stack.
+ __ ldr(r1, MemOperand(sp, kPointerSize));
// Check that the object isn't a smi.
__ BranchOnSmi(r1, &slow);
@@ -790,6 +793,7 @@
// Slow case: Push extra copies of the arguments (2).
__ bind(&slow);
__ IncrementCounter(&Counters::keyed_load_generic_slow, 1, r0, r1);
+ __ ldr(r0, MemOperand(sp, 0));
GenerateRuntimeGetProperty(masm);
}
@@ -797,6 +801,7 @@
void KeyedLoadIC::GenerateString(MacroAssembler* masm) {
// ---------- S t a t e --------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
@@ -806,8 +811,8 @@
Label slow_char_code;
Label got_char_code;
- // Get the key and receiver object from the stack.
- __ ldm(ia, sp, r0.bit() | r1.bit());
+ // Get the object from the stack.
+ __ ldr(r1, MemOperand(sp, kPointerSize));
Register object = r1;
Register index = r0;
@@ -907,13 +912,14 @@
ExternalArrayType array_type) {
// ---------- S t a t e --------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
Label slow, failed_allocation;
- // Get the key and receiver object from the stack.
- __ ldm(ia, sp, r0.bit() | r1.bit());
+ // Get the object from the stack.
+ __ ldr(r1, MemOperand(sp, kPointerSize));
// r0: key
// r1: receiver object
@@ -1143,6 +1149,7 @@
// Slow case: Load name and receiver from stack and jump to runtime.
__ bind(&slow);
__ IncrementCounter(&Counters::keyed_load_external_array_slow, 1, r0,
r1);
+ __ ldr(r0, MemOperand(sp, 0));
GenerateRuntimeGetProperty(masm);
}
@@ -1150,13 +1157,14 @@
void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) {
// ---------- S t a t e --------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
Label slow;
- // Get the key and receiver object from the stack.
- __ ldm(ia, sp, r0.bit() | r1.bit());
+ // Get the object from the stack.
+ __ ldr(r1, MemOperand(sp, kPointerSize));
// Check that the receiver isn't a smi.
__ BranchOnSmi(r1, &slow);
=======================================
--- /branches/bleeding_edge/src/arm/stub-cache-arm.cc Tue May 4 07:49:50
2010
+++ /branches/bleeding_edge/src/arm/stub-cache-arm.cc Tue May 4 23:40:14
2010
@@ -1824,18 +1824,18 @@
int index) {
// ----------- S t a t e -------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
Label miss;
- __ ldr(r2, MemOperand(sp, 0));
- __ ldr(r0, MemOperand(sp, kPointerSize));
-
- __ cmp(r2, Operand(Handle<String>(name)));
+ // Check the key is the cached one.
+ __ cmp(r0, Operand(Handle<String>(name)));
__ b(ne, &miss);
- GenerateLoadField(receiver, holder, r0, r3, r1, index, name, &miss);
+ __ ldr(r1, MemOperand(sp, kPointerSize)); // Receiver.
+ GenerateLoadField(receiver, holder, r1, r2, r3, index, name, &miss);
__ bind(&miss);
GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
@@ -1849,19 +1849,19 @@
AccessorInfo* callback)
{
// ----------- S t a t e -------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
Label miss;
- __ ldr(r2, MemOperand(sp, 0));
- __ ldr(r0, MemOperand(sp, kPointerSize));
-
- __ cmp(r2, Operand(Handle<String>(name)));
+ // Check the key is the cached one.
+ __ cmp(r0, Operand(Handle<String>(name)));
__ b(ne, &miss);
Failure* failure = Failure::InternalError();
- bool success = GenerateLoadCallback(receiver, holder, r0, r2, r3, r1,
+ __ ldr(r1, MemOperand(sp, kPointerSize)); // Receiver.
+ bool success = GenerateLoadCallback(receiver, holder, r1, r0, r2, r3,
callback, name, &miss, &failure);
if (!success) return failure;
@@ -1878,19 +1878,18 @@
Object* value) {
// ----------- S t a t e -------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
Label miss;
- // Check the key is the cached one
- __ ldr(r2, MemOperand(sp, 0));
- __ ldr(r0, MemOperand(sp, kPointerSize));
-
- __ cmp(r2, Operand(Handle<String>(name)));
+ // Check the key is the cached one.
+ __ cmp(r0, Operand(Handle<String>(name)));
__ b(ne, &miss);
- GenerateLoadConstant(receiver, holder, r0, r3, r1, value, name, &miss);
+ __ ldr(r1, MemOperand(sp, kPointerSize)); // Receiver.
+ GenerateLoadConstant(receiver, holder, r1, r2, r3, value, name, &miss);
__ bind(&miss);
GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
@@ -1904,27 +1903,26 @@
String* name) {
// ----------- S t a t e -------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
Label miss;
- // Check the key is the cached one
- __ ldr(r2, MemOperand(sp, 0));
- __ ldr(r0, MemOperand(sp, kPointerSize));
-
- __ cmp(r2, Operand(Handle<String>(name)));
+ // Check the key is the cached one.
+ __ cmp(r0, Operand(Handle<String>(name)));
__ b(ne, &miss);
LookupResult lookup;
LookupPostInterceptor(holder, name, &lookup);
+ __ ldr(r1, MemOperand(sp, kPointerSize)); // Receiver.
GenerateLoadInterceptor(receiver,
holder,
&lookup,
+ r1,
r0,
r2,
r3,
- r1,
name,
&miss);
__ bind(&miss);
@@ -1937,19 +1935,18 @@
Object* KeyedLoadStubCompiler::CompileLoadArrayLength(String* name) {
// ----------- S t a t e -------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
Label miss;
- // Check the key is the cached one
- __ ldr(r2, MemOperand(sp, 0));
- __ ldr(r0, MemOperand(sp, kPointerSize));
-
- __ cmp(r2, Operand(Handle<String>(name)));
+ // Check the key is the cached one.
+ __ cmp(r0, Operand(Handle<String>(name)));
__ b(ne, &miss);
- GenerateLoadArrayLength(masm(), r0, r3, &miss);
+ __ ldr(r1, MemOperand(sp, kPointerSize)); // Receiver.
+ GenerateLoadArrayLength(masm(), r1, r2, &miss);
__ bind(&miss);
GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
@@ -1960,19 +1957,19 @@
Object* KeyedLoadStubCompiler::CompileLoadStringLength(String* name) {
// ----------- S t a t e -------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
Label miss;
__ IncrementCounter(&Counters::keyed_load_string_length, 1, r1, r3);
- __ ldr(r2, MemOperand(sp));
- __ ldr(r0, MemOperand(sp, kPointerSize)); // receiver
-
- __ cmp(r2, Operand(Handle<String>(name)));
+ // Check the key is the cached one.
+ __ cmp(r0, Operand(Handle<String>(name)));
__ b(ne, &miss);
- GenerateLoadStringLength(masm(), r0, r1, r3, &miss);
+ __ ldr(r1, MemOperand(sp, kPointerSize)); // Receiver.
+ GenerateLoadStringLength(masm(), r1, r2, r3, &miss);
__ bind(&miss);
__ DecrementCounter(&Counters::keyed_load_string_length, 1, r1, r3);
@@ -1986,6 +1983,7 @@
Object* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) {
// ----------- S t a t e -------------
// -- lr : return address
+ // -- r0 : key
// -- sp[0] : key
// -- sp[4] : receiver
// -----------------------------------
=======================================
--- /branches/bleeding_edge/src/arm/virtual-frame-arm.cc Tue May 4
02:33:12 2010
+++ /branches/bleeding_edge/src/arm/virtual-frame-arm.cc Tue May 4
23:40:14 2010
@@ -321,6 +321,7 @@
void VirtualFrame::CallKeyedLoadIC() {
Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
+ SpillAllButCopyTOSToR0();
CallCodeObject(ic, RelocInfo::CODE_TARGET, 0);
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev