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

Unified Diff: src/ia32/ic-ia32.cc

Issue 573009: Change LoadIC interface on ia32 to take arguments in registers. (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/ia32/full-codegen-ia32.cc ('k') | src/ia32/stub-cache-ia32.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ia32/ic-ia32.cc
===================================================================
--- src/ia32/ic-ia32.cc (revision 3838)
+++ src/ia32/ic-ia32.cc (working copy)
@@ -50,28 +50,29 @@
// or if name is not a symbol, and will jump to the miss_label in that case.
static void GenerateDictionaryLoad(MacroAssembler* masm,
Label* miss_label,
+ Register receiver,
+ Register name,
Register r0,
Register r1,
Register r2,
- Register name,
DictionaryCheck check_dictionary) {
// Register use:
//
+ // name - holds the name of the property and is unchanged.
+ // receiver - holds the receiver and is unchanged.
+ // Scratch registers:
// r0 - used to hold the property dictionary.
//
- // r1 - initially the receiver
- // - used for the index into the property dictionary
+ // r1 - used for the index into the property dictionary
// - holds the result on exit.
//
// r2 - used to hold the capacity of the property dictionary.
- //
- // name - holds the name of the property and is unchanged.
Label done;
// Check for the absence of an interceptor.
// Load the map into r0.
- __ mov(r0, FieldOperand(r1, JSObject::kMapOffset));
+ __ mov(r0, FieldOperand(receiver, JSObject::kMapOffset));
// Test the has_named_interceptor bit in the map.
__ test(FieldOperand(r0, Map::kInstanceAttributesOffset),
Immediate(1 << (Map::kHasNamedInterceptor + (3 * 8))));
@@ -91,7 +92,7 @@
__ j(equal, miss_label, not_taken);
// Load properties array.
- __ mov(r0, FieldOperand(r1, JSObject::kPropertiesOffset));
+ __ mov(r0, FieldOperand(receiver, JSObject::kPropertiesOffset));
// Check that the properties array is a dictionary.
if (check_dictionary == CHECK_DICTIONARY) {
@@ -176,14 +177,12 @@
void LoadIC::GenerateArrayLength(MacroAssembler* masm) {
// ----------- S t a t e -------------
+ // -- eax : receiver
// -- ecx : name
// -- esp[0] : return address
- // -- esp[4] : receiver
// -----------------------------------
Label miss;
- __ mov(eax, Operand(esp, kPointerSize));
-
StubCompiler::GenerateLoadArrayLength(masm, eax, edx, &miss);
__ bind(&miss);
StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC);
@@ -192,14 +191,12 @@
void LoadIC::GenerateStringLength(MacroAssembler* masm) {
// ----------- S t a t e -------------
+ // -- eax : receiver
// -- ecx : name
// -- esp[0] : return address
- // -- esp[4] : receiver
// -----------------------------------
Label miss;
- __ mov(eax, Operand(esp, kPointerSize));
-
StubCompiler::GenerateLoadStringLength(masm, eax, edx, ebx, &miss);
__ bind(&miss);
StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC);
@@ -208,14 +205,12 @@
void LoadIC::GenerateFunctionPrototype(MacroAssembler* masm) {
// ----------- S t a t e -------------
+ // -- eax : receiver
// -- ecx : name
// -- esp[0] : return address
- // -- esp[4] : receiver
// -----------------------------------
Label miss;
- __ mov(eax, Operand(esp, kPointerSize));
-
StubCompiler::GenerateLoadFunctionPrototype(masm, eax, edx, ebx, &miss);
__ bind(&miss);
StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC);
@@ -364,13 +359,14 @@
__ bind(&probe_dictionary);
GenerateDictionaryLoad(masm,
&slow,
- ebx,
ecx,
- edx,
eax,
+ ebx,
+ edx,
+ edi,
DICTIONARY_CHECK_DONE);
- GenerateCheckNonObjectOrLoaded(masm, &slow, ecx, edx);
- __ mov(eax, Operand(ecx));
+ GenerateCheckNonObjectOrLoaded(masm, &slow, edx, ebx);
+ __ mov(eax, Operand(edx));
__ IncrementCounter(&Counters::keyed_load_generic_symbol, 1);
__ ret(0);
@@ -1001,7 +997,7 @@
// Search dictionary - put result in register edi.
__ mov(edi, edx);
- GenerateDictionaryLoad(masm, miss, eax, edi, ebx, ecx, CHECK_DICTIONARY);
+ GenerateDictionaryLoad(masm, miss, edx, ecx, eax, edi, ebx, CHECK_DICTIONARY);
// Check that the result is not a smi.
__ test(edi, Immediate(kSmiTagMask));
@@ -1150,13 +1146,11 @@
void LoadIC::GenerateMegamorphic(MacroAssembler* masm) {
// ----------- S t a t e -------------
+ // -- eax : receiver
// -- ecx : name
// -- esp[0] : return address
- // -- esp[4] : receiver
// -----------------------------------
- __ mov(eax, Operand(esp, kPointerSize));
-
// Probe the stub cache.
Code::Flags flags = Code::ComputeFlags(Code::LOAD_IC,
NOT_IN_LOOP,
@@ -1170,14 +1164,12 @@
void LoadIC::GenerateNormal(MacroAssembler* masm) {
// ----------- S t a t e -------------
+ // -- eax : receiver
// -- ecx : name
// -- esp[0] : return address
- // -- esp[4] : receiver
// -----------------------------------
Label miss, probe, global;
- __ mov(eax, Operand(esp, kPointerSize));
-
// Check that the receiver isn't a smi.
__ test(eax, Immediate(kSmiTagMask));
__ j(zero, &miss, not_taken);
@@ -1202,8 +1194,16 @@
// Search the dictionary placing the result in eax.
__ bind(&probe);
- GenerateDictionaryLoad(masm, &miss, edx, eax, ebx, ecx, CHECK_DICTIONARY);
- GenerateCheckNonObjectOrLoaded(masm, &miss, eax, edx);
+ GenerateDictionaryLoad(masm,
+ &miss,
+ eax,
+ ecx,
+ edx,
+ edi,
+ ebx,
+ CHECK_DICTIONARY);
+ GenerateCheckNonObjectOrLoaded(masm, &miss, edi, edx);
+ __ mov(eax, edi);
__ ret(0);
// Global object access: Check access rights.
@@ -1213,20 +1213,19 @@
// Cache miss: Restore receiver from stack and jump to runtime.
__ bind(&miss);
- __ mov(eax, Operand(esp, 1 * kPointerSize));
GenerateMiss(masm);
}
void LoadIC::GenerateMiss(MacroAssembler* masm) {
// ----------- S t a t e -------------
+ // -- eax : receiver
// -- ecx : name
// -- esp[0] : return address
- // -- esp[4] : receiver
// -----------------------------------
__ pop(ebx);
- __ push(Operand(esp, 0)); // receiver
+ __ push(eax); // receiver
__ push(ecx); // name
__ push(ebx); // return address
« no previous file with comments | « src/ia32/full-codegen-ia32.cc ('k') | src/ia32/stub-cache-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698