Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Unified Diff: src/arm/stub-cache-arm.cc

Issue 554152: Change StoreIC interface on ARM platform (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/arm/ic-arm.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/arm/stub-cache-arm.cc
===================================================================
--- src/arm/stub-cache-arm.cc (revision 3829)
+++ src/arm/stub-cache-arm.cc (working copy)
@@ -258,8 +258,9 @@
// Generate StoreField code, value is passed in r0 register.
-// After executing generated code, the receiver_reg and name_reg
-// may be clobbered.
+// When leaving generated code after success, the receiver_reg and name_reg
+// may be clobbered. Upon branch to miss_label, the receiver and name
+// registers have their original values.
void StubCompiler::GenerateStoreField(MacroAssembler* masm,
JSObject* object,
int index,
@@ -525,9 +526,7 @@
// Note: starting a frame here makes GC aware of pointers pushed below.
__ EnterInternalFrame();
- if (lookup->type() == CALLBACKS) {
- __ push(receiver);
- }
+ __ push(receiver);
__ push(holder);
__ push(name_);
@@ -548,11 +547,8 @@
__ bind(&interceptor_failed);
__ pop(name_);
__ pop(holder);
+ __ pop(receiver);
- if (lookup->type() == CALLBACKS) {
- __ pop(receiver);
- }
-
__ LeaveInternalFrame();
if (lookup->type() == FIELD) {
@@ -1208,24 +1204,19 @@
String* name) {
// ----------- S t a t e -------------
// -- r0 : value
+ // -- r1 : receiver
// -- r2 : name
// -- lr : return address
- // -- [sp] : receiver
// -----------------------------------
Label miss;
- // Get the receiver from the stack.
- __ ldr(r3, MemOperand(sp, 0 * kPointerSize));
-
- // name register might be clobbered.
GenerateStoreField(masm(),
object,
index,
transition,
- r3, r2, r1,
+ r1, r2, r3,
&miss);
__ bind(&miss);
- __ mov(r2, Operand(Handle<String>(name))); // restore name
Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
__ Jump(ic, RelocInfo::CODE_TARGET);
@@ -1239,39 +1230,33 @@
String* name) {
// ----------- S t a t e -------------
// -- r0 : value
+ // -- r1 : receiver
// -- r2 : name
// -- lr : return address
- // -- [sp] : receiver
// -----------------------------------
Label miss;
- // Get the object from the stack.
- __ ldr(r3, MemOperand(sp, 0 * kPointerSize));
-
// Check that the object isn't a smi.
- __ tst(r3, Operand(kSmiTagMask));
+ __ tst(r1, Operand(kSmiTagMask));
__ b(eq, &miss);
// Check that the map of the object hasn't changed.
- __ ldr(r1, FieldMemOperand(r3, HeapObject::kMapOffset));
- __ cmp(r1, Operand(Handle<Map>(object->map())));
+ __ ldr(r3, FieldMemOperand(r1, HeapObject::kMapOffset));
+ __ cmp(r3, Operand(Handle<Map>(object->map())));
__ b(ne, &miss);
// Perform global security token check if needed.
if (object->IsJSGlobalProxy()) {
- __ CheckAccessGlobalProxy(r3, r1, &miss);
+ __ CheckAccessGlobalProxy(r1, r3, &miss);
}
// Stub never generated for non-global objects that require access
// checks.
ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
- __ ldr(ip, MemOperand(sp)); // receiver
- __ push(ip);
+ __ push(r1); // receiver
__ mov(ip, Operand(Handle<AccessorInfo>(callback))); // callback info
- __ push(ip);
- __ push(r2); // name
- __ push(r0); // value
+ __ stm(db_w, sp, ip.bit() | r2.bit() | r0.bit());
// Do tail-call to the runtime system.
ExternalReference store_callback_property =
@@ -1292,37 +1277,33 @@
String* name) {
// ----------- S t a t e -------------
// -- r0 : value
+ // -- r1 : receiver
// -- r2 : name
// -- lr : return address
- // -- [sp] : receiver
// -----------------------------------
Label miss;
- // Get the object from the stack.
- __ ldr(r3, MemOperand(sp, 0 * kPointerSize));
-
// Check that the object isn't a smi.
- __ tst(r3, Operand(kSmiTagMask));
+ __ tst(r1, Operand(kSmiTagMask));
__ b(eq, &miss);
// Check that the map of the object hasn't changed.
- __ ldr(r1, FieldMemOperand(r3, HeapObject::kMapOffset));
- __ cmp(r1, Operand(Handle<Map>(receiver->map())));
+ __ ldr(r3, FieldMemOperand(r1, HeapObject::kMapOffset));
+ __ cmp(r3, Operand(Handle<Map>(receiver->map())));
__ b(ne, &miss);
// Perform global security token check if needed.
if (receiver->IsJSGlobalProxy()) {
- __ CheckAccessGlobalProxy(r3, r1, &miss);
+ __ CheckAccessGlobalProxy(r1, r3, &miss);
}
- // Stub never generated for non-global objects that require access
+ // Stub is never generated for non-global objects that require access
// checks.
ASSERT(receiver->IsJSGlobalProxy() || !receiver->IsAccessCheckNeeded());
- __ ldr(ip, MemOperand(sp)); // receiver
- __ push(ip);
- __ push(r2); // name
- __ push(r0); // value
+ __ push(r1); // receiver.
+ __ push(r2); // name.
+ __ push(r0); // value.
// Do tail-call to the runtime system.
ExternalReference store_ic_property =
@@ -1344,14 +1325,13 @@
String* name) {
// ----------- S t a t e -------------
// -- r0 : value
+ // -- r1 : receiver
// -- r2 : name
// -- lr : return address
- // -- [sp] : receiver
// -----------------------------------
Label miss;
// Check that the map of the global has not changed.
- __ ldr(r1, MemOperand(sp, 0 * kPointerSize));
__ ldr(r3, FieldMemOperand(r1, HeapObject::kMapOffset));
__ cmp(r3, Operand(Handle<Map>(object->map())));
__ b(ne, &miss);
@@ -1360,12 +1340,12 @@
__ mov(r2, Operand(Handle<JSGlobalPropertyCell>(cell)));
__ str(r0, FieldMemOperand(r2, JSGlobalPropertyCell::kValueOffset));
- __ IncrementCounter(&Counters::named_store_global_inline, 1, r1, r3);
+ __ IncrementCounter(&Counters::named_store_global_inline, 1, r4, r3);
__ Ret();
// Handle store cache miss.
__ bind(&miss);
- __ IncrementCounter(&Counters::named_store_global_inline_miss, 1, r1, r3);
+ __ IncrementCounter(&Counters::named_store_global_inline_miss, 1, r4, r3);
Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
__ Jump(ic, RelocInfo::CODE_TARGET);
« no previous file with comments | « src/arm/ic-arm.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698